From bff7ce3f27ed5ff84c670c4c4cf5bb7a03db6d1f Mon Sep 17 00:00:00 2001 From: Lukas Date: Thu, 26 Sep 2024 11:31:18 +0200 Subject: [PATCH 01/72] fix: apply gas & codesize savings --- src/contracts/protocol/pool/Pool.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/contracts/protocol/pool/Pool.sol b/src/contracts/protocol/pool/Pool.sol index f4a9812e..4f62506d 100644 --- a/src/contracts/protocol/pool/Pool.sol +++ b/src/contracts/protocol/pool/Pool.sol @@ -434,7 +434,7 @@ abstract contract Pool is VersionedInitializable, PoolStorage, IPool { function getReserveData( address asset ) external view virtual override returns (DataTypes.ReserveDataLegacy memory) { - DataTypes.ReserveData memory reserve = _reserves[asset]; + DataTypes.ReserveData storage reserve = _reserves[asset]; DataTypes.ReserveDataLegacy memory res; res.configuration = reserve.configuration; @@ -686,7 +686,7 @@ abstract contract Pool is VersionedInitializable, PoolStorage, IPool { /// @inheritdoc IPool function configureEModeCategory( uint8 id, - DataTypes.EModeCategoryBaseConfiguration memory category + DataTypes.EModeCategoryBaseConfiguration calldata 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); @@ -720,7 +720,7 @@ abstract contract Pool is VersionedInitializable, PoolStorage, IPool { function getEModeCategoryData( uint8 id ) external view virtual override returns (DataTypes.EModeCategoryLegacy memory) { - DataTypes.EModeCategory memory category = _eModeCategories[id]; + DataTypes.EModeCategory storage category = _eModeCategories[id]; return DataTypes.EModeCategoryLegacy({ ltv: category.ltv, From 969ee04160751319eb4eaf5cbac12a183c1c9c8e Mon Sep 17 00:00:00 2001 From: Lukas Date: Thu, 26 Sep 2024 11:38:15 +0200 Subject: [PATCH 02/72] refactor: aggregator interface cleanup --- .../chainlink/AggregatorInterface.sol | 28 +++++++++++ .../libraries/PriceFeedEngine.sol | 4 +- .../helpers/UiPoolDataProviderV3.sol | 10 ++-- .../interfaces/IEACAggregatorProxy.sol | 19 -------- src/contracts/rewards/EmissionManager.sol | 4 +- src/contracts/rewards/RewardsController.sol | 10 ++-- .../rewards/interfaces/IEmissionManager.sol | 12 ++--- .../rewards/interfaces/IRewardsController.sol | 10 ++-- .../rewards/libraries/RewardsDataTypes.sol | 4 +- .../procedures/AaveV3GettersProcedureOne.sol | 6 +-- .../ERC20AaveLMUpgradable.t.sol | 4 +- tests/rewards/EmissionsManager.t.sol | 6 +-- tests/rewards/RewardsController.t.sol | 6 +-- tests/utils/ProtocolV3TestBase.sol | 48 +------------------ 14 files changed, 68 insertions(+), 103 deletions(-) delete mode 100644 src/contracts/helpers/interfaces/IEACAggregatorProxy.sol diff --git a/src/contracts/dependencies/chainlink/AggregatorInterface.sol b/src/contracts/dependencies/chainlink/AggregatorInterface.sol index 496151aa..2bb5ae36 100644 --- a/src/contracts/dependencies/chainlink/AggregatorInterface.sol +++ b/src/contracts/dependencies/chainlink/AggregatorInterface.sol @@ -3,6 +3,34 @@ pragma solidity ^0.8.0; interface AggregatorInterface { + function decimals() external view returns (uint8); + + function description() external view returns (string memory); + + function getRoundData( + uint80 _roundId + ) + external + view + returns ( + uint80 roundId, + int256 answer, + uint256 startedAt, + uint256 updatedAt, + uint80 answeredInRound + ); + + function latestRoundData() + external + view + returns ( + uint80 roundId, + int256 answer, + uint256 startedAt, + uint256 updatedAt, + uint80 answeredInRound + ); + function latestAnswer() external view returns (int256); function latestTimestamp() external view returns (uint256); diff --git a/src/contracts/extensions/v3-config-engine/libraries/PriceFeedEngine.sol b/src/contracts/extensions/v3-config-engine/libraries/PriceFeedEngine.sol index 75cc49f4..97c72977 100644 --- a/src/contracts/extensions/v3-config-engine/libraries/PriceFeedEngine.sol +++ b/src/contracts/extensions/v3-config-engine/libraries/PriceFeedEngine.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.18; import {IAaveV3ConfigEngine as IEngine, IAaveOracle} from '../IAaveV3ConfigEngine.sol'; -import {IEACAggregatorProxy} from '../../../helpers/interfaces/IEACAggregatorProxy.sol'; +import {AggregatorInterface} from '../../../dependencies/chainlink/AggregatorInterface.sol'; library PriceFeedEngine { function executePriceFeedsUpdate( @@ -21,7 +21,7 @@ library PriceFeedEngine { for (uint256 i = 0; i < updates.length; i++) { require(updates[i].priceFeed != address(0), 'PRICE_FEED_ALWAYS_REQUIRED'); require( - IEACAggregatorProxy(updates[i].priceFeed).latestAnswer() > 0, + AggregatorInterface(updates[i].priceFeed).latestAnswer() > 0, 'FEED_SHOULD_RETURN_POSITIVE_PRICE' ); assets[i] = updates[i].asset; diff --git a/src/contracts/helpers/UiPoolDataProviderV3.sol b/src/contracts/helpers/UiPoolDataProviderV3.sol index b079d2dd..d1d4a53e 100644 --- a/src/contracts/helpers/UiPoolDataProviderV3.sol +++ b/src/contracts/helpers/UiPoolDataProviderV3.sol @@ -13,7 +13,7 @@ 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 {AggregatorInterface} from '../dependencies/chainlink/AggregatorInterface.sol'; import {IERC20DetailedBytes} from './interfaces/IERC20DetailedBytes.sol'; import {IUiPoolDataProviderV3} from './interfaces/IUiPoolDataProviderV3.sol'; @@ -22,14 +22,14 @@ contract UiPoolDataProviderV3 is IUiPoolDataProviderV3 { using ReserveConfiguration for DataTypes.ReserveConfigurationMap; using UserConfiguration for DataTypes.UserConfigurationMap; - IEACAggregatorProxy public immutable networkBaseTokenPriceInUsdProxyAggregator; - IEACAggregatorProxy public immutable marketReferenceCurrencyPriceInUsdProxyAggregator; + AggregatorInterface public immutable networkBaseTokenPriceInUsdProxyAggregator; + AggregatorInterface public immutable marketReferenceCurrencyPriceInUsdProxyAggregator; uint256 public constant ETH_CURRENCY_UNIT = 1 ether; address public constant MKR_ADDRESS = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; constructor( - IEACAggregatorProxy _networkBaseTokenPriceInUsdProxyAggregator, - IEACAggregatorProxy _marketReferenceCurrencyPriceInUsdProxyAggregator + AggregatorInterface _networkBaseTokenPriceInUsdProxyAggregator, + AggregatorInterface _marketReferenceCurrencyPriceInUsdProxyAggregator ) { networkBaseTokenPriceInUsdProxyAggregator = _networkBaseTokenPriceInUsdProxyAggregator; marketReferenceCurrencyPriceInUsdProxyAggregator = _marketReferenceCurrencyPriceInUsdProxyAggregator; diff --git a/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol b/src/contracts/helpers/interfaces/IEACAggregatorProxy.sol deleted file mode 100644 index c89baee6..00000000 --- a/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/src/contracts/rewards/EmissionManager.sol b/src/contracts/rewards/EmissionManager.sol index b18473ff..4cdaf2bf 100644 --- a/src/contracts/rewards/EmissionManager.sol +++ b/src/contracts/rewards/EmissionManager.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.10; import {Ownable} from '../dependencies/openzeppelin/contracts/Ownable.sol'; -import {IEACAggregatorProxy} from '../helpers/interfaces/IEACAggregatorProxy.sol'; +import {AggregatorInterface} from '../dependencies/chainlink/AggregatorInterface.sol'; import {IEmissionManager} from './interfaces/IEmissionManager.sol'; import {ITransferStrategyBase} from './interfaces/ITransferStrategyBase.sol'; import {IRewardsController} from './interfaces/IRewardsController.sol'; @@ -54,7 +54,7 @@ contract EmissionManager is Ownable, IEmissionManager { /// @inheritdoc IEmissionManager function setRewardOracle( address reward, - IEACAggregatorProxy rewardOracle + AggregatorInterface rewardOracle ) external override onlyEmissionAdmin(reward) { _rewardsController.setRewardOracle(reward, rewardOracle); } diff --git a/src/contracts/rewards/RewardsController.sol b/src/contracts/rewards/RewardsController.sol index 3a817f60..c4c7b539 100644 --- a/src/contracts/rewards/RewardsController.sol +++ b/src/contracts/rewards/RewardsController.sol @@ -8,7 +8,7 @@ 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'; +import {AggregatorInterface} from '../dependencies/chainlink/AggregatorInterface.sol'; /** * @title RewardsController @@ -34,7 +34,7 @@ contract RewardsController is RewardsDistributor, VersionedInitializable, IRewar // 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; + mapping(address => AggregatorInterface) internal _rewardOracle; modifier onlyAuthorizedClaimers(address claimer, address user) { require(_authorizedClaimers[user] == claimer, 'CLAIMER_UNAUTHORIZED'); @@ -100,7 +100,7 @@ contract RewardsController is RewardsDistributor, VersionedInitializable, IRewar /// @inheritdoc IRewardsController function setRewardOracle( address reward, - IEACAggregatorProxy rewardOracle + AggregatorInterface rewardOracle ) external onlyEmissionManager { _setRewardOracle(reward, rewardOracle); } @@ -341,13 +341,13 @@ contract RewardsController is RewardsDistributor, VersionedInitializable, IRewar } /** - * @dev Update the Price Oracle of a reward token. The Price Oracle must follow Chainlink IEACAggregatorProxy interface. + * @dev Update the Price Oracle of a reward token. The Price Oracle must follow Chainlink AggregatorInterface 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 { + function _setRewardOracle(address reward, AggregatorInterface rewardOracle) internal { require(rewardOracle.latestAnswer() > 0, 'ORACLE_MUST_RETURN_PRICE'); _rewardOracle[reward] = rewardOracle; emit RewardOracleUpdated(reward, address(rewardOracle)); diff --git a/src/contracts/rewards/interfaces/IEmissionManager.sol b/src/contracts/rewards/interfaces/IEmissionManager.sol index 4853af21..0f6300bd 100644 --- a/src/contracts/rewards/interfaces/IEmissionManager.sol +++ b/src/contracts/rewards/interfaces/IEmissionManager.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.10; -import {IEACAggregatorProxy} from '../../helpers/interfaces/IEACAggregatorProxy.sol'; +import {AggregatorInterface} from '../../dependencies/chainlink/AggregatorInterface.sol'; import {RewardsDataTypes} from '../libraries/RewardsDataTypes.sol'; import {ITransferStrategyBase} from './ITransferStrategyBase.sol'; import {IRewardsController} from './IRewardsController.sol'; @@ -34,8 +34,8 @@ interface IEmissionManager { * 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. + * AggregatorInterface rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. + * Must follow Chainlink Aggregator AggregatorInterface interface to be compatible. */ function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; @@ -51,13 +51,13 @@ interface IEmissionManager { * @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. + * a check to see if the reward asset oracle is compatible with AggregatorInterface 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 + * @param rewardOracle The address of price aggregator that follows AggregatorInterface interface */ - function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; + function setRewardOracle(address reward, AggregatorInterface rewardOracle) external; /** * @dev Sets the end date for the distribution diff --git a/src/contracts/rewards/interfaces/IRewardsController.sol b/src/contracts/rewards/interfaces/IRewardsController.sol index cdb2ac29..791180c0 100644 --- a/src/contracts/rewards/interfaces/IRewardsController.sol +++ b/src/contracts/rewards/interfaces/IRewardsController.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.10; import {IRewardsDistributor} from './IRewardsDistributor.sol'; import {ITransferStrategyBase} from './ITransferStrategyBase.sol'; -import {IEACAggregatorProxy} from '../../helpers/interfaces/IEACAggregatorProxy.sol'; +import {AggregatorInterface} from '../../dependencies/chainlink/AggregatorInterface.sol'; import {RewardsDataTypes} from '../libraries/RewardsDataTypes.sol'; /** @@ -70,9 +70,9 @@ interface IRewardsController is IRewardsDistributor { * 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 + * @param rewardOracle The address of price aggregator that follows AggregatorInterface interface */ - function setRewardOracle(address reward, IEACAggregatorProxy rewardOracle) external; + function setRewardOracle(address reward, AggregatorInterface rewardOracle) external; /** * @dev Get the price aggregator oracle address @@ -104,8 +104,8 @@ interface IRewardsController is IRewardsDistributor { * 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. + * AggregatorInterface rewardOracle: The Price Oracle of a reward to visualize the incentives at the UI Frontend. + * Must follow Chainlink Aggregator AggregatorInterface interface to be compatible. */ function configureAssets(RewardsDataTypes.RewardsConfigInput[] memory config) external; diff --git a/src/contracts/rewards/libraries/RewardsDataTypes.sol b/src/contracts/rewards/libraries/RewardsDataTypes.sol index 38fe87c5..9a4bf245 100644 --- a/src/contracts/rewards/libraries/RewardsDataTypes.sol +++ b/src/contracts/rewards/libraries/RewardsDataTypes.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.10; import {ITransferStrategyBase} from '../interfaces/ITransferStrategyBase.sol'; -import {IEACAggregatorProxy} from '../../helpers/interfaces/IEACAggregatorProxy.sol'; +import {AggregatorInterface} from '../../dependencies/chainlink/AggregatorInterface.sol'; library RewardsDataTypes { struct RewardsConfigInput { @@ -12,7 +12,7 @@ library RewardsDataTypes { address asset; address reward; ITransferStrategyBase transferStrategy; - IEACAggregatorProxy rewardOracle; + AggregatorInterface rewardOracle; } struct UserAssetBalance { diff --git a/src/deployments/contracts/procedures/AaveV3GettersProcedureOne.sol b/src/deployments/contracts/procedures/AaveV3GettersProcedureOne.sol index 8aa66732..528da7c8 100644 --- a/src/deployments/contracts/procedures/AaveV3GettersProcedureOne.sol +++ b/src/deployments/contracts/procedures/AaveV3GettersProcedureOne.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.10; import {WalletBalanceProvider} from '../../../contracts/helpers/WalletBalanceProvider.sol'; import {UiPoolDataProviderV3} from '../../../contracts/helpers/UiPoolDataProviderV3.sol'; import {UiIncentiveDataProviderV3} from '../../../contracts/helpers/UiIncentiveDataProviderV3.sol'; -import {IEACAggregatorProxy} from '../../../contracts/helpers/interfaces/IEACAggregatorProxy.sol'; +import {AggregatorInterface} from '../../../contracts/dependencies/chainlink/AggregatorInterface.sol'; import {AaveProtocolDataProvider} from '../../../contracts/helpers/AaveProtocolDataProvider.sol'; import {IPoolAddressesProvider} from '../../../contracts/interfaces/IPoolAddressesProvider.sol'; @@ -34,8 +34,8 @@ contract AaveV3GettersProcedureOne { ) { report.uiPoolDataProvider = address( new UiPoolDataProviderV3( - IEACAggregatorProxy(networkBaseTokenPriceInUsdProxyAggregator), - IEACAggregatorProxy(marketReferenceCurrencyPriceInUsdProxyAggregator) + AggregatorInterface(networkBaseTokenPriceInUsdProxyAggregator), + AggregatorInterface(marketReferenceCurrencyPriceInUsdProxyAggregator) ) ); } diff --git a/tests/extensions/static-a-token/ERC20AaveLMUpgradable.t.sol b/tests/extensions/static-a-token/ERC20AaveLMUpgradable.t.sol index bcc552f8..1b05f7b9 100644 --- a/tests/extensions/static-a-token/ERC20AaveLMUpgradable.t.sol +++ b/tests/extensions/static-a-token/ERC20AaveLMUpgradable.t.sol @@ -8,7 +8,7 @@ import {ERC20AaveLMUpgradeable, IERC20AaveLM} from '../../../src/contracts/exten import {IRewardsController} from '../../../src/contracts/rewards/interfaces/IRewardsController.sol'; import {PullRewardsTransferStrategy, ITransferStrategyBase} from '../../../src/contracts/rewards/transfer-strategies/PullRewardsTransferStrategy.sol'; import {RewardsDataTypes} from '../../../src/contracts/rewards/libraries/RewardsDataTypes.sol'; -import {IEACAggregatorProxy} from '../../../src/contracts/helpers/interfaces/IEACAggregatorProxy.sol'; +import {AggregatorInterface} from '../../../src/contracts/dependencies/chainlink/AggregatorInterface.sol'; import {DataTypes} from '../../../src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol'; // Minimal mock as contract is abstract @@ -377,7 +377,7 @@ contract ERC20AaveLMUpgradableTest is TestnetProcedures { address(underlying), rewardToken, ITransferStrategyBase(strategy), - IEACAggregatorProxy(address(2)) + AggregatorInterface(address(2)) ); // configure asset diff --git a/tests/rewards/EmissionsManager.t.sol b/tests/rewards/EmissionsManager.t.sol index 9c157af1..4f7e7743 100644 --- a/tests/rewards/EmissionsManager.t.sol +++ b/tests/rewards/EmissionsManager.t.sol @@ -7,7 +7,7 @@ import {EmissionManager} from '../../src/contracts/rewards/EmissionManager.sol'; import {DataTypes} from '../../src/contracts/protocol/libraries/types/DataTypes.sol'; import {IPool} from '../../src/contracts/interfaces/IPool.sol'; import {ITransferStrategyBase} from '../../src/contracts/rewards/interfaces/ITransferStrategyBase.sol'; -import {IEACAggregatorProxy} from '../../src/contracts/helpers/interfaces/IEACAggregatorProxy.sol'; +import {AggregatorInterface} from '../../src/contracts/dependencies/chainlink/AggregatorInterface.sol'; import {RewardsDataTypes} from '../../src/contracts/rewards/libraries/RewardsDataTypes.sol'; import {PullRewardsTransferStrategy} from '../../src/contracts/rewards/transfer-strategies/PullRewardsTransferStrategy.sol'; import {TestnetProcedures} from '../utils/TestnetProcedures.sol'; @@ -64,7 +64,7 @@ contract EmissionManagerTest is TestnetProcedures { MockAggregator mock = new MockAggregator(2e6); test_configureAssets(); vm.prank(alice); - manager.setRewardOracle(tokenList.usdx, IEACAggregatorProxy(address(mock))); + manager.setRewardOracle(tokenList.usdx, AggregatorInterface(address(mock))); } function test_setDistributionEnd() public { @@ -103,7 +103,7 @@ contract EmissionManagerTest is TestnetProcedures { usdxAToken, tokenList.usdx, ITransferStrategyBase(strat), - IEACAggregatorProxy(address(2)) + AggregatorInterface(address(2)) ); vm.prank(alice); diff --git a/tests/rewards/RewardsController.t.sol b/tests/rewards/RewardsController.t.sol index 26d206ef..f1323bae 100644 --- a/tests/rewards/RewardsController.t.sol +++ b/tests/rewards/RewardsController.t.sol @@ -7,7 +7,7 @@ import {EmissionManager} from '../../src/contracts/rewards/EmissionManager.sol'; import {DataTypes} from '../../src/contracts/protocol/libraries/types/DataTypes.sol'; import {IAToken, IERC20} from '../../src/contracts/protocol/tokenization/AToken.sol'; import {ITransferStrategyBase} from '../../src/contracts/rewards/interfaces/ITransferStrategyBase.sol'; -import {IEACAggregatorProxy} from '../../src/contracts/helpers/interfaces/IEACAggregatorProxy.sol'; +import {AggregatorInterface} from '../../src/contracts/dependencies/chainlink/AggregatorInterface.sol'; import {RewardsDataTypes} from '../../src/contracts/rewards/libraries/RewardsDataTypes.sol'; import {PullRewardsTransferStrategy} from '../../src/contracts/rewards/transfer-strategies/PullRewardsTransferStrategy.sol'; import {TestnetProcedures} from '../utils/TestnetProcedures.sol'; @@ -108,7 +108,7 @@ contract RewardsControllerTest is TestnetProcedures { emit RewardOracleUpdated(tokenList.usdx, address(mock)); vm.prank(alice); - manager.setRewardOracle(tokenList.usdx, IEACAggregatorProxy(address(mock))); + manager.setRewardOracle(tokenList.usdx, AggregatorInterface(address(mock))); assertEq(rewardsController.getRewardOracle(tokenList.usdx), address(mock)); } @@ -182,7 +182,7 @@ contract RewardsControllerTest is TestnetProcedures { usdxAToken, tokenList.usdx, ITransferStrategyBase(strat), - IEACAggregatorProxy(address(2)) + AggregatorInterface(address(2)) ); vm.expectEmit(address(rewardsController)); diff --git a/tests/utils/ProtocolV3TestBase.sol b/tests/utils/ProtocolV3TestBase.sol index dbfbea39..b0024c1c 100644 --- a/tests/utils/ProtocolV3TestBase.sol +++ b/tests/utils/ProtocolV3TestBase.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity >=0.7.5 <0.9.0; +import {AggregatorInterface} from '../../src/contracts/dependencies/chainlink/AggregatorInterface.sol'; import {IERC20Detailed} from '../../src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol'; import {IDefaultInterestRateStrategyV2} from '../../src/contracts/interfaces/IDefaultInterestRateStrategyV2.sol'; import {ReserveConfiguration} from '../../src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol'; @@ -18,56 +19,11 @@ struct ReserveTokens { address variableDebtToken; } -interface ExtendedAggregatorV2V3Interface { - 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); - - function decimals() external view returns (uint8); - +interface ExtendedAggregatorV2V3Interface is AggregatorInterface { function DECIMALS() external view returns (uint8); - function description() external view returns (string memory); - function version() external view returns (uint256); - // getRoundData and latestRoundData should both raise "No data present" - // if they do not have data to report, instead of returning unset values - // which could be misinterpreted as actual reported values. - function getRoundData( - uint80 _roundId - ) - external - view - returns ( - uint80 roundId, - int256 answer, - uint256 startedAt, - uint256 updatedAt, - uint80 answeredInRound - ); - - function latestRoundData() - external - view - returns ( - uint80 roundId, - int256 answer, - uint256 startedAt, - uint256 updatedAt, - uint80 answeredInRound - ); - - event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt); - - event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt); - /** * @notice Returns the name identifier of the feed * @return string name From 1b56764c7d4b9d6b21015c7dc9d272aa096484e8 Mon Sep 17 00:00:00 2001 From: Lukas Date: Thu, 26 Sep 2024 11:53:47 +0200 Subject: [PATCH 03/72] perf: optimize bitmap for access instead of writes --- .../configuration/ReserveConfiguration.sol | 132 +++++++++--------- 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol index 2008acb6..52f9c725 100644 --- a/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ b/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -10,26 +10,26 @@ import {DataTypes} from '../types/DataTypes.sol'; * @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 LTV_MASK = 0x000000000000000000000000000000000000000000000000000000000000FFFF; // prettier-ignore + uint256 internal constant LIQUIDATION_THRESHOLD_MASK = 0x00000000000000000000000000000000000000000000000000000000FFFF0000; // prettier-ignore + uint256 internal constant LIQUIDATION_BONUS_MASK = 0x0000000000000000000000000000000000000000000000000000FFFF00000000; // prettier-ignore + uint256 internal constant DECIMALS_MASK = 0x00000000000000000000000000000000000000000000000000FF000000000000; // prettier-ignore + uint256 internal constant ACTIVE_MASK = 0x0000000000000000000000000000000000000000000000000100000000000000; // prettier-ignore + uint256 internal constant FROZEN_MASK = 0x0000000000000000000000000000000000000000000000000200000000000000; // prettier-ignore + uint256 internal constant BORROWING_MASK = 0x0000000000000000000000000000000000000000000000000400000000000000; // 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 + uint256 internal constant PAUSED_MASK = 0x0000000000000000000000000000000000000000000000001000000000000000; // prettier-ignore + uint256 internal constant BORROWABLE_IN_ISOLATION_MASK = 0x0000000000000000000000000000000000000000000000002000000000000000; // prettier-ignore + uint256 internal constant SILOED_BORROWING_MASK = 0x0000000000000000000000000000000000000000000000004000000000000000; // prettier-ignore + uint256 internal constant FLASHLOAN_ENABLED_MASK = 0x0000000000000000000000000000000000000000000000008000000000000000; // prettier-ignore + uint256 internal constant RESERVE_FACTOR_MASK = 0x00000000000000000000000000000000000000000000FFFF0000000000000000; // prettier-ignore + uint256 internal constant BORROW_CAP_MASK = 0x00000000000000000000000000000000000FFFFFFFFF00000000000000000000; // prettier-ignore + uint256 internal constant SUPPLY_CAP_MASK = 0x00000000000000000000000000FFFFFFFFF00000000000000000000000000000; // prettier-ignore + uint256 internal constant LIQUIDATION_PROTOCOL_FEE_MASK = 0x0000000000000000000000FFFF00000000000000000000000000000000000000; // 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 = 0x00000000000FFFFFFFFF00000000000000000000000000000000000000000000; // prettier-ignore + uint256 internal constant DEBT_CEILING_MASK = 0x0FFFFFFFFFF00000000000000000000000000000000000000000000000000000; // prettier-ignore + uint256 internal constant VIRTUAL_ACC_ACTIVE_MASK = 0x1000000000000000000000000000000000000000000000000000000000000000; // 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; @@ -73,7 +73,7 @@ library ReserveConfiguration { 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; + self.data = (self.data & ~LTV_MASK) | ltv; } /** @@ -82,7 +82,7 @@ library ReserveConfiguration { * @return The loan to value */ function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; + return self.data & LTV_MASK; } /** @@ -97,7 +97,7 @@ library ReserveConfiguration { require(threshold <= MAX_VALID_LIQUIDATION_THRESHOLD, Errors.INVALID_LIQ_THRESHOLD); self.data = - (self.data & LIQUIDATION_THRESHOLD_MASK) | + (self.data & ~LIQUIDATION_THRESHOLD_MASK) | (threshold << LIQUIDATION_THRESHOLD_START_BIT_POSITION); } @@ -109,7 +109,7 @@ library ReserveConfiguration { function getLiquidationThreshold( DataTypes.ReserveConfigurationMap memory self ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; + return (self.data & LIQUIDATION_THRESHOLD_MASK) >> LIQUIDATION_THRESHOLD_START_BIT_POSITION; } /** @@ -124,7 +124,7 @@ library ReserveConfiguration { require(bonus <= MAX_VALID_LIQUIDATION_BONUS, Errors.INVALID_LIQ_BONUS); self.data = - (self.data & LIQUIDATION_BONUS_MASK) | + (self.data & ~LIQUIDATION_BONUS_MASK) | (bonus << LIQUIDATION_BONUS_START_BIT_POSITION); } @@ -136,7 +136,7 @@ library ReserveConfiguration { function getLiquidationBonus( DataTypes.ReserveConfigurationMap memory self ) internal pure returns (uint256) { - return (self.data & ~LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; + return (self.data & LIQUIDATION_BONUS_MASK) >> LIQUIDATION_BONUS_START_BIT_POSITION; } /** @@ -150,7 +150,7 @@ library ReserveConfiguration { ) internal pure { require(decimals <= MAX_VALID_DECIMALS, Errors.INVALID_DECIMALS); - self.data = (self.data & DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); + self.data = (self.data & ~DECIMALS_MASK) | (decimals << RESERVE_DECIMALS_START_BIT_POSITION); } /** @@ -161,7 +161,7 @@ library ReserveConfiguration { function getDecimals( DataTypes.ReserveConfigurationMap memory self ) internal pure returns (uint256) { - return (self.data & ~DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; + return (self.data & DECIMALS_MASK) >> RESERVE_DECIMALS_START_BIT_POSITION; } /** @@ -171,7 +171,7 @@ library ReserveConfiguration { */ function setActive(DataTypes.ReserveConfigurationMap memory self, bool active) internal pure { self.data = - (self.data & ACTIVE_MASK) | + (self.data & ~ACTIVE_MASK) | (uint256(active ? 1 : 0) << IS_ACTIVE_START_BIT_POSITION); } @@ -181,7 +181,7 @@ library ReserveConfiguration { * @return The active state */ function getActive(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~ACTIVE_MASK) != 0; + return (self.data & ACTIVE_MASK) != 0; } /** @@ -191,7 +191,7 @@ library ReserveConfiguration { */ function setFrozen(DataTypes.ReserveConfigurationMap memory self, bool frozen) internal pure { self.data = - (self.data & FROZEN_MASK) | + (self.data & ~FROZEN_MASK) | (uint256(frozen ? 1 : 0) << IS_FROZEN_START_BIT_POSITION); } @@ -201,7 +201,7 @@ library ReserveConfiguration { * @return The frozen state */ function getFrozen(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~FROZEN_MASK) != 0; + return (self.data & FROZEN_MASK) != 0; } /** @@ -211,7 +211,7 @@ library ReserveConfiguration { */ function setPaused(DataTypes.ReserveConfigurationMap memory self, bool paused) internal pure { self.data = - (self.data & PAUSED_MASK) | + (self.data & ~PAUSED_MASK) | (uint256(paused ? 1 : 0) << IS_PAUSED_START_BIT_POSITION); } @@ -221,7 +221,7 @@ library ReserveConfiguration { * @return The paused state */ function getPaused(DataTypes.ReserveConfigurationMap memory self) internal pure returns (bool) { - return (self.data & ~PAUSED_MASK) != 0; + return (self.data & PAUSED_MASK) != 0; } /** @@ -238,7 +238,7 @@ library ReserveConfiguration { bool borrowable ) internal pure { self.data = - (self.data & BORROWABLE_IN_ISOLATION_MASK) | + (self.data & ~BORROWABLE_IN_ISOLATION_MASK) | (uint256(borrowable ? 1 : 0) << BORROWABLE_IN_ISOLATION_START_BIT_POSITION); } @@ -254,7 +254,7 @@ library ReserveConfiguration { function getBorrowableInIsolation( DataTypes.ReserveConfigurationMap memory self ) internal pure returns (bool) { - return (self.data & ~BORROWABLE_IN_ISOLATION_MASK) != 0; + return (self.data & BORROWABLE_IN_ISOLATION_MASK) != 0; } /** @@ -268,7 +268,7 @@ library ReserveConfiguration { bool siloed ) internal pure { self.data = - (self.data & SILOED_BORROWING_MASK) | + (self.data & ~SILOED_BORROWING_MASK) | (uint256(siloed ? 1 : 0) << SILOED_BORROWING_START_BIT_POSITION); } @@ -281,7 +281,7 @@ library ReserveConfiguration { function getSiloedBorrowing( DataTypes.ReserveConfigurationMap memory self ) internal pure returns (bool) { - return (self.data & ~SILOED_BORROWING_MASK) != 0; + return (self.data & SILOED_BORROWING_MASK) != 0; } /** @@ -294,7 +294,7 @@ library ReserveConfiguration { bool enabled ) internal pure { self.data = - (self.data & BORROWING_MASK) | + (self.data & ~BORROWING_MASK) | (uint256(enabled ? 1 : 0) << BORROWING_ENABLED_START_BIT_POSITION); } @@ -306,7 +306,7 @@ library ReserveConfiguration { function getBorrowingEnabled( DataTypes.ReserveConfigurationMap memory self ) internal pure returns (bool) { - return (self.data & ~BORROWING_MASK) != 0; + return (self.data & BORROWING_MASK) != 0; } /** @@ -321,7 +321,7 @@ library ReserveConfiguration { require(reserveFactor <= MAX_VALID_RESERVE_FACTOR, Errors.INVALID_RESERVE_FACTOR); self.data = - (self.data & RESERVE_FACTOR_MASK) | + (self.data & ~RESERVE_FACTOR_MASK) | (reserveFactor << RESERVE_FACTOR_START_BIT_POSITION); } @@ -333,7 +333,7 @@ library ReserveConfiguration { function getReserveFactor( DataTypes.ReserveConfigurationMap memory self ) internal pure returns (uint256) { - return (self.data & ~RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; + return (self.data & RESERVE_FACTOR_MASK) >> RESERVE_FACTOR_START_BIT_POSITION; } /** @@ -347,7 +347,7 @@ library ReserveConfiguration { ) 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); + self.data = (self.data & ~BORROW_CAP_MASK) | (borrowCap << BORROW_CAP_START_BIT_POSITION); } /** @@ -358,7 +358,7 @@ library ReserveConfiguration { function getBorrowCap( DataTypes.ReserveConfigurationMap memory self ) internal pure returns (uint256) { - return (self.data & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; + return (self.data & BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION; } /** @@ -372,7 +372,7 @@ library ReserveConfiguration { ) 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); + self.data = (self.data & ~SUPPLY_CAP_MASK) | (supplyCap << SUPPLY_CAP_START_BIT_POSITION); } /** @@ -383,7 +383,7 @@ library ReserveConfiguration { function getSupplyCap( DataTypes.ReserveConfigurationMap memory self ) internal pure returns (uint256) { - return (self.data & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; + return (self.data & SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION; } /** @@ -397,7 +397,7 @@ library ReserveConfiguration { ) 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); + self.data = (self.data & ~DEBT_CEILING_MASK) | (ceiling << DEBT_CEILING_START_BIT_POSITION); } /** @@ -408,7 +408,7 @@ library ReserveConfiguration { function getDebtCeiling( DataTypes.ReserveConfigurationMap memory self ) internal pure returns (uint256) { - return (self.data & ~DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; + return (self.data & DEBT_CEILING_MASK) >> DEBT_CEILING_START_BIT_POSITION; } /** @@ -426,7 +426,7 @@ library ReserveConfiguration { ); self.data = - (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) | + (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) | (liquidationProtocolFee << LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION); } @@ -439,7 +439,7 @@ library ReserveConfiguration { DataTypes.ReserveConfigurationMap memory self ) internal pure returns (uint256) { return - (self.data & ~LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; + (self.data & LIQUIDATION_PROTOCOL_FEE_MASK) >> LIQUIDATION_PROTOCOL_FEE_START_BIT_POSITION; } /** @@ -454,7 +454,7 @@ library ReserveConfiguration { require(unbackedMintCap <= MAX_VALID_UNBACKED_MINT_CAP, Errors.INVALID_UNBACKED_MINT_CAP); self.data = - (self.data & UNBACKED_MINT_CAP_MASK) | + (self.data & ~UNBACKED_MINT_CAP_MASK) | (unbackedMintCap << UNBACKED_MINT_CAP_START_BIT_POSITION); } @@ -466,7 +466,7 @@ library ReserveConfiguration { function getUnbackedMintCap( DataTypes.ReserveConfigurationMap memory self ) internal pure returns (uint256) { - return (self.data & ~UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; + return (self.data & UNBACKED_MINT_CAP_MASK) >> UNBACKED_MINT_CAP_START_BIT_POSITION; } /** @@ -479,7 +479,7 @@ library ReserveConfiguration { bool flashLoanEnabled ) internal pure { self.data = - (self.data & FLASHLOAN_ENABLED_MASK) | + (self.data & ~FLASHLOAN_ENABLED_MASK) | (uint256(flashLoanEnabled ? 1 : 0) << FLASHLOAN_ENABLED_START_BIT_POSITION); } @@ -491,7 +491,7 @@ library ReserveConfiguration { function getFlashLoanEnabled( DataTypes.ReserveConfigurationMap memory self ) internal pure returns (bool) { - return (self.data & ~FLASHLOAN_ENABLED_MASK) != 0; + return (self.data & FLASHLOAN_ENABLED_MASK) != 0; } /** @@ -504,7 +504,7 @@ library ReserveConfiguration { bool active ) internal pure { self.data = - (self.data & VIRTUAL_ACC_ACTIVE_MASK) | + (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) | (uint256(active ? 1 : 0) << VIRTUAL_ACC_START_BIT_POSITION); } @@ -518,7 +518,7 @@ library ReserveConfiguration { function getIsVirtualAccActive( DataTypes.ReserveConfigurationMap memory self ) internal pure returns (bool) { - return (self.data & ~VIRTUAL_ACC_ACTIVE_MASK) != 0; + return (self.data & VIRTUAL_ACC_ACTIVE_MASK) != 0; } /** @@ -535,10 +535,10 @@ library ReserveConfiguration { uint256 dataLocal = self.data; return ( - (dataLocal & ~ACTIVE_MASK) != 0, - (dataLocal & ~FROZEN_MASK) != 0, - (dataLocal & ~BORROWING_MASK) != 0, - (dataLocal & ~PAUSED_MASK) != 0 + (dataLocal & ACTIVE_MASK) != 0, + (dataLocal & FROZEN_MASK) != 0, + (dataLocal & BORROWING_MASK) != 0, + (dataLocal & PAUSED_MASK) != 0 ); } @@ -557,11 +557,11 @@ library ReserveConfiguration { 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 & 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 ); } @@ -577,8 +577,8 @@ library ReserveConfiguration { uint256 dataLocal = self.data; return ( - (dataLocal & ~BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, - (dataLocal & ~SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION + (dataLocal & BORROW_CAP_MASK) >> BORROW_CAP_START_BIT_POSITION, + (dataLocal & SUPPLY_CAP_MASK) >> SUPPLY_CAP_START_BIT_POSITION ); } } From 93020381fafcd4a098b0d55030b0e4a2ad2f0149 Mon Sep 17 00:00:00 2001 From: Ian Flexa <85500650+ianflexa@users.noreply.github.com> Date: Thu, 26 Sep 2024 06:20:21 -0400 Subject: [PATCH 04/72] feat: deficit tracking and excess debt removal (#61) Tracking of reserve deficit and instant removal of bad debt. This newly introduced feature allows the removal of excess debt. When a users collateral if fully liquidated but debt is left in the protocol, the debt generates yield although it is expected to never be payed back. With the reserve deficit tracking, this debt is immediately burned and tracked in a local state. In addition a new method is introduced which allows burning aTokens in order the resolve the realized debt. --------- Co-authored-by: Lukas --- docs/Aave-v3.3-features.md | 82 +++++ docs/v3.3-properties.md | 26 ++ .../helpers/UiPoolDataProviderV3.sol | 1 + .../interfaces/IUiPoolDataProviderV3.sol | 2 + src/contracts/instances/PoolInstance.sol | 8 + src/contracts/interfaces/IPool.sol | 40 +++ .../protocol/libraries/helpers/Errors.sol | 3 + .../libraries/logic/LiquidationLogic.sol | 196 ++++++++++- .../protocol/libraries/logic/ReserveLogic.sol | 77 ++++ .../libraries/logic/ValidationLogic.sol | 24 ++ .../protocol/libraries/types/DataTypes.sol | 5 +- src/contracts/protocol/pool/Pool.sol | 59 ++++ tests/protocol/pool/Pool.Deficit.sol | 182 ++++++++++ tests/protocol/pool/Pool.Liquidations.t.sol | 331 +++++++++++++++++- 14 files changed, 999 insertions(+), 37 deletions(-) create mode 100644 docs/Aave-v3.3-features.md create mode 100644 docs/v3.3-properties.md create mode 100644 tests/protocol/pool/Pool.Deficit.sol diff --git a/docs/Aave-v3.3-features.md b/docs/Aave-v3.3-features.md new file mode 100644 index 00000000..893ac3f7 --- /dev/null +++ b/docs/Aave-v3.3-features.md @@ -0,0 +1,82 @@ +## Aave v3.3 features + +Aave v3.3 is an upgrade on top of Aave 3.2 + +
+
+ +## Features + +
+ +### 1. Bad Debt Management + +On Aave v3, certain liquidation scenarios of an account can result in a permanently bad debt situation. This occurs when the total collateral liquidated is insufficient to cover the repayment of the debt, leaving the account with zero collateral and some remaining debt. We understand that such debt is unlikely to be repaid and adversely affects the protocol by continuing to accrue interest. + +To mitigate the creation of new bad debt accounts post-liquidation and to halt further interest accrual on such liabilities, the bad debt feature introduces a new verification step during liquidation. This step checks the total collateral and total debt values of the account post-liquidation and repayment. If an account ends up with zero collateral and non-zero debt, a flag is triggered, and any remaining debt in the account is burned and the new deficit created is accounted to the reserve. + +For accounts already in a bad debt situation, this feature enables the permissionless burning of debt tokens. It employs the same verification criteria, checking if the account's collateral equals zero while its debt remains non-zero. + +In terms of implementation, the feature introduces an `isBadDebt` flag during a liquidation call. This flag checks whether the liquidation will result in a bad debt situation by comparing whether the total borrower’s collateral equals the collateral liquidated in the base currency and whether the total borrower’s debt exceeds the debt repaid in base currency. When this flag is activated, the variable debt tokens of the borrower are burned, and it is accounted to the equivalent reserve as a deficit. + +For accounts already in bad debt, introduces a `burnBadDebt` function to the Pool contract. This function accepts a list of accounts in bad debt to be processed. It validates through `validateUserBadDebt` that the account has zero collateral in base currency and non-zero debt before burning all variable debt tokens of the account and accounting the deficit to the equivalent reserve. + +The new `deficit` data is introduced to the `ReserveData` struct by re-utilizing the deprecated stableBorrowRate (`__deprecatedStableBorrowRate`) storage, and can be fetched via the new `getReserveDeficit` function in the Pool contract. + +The deficit reduction of a reserve is introduced via the `eliminateReserveDeficit` function in the Pool contract, where a permissioned entity (the `CoverageAdmin`) can burn his aTokens to decrease the deficit of the equivalent reserve. This function checks if the reserve has any deficit and validates the coverage admin's health factor and LTV before reducing the deficit. + +**Misc considerations & acknowledged limitations** + +- For the scope of this feature we define a bad debt situation as an account that has zero collateral but retains some level of debt. Accounts with any remaining collateral potentially can be overcollateralized again. +- Currently, there are no additional incentives for burning the debt of accounts that are already in bad debt. + +**Gas Analysis** + +A gas consumption analysis was conducted to evaluate the impact of implementing the bad debt feature. On average, the increase in gas usage is approximately 0.26%, with a potential maximum of 11%, depending on the number of variable debt tokens held by the borrower. We conclude that integrating this feature is beneficial despite a moderate increase in gas costs. + +For accounts already in bad debt, the gas cost for executing the external function that batches multiple accounts shows an incremental increase of about 30% per account added to the batch. + +``` +| General Pool.Liquidations.t.sol | | | | | | +|---------------------------------------------------------|------------|--------|--------|--------|------------| +| | | | | | | +| Function Name | min | avg | median | max | increase | +| burnBadDebt | 84480 | 134140 | 134140 | 183800 | | +| liquidationCall (without bad debt feature) | 53294 | 230728 | 324231 | 376846 | | +| liquidationCall (with bad debt feature) | 53421 | 231041 | 325214 | 417368 | 0.23 - 11% | +|---------------------------------------------------------|------------|--------|--------|--------|------------| + + +| Isolated Tests: Liquidation without bad debt occurency | | | | | | +|---------------------------------------------------------|------------|--------|--------|--------|----------| +| | | | | | | +| Function Name | min | avg | median | max | increase | +| liquidationCall (without bad debt feature) | 372084 | 372084 | 372084 | 372084 | | +| liquidationCall (with bad debt feature) | 373068 | 373068 | 373068 | 373068 | 0.26% | +|---------------------------------------------------------|------------|--------|--------|--------|----------| + + +| Isolated Tests: Liquidation with bad debt occurency | | | | | | +|---------------------------------------------------------|------------|--------|--------|--------|----------| +| | | | | | | +| Function Name | min | avg | median | max | increase | +| liquidationCall (without bad debt feature) | 360782 | 360782 | 360782 | 360782 | | +| liquidationCall (with bad debt feature) | 362937 | 362937 | 362937 | 362937 | 0.59% | +|---------------------------------------------------------|------------|--------|--------|--------|----------| + + +| Isolated Tests: Batching Accounts in Bad Debt | | | | | | +|---------------------------------------------------------|-----------|--------|--------|--------|-----------| +| | | | | | | +| Function Name | min | avg | median | max | increase | +| burnBadDebt - 1 account | 183800 | 183800 | 183800 | 183800 | | +| burnBadDebt - 2 accounts | 243768 | 243768 | 243768 | 243768 | 33.68% | +| burnBadDebt - 4 accounts | 363704 | 363704 | 363704 | 363704 | 50.53% | +|---------------------------------------------------------|-----------|--------------------------|-----------| +``` + +
+ +--- + +
diff --git a/docs/v3.3-properties.md b/docs/v3.3-properties.md new file mode 100644 index 00000000..7595138f --- /dev/null +++ b/docs/v3.3-properties.md @@ -0,0 +1,26 @@ +## Aave v3.3 features properties + +Formal properties in natural language of the 3.2 features. + +
+
+ +## Properties + +
+ +### 1. Bad Debt Management + +- A bad debt liquidation event should only occur when the liquidation results in the user's total collateral across all reserves being zero in the base currency, while the total debt across all reserves remains non-zero in the base currency. +- A user should only be considered in bad debt if their total collateral across all reserves is zero in the base currency while their total debt across all reserves remains non-zero in the base currency or if they have active borrowing. +- After a bad debt liquidation, the user's borrows should be zero. +- For accounts already in bad debt that are cleaned via the burnBadDebt function, the borrow balance should be zero after cleaning. +- The deficit of all reserves should initially be zero. +- The deficit of reserves that cannot be borrowed or have no borrows must be zero. +- In the event of a bad debt liquidation, the reserve deficit incremented should be the difference between the user's total debt and the user's actual debt to liquidate for the equivalent reserve. +- For accounts already in bad debt and that are cleaned via the `burnBadDebt` function, the increase in the reserve deficit should be equal to the user's debt balance for the equivalent reserve. +- The deficit of all reserves should only be reduced by an authorized entity called the coverage admin. +- The deficit of a reserve should only be reduced if reserve deficit is not zero. +- The deficit of a reserve should only be reduced if the coverage admin has the equivalent aToken in their balance. +- The deficit of a reserve should only be reduced after validating the health factor and the ltv of the coverage admin. +- The maximum amount by which the deficit of a reserve can be reduced should not exceed the current reserve deficit. diff --git a/src/contracts/helpers/UiPoolDataProviderV3.sol b/src/contracts/helpers/UiPoolDataProviderV3.sol index d1d4a53e..5938b958 100644 --- a/src/contracts/helpers/UiPoolDataProviderV3.sol +++ b/src/contracts/helpers/UiPoolDataProviderV3.sol @@ -127,6 +127,7 @@ contract UiPoolDataProviderV3 is IUiPoolDataProviderV3 { } catch {} // v3 only + reserveData.deficit = uint128(pool.getReserveDeficit(reserveData.underlyingAsset)); reserveData.debtCeiling = reserveConfigurationMap.getDebtCeiling(); reserveData.debtCeilingDecimals = poolDataProvider.getDebtCeilingDecimals(); (reserveData.borrowCap, reserveData.supplyCap) = reserveConfigurationMap.getCaps(); diff --git a/src/contracts/helpers/interfaces/IUiPoolDataProviderV3.sol b/src/contracts/helpers/interfaces/IUiPoolDataProviderV3.sol index 3280d75b..04ef88e7 100644 --- a/src/contracts/helpers/interfaces/IUiPoolDataProviderV3.sol +++ b/src/contracts/helpers/interfaces/IUiPoolDataProviderV3.sol @@ -52,6 +52,8 @@ interface IUiPoolDataProviderV3 { // v3.1 bool virtualAccActive; uint128 virtualUnderlyingBalance; + // v3.3 + uint128 deficit; } struct UserReserveData { diff --git a/src/contracts/instances/PoolInstance.sol b/src/contracts/instances/PoolInstance.sol index 4b1596d8..58dd74cd 100644 --- a/src/contracts/instances/PoolInstance.sol +++ b/src/contracts/instances/PoolInstance.sol @@ -15,10 +15,18 @@ contract PoolInstance is 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 + * @dev Initializes the reserves deficit to zero by reusing the `__deprecatedStableBorrowRate` storage slot. * @param provider The address of the PoolAddressesProvider */ function initialize(IPoolAddressesProvider provider) external virtual override initializer { require(provider == ADDRESSES_PROVIDER, Errors.INVALID_ADDRESSES_PROVIDER); + uint256 reservesListCount = _reservesCount; + for (uint256 i = 0; i < reservesListCount; i++) { + address asset = _reservesList[i]; + if (asset != address(0)) { + _reserves[asset].deficit = 0; + } + } } function getRevision() internal pure virtual override returns (uint256) { diff --git a/src/contracts/interfaces/IPool.sol b/src/contracts/interfaces/IPool.sol index 4ed19d05..5a809333 100644 --- a/src/contracts/interfaces/IPool.sol +++ b/src/contracts/interfaces/IPool.sol @@ -185,6 +185,14 @@ interface IPool { uint256 variableBorrowIndex ); + /** + * @dev Emitted when the deficit of a reserve is covered. + * @param reserve The address of the underlying asset of the reserve + * @param amountCovered The amount of deficit covered + * @param currentDeficit The current deficit of the reserve. + */ + event BadDebtCovered(address indexed reserve, uint256 amountCovered, uint256 currentDeficit); + /** * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. * @param reserve The address of the reserve @@ -192,6 +200,14 @@ interface IPool { */ event MintedToTreasury(address indexed reserve, uint256 amountMinted); + /** + * + * @param user The user address where the bad debt will be burned + * @param debtAsset The address of the underlying borrowed asset to be burned + * @param amount The amount to burn + */ + event BadDebtBurned(address indexed user, address indexed debtAsset, uint256 amount); + /** * @notice Mints an `amount` of aTokens to the `onBehalfOf` * @param asset The address of the underlying asset to mint @@ -797,6 +813,30 @@ interface IPool { */ function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; + /** + * @notice Validate and burn all bad debt of users. + * @dev A user is considered to be in bad debt if, after liquidation, they have all collateral liquidated + * while leaving some debt unpaid. This condition indicates that the user's debt is unlikely to be repaid, + * necessitating a debt write-off to prevent further interest accrual. + * @param users The array of addresses in bad debt. + */ + function burnBadDebt(address[] calldata users) external; + + /** + * @notice It Covers the deficit of a specified reserve by burning the equivalent aToken `amount`. + * @dev The deficit of a reserve can occur due to situations where borrowed assets are not repaid, leading to bad debt. + * @param asset The address of the underlying asset to cover the dificit. + * @param amount The amount to be covered. + */ + function eliminateReserveDeficit(address asset, uint256 amount) external; + + /** + * @notice Returns the current deficit of a reserve. + * @param asset The address of the underlying asset of the reserve + * @return The the current deficit + */ + function getReserveDeficit(address asset) external view returns (uint256); + /** * @notice Gets the address of the external FlashLoanLogic */ diff --git a/src/contracts/protocol/libraries/helpers/Errors.sol b/src/contracts/protocol/libraries/helpers/Errors.sol index d3f564cb..93dd126e 100644 --- a/src/contracts/protocol/libraries/helpers/Errors.sol +++ b/src/contracts/protocol/libraries/helpers/Errors.sol @@ -100,4 +100,7 @@ library Errors { 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 + string public constant USER_NOT_IN_BAD_DEBT = '101'; // The user is not in bad debt + string public constant CALLER_NOT_COVERAGE_ADMIN = '102'; // The caller of the function is not the coverage admin + string public constant RESERVE_NOT_IN_DEFICIT = '103'; // The reserve is not in deficit } diff --git a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol index 8f4c35f6..07fbb152 100644 --- a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -17,6 +17,7 @@ import {EModeConfiguration} from '../../libraries/configuration/EModeConfigurati import {IAToken} from '../../../interfaces/IAToken.sol'; import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; +import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; /** * @title LiquidationLogic library @@ -31,10 +32,12 @@ library LiquidationLogic { using UserConfiguration for DataTypes.UserConfigurationMap; using ReserveConfiguration for DataTypes.ReserveConfigurationMap; using GPv2SafeERC20 for IERC20; + using SafeCast for uint256; // See `IPool` for descriptions event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + event BadDebtBurned(address indexed user, address indexed debtAsset, uint256 amount); event LiquidationCall( address indexed collateralAsset, address indexed debtAsset, @@ -74,6 +77,12 @@ library LiquidationLogic { uint256 liquidationBonus; uint256 healthFactor; uint256 liquidationProtocolFeeAmount; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 collateralToLiquidateInBaseCurrency; + uint256 debtToRepayInBaseCurrency; + address collateralPriceSource; + address debtPriceSource; IAToken collateralAToken; DataTypes.ReserveCache debtReserveCache; } @@ -82,7 +91,7 @@ library LiquidationLogic { * @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 + * @dev Emits the `LiquidationCall()` event, and the `BadDebtBurned()` event if the liquidation results in bad debt * @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 @@ -104,7 +113,14 @@ library LiquidationLogic { vars.debtReserveCache = debtReserve.cache(); debtReserve.updateState(vars.debtReserveCache); - (, , , , vars.healthFactor, ) = GenericLogic.calculateUserAccountData( + ( + vars.totalCollateralInBaseCurrency, + vars.totalDebtInBaseCurrency, + , + , + vars.healthFactor, + + ) = GenericLogic.calculateUserAccountData( reservesData, reservesList, eModeCategories, @@ -153,7 +169,9 @@ library LiquidationLogic { ( vars.actualCollateralToLiquidate, vars.actualDebtToLiquidate, - vars.liquidationProtocolFeeAmount + vars.liquidationProtocolFeeAmount, + vars.collateralToLiquidateInBaseCurrency, + vars.debtToRepayInBaseCurrency ) = _calculateAvailableCollateralToLiquidate( collateralReserve, vars.debtReserveCache, @@ -165,7 +183,14 @@ library LiquidationLogic { IPriceOracleGetter(params.priceOracle) ); - if (vars.userTotalDebt == vars.actualDebtToLiquidate) { + bool isBadDebt = _isBadDebtScenario( + vars.totalCollateralInBaseCurrency, + vars.collateralToLiquidateInBaseCurrency, + vars.totalDebtInBaseCurrency, + vars.debtToRepayInBaseCurrency + ); + + if (vars.userTotalDebt == vars.actualDebtToLiquidate || isBadDebt) { userConfig.setBorrowing(debtReserve.id, false); } @@ -179,7 +204,7 @@ library LiquidationLogic { emit ReserveUsedAsCollateralDisabled(params.collateralAsset, params.user); } - _burnDebtTokens(params, vars); + _burnDebtTokens(params, vars, debtReserve, isBadDebt); debtReserve.updateInterestRatesAndVirtualBalance( vars.debtReserveCache, @@ -220,6 +245,11 @@ library LiquidationLogic { ); } + // burn bad debt if necessary + if (isBadDebt && userConfig.isBorrowingAny()) { + _burnBadDebt(reservesData, reservesList, userConfig, params.reservesCount, params.user); + } + // Transfers the debt asset being repaid to the aToken, where the liquidity is kept IERC20(params.debtAsset).safeTransferFrom( msg.sender, @@ -244,6 +274,42 @@ library LiquidationLogic { ); } + /** + * @notice Validates a user's bad debt situation and subsequently burning the debt. + * @param reservesData The state 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 burn the bad debt + * @param userEModeCategory The users active efficiency mode category + * @param reservesCount The number of available reserves + * @param oracle The price oracle + */ + function executeBadDebtCleanup( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.UserConfigurationMap storage userConfig, + address user, + uint8 userEModeCategory, + uint256 reservesCount, + address oracle + ) external { + ValidationLogic.validateUserBadDebt( + reservesData, + reservesList, + eModeCategories, + DataTypes.CalculateUserAccountDataParams({ + userConfig: userConfig, + reservesCount: reservesCount, + user: user, + oracle: oracle, + userEModeCategory: userEModeCategory + }) + ); + _burnBadDebt(reservesData, reservesList, userConfig, reservesCount, user); + } + /** * @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. @@ -318,18 +384,34 @@ library LiquidationLogic { } /** - * @notice Burns the debt tokens of the user up to the amount being repaid by the liquidator. + * @notice Burns the debt tokens of the user up to the amount being repaid by the liquidator + * or the entire debt if the user is in a bad debt scenario. * @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 + LiquidationCallLocalVars memory vars, + DataTypes.ReserveData storage debtReserve, + bool isBadDebt ) internal { vars.debtReserveCache.nextScaledVariableDebt = IVariableDebtToken( vars.debtReserveCache.variableDebtTokenAddress - ).burn(params.user, vars.actualDebtToLiquidate, vars.debtReserveCache.nextVariableBorrowIndex); + ).burn( + params.user, + isBadDebt ? vars.userTotalDebt : vars.actualDebtToLiquidate, + vars.debtReserveCache.nextVariableBorrowIndex + ); + + if (isBadDebt) { + debtReserve.deficit += (vars.userTotalDebt - vars.actualDebtToLiquidate).toUint128(); + emit BadDebtBurned( + params.user, + params.debtAsset, + vars.userTotalDebt - vars.actualDebtToLiquidate + ); + } } /** @@ -378,6 +460,8 @@ library LiquidationLogic { uint256 debtAmountNeeded; uint256 liquidationProtocolFeePercentage; uint256 liquidationProtocolFee; + uint256 collateralToLiquidateInBaseCurrency; + uint256 debtToRepayInBaseCurrency; } /** @@ -395,6 +479,8 @@ library LiquidationLogic { * @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 + * @return The collateral amount to liquidate in the base currency used by the price feed + * @return The amount to repay with the liquidation in the base currency used by the price feed */ function _calculateAvailableCollateralToLiquidate( DataTypes.ReserveData storage collateralReserve, @@ -405,7 +491,7 @@ library LiquidationLogic { uint256 userCollateralBalance, uint256 liquidationBonus, IPriceOracleGetter oracle - ) internal view returns (uint256, uint256, uint256) { + ) internal view returns (uint256, uint256, uint256, uint256, uint256) { AvailableCollateralToLiquidateLocalVars memory vars; vars.collateralPrice = oracle.getAssetPrice(collateralAsset); @@ -439,6 +525,14 @@ library LiquidationLogic { vars.debtAmountNeeded = debtToCover; } + vars.collateralToLiquidateInBaseCurrency = + (vars.collateralAmount * vars.collateralPrice) / + vars.collateralAssetUnit; + + vars.debtToRepayInBaseCurrency = + (vars.debtAmountNeeded * vars.debtAssetPrice) / + vars.debtAssetUnit; + if (vars.liquidationProtocolFeePercentage != 0) { vars.bonusCollateral = vars.collateralAmount - @@ -447,14 +541,84 @@ library LiquidationLogic { vars.liquidationProtocolFee = vars.bonusCollateral.percentMul( vars.liquidationProtocolFeePercentage ); + vars.collateralAmount -= vars.liquidationProtocolFee; + } + return ( + vars.collateralAmount, + vars.debtAmountNeeded, + vars.liquidationProtocolFee, + vars.collateralToLiquidateInBaseCurrency, + vars.debtToRepayInBaseCurrency + ); + } - return ( - vars.collateralAmount - vars.liquidationProtocolFee, - vars.debtAmountNeeded, - vars.liquidationProtocolFee - ); - } else { - return (vars.collateralAmount, vars.debtAmountNeeded, 0); + /** + * @notice Checks whether a liquidation will result in a bad debt situation for the user. + * @dev This function is invoked during the liquidation, after calculating the amounts related + * to collateral and debt that are to be liquidated and repaid, respectively. + * @param totalCollateralInBaseCurrency The total collateral of the user in the base currency used by the price feed + * @param collateralToLiquidateInBaseCurrency The collateral to liquidate in the base currency used by the price feed + * @param totalDebtInBaseCurrency The total debt of the user in the base currency used by the price feed + * @param debtToRepayInBaseCurrency The amount to repay with the liquidation in the base currency used by the price feed + * @return True if the liquidation will result in bad debt, false otherwise + */ + function _isBadDebtScenario( + uint256 totalCollateralInBaseCurrency, + uint256 collateralToLiquidateInBaseCurrency, + uint256 totalDebtInBaseCurrency, + uint256 debtToRepayInBaseCurrency + ) internal pure returns (bool) { + bool collateralIsZeroAfterLiquidation = totalCollateralInBaseCurrency == + collateralToLiquidateInBaseCurrency; + bool debtIsZeroAfterLiquidation = totalDebtInBaseCurrency == debtToRepayInBaseCurrency; + return collateralIsZeroAfterLiquidation && !debtIsZeroAfterLiquidation; + } + + /** + * @notice Remove a user's bad debt by burning debt tokens. + * @dev This function iterates through all active reserves where the user has a debt position, + * updates their state, and performs the necessary burn. + * @param reservesData The state of all the reserves + * @param reservesList The addresses of all the active reserves + * @param userConfig The user configuration + * @param reservesCount The total number of valid reserves + * @param user The user from which the debt will be burned. + */ + function _burnBadDebt( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + DataTypes.UserConfigurationMap storage userConfig, + uint256 reservesCount, + address user + ) internal { + for (uint256 i; i < reservesCount; i++) { + if (!userConfig.isBorrowing(i)) { + continue; + } + + address reserveAddress = reservesList[i]; + if (reserveAddress == address(0)) { + continue; + } + + DataTypes.ReserveData storage currentReserve = reservesData[reserveAddress]; + DataTypes.ReserveCache memory reserveCache = currentReserve.cache(); + + currentReserve.updateState(reserveCache); + currentReserve.updateInterestRatesAndVirtualBalance(reserveCache, reserveAddress, 0, 0); + + userConfig.setBorrowing(i, false); + + IVariableDebtToken vToken = IVariableDebtToken(currentReserve.variableDebtTokenAddress); + // Fetch the scaled balance first as it is more gas-efficient + uint256 userDebt = vToken.scaledBalanceOf(user); + if (userDebt != 0) { + // Scale up the debt balance + userDebt = userDebt.rayMul(reserveCache.nextVariableBorrowIndex); + vToken.burn(user, userDebt, reserveCache.nextVariableBorrowIndex); + currentReserve.deficit += userDebt.toUint128(); + emit BadDebtBurned(user, reserveAddress, userDebt); + } } } } diff --git a/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/src/contracts/protocol/libraries/logic/ReserveLogic.sol index dd5c637d..ecb869b8 100644 --- a/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ b/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -12,6 +12,9 @@ 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'; +import {IAToken} from '../../../interfaces/IAToken.sol'; +import {UserConfiguration} from '../configuration/UserConfiguration.sol'; +import {ValidationLogic} from './ValidationLogic.sol'; /** * @title ReserveLogic library @@ -25,6 +28,7 @@ library ReserveLogic { using GPv2SafeERC20 for IERC20; using ReserveLogic for DataTypes.ReserveData; using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; // See `IPool` for descriptions event ReserveDataUpdated( @@ -36,6 +40,9 @@ library ReserveLogic { uint256 variableBorrowIndex ); + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + event BadDebtCovered(address indexed reserve, uint256 amountDecreased, uint256 currentDeficit); + /** * @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 @@ -310,4 +317,74 @@ library ReserveLogic { return reserveCache; } + + /** + * @notice Reduces a portion or all of the deficit of a specified reserve by burning the equivalent aToken `amount`. + * @dev Emits the `BadDebtCovered() event`. + * @dev If the coverage admin covers its entire balance, `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 eliminateDeficit function + */ + function eliminateDeficit( + 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 { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + uint256 currentDeficit = reserve.deficit; + + require(currentDeficit != 0, Errors.RESERVE_NOT_IN_DEFICIT); + + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + reserve.updateState(reserveCache); + + uint256 userBalance = IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender).rayMul( + reserveCache.nextLiquidityIndex + ); + + uint256 deficitToDecrease = params.amount; + + if (params.amount > currentDeficit) { + deficitToDecrease = currentDeficit; + } + + bool isCollateral = userConfig.isUsingAsCollateral(reserve.id); + + if (isCollateral && deficitToDecrease == userBalance) { + userConfig.setUsingAsCollateral(reserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); + } + + IAToken(reserveCache.aTokenAddress).burn( + msg.sender, + reserveCache.aTokenAddress, + deficitToDecrease, + reserveCache.nextLiquidityIndex + ); + + if (isCollateral && userConfig.isBorrowingAny()) { + ValidationLogic.validateHFAndLtv( + reservesData, + reservesList, + eModeCategories, + userConfig, + params.asset, + msg.sender, + params.reservesCount, + params.oracle, + params.userEModeCategory + ); + } + + reserve.deficit -= deficitToDecrease.toUint128(); + + emit BadDebtCovered(params.asset, deficitToDecrease, reserve.deficit); + } } diff --git a/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/src/contracts/protocol/libraries/logic/ValidationLogic.sol index e08a30e8..b365804b 100644 --- a/src/contracts/protocol/libraries/logic/ValidationLogic.sol +++ b/src/contracts/protocol/libraries/logic/ValidationLogic.sol @@ -639,4 +639,28 @@ library ValidationLogic { } return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); } + + /** + * @notice Validates that the user is in a bad debt situation. + * @dev This function ensures the presence of bad debt, defined as zero collateral value + * with non-zero debt value or active borrowing. Reverts if the user is not in this state. + * @param reservesData The state 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 + */ + function validateUserBadDebt( + mapping(address => DataTypes.ReserveData) storage reservesData, + mapping(uint256 => address) storage reservesList, + mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, + DataTypes.CalculateUserAccountDataParams memory params + ) internal view { + (uint256 totalCollateralInBaseCurrency, uint256 totalDebtInBaseCurrency, , , , ) = GenericLogic + .calculateUserAccountData(reservesData, reservesList, eModeCategories, params); + require( + totalCollateralInBaseCurrency == 0 && + (totalDebtInBaseCurrency != 0 || params.userConfig.isBorrowingAny()), + Errors.USER_NOT_IN_BAD_DEBT + ); + } } diff --git a/src/contracts/protocol/libraries/types/DataTypes.sol b/src/contracts/protocol/libraries/types/DataTypes.sol index 13c12c99..9f72b2ab 100644 --- a/src/contracts/protocol/libraries/types/DataTypes.sol +++ b/src/contracts/protocol/libraries/types/DataTypes.sol @@ -50,8 +50,9 @@ library DataTypes { uint128 variableBorrowIndex; //the current variable borrow rate. Expressed in ray uint128 currentVariableBorrowRate; - // DEPRECATED on v3.2.0 - uint128 __deprecatedStableBorrowRate; + /// @notice reused `__deprecatedStableBorrowRate` storage from pre 3.2 + // the current accumulate deficit in underlying tokens + uint128 deficit; //timestamp of last update uint40 lastUpdateTimestamp; //the id of the reserve. Represents the position in the list of the active reserves diff --git a/src/contracts/protocol/pool/Pool.sol b/src/contracts/protocol/pool/Pool.sol index 4f62506d..8d12e00f 100644 --- a/src/contracts/protocol/pool/Pool.sol +++ b/src/contracts/protocol/pool/Pool.sol @@ -17,6 +17,7 @@ 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 {IAccessControl} from '../../dependencies/openzeppelin/contracts/IAccessControl.sol'; import {PoolStorage} from './PoolStorage.sol'; /** @@ -64,6 +65,14 @@ abstract contract Pool is VersionedInitializable, PoolStorage, IPool { _; } + /** + * @dev Only aToken Burner can call functions marked by this modifier. + */ + modifier onlyCoverageAdmin() { + _onlyCoverageAdmin(); + _; + } + function _onlyPoolConfigurator() internal view virtual { require( ADDRESSES_PROVIDER.getPoolConfigurator() == msg.sender, @@ -85,6 +94,13 @@ abstract contract Pool is VersionedInitializable, PoolStorage, IPool { ); } + function _onlyCoverageAdmin() internal view virtual { + require( + IAccessControl(ADDRESSES_PROVIDER.getACLManager()).hasRole('COVERAGE_ADMIN', msg.sender), + Errors.CALLER_NOT_COVERAGE_ADMIN + ); + } + /** * @dev Constructor. * @param provider The address of the PoolAddressesProvider contract @@ -830,6 +846,49 @@ abstract contract Pool is VersionedInitializable, PoolStorage, IPool { ); } + /// @inheritdoc IPool + function burnBadDebt(address[] calldata users) external virtual override { + for (uint256 i; i < users.length; i++) { + address user = users[i]; + LiquidationLogic.executeBadDebtCleanup( + _reserves, + _reservesList, + _eModeCategories, + _usersConfig[user], + user, + _usersEModeCategory[user], + _reservesCount, + ADDRESSES_PROVIDER.getPriceOracle() + ); + } + } + + /// @inheritdoc IPool + function eliminateReserveDeficit( + address asset, + uint256 amount + ) external override onlyCoverageAdmin { + ReserveLogic.eliminateDeficit( + _reserves, + _reservesList, + _eModeCategories, + _usersConfig[msg.sender], + DataTypes.ExecuteWithdrawParams({ + asset: asset, + amount: amount, + to: address(0), // not used + reservesCount: _reservesCount, + oracle: ADDRESSES_PROVIDER.getPriceOracle(), + userEModeCategory: _usersEModeCategory[msg.sender] + }) + ); + } + + /// @inheritdoc IPool + function getReserveDeficit(address asset) external view virtual returns (uint256) { + return _reserves[asset].deficit; + } + /// @inheritdoc IPool function getFlashLoanLogic() external pure returns (address) { return address(FlashLoanLogic); diff --git a/tests/protocol/pool/Pool.Deficit.sol b/tests/protocol/pool/Pool.Deficit.sol new file mode 100644 index 00000000..8221f95c --- /dev/null +++ b/tests/protocol/pool/Pool.Deficit.sol @@ -0,0 +1,182 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import 'forge-std/Test.sol'; +import 'forge-std/StdStorage.sol'; + +import {IERC20} from '../../../src/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; +import {IPool, DataTypes} from '../../../src/contracts/interfaces/IPool.sol'; +import {Errors} from '../../../src/contracts/protocol/libraries/helpers/Errors.sol'; +import {IAaveOracle} from '../../../src/contracts/interfaces/IAaveOracle.sol'; +import {TestnetProcedures} from '../../utils/TestnetProcedures.sol'; +import {IAccessControl} from '../../../src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol'; + +contract PoolDeficitTests is TestnetProcedures { + using stdStorage for StdStorage; + + event BadDebtCovered(address indexed reserve, uint256 amountDecreased, uint256 currentDeficit); + + function setUp() public virtual { + initTestEnvironment(); + } + + function test_eliminateReserveDeficit(address coverageAdmin, uint120 supplyAmount) public { + _filterAddresses(coverageAdmin); + (address reserveToken, uint256 currentDeficit) = _createReserveDeficit(supplyAmount); + + vm.prank(poolAdmin); + IAccessControl(report.aclManager).grantRole('COVERAGE_ADMIN', coverageAdmin); + + deal(reserveToken, coverageAdmin, currentDeficit); + + vm.startPrank(coverageAdmin); + IERC20(reserveToken).approve(report.poolProxy, UINT256_MAX); + contracts.poolProxy.supply(reserveToken, currentDeficit, coverageAdmin, 0); + + // eliminate deficit + vm.expectEmit(address(contracts.poolProxy)); + emit BadDebtCovered(reserveToken, currentDeficit, 0); + contracts.poolProxy.eliminateReserveDeficit(reserveToken, currentDeficit); + } + + function test_eliminateReserveDeficit_parcial( + address coverageAdmin, + uint120 supplyAmount, + uint120 amountToCover + ) public { + _filterAddresses(coverageAdmin); + (address reserveToken, uint256 currentDeficit) = _createReserveDeficit(supplyAmount); + vm.assume(amountToCover != 0 && amountToCover < currentDeficit); + + vm.prank(poolAdmin); + IAccessControl(report.aclManager).grantRole('COVERAGE_ADMIN', coverageAdmin); + + deal(reserveToken, coverageAdmin, currentDeficit); + + vm.startPrank(coverageAdmin); + IERC20(reserveToken).approve(report.poolProxy, UINT256_MAX); + contracts.poolProxy.supply(reserveToken, currentDeficit, coverageAdmin, 0); + + // eliminate deficit + vm.expectEmit(address(contracts.poolProxy)); + emit BadDebtCovered(reserveToken, amountToCover, currentDeficit - amountToCover); + contracts.poolProxy.eliminateReserveDeficit(reserveToken, amountToCover); + } + + function test_reverts_eliminateReserveDeficit_invalid_hf( + address coverageAdmin, + uint120 supplyAmount, + uint120 cAdminBorrowAmount + ) public { + _filterAddresses(coverageAdmin); + (address reserveToken, uint256 currentDeficit) = _createReserveDeficit(supplyAmount); + vm.assume(cAdminBorrowAmount != 0 && uint256(cAdminBorrowAmount) * 2 <= currentDeficit); + + vm.prank(poolAdmin); + IAccessControl(report.aclManager).grantRole('COVERAGE_ADMIN', coverageAdmin); + + deal(reserveToken, coverageAdmin, currentDeficit); + + vm.startPrank(coverageAdmin); + IERC20(reserveToken).approve(report.poolProxy, UINT256_MAX); + contracts.poolProxy.supply(reserveToken, currentDeficit, coverageAdmin, 0); + contracts.poolProxy.borrow(reserveToken, cAdminBorrowAmount, 2, 0, coverageAdmin); + + vm.expectRevert(bytes(Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD)); + contracts.poolProxy.eliminateReserveDeficit(reserveToken, currentDeficit); + } + + function test_reverts_eliminateReserveDeficit_invalid_caller( + address caller, + uint120 supplyAmount + ) public { + _filterAddresses(caller); + (address reserveToken, uint256 currentDeficit) = _createReserveDeficit(supplyAmount); + + vm.expectRevert(bytes(Errors.CALLER_NOT_COVERAGE_ADMIN)); + vm.prank(caller); + contracts.poolProxy.eliminateReserveDeficit(reserveToken, currentDeficit); + } + + function test_reverts_eliminateReserveDeficit_invalid_amount( + address coverageAdmin, + uint120 supplyAmount + ) public { + _filterAddresses(coverageAdmin); + + (address reserveToken, ) = _createReserveDeficit(supplyAmount); + + vm.prank(poolAdmin); + IAccessControl(report.aclManager).grantRole('COVERAGE_ADMIN', coverageAdmin); + + vm.startPrank(coverageAdmin); + vm.expectRevert(bytes(Errors.INVALID_AMOUNT)); + contracts.poolProxy.eliminateReserveDeficit(reserveToken, 0); + } + + function test_reverts_eliminateReserveDeficit_reserve_not_in_deficit( + address coverageAdmin, + uint120 supplyAmount + ) public { + _filterAddresses(coverageAdmin); + + vm.prank(poolAdmin); + IAccessControl(report.aclManager).grantRole('COVERAGE_ADMIN', coverageAdmin); + + vm.startPrank(coverageAdmin); + + vm.expectRevert(bytes(Errors.RESERVE_NOT_IN_DEFICIT)); + contracts.poolProxy.eliminateReserveDeficit(tokenList.usdx, 1); + } + + function _createReserveDeficit(uint120 supplyAmount) internal returns (address, uint256) { + vm.assume(supplyAmount != 0); + deal(tokenList.wbtc, alice, supplyAmount); + vm.prank(alice); + contracts.poolProxy.supply(tokenList.wbtc, supplyAmount, alice, 0); + (, , uint256 availableBorrowsBase, , , ) = contracts.poolProxy.getUserAccountData(alice); + + uint256 borrowAmount = availableBorrowsBase / 1e2; // base unit -> usdx unit + + // setup available amount to borrow + deal(tokenList.usdx, carol, borrowAmount); + vm.prank(carol); + contracts.poolProxy.supply(tokenList.usdx, borrowAmount, carol, 0); + + vm.prank(alice); + contracts.poolProxy.borrow(tokenList.usdx, borrowAmount, 2, 0, alice); + vm.stopPrank(); + + vm.warp(block.timestamp + 30 days); + + stdstore + .target(IAaveOracle(report.aaveOracle).getSourceOfAsset(tokenList.wbtc)) + .sig('_latestAnswer()') + .checked_write( + _calcPrice(IAaveOracle(report.aaveOracle).getAssetPrice(tokenList.wbtc), 20_00) + ); + + deal(tokenList.usdx, bob, borrowAmount); + vm.prank(bob); + contracts.poolProxy.liquidationCall(tokenList.wbtc, tokenList.usdx, alice, borrowAmount, false); + + uint256 currentDeficit = contracts.poolProxy.getReserveDeficit(tokenList.usdx); + + assertGt(currentDeficit, 0); + + return (tokenList.usdx, currentDeficit); + } + + function _filterAddresses(address user) internal { + vm.assume(user != address(0)); + vm.assume(user != report.proxyAdmin); + vm.assume(user != report.poolAddressesProvider); + vm.assume(user != alice); + vm.assume(user != bob); + vm.assume(user != carol); + vm.assume(user != tokenList.usdx); + vm.assume(user != tokenList.wbtc); + vm.assume(user != tokenList.weth); + vm.assume(user != 0xcF63D4456FCF098EF4012F6dbd2FA3a30f122D43); + } +} diff --git a/tests/protocol/pool/Pool.Liquidations.t.sol b/tests/protocol/pool/Pool.Liquidations.t.sol index 66dfc23e..fdb4b9cb 100644 --- a/tests/protocol/pool/Pool.Liquidations.t.sol +++ b/tests/protocol/pool/Pool.Liquidations.t.sol @@ -32,6 +32,7 @@ contract PoolLiquidationTests is TestnetProcedures { IVariableDebtToken internal varDebtUSDX; address internal aUSDX; + address[] internal badDebtAccounts; PriceOracleSentinel internal priceOracleSentinel; SequencerOracle internal sequencerOracleMock; @@ -63,6 +64,9 @@ contract PoolLiquidationTests is TestnetProcedures { vm.prank(poolAdmin); sequencerOracleMock.setAnswer(false, 0); + + badDebtAccounts.push(makeAddr('badDebtUser1')); + badDebtAccounts.push(makeAddr('badDebtUser2')); } struct LiquidationInput { @@ -80,6 +84,12 @@ contract PoolLiquidationTests is TestnetProcedures { DataTypes.ReserveCache debtCache; uint256 priceImpactPercent; uint256 liquidationProtocolFeeAmount; + uint256 collateralToLiquidateInBaseCurrency; + uint256 debtToLiquidateInBaseCurrency; + uint256 totalCollateralInBaseCurrency; + uint256 totalDebtInBaseCurrency; + uint256 healthFactor; + bool isBadDebt; } function test_liquidate_variable_borrow_same_collateral_and_borrow() public { @@ -154,7 +164,7 @@ contract PoolLiquidationTests is TestnetProcedures { tokenList.usdx, UINT256_MAX, tokenList.wbtc, - 25_00 + 16_00 ); (, , address varDebtToken) = contracts.protocolDataProvider.getReserveTokensAddresses( @@ -191,7 +201,13 @@ contract PoolLiquidationTests is TestnetProcedures { params.receiveAToken ); - _afterLiquidationChecksVariable(params, bob, liquidatorBalanceBefore, userDebtBefore); + _afterLiquidationChecksVariable( + params, + bob, + liquidatorBalanceBefore, + userDebtBefore, + params.isBadDebt + ); } function test_liquidate_variable_borrow_no_fee() public { @@ -212,7 +228,7 @@ contract PoolLiquidationTests is TestnetProcedures { tokenList.usdx, UINT256_MAX, tokenList.wbtc, - 25_00 + 16_00 ); (, , address varDebtToken) = contracts.protocolDataProvider.getReserveTokensAddresses( @@ -248,7 +264,13 @@ contract PoolLiquidationTests is TestnetProcedures { params.liquidationAmountInput, params.receiveAToken ); - _afterLiquidationChecksVariable(params, bob, liquidatorBalanceBefore, userDebtBefore); + _afterLiquidationChecksVariable( + params, + bob, + liquidatorBalanceBefore, + userDebtBefore, + params.isBadDebt + ); } function test_partial_liquidate_variable_borrow() public { @@ -303,7 +325,13 @@ contract PoolLiquidationTests is TestnetProcedures { params.receiveAToken ); - _afterLiquidationChecksVariable(params, bob, liquidatorBalanceBefore, userDebtBefore); + _afterLiquidationChecksVariable( + params, + bob, + liquidatorBalanceBefore, + userDebtBefore, + params.isBadDebt + ); } function test_partial_liquidate_atokens_variable_borrow() public { @@ -359,7 +387,13 @@ contract PoolLiquidationTests is TestnetProcedures { params.receiveAToken ); - _afterLiquidationChecksVariable(params, bob, liquidatorBalanceBefore, userDebtBefore); + _afterLiquidationChecksVariable( + params, + bob, + liquidatorBalanceBefore, + userDebtBefore, + params.isBadDebt + ); } function test_full_liquidate_atokens_multiple_variable_borrows() public { @@ -570,7 +604,7 @@ contract PoolLiquidationTests is TestnetProcedures { tokenList.usdx, UINT256_MAX, tokenList.wbtc, - 25_00 + 12_00 ); (, , address varDebtToken) = contracts.protocolDataProvider.getReserveTokensAddresses( @@ -608,7 +642,13 @@ contract PoolLiquidationTests is TestnetProcedures { params.receiveAToken ); - _afterLiquidationChecksVariable(params, bob, liquidatorBalanceBefore, userDebtBefore); + _afterLiquidationChecksVariable( + params, + bob, + liquidatorBalanceBefore, + userDebtBefore, + params.isBadDebt + ); } function test_liquidate_emode_position_without_emode_oracle() public { @@ -637,7 +677,7 @@ contract PoolLiquidationTests is TestnetProcedures { tokenList.weth, UINT256_MAX, tokenList.wbtc, - 25_00 + 20_00 ); (, , address varDebtToken) = contracts.protocolDataProvider.getReserveTokensAddresses( @@ -675,7 +715,245 @@ contract PoolLiquidationTests is TestnetProcedures { params.receiveAToken ); - _afterLiquidationChecksVariable(params, bob, liquidatorBalanceBefore, userDebtBefore); + _afterLiquidationChecksVariable( + params, + bob, + liquidatorBalanceBefore, + userDebtBefore, + params.isBadDebt + ); + } + + function test_liquidate_borrow_bad_debt() public { + uint256 supplyAmount = 0.5e8; + uint256 borrowAmount = 11000e6; + vm.startPrank(alice); + contracts.poolProxy.supply(tokenList.wbtc, supplyAmount, alice, 0); + contracts.poolProxy.borrow(tokenList.usdx, borrowAmount, 2, 0, alice); + vm.stopPrank(); + + vm.warp(block.timestamp + 30 days); + LiquidationInput memory params = _loadLiquidationInput( + alice, + tokenList.wbtc, + tokenList.usdx, + UINT256_MAX, + tokenList.wbtc, + 20_00 + ); + + (, , address varDebtToken) = contracts.protocolDataProvider.getReserveTokensAddresses( + params.debtAsset + ); + uint256 userDebtBefore = IERC20(varDebtToken).balanceOf(params.user); + uint256 liquidatorBalanceBefore; + if (params.receiveAToken) { + (address atoken, , ) = contracts.protocolDataProvider.getReserveTokensAddresses( + params.collateralAsset + ); + liquidatorBalanceBefore = IERC20(atoken).balanceOf(bob); + } else { + liquidatorBalanceBefore = IERC20(params.collateralAsset).balanceOf(bob); + } + + vm.expectEmit(address(contracts.poolProxy)); + emit LiquidationLogic.BadDebtBurned( + params.user, + tokenList.usdx, + userDebtBefore - params.actualDebtToLiquidate + ); + vm.prank(bob); + contracts.poolProxy.liquidationCall( + params.collateralAsset, + params.debtAsset, + params.user, + params.liquidationAmountInput, + params.receiveAToken + ); + _afterLiquidationChecksVariable( + params, + bob, + liquidatorBalanceBefore, + userDebtBefore, + params.isBadDebt + ); + } + + function test_liquidate_borrow_burn_multiple_assets_bad_debt() public { + uint256 amount = 1.00999999e8; + uint256 borrowAmount = 20500.999999e6; + uint256 secondBorrowAmount = 0.002e8; + vm.startPrank(alice); + + contracts.poolProxy.supply(tokenList.wbtc, amount, alice, 0); + contracts.poolProxy.borrow(tokenList.usdx, borrowAmount, 2, 0, alice); + vm.warp(block.timestamp + 30 days); + contracts.poolProxy.borrow(tokenList.wbtc, secondBorrowAmount, 2, 0, alice); + vm.stopPrank(); + + vm.warp(block.timestamp + 30 days); + + LiquidationInput memory params = _loadLiquidationInput( + alice, + tokenList.wbtc, + tokenList.usdx, + UINT256_MAX, + tokenList.wbtc, + 21_50 + ); + + (, , address varDebtToken) = contracts.protocolDataProvider.getReserveTokensAddresses( + params.debtAsset + ); + uint256 userDebtBefore = IERC20(varDebtToken).balanceOf(params.user); + + uint256 liquidatorBalanceBefore; + if (params.receiveAToken) { + (address atoken, , ) = contracts.protocolDataProvider.getReserveTokensAddresses( + params.collateralAsset + ); + liquidatorBalanceBefore = IERC20(atoken).balanceOf(bob); + } else { + liquidatorBalanceBefore = IERC20(params.collateralAsset).balanceOf(bob); + } + + vm.expectEmit(address(contracts.poolProxy)); + emit LiquidationLogic.BadDebtBurned( + params.user, + tokenList.usdx, + userDebtBefore - params.actualDebtToLiquidate + ); + vm.prank(bob); + contracts.poolProxy.liquidationCall( + params.collateralAsset, + params.debtAsset, + params.user, + params.liquidationAmountInput, + params.receiveAToken + ); + _afterLiquidationChecksVariable( + params, + bob, + liquidatorBalanceBefore, + userDebtBefore, + params.isBadDebt + ); + // check second borrow + (, , varDebtToken) = contracts.protocolDataProvider.getReserveTokensAddresses(tokenList.wbtc); + assertEq(IERC20(varDebtToken).balanceOf(params.user), 0, 'user balance doesnt match'); + } + + function test_burnBadDebt() public { + uint256 supplyAmount = 0.5e8; + uint256 borrowAmount = 11110e6; + uint256 len = badDebtAccounts.length; + + for (uint256 i; i < len; ++i) { + address user = badDebtAccounts[i]; + deal(tokenList.wbtc, user, supplyAmount); + vm.startPrank(user); + IERC20(tokenList.wbtc).approve(address(contracts.poolProxy), type(uint256).max); + contracts.poolProxy.supply(tokenList.wbtc, supplyAmount, user, 0); + contracts.poolProxy.borrow(tokenList.usdx, borrowAmount, 2, 0, user); + vm.stopPrank(); + } + + vm.warp(block.timestamp + 30 days); + stdstore + .target(IAaveOracle(report.aaveOracle).getSourceOfAsset(tokenList.wbtc)) + .sig('_latestAnswer()') + .checked_write(1); + + (, , address varDebtToken) = contracts.protocolDataProvider.getReserveTokensAddresses( + tokenList.usdx + ); + + uint256[] memory usersDebtBefore = new uint256[](len); + for (uint256 i; i < len; ++i) { + usersDebtBefore[i] = IERC20(varDebtToken).balanceOf(badDebtAccounts[i]); + } + + vm.expectEmit(address(contracts.poolProxy)); + emit LiquidationLogic.BadDebtBurned(badDebtAccounts[0], tokenList.usdx, usersDebtBefore[0]); + + vm.prank(bob); + contracts.poolProxy.burnBadDebt(badDebtAccounts); + + for (uint256 i; i < len; ++i) { + assertEq(IERC20(varDebtToken).balanceOf(badDebtAccounts[i]), 0); + } + } + + function test_revert_burnBadDebt_not_in_bad_debt() public { + uint256 supplyAmount = 0.5e8; + uint256 borrowAmount = 11110e6; + uint256 len = badDebtAccounts.length; + + for (uint256 i; i < len; ++i) { + address user = badDebtAccounts[i]; + deal(tokenList.wbtc, user, supplyAmount); + vm.startPrank(user); + IERC20(tokenList.wbtc).approve(address(contracts.poolProxy), type(uint256).max); + contracts.poolProxy.supply(tokenList.wbtc, supplyAmount, user, 0); + contracts.poolProxy.borrow(tokenList.usdx, borrowAmount, 2, 0, user); + vm.stopPrank(); + } + + vm.expectRevert(bytes(Errors.USER_NOT_IN_BAD_DEBT)); + vm.prank(bob); + contracts.poolProxy.burnBadDebt(badDebtAccounts); + } + + function test_deficit_increased_after_liquidate_bad_debt() public { + uint256 supplyAmount = 0.5e8; + uint256 borrowAmount = 11000e6; + vm.startPrank(alice); + contracts.poolProxy.supply(tokenList.wbtc, supplyAmount, alice, 0); + contracts.poolProxy.borrow(tokenList.usdx, borrowAmount, 2, 0, alice); + vm.stopPrank(); + + vm.warp(block.timestamp + 30 days); + LiquidationInput memory params = _loadLiquidationInput( + alice, + tokenList.wbtc, + tokenList.usdx, + UINT256_MAX, + tokenList.wbtc, + 20_00 + ); + + (, , address varDebtToken) = contracts.protocolDataProvider.getReserveTokensAddresses( + params.debtAsset + ); + uint256 userDebtBefore = IERC20(varDebtToken).balanceOf(params.user); + uint256 liquidatorBalanceBefore; + if (params.receiveAToken) { + (address atoken, , ) = contracts.protocolDataProvider.getReserveTokensAddresses( + params.collateralAsset + ); + liquidatorBalanceBefore = IERC20(atoken).balanceOf(bob); + } else { + liquidatorBalanceBefore = IERC20(params.collateralAsset).balanceOf(bob); + } + + vm.expectEmit(address(contracts.poolProxy)); + emit LiquidationLogic.BadDebtBurned( + params.user, + tokenList.usdx, + userDebtBefore - params.actualDebtToLiquidate + ); + vm.prank(bob); + contracts.poolProxy.liquidationCall( + params.collateralAsset, + params.debtAsset, + params.user, + params.liquidationAmountInput, + params.receiveAToken + ); + assertEq( + contracts.poolProxy.getReserveDeficit(tokenList.usdx), + userDebtBefore - params.actualDebtToLiquidate + ); } function _loadLiquidationInput( @@ -714,17 +992,26 @@ contract PoolLiquidationTests is TestnetProcedures { ) ); - (, , , , , uint256 healthFactor) = contracts.poolProxy.getUserAccountData(params.user); + ( + params.totalCollateralInBaseCurrency, + params.totalDebtInBaseCurrency, + , + , + , + params.healthFactor + ) = contracts.poolProxy.getUserAccountData(params.user); - (, , uint256 currentVariableDebt, , , , , , ) = contracts - .protocolDataProvider - .getUserReserveData(params.debtAsset, params.user); + (, , address variableDebtToken) = contracts.protocolDataProvider.getReserveTokensAddresses( + params.debtAsset + ); - uint256 closeFactor = healthFactor > LiquidationLogic.CLOSE_FACTOR_HF_THRESHOLD + uint256 closeFactor = params.healthFactor > LiquidationLogic.CLOSE_FACTOR_HF_THRESHOLD ? LiquidationLogic.DEFAULT_LIQUIDATION_CLOSE_FACTOR : LiquidationLogic.MAX_LIQUIDATION_CLOSE_FACTOR; - uint256 maxLiquidatableDebt = (currentVariableDebt).percentMul(closeFactor); + uint256 maxLiquidatableDebt = (IERC20(variableDebtToken).balanceOf(params.user)).percentMul( + closeFactor + ); params.actualDebtToLiquidate = params.liquidationAmountInput > maxLiquidatableDebt ? maxLiquidatableDebt @@ -738,7 +1025,9 @@ contract PoolLiquidationTests is TestnetProcedures { ( params.actualCollateralToLiquidate, params.actualDebtToLiquidate, - params.liquidationProtocolFeeAmount + params.liquidationProtocolFeeAmount, + params.collateralToLiquidateInBaseCurrency, + params.debtToLiquidateInBaseCurrency ) = LiquidationLogic._calculateAvailableCollateralToLiquidate( collateralReserveData, params.debtCache, @@ -749,6 +1038,9 @@ contract PoolLiquidationTests is TestnetProcedures { params.liquidationBonus, IAaveOracle(report.aaveOracle) ); + params.isBadDebt = + params.totalCollateralInBaseCurrency == params.collateralToLiquidateInBaseCurrency && + params.totalDebtInBaseCurrency != params.debtToLiquidateInBaseCurrency; return params; } @@ -1025,7 +1317,8 @@ contract PoolLiquidationTests is TestnetProcedures { LiquidationInput memory params, address liquidator, uint256 liquidatorBalanceBefore, - uint256 userBalanceBefore + uint256 userBalanceBefore, + bool isBadDebt ) internal view { (address collateralBalance, , ) = contracts.protocolDataProvider.getReserveTokensAddresses( params.collateralAsset @@ -1048,7 +1341,7 @@ contract PoolLiquidationTests is TestnetProcedures { } assertApproxEqAbs( IERC20(variableDebtToken).balanceOf(params.user), - userBalanceBefore - params.actualDebtToLiquidate, + isBadDebt ? 0 : userBalanceBefore - params.actualDebtToLiquidate, 1, 'user balance doesnt match' ); From 2ea3e7772bab6a4d2eddd0d475ff39df3b7de53f Mon Sep 17 00:00:00 2001 From: Lukas Date: Thu, 26 Sep 2024 14:59:49 +0200 Subject: [PATCH 05/72] fix: patch imports --- .../helpers/UiIncentiveDataProviderV3.sol | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/contracts/helpers/UiIncentiveDataProviderV3.sol b/src/contracts/helpers/UiIncentiveDataProviderV3.sol index 79a1829d..b99a115b 100644 --- a/src/contracts/helpers/UiIncentiveDataProviderV3.sol +++ b/src/contracts/helpers/UiIncentiveDataProviderV3.sol @@ -8,7 +8,7 @@ import {IncentivizedERC20} from '../protocol/tokenization/base/IncentivizedERC20 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 {AggregatorInterface} from '../dependencies/chainlink/AggregatorInterface.sol'; import {IUiIncentiveDataProviderV3} from './interfaces/IUiIncentiveDataProviderV3.sol'; contract UiIncentiveDataProviderV3 is IUiIncentiveDataProviderV3 { @@ -84,10 +84,10 @@ contract UiIncentiveDataProviderV3 is IUiIncentiveDataProviderV3 { rewardInformation.rewardOracleAddress = aTokenIncentiveController.getRewardOracle( rewardInformation.rewardTokenAddress ); - rewardInformation.priceFeedDecimals = IEACAggregatorProxy( + rewardInformation.priceFeedDecimals = AggregatorInterface( rewardInformation.rewardOracleAddress ).decimals(); - rewardInformation.rewardPriceFeed = IEACAggregatorProxy( + rewardInformation.rewardPriceFeed = AggregatorInterface( rewardInformation.rewardOracleAddress ).latestAnswer(); @@ -138,10 +138,10 @@ contract UiIncentiveDataProviderV3 is IUiIncentiveDataProviderV3 { rewardInformation.rewardOracleAddress = vTokenIncentiveController.getRewardOracle( rewardInformation.rewardTokenAddress ); - rewardInformation.priceFeedDecimals = IEACAggregatorProxy( + rewardInformation.priceFeedDecimals = AggregatorInterface( rewardInformation.rewardOracleAddress ).decimals(); - rewardInformation.rewardPriceFeed = IEACAggregatorProxy( + rewardInformation.rewardPriceFeed = AggregatorInterface( rewardInformation.rewardOracleAddress ).latestAnswer(); @@ -218,10 +218,10 @@ contract UiIncentiveDataProviderV3 is IUiIncentiveDataProviderV3 { userRewardInformation.rewardOracleAddress = aTokenIncentiveController.getRewardOracle( userRewardInformation.rewardTokenAddress ); - userRewardInformation.priceFeedDecimals = IEACAggregatorProxy( + userRewardInformation.priceFeedDecimals = AggregatorInterface( userRewardInformation.rewardOracleAddress ).decimals(); - userRewardInformation.rewardPriceFeed = IEACAggregatorProxy( + userRewardInformation.rewardPriceFeed = AggregatorInterface( userRewardInformation.rewardOracleAddress ).latestAnswer(); @@ -271,10 +271,10 @@ contract UiIncentiveDataProviderV3 is IUiIncentiveDataProviderV3 { userRewardInformation.rewardOracleAddress = vTokenIncentiveController.getRewardOracle( userRewardInformation.rewardTokenAddress ); - userRewardInformation.priceFeedDecimals = IEACAggregatorProxy( + userRewardInformation.priceFeedDecimals = AggregatorInterface( userRewardInformation.rewardOracleAddress ).decimals(); - userRewardInformation.rewardPriceFeed = IEACAggregatorProxy( + userRewardInformation.rewardPriceFeed = AggregatorInterface( userRewardInformation.rewardOracleAddress ).latestAnswer(); From 7e582b03a5fe9e9777ce6989061c7e33941969c0 Mon Sep 17 00:00:00 2001 From: Lukas Date: Sat, 28 Sep 2024 12:35:08 +0200 Subject: [PATCH 06/72] feat: getReserveAToken getter (#64) --- .../extensions/static-a-token/StataTokenFactory.sol | 13 +++++-------- src/contracts/helpers/AaveProtocolDataProvider.sol | 12 +++++------- src/contracts/helpers/WrappedTokenGatewayV3.sol | 4 ++-- src/contracts/interfaces/IPool.sol | 7 +++++++ .../protocol/libraries/logic/ConfiguratorLogic.sol | 10 +++++----- src/contracts/protocol/pool/Pool.sol | 5 +++++ .../static-a-token/StataTokenV2Rescuable.sol | 2 -- tests/protocol/pool/Pool.Deficit.sol | 5 ++--- 8 files changed, 31 insertions(+), 27 deletions(-) diff --git a/src/contracts/extensions/static-a-token/StataTokenFactory.sol b/src/contracts/extensions/static-a-token/StataTokenFactory.sol index 5ca2bb28..b53d7f76 100644 --- a/src/contracts/extensions/static-a-token/StataTokenFactory.sol +++ b/src/contracts/extensions/static-a-token/StataTokenFactory.sol @@ -46,12 +46,11 @@ contract StataTokenFactory is Initializable, IStataTokenFactory { for (uint256 i = 0; i < underlyings.length; i++) { address cachedStataToken = _underlyingToStataToken[underlyings[i]]; if (cachedStataToken == address(0)) { - DataTypes.ReserveDataLegacy memory reserveData = POOL.getReserveData(underlyings[i]); - if (reserveData.aTokenAddress == address(0)) - revert NotListedUnderlying(reserveData.aTokenAddress); + address aTokenAddress = POOL.getReserveAToken(underlyings[i]); + if (aTokenAddress == address(0)) revert NotListedUnderlying(aTokenAddress); bytes memory symbol = abi.encodePacked( 'stat', - IERC20Metadata(reserveData.aTokenAddress).symbol(), + IERC20Metadata(aTokenAddress).symbol(), 'v2' ); address stataToken = TRANSPARENT_PROXY_FACTORY.createDeterministic( @@ -59,10 +58,8 @@ contract StataTokenFactory is Initializable, IStataTokenFactory { PROXY_ADMIN, abi.encodeWithSelector( StataTokenV2.initialize.selector, - reserveData.aTokenAddress, - string( - abi.encodePacked('Static ', IERC20Metadata(reserveData.aTokenAddress).name(), ' v2') - ), + aTokenAddress, + string(abi.encodePacked('Static ', IERC20Metadata(aTokenAddress).name(), ' v2')), string(symbol) ), bytes32(uint256(uint160(underlyings[i]))) diff --git a/src/contracts/helpers/AaveProtocolDataProvider.sol b/src/contracts/helpers/AaveProtocolDataProvider.sol index 671b658b..56717d98 100644 --- a/src/contracts/helpers/AaveProtocolDataProvider.sol +++ b/src/contracts/helpers/AaveProtocolDataProvider.sol @@ -63,10 +63,10 @@ contract AaveProtocolDataProvider is IPoolDataProvider { 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]); + address aTokenAddress = pool.getReserveAToken(reserves[i]); aTokens[i] = TokenData({ - symbol: IERC20Detailed(reserveData.aTokenAddress).symbol(), - tokenAddress: reserveData.aTokenAddress + symbol: IERC20Detailed(aTokenAddress).symbol(), + tokenAddress: aTokenAddress }); } return aTokens; @@ -188,10 +188,8 @@ contract AaveProtocolDataProvider is IPoolDataProvider { /// @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(); + address aTokenAddress = IPool(ADDRESSES_PROVIDER.getPool()).getReserveAToken(asset); + return IERC20Detailed(aTokenAddress).totalSupply(); } /// @inheritdoc IPoolDataProvider diff --git a/src/contracts/helpers/WrappedTokenGatewayV3.sol b/src/contracts/helpers/WrappedTokenGatewayV3.sol index 56725d5e..b05bb781 100644 --- a/src/contracts/helpers/WrappedTokenGatewayV3.sol +++ b/src/contracts/helpers/WrappedTokenGatewayV3.sol @@ -53,7 +53,7 @@ contract WrappedTokenGatewayV3 is IWrappedTokenGatewayV3, Ownable { * @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); + IAToken aWETH = IAToken(POOL.getReserveAToken(address(WETH))); uint256 userBalance = aWETH.balanceOf(msg.sender); uint256 amountToWithdraw = amount; @@ -127,7 +127,7 @@ contract WrappedTokenGatewayV3 is IWrappedTokenGatewayV3, Ownable { bytes32 permitR, bytes32 permitS ) external override { - IAToken aWETH = IAToken(POOL.getReserveData(address(WETH)).aTokenAddress); + IAToken aWETH = IAToken(POOL.getReserveAToken(address(WETH))); uint256 userBalance = aWETH.balanceOf(msg.sender); uint256 amountToWithdraw = amount; diff --git a/src/contracts/interfaces/IPool.sol b/src/contracts/interfaces/IPool.sol index 5a809333..82e6b751 100644 --- a/src/contracts/interfaces/IPool.sol +++ b/src/contracts/interfaces/IPool.sol @@ -837,6 +837,13 @@ interface IPool { */ function getReserveDeficit(address asset) external view returns (uint256); + /** + * @notice Returns the aToken address of a reserve. + * @param asset The address of the underlying asset of the reserve + * @return The address of the aToken + */ + function getReserveAToken(address asset) external view returns (address); + /** * @notice Gets the address of the external FlashLoanLogic */ diff --git a/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol b/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol index c6b08dcc..a3d58724 100644 --- a/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol +++ b/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol @@ -124,9 +124,9 @@ library ConfiguratorLogic { IPool cachedPool, ConfiguratorInputTypes.UpdateATokenInput calldata input ) external { - DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); + address aTokenAddress = cachedPool.getReserveAToken(input.asset); - (, , , uint256 decimals, ) = cachedPool.getConfiguration(input.asset).getParams(); + uint256 decimals = cachedPool.getConfiguration(input.asset).getDecimals(); bytes memory encodedCall = abi.encodeWithSelector( IInitializableAToken.initialize.selector, @@ -140,9 +140,9 @@ library ConfiguratorLogic { input.params ); - _upgradeTokenImplementation(reserveData.aTokenAddress, input.implementation, encodedCall); + _upgradeTokenImplementation(aTokenAddress, input.implementation, encodedCall); - emit ATokenUpgraded(input.asset, reserveData.aTokenAddress, input.implementation); + emit ATokenUpgraded(input.asset, aTokenAddress, input.implementation); } /** @@ -157,7 +157,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).getDecimals(); bytes memory encodedCall = abi.encodeWithSelector( IInitializableDebtToken.initialize.selector, diff --git a/src/contracts/protocol/pool/Pool.sol b/src/contracts/protocol/pool/Pool.sol index 8d12e00f..c079a517 100644 --- a/src/contracts/protocol/pool/Pool.sol +++ b/src/contracts/protocol/pool/Pool.sol @@ -889,6 +889,11 @@ abstract contract Pool is VersionedInitializable, PoolStorage, IPool { return _reserves[asset].deficit; } + /// @inheritdoc IPool + function getReserveAToken(address asset) external view virtual returns (address) { + return _reserves[asset].aTokenAddress; + } + /// @inheritdoc IPool function getFlashLoanLogic() external pure returns (address) { return address(FlashLoanLogic); diff --git a/tests/extensions/static-a-token/StataTokenV2Rescuable.sol b/tests/extensions/static-a-token/StataTokenV2Rescuable.sol index 8034fd52..a07206ba 100644 --- a/tests/extensions/static-a-token/StataTokenV2Rescuable.sol +++ b/tests/extensions/static-a-token/StataTokenV2Rescuable.sol @@ -44,8 +44,6 @@ contract StataTokenV2RescuableTest is BaseTest { _fundAToken(donation, address(stataTokenV2)); _fund4626(stake, address(this)); - address treasury = IAToken(aToken).RESERVE_TREASURY_ADDRESS(); - vm.expectEmit(true, true, true, true); emit ERC20Rescued(poolAdmin, aToken, address(this), donation); vm.startPrank(poolAdmin); diff --git a/tests/protocol/pool/Pool.Deficit.sol b/tests/protocol/pool/Pool.Deficit.sol index 8221f95c..9b9a4dfc 100644 --- a/tests/protocol/pool/Pool.Deficit.sol +++ b/tests/protocol/pool/Pool.Deficit.sol @@ -115,8 +115,7 @@ contract PoolDeficitTests is TestnetProcedures { } function test_reverts_eliminateReserveDeficit_reserve_not_in_deficit( - address coverageAdmin, - uint120 supplyAmount + address coverageAdmin ) public { _filterAddresses(coverageAdmin); @@ -167,7 +166,7 @@ contract PoolDeficitTests is TestnetProcedures { return (tokenList.usdx, currentDeficit); } - function _filterAddresses(address user) internal { + function _filterAddresses(address user) internal view { vm.assume(user != address(0)); vm.assume(user != report.proxyAdmin); vm.assume(user != report.poolAddressesProvider); From 802924b818199e89b4c44fc99f06b9f6eaedc829 Mon Sep 17 00:00:00 2001 From: Lukas Date: Tue, 1 Oct 2024 11:30:00 +0200 Subject: [PATCH 07/72] docs: refine docs (#67) * fix: refine docs * fix: typo --- docs/Aave-v3.3-features.md | 49 ++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/docs/Aave-v3.3-features.md b/docs/Aave-v3.3-features.md index 893ac3f7..36a7daed 100644 --- a/docs/Aave-v3.3-features.md +++ b/docs/Aave-v3.3-features.md @@ -11,19 +11,25 @@ Aave v3.3 is an upgrade on top of Aave 3.2 ### 1. Bad Debt Management -On Aave v3, certain liquidation scenarios of an account can result in a permanently bad debt situation. This occurs when the total collateral liquidated is insufficient to cover the repayment of the debt, leaving the account with zero collateral and some remaining debt. We understand that such debt is unlikely to be repaid and adversely affects the protocol by continuing to accrue interest. +On Aave v3, some liquidation scenarios can result in a permanent bad debt on the protocol. +This occurs when the total collateral liquidated is insufficient to cover the repayment of the debt, leaving the account with zero collateral and some remaining debt. +We understand that such debt is unlikely to be repaid and adversely affects the protocol by continuing to accrue interest. -To mitigate the creation of new bad debt accounts post-liquidation and to halt further interest accrual on such liabilities, the bad debt feature introduces a new verification step during liquidation. This step checks the total collateral and total debt values of the account post-liquidation and repayment. If an account ends up with zero collateral and non-zero debt, a flag is triggered, and any remaining debt in the account is burned and the new deficit created is accounted to the reserve. +To mitigate the creation of new bad debt accounts post-liquidation and to halt further interest accrual on such liabilities, the bad debt feature introduces a new verification step during liquidation. +This step checks the total collateral and total debt values of the account post-liquidation and repayment: +If an account ends up with zero collateral and non-zero debt, any remaining debt in the account is burned and the new deficit created is accounted to the reserve. -For accounts already in a bad debt situation, this feature enables the permissionless burning of debt tokens. It employs the same verification criteria, checking if the account's collateral equals zero while its debt remains non-zero. +In terms of implementation, the feature checks whether the liquidation will result in a bad debt situation by comparing whether the total borrower’s collateral equals the collateral liquidated in the base currency. +If the total borrower’s debt exceeds the debt repaid in base currency, the variable debt tokens of the borrower are burned, and it is accounted to the respective reserve as a deficit. -In terms of implementation, the feature introduces an `isBadDebt` flag during a liquidation call. This flag checks whether the liquidation will result in a bad debt situation by comparing whether the total borrower’s collateral equals the collateral liquidated in the base currency and whether the total borrower’s debt exceeds the debt repaid in base currency. When this flag is activated, the variable debt tokens of the borrower are burned, and it is accounted to the equivalent reserve as a deficit. - -For accounts already in bad debt, introduces a `burnBadDebt` function to the Pool contract. This function accepts a list of accounts in bad debt to be processed. It validates through `validateUserBadDebt` that the account has zero collateral in base currency and non-zero debt before burning all variable debt tokens of the account and accounting the deficit to the equivalent reserve. +For accounts already in a bad debt situation, an nem `eliminateReserveDeficit`method is introduced allowing permissionless burning of debt tokens. +It employs the same verification criteria, checking if the account's collateral equals zero while its debt remains non-zero. +This function accepts a list of accounts in bad debt to be processed. It validates that the account has zero collateral in base currency and non-zero debt before burning all variable debt tokens of the account and accounting the deficit to the equivalent reserve. The new `deficit` data is introduced to the `ReserveData` struct by re-utilizing the deprecated stableBorrowRate (`__deprecatedStableBorrowRate`) storage, and can be fetched via the new `getReserveDeficit` function in the Pool contract. -The deficit reduction of a reserve is introduced via the `eliminateReserveDeficit` function in the Pool contract, where a permissioned entity (the `CoverageAdmin`) can burn his aTokens to decrease the deficit of the equivalent reserve. This function checks if the reserve has any deficit and validates the coverage admin's health factor and LTV before reducing the deficit. +The deficit reduction of a reserve is introduced via the `eliminateReserveDeficit` function in the Pool contract, where a permissioned entity (the registered `Umbrella` on the PoolAddressesProvider) can burn aTokens to decrease the deficit of the respective reserve. +This function only allows burning up to the currently existing deficit and validates the callers health factor and LTV before reducing the deficit. **Misc considerations & acknowledged limitations** @@ -80,3 +86,32 @@ For accounts already in bad debt, the gas cost for executing the external functi ---
+ +### 2. Bitmap access optimization + +The current bitmasks on `ReserveConfiguration` have been optimized for `writes`. +This is unintuitive, as the most common protocol interactions `read` from the configuration. +By flipping the masks: + +```diff +- uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore ++ uint256 internal constant LTV_MASK = 0x000000000000000000000000000000000000000000000000000000000000FFFF; // prettier-ignore +``` + +The access can be simplified: +``` +function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { +- return self.data & ~LTV_MASK; ++ return self.data & LTV_MASK; +} +``` + +Which slightly reduces gas & code-size. The effect is getting more meaningful for accounts holding multiple collateral & borrow positions. + + +### 3. Additional getters + +When analyzing ecosystem contracts we noticed that a lot of contracts have to pay excess gas due to the lack of fine grained getters on the protocol. +If an external integration e.g. wants to query the aToken balance of an address, it currently has to fetch `Pool.getReserveData().aTokenAddress` or `Pool.getReserveDataExtended().aTokenAddress` which will read 7 or 8 storage slots respectively. +This is suboptimal, as the consumer is only interested in a single slot - the one containing the `aTokenAddress`. +Therefore we added a `getReserveAToken()` getter reducing gas cost by up to ~12k gas. We plan on adding more dedicated getters in the future when we see fit. From f5389a4b8d5c7490f7ae2bd33eacf50c6ef472d9 Mon Sep 17 00:00:00 2001 From: Lukas Date: Mon, 7 Oct 2024 08:43:00 +0200 Subject: [PATCH 08/72] fix: access cache not storage (#68) accessing the configuration cache should be save in this case and reduces gas overhead by around 300gas per access --- src/contracts/protocol/libraries/logic/ReserveLogic.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/src/contracts/protocol/libraries/logic/ReserveLogic.sol index ecb869b8..c80c9221 100644 --- a/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ b/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -186,7 +186,7 @@ library ReserveLogic { totalDebt: totalVariableDebt, reserveFactor: reserveCache.reserveFactor, reserve: reserveAddress, - usingVirtualBalance: reserve.configuration.getIsVirtualAccActive(), + usingVirtualBalance: reserveCache.reserveConfiguration.getIsVirtualAccActive(), virtualUnderlyingBalance: reserve.virtualUnderlyingBalance }) ); @@ -195,7 +195,7 @@ library ReserveLogic { reserve.currentVariableBorrowRate = nextVariableRate.toUint128(); // Only affect virtual balance if the reserve uses it - if (reserve.configuration.getIsVirtualAccActive()) { + if (reserveCache.reserveConfiguration.getIsVirtualAccActive()) { if (liquidityAdded > 0) { reserve.virtualUnderlyingBalance += liquidityAdded.toUint128(); } From c4c438e22001ff2e5892913d4edbfec1a72f2f92 Mon Sep 17 00:00:00 2001 From: ianflexa Date: Mon, 7 Oct 2024 05:56:28 -0400 Subject: [PATCH 09/72] chore: add comment in `_burnBadDebt` + lint --- docs/Aave-v3.3-features.md | 2 +- src/contracts/protocol/libraries/logic/LiquidationLogic.sol | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/Aave-v3.3-features.md b/docs/Aave-v3.3-features.md index 36a7daed..ffd0f8bf 100644 --- a/docs/Aave-v3.3-features.md +++ b/docs/Aave-v3.3-features.md @@ -99,6 +99,7 @@ By flipping the masks: ``` The access can be simplified: + ``` function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { - return self.data & ~LTV_MASK; @@ -108,7 +109,6 @@ function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure ret Which slightly reduces gas & code-size. The effect is getting more meaningful for accounts holding multiple collateral & borrow positions. - ### 3. Additional getters When analyzing ecosystem contracts we noticed that a lot of contracts have to pay excess gas due to the lack of fine grained getters on the protocol. diff --git a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol index 07fbb152..e69b212d 100644 --- a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -612,6 +612,9 @@ library LiquidationLogic { IVariableDebtToken vToken = IVariableDebtToken(currentReserve.variableDebtTokenAddress); // Fetch the scaled balance first as it is more gas-efficient uint256 userDebt = vToken.scaledBalanceOf(user); + // Prior v3.1, there were cases where, after liquidation, the `isBorrowing` flag was left on + // even after the user debt was fully repaid, so to avoid this function reverting in the `_burnScaled` + // (see ScaledBalanceTokenBase contract), we check for any debt remaining. if (userDebt != 0) { // Scale up the debt balance userDebt = userDebt.rayMul(reserveCache.nextVariableBorrowIndex); From 26b632d9101fff3aa68ae8014e46645ec798ee40 Mon Sep 17 00:00:00 2001 From: Lukas Date: Mon, 7 Oct 2024 15:08:01 +0200 Subject: [PATCH 10/72] feat: use addresses provider instead of acl (#66) umbrella should be a single address tied to the pool, so using acl is overkill, which also will be cheaper --- .../protocol/libraries/helpers/Errors.sol | 2 +- src/contracts/protocol/pool/Pool.sol | 21 +++++++------------ tests/protocol/pool/Pool.Deficit.sol | 12 +++++------ 3 files changed, 14 insertions(+), 21 deletions(-) diff --git a/src/contracts/protocol/libraries/helpers/Errors.sol b/src/contracts/protocol/libraries/helpers/Errors.sol index 93dd126e..f5f4e46c 100644 --- a/src/contracts/protocol/libraries/helpers/Errors.sol +++ b/src/contracts/protocol/libraries/helpers/Errors.sol @@ -101,6 +101,6 @@ library Errors { 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 string public constant USER_NOT_IN_BAD_DEBT = '101'; // The user is not in bad debt - string public constant CALLER_NOT_COVERAGE_ADMIN = '102'; // The caller of the function is not the coverage admin + string public constant CALLER_NOT_UMBRELLA = '102'; // The caller of the function is not the umbrella contract string public constant RESERVE_NOT_IN_DEFICIT = '103'; // The reserve is not in deficit } diff --git a/src/contracts/protocol/pool/Pool.sol b/src/contracts/protocol/pool/Pool.sol index c079a517..8d0c0880 100644 --- a/src/contracts/protocol/pool/Pool.sol +++ b/src/contracts/protocol/pool/Pool.sol @@ -66,10 +66,13 @@ abstract contract Pool is VersionedInitializable, PoolStorage, IPool { } /** - * @dev Only aToken Burner can call functions marked by this modifier. + * @dev Only the umbrella contract can call functions marked by this modifier. */ - modifier onlyCoverageAdmin() { - _onlyCoverageAdmin(); + modifier onlyUmbrella() { + require( + ADDRESSES_PROVIDER.getAddress(bytes32('UMBRELLA')) == msg.sender, + Errors.CALLER_NOT_UMBRELLA + ); _; } @@ -94,13 +97,6 @@ abstract contract Pool is VersionedInitializable, PoolStorage, IPool { ); } - function _onlyCoverageAdmin() internal view virtual { - require( - IAccessControl(ADDRESSES_PROVIDER.getACLManager()).hasRole('COVERAGE_ADMIN', msg.sender), - Errors.CALLER_NOT_COVERAGE_ADMIN - ); - } - /** * @dev Constructor. * @param provider The address of the PoolAddressesProvider contract @@ -864,10 +860,7 @@ abstract contract Pool is VersionedInitializable, PoolStorage, IPool { } /// @inheritdoc IPool - function eliminateReserveDeficit( - address asset, - uint256 amount - ) external override onlyCoverageAdmin { + function eliminateReserveDeficit(address asset, uint256 amount) external override onlyUmbrella { ReserveLogic.eliminateDeficit( _reserves, _reservesList, diff --git a/tests/protocol/pool/Pool.Deficit.sol b/tests/protocol/pool/Pool.Deficit.sol index 9b9a4dfc..dc98c1c4 100644 --- a/tests/protocol/pool/Pool.Deficit.sol +++ b/tests/protocol/pool/Pool.Deficit.sol @@ -25,7 +25,7 @@ contract PoolDeficitTests is TestnetProcedures { (address reserveToken, uint256 currentDeficit) = _createReserveDeficit(supplyAmount); vm.prank(poolAdmin); - IAccessControl(report.aclManager).grantRole('COVERAGE_ADMIN', coverageAdmin); + contracts.poolAddressesProvider.setAddress(bytes32('UMBRELLA'), coverageAdmin); deal(reserveToken, coverageAdmin, currentDeficit); @@ -49,7 +49,7 @@ contract PoolDeficitTests is TestnetProcedures { vm.assume(amountToCover != 0 && amountToCover < currentDeficit); vm.prank(poolAdmin); - IAccessControl(report.aclManager).grantRole('COVERAGE_ADMIN', coverageAdmin); + contracts.poolAddressesProvider.setAddress(bytes32('UMBRELLA'), coverageAdmin); deal(reserveToken, coverageAdmin, currentDeficit); @@ -73,7 +73,7 @@ contract PoolDeficitTests is TestnetProcedures { vm.assume(cAdminBorrowAmount != 0 && uint256(cAdminBorrowAmount) * 2 <= currentDeficit); vm.prank(poolAdmin); - IAccessControl(report.aclManager).grantRole('COVERAGE_ADMIN', coverageAdmin); + contracts.poolAddressesProvider.setAddress(bytes32('UMBRELLA'), coverageAdmin); deal(reserveToken, coverageAdmin, currentDeficit); @@ -93,7 +93,7 @@ contract PoolDeficitTests is TestnetProcedures { _filterAddresses(caller); (address reserveToken, uint256 currentDeficit) = _createReserveDeficit(supplyAmount); - vm.expectRevert(bytes(Errors.CALLER_NOT_COVERAGE_ADMIN)); + vm.expectRevert(bytes(Errors.CALLER_NOT_UMBRELLA)); vm.prank(caller); contracts.poolProxy.eliminateReserveDeficit(reserveToken, currentDeficit); } @@ -107,7 +107,7 @@ contract PoolDeficitTests is TestnetProcedures { (address reserveToken, ) = _createReserveDeficit(supplyAmount); vm.prank(poolAdmin); - IAccessControl(report.aclManager).grantRole('COVERAGE_ADMIN', coverageAdmin); + contracts.poolAddressesProvider.setAddress(bytes32('UMBRELLA'), coverageAdmin); vm.startPrank(coverageAdmin); vm.expectRevert(bytes(Errors.INVALID_AMOUNT)); @@ -120,7 +120,7 @@ contract PoolDeficitTests is TestnetProcedures { _filterAddresses(coverageAdmin); vm.prank(poolAdmin); - IAccessControl(report.aclManager).grantRole('COVERAGE_ADMIN', coverageAdmin); + contracts.poolAddressesProvider.setAddress(bytes32('UMBRELLA'), coverageAdmin); vm.startPrank(coverageAdmin); From da89365161721f5e88703135b11ef321b0005726 Mon Sep 17 00:00:00 2001 From: Lukas Date: Thu, 10 Oct 2024 15:00:35 +0200 Subject: [PATCH 11/72] fix: use cache.lastUpdatedTimestamp (#70) --- src/contracts/protocol/libraries/logic/ReserveLogic.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/src/contracts/protocol/libraries/logic/ReserveLogic.sol index c80c9221..1d221620 100644 --- a/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ b/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -102,7 +102,7 @@ library ReserveLogic { ) internal { // If time didn't pass since last stored timestamp, skip state update //solium-disable-next-line - if (reserve.lastUpdateTimestamp == uint40(block.timestamp)) { + if (reserveCache.reserveLastUpdateTimestamp == uint40(block.timestamp)) { return; } From 95bf29b23c45edb916f745df1b08e5027062338c Mon Sep 17 00:00:00 2001 From: Lukas Date: Wed, 16 Oct 2024 09:47:05 +0200 Subject: [PATCH 12/72] fix: debt cleanup review & liquidation improvements (#69) - adding `getReserveVariableDebtToken` getter - adjusting close factor to apply to whole position, not per reserve - adjusting close factor to increase to 100% when debt/collateral are below a threshold - adjusting liquidations to force full liquidation/or keep a leftover that is high enough to allow further liqudiations --- docs/Aave-v3.3-features.md | 117 ------- docs/v3.3-properties.md | 26 -- docs/v3.3/Aave-v3.3-features.md | 111 +++++++ docs/v3.3/v3.3-properties.md | 21 ++ foundry.toml | 2 +- src/contracts/instances/PoolInstance.sol | 12 +- src/contracts/interfaces/IPool.sol | 21 +- .../protocol/libraries/helpers/Errors.sol | 3 +- .../libraries/logic/LiquidationLogic.sol | 307 ++++++++---------- .../protocol/libraries/logic/ReserveLogic.sol | 16 +- src/contracts/protocol/pool/Pool.sol | 22 +- tests/helpers/LiquidationHelper.sol | 134 ++++++++ tests/misc/rates/RateStrategy.setters.t.sol | 14 +- tests/misc/rates/RateStrategy.template.sol | 13 +- tests/protocol/pool/Pool.Deficit.sol | 10 +- tests/protocol/pool/Pool.EMode.sol | 1 + .../pool/Pool.Liquidations.CloseFactor.t.sol | 203 ++++++++++++ tests/protocol/pool/Pool.Liquidations.t.sol | 118 ++----- 18 files changed, 680 insertions(+), 471 deletions(-) delete mode 100644 docs/Aave-v3.3-features.md delete mode 100644 docs/v3.3-properties.md create mode 100644 docs/v3.3/Aave-v3.3-features.md create mode 100644 docs/v3.3/v3.3-properties.md create mode 100644 tests/helpers/LiquidationHelper.sol create mode 100644 tests/protocol/pool/Pool.Liquidations.CloseFactor.t.sol diff --git a/docs/Aave-v3.3-features.md b/docs/Aave-v3.3-features.md deleted file mode 100644 index ffd0f8bf..00000000 --- a/docs/Aave-v3.3-features.md +++ /dev/null @@ -1,117 +0,0 @@ -## Aave v3.3 features - -Aave v3.3 is an upgrade on top of Aave 3.2 - -
-
- -## Features - -
- -### 1. Bad Debt Management - -On Aave v3, some liquidation scenarios can result in a permanent bad debt on the protocol. -This occurs when the total collateral liquidated is insufficient to cover the repayment of the debt, leaving the account with zero collateral and some remaining debt. -We understand that such debt is unlikely to be repaid and adversely affects the protocol by continuing to accrue interest. - -To mitigate the creation of new bad debt accounts post-liquidation and to halt further interest accrual on such liabilities, the bad debt feature introduces a new verification step during liquidation. -This step checks the total collateral and total debt values of the account post-liquidation and repayment: -If an account ends up with zero collateral and non-zero debt, any remaining debt in the account is burned and the new deficit created is accounted to the reserve. - -In terms of implementation, the feature checks whether the liquidation will result in a bad debt situation by comparing whether the total borrower’s collateral equals the collateral liquidated in the base currency. -If the total borrower’s debt exceeds the debt repaid in base currency, the variable debt tokens of the borrower are burned, and it is accounted to the respective reserve as a deficit. - -For accounts already in a bad debt situation, an nem `eliminateReserveDeficit`method is introduced allowing permissionless burning of debt tokens. -It employs the same verification criteria, checking if the account's collateral equals zero while its debt remains non-zero. -This function accepts a list of accounts in bad debt to be processed. It validates that the account has zero collateral in base currency and non-zero debt before burning all variable debt tokens of the account and accounting the deficit to the equivalent reserve. - -The new `deficit` data is introduced to the `ReserveData` struct by re-utilizing the deprecated stableBorrowRate (`__deprecatedStableBorrowRate`) storage, and can be fetched via the new `getReserveDeficit` function in the Pool contract. - -The deficit reduction of a reserve is introduced via the `eliminateReserveDeficit` function in the Pool contract, where a permissioned entity (the registered `Umbrella` on the PoolAddressesProvider) can burn aTokens to decrease the deficit of the respective reserve. -This function only allows burning up to the currently existing deficit and validates the callers health factor and LTV before reducing the deficit. - -**Misc considerations & acknowledged limitations** - -- For the scope of this feature we define a bad debt situation as an account that has zero collateral but retains some level of debt. Accounts with any remaining collateral potentially can be overcollateralized again. -- Currently, there are no additional incentives for burning the debt of accounts that are already in bad debt. - -**Gas Analysis** - -A gas consumption analysis was conducted to evaluate the impact of implementing the bad debt feature. On average, the increase in gas usage is approximately 0.26%, with a potential maximum of 11%, depending on the number of variable debt tokens held by the borrower. We conclude that integrating this feature is beneficial despite a moderate increase in gas costs. - -For accounts already in bad debt, the gas cost for executing the external function that batches multiple accounts shows an incremental increase of about 30% per account added to the batch. - -``` -| General Pool.Liquidations.t.sol | | | | | | -|---------------------------------------------------------|------------|--------|--------|--------|------------| -| | | | | | | -| Function Name | min | avg | median | max | increase | -| burnBadDebt | 84480 | 134140 | 134140 | 183800 | | -| liquidationCall (without bad debt feature) | 53294 | 230728 | 324231 | 376846 | | -| liquidationCall (with bad debt feature) | 53421 | 231041 | 325214 | 417368 | 0.23 - 11% | -|---------------------------------------------------------|------------|--------|--------|--------|------------| - - -| Isolated Tests: Liquidation without bad debt occurency | | | | | | -|---------------------------------------------------------|------------|--------|--------|--------|----------| -| | | | | | | -| Function Name | min | avg | median | max | increase | -| liquidationCall (without bad debt feature) | 372084 | 372084 | 372084 | 372084 | | -| liquidationCall (with bad debt feature) | 373068 | 373068 | 373068 | 373068 | 0.26% | -|---------------------------------------------------------|------------|--------|--------|--------|----------| - - -| Isolated Tests: Liquidation with bad debt occurency | | | | | | -|---------------------------------------------------------|------------|--------|--------|--------|----------| -| | | | | | | -| Function Name | min | avg | median | max | increase | -| liquidationCall (without bad debt feature) | 360782 | 360782 | 360782 | 360782 | | -| liquidationCall (with bad debt feature) | 362937 | 362937 | 362937 | 362937 | 0.59% | -|---------------------------------------------------------|------------|--------|--------|--------|----------| - - -| Isolated Tests: Batching Accounts in Bad Debt | | | | | | -|---------------------------------------------------------|-----------|--------|--------|--------|-----------| -| | | | | | | -| Function Name | min | avg | median | max | increase | -| burnBadDebt - 1 account | 183800 | 183800 | 183800 | 183800 | | -| burnBadDebt - 2 accounts | 243768 | 243768 | 243768 | 243768 | 33.68% | -| burnBadDebt - 4 accounts | 363704 | 363704 | 363704 | 363704 | 50.53% | -|---------------------------------------------------------|-----------|--------------------------|-----------| -``` - -
- ---- - -
- -### 2. Bitmap access optimization - -The current bitmasks on `ReserveConfiguration` have been optimized for `writes`. -This is unintuitive, as the most common protocol interactions `read` from the configuration. -By flipping the masks: - -```diff -- uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore -+ uint256 internal constant LTV_MASK = 0x000000000000000000000000000000000000000000000000000000000000FFFF; // prettier-ignore -``` - -The access can be simplified: - -``` -function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { -- return self.data & ~LTV_MASK; -+ return self.data & LTV_MASK; -} -``` - -Which slightly reduces gas & code-size. The effect is getting more meaningful for accounts holding multiple collateral & borrow positions. - -### 3. Additional getters - -When analyzing ecosystem contracts we noticed that a lot of contracts have to pay excess gas due to the lack of fine grained getters on the protocol. -If an external integration e.g. wants to query the aToken balance of an address, it currently has to fetch `Pool.getReserveData().aTokenAddress` or `Pool.getReserveDataExtended().aTokenAddress` which will read 7 or 8 storage slots respectively. -This is suboptimal, as the consumer is only interested in a single slot - the one containing the `aTokenAddress`. -Therefore we added a `getReserveAToken()` getter reducing gas cost by up to ~12k gas. We plan on adding more dedicated getters in the future when we see fit. diff --git a/docs/v3.3-properties.md b/docs/v3.3-properties.md deleted file mode 100644 index 7595138f..00000000 --- a/docs/v3.3-properties.md +++ /dev/null @@ -1,26 +0,0 @@ -## Aave v3.3 features properties - -Formal properties in natural language of the 3.2 features. - -
-
- -## Properties - -
- -### 1. Bad Debt Management - -- A bad debt liquidation event should only occur when the liquidation results in the user's total collateral across all reserves being zero in the base currency, while the total debt across all reserves remains non-zero in the base currency. -- A user should only be considered in bad debt if their total collateral across all reserves is zero in the base currency while their total debt across all reserves remains non-zero in the base currency or if they have active borrowing. -- After a bad debt liquidation, the user's borrows should be zero. -- For accounts already in bad debt that are cleaned via the burnBadDebt function, the borrow balance should be zero after cleaning. -- The deficit of all reserves should initially be zero. -- The deficit of reserves that cannot be borrowed or have no borrows must be zero. -- In the event of a bad debt liquidation, the reserve deficit incremented should be the difference between the user's total debt and the user's actual debt to liquidate for the equivalent reserve. -- For accounts already in bad debt and that are cleaned via the `burnBadDebt` function, the increase in the reserve deficit should be equal to the user's debt balance for the equivalent reserve. -- The deficit of all reserves should only be reduced by an authorized entity called the coverage admin. -- The deficit of a reserve should only be reduced if reserve deficit is not zero. -- The deficit of a reserve should only be reduced if the coverage admin has the equivalent aToken in their balance. -- The deficit of a reserve should only be reduced after validating the health factor and the ltv of the coverage admin. -- The maximum amount by which the deficit of a reserve can be reduced should not exceed the current reserve deficit. diff --git a/docs/v3.3/Aave-v3.3-features.md b/docs/v3.3/Aave-v3.3-features.md new file mode 100644 index 00000000..e12d9819 --- /dev/null +++ b/docs/v3.3/Aave-v3.3-features.md @@ -0,0 +1,111 @@ +## Aave v3.3 features + +Aave v3.3 is an upgrade on top of Aave 3.2 + +## Features + +### 1. Bad Debt Management + +On Aave v3, some liquidation scenarios can result in a permanent "bad debt" on the protocol. +This occurs when the total collateral liquidated is insufficient to cover the repayment of all debt, leaving the account with zero collateral and some remaining debt. +We understand that such debt is unlikely to be repaid and adversely affects the protocol by continuing to accrue interest. + +To mitigate the creation of new bad debt accounts post-liquidation and to halt further interest accrual on such liabilities, the bad debt feature introduces a new verification step during liquidation. +This step checks the total collateral and total debt values of the account post-liquidation and repayment: +If an account ends up with zero collateral and non-zero debt, any remaining debt in the account is burned and the new deficit created is accounted to the reserve. + +In terms of implementation, the feature checks whether the liquidation will result in a bad debt situation by comparing whether the total borrower’s collateral equals the collateral liquidated in the base currency. +If the total borrower’s debt exceeds the debt repaid in base currency, the variable debt tokens of the borrower are burned, and it is accounted to the respective reserve as a deficit. + +The new `deficit` data is introduced to the `ReserveData` struct by re-utilizing the deprecated stableBorrowRate (`__deprecatedStableBorrowRate`) storage, and can be fetched via the new `getReserveDeficit` function in the Pool contract. + +The deficit reduction of a reserve is introduced via the `eliminateReserveDeficit` function in the Pool contract, where a permissioned entity (the registered `Umbrella` on the PoolAddressesProvider) can burn aTokens to decrease the deficit of the respective reserve. +This function only allows burning up to the currently existing deficit and validates the callers health factor and LTV before reducing the deficit. + +**Misc considerations** + +- For positions already in bad debt, this upgrade does not offer any solution, but recommends the DAO to clean up these positions via a `repayOnBehalf`. + +**Acknowledged limitations** + +- For the scope of this feature we define a bad debt situation as an account that has zero collateral, in base currency, but retains some level of debt, in base currency. + Accounts with any remaining collateral potentially can be overcollateralized again. + +### 2. Liquidation: 50% close factor re-design + +The Aave protocol currently implements a so-called "Close Factor" which determines how much of a debt position can be repaid in a single liquidation. +While in Aave v2, this parameter was a constant 50%, in Aave v3 there is an alteration between the default 50% and a max close factor of 100%, currently applied when a user health factor deteriorates below a certain threshold. + +The 50% close factor has always been applied on a per reserve basis, so if a user has e.g. the following positions: + +- 3k $ GHO DEBT +- 3k $ USDC DEBT +- 3k $ DAI DEBT +- 9k $ ETH Collateral + A liquidation would only be able to liquidate 1.5k $ GHO/USDC or DAI per liquidation. + +While being by design, it's also rather unintuitive and can even be problematic on smaller positions. +If the overall position value falls below a certain threshold it might no longer be economically sound to liquidate that position - by applying the close factor to each specific reserve, this problem scope is increased unnecessarily. + +Therefore in Aave v3.3 the Close Factor is altered to apply for the whole position, which on the above example would allow to liquidate the whole 3k $ GHO/USDC or DAI in a single liquidation. + +### 3. Liquidation: Position size dependent 100% close factor + +For the aave protocol it is problematic to have dust debt positions, as there is no incentive to liquidate them, while on the other hand they create an ever increasing liability to the protocol. +Most of these dust debt positions are caused by the 50% close factor being applied to already small positions. +In this liquidators can only liquidate 50% of a position which will decrease the overall position value to a point where the gas cost no longer outweights the liquidation bonus. + +Therefore in order to reduce the accumulation of minor debt positions, a new mechanism is introduced: +Liquidations up to a 100% close factor are now allowed whenever the total principal or the total debt of the user on the specific reserve being liquidated is below a `MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD` + +**Acknowledged limitations** +Liquidations are still highly influenced by gas price, liquidation bonus and secondary market liquidity. +`MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD` has to be chosen in a "best effort" way to allow for liquidations on "average" network conditions. +A threshold of 2000$ for example would mean that, at a 1% bonus a liquidation cannot cost more then 20$ before no longer being liquidated by a economically reasonable liquidator. + +### 4. Liquidation: Forced position cleanup + +A problem that exists with current liquidations is that for one or another reason, liquidators sometimes chose to not clean up a full positions but leave some minor dust. +As elaborated before, small debt positions can be problmatic already, but they are especially problematic with the newly introduced bad debt cleanup: + +- when leaving dust, the bad debt cleanup will **not** clean up debt, as it only triggers when the collateral is zero +- as the bad debt cleanup slightly increases gas, for liquidators there is an incentive to leave dust + +To counter these problems a new mechanism is introduced to now allow any debt or collateral below `MIN_LEFTOVER_BASE` to remain after a liquidation. +If debt or collateral after the liquidation would be below `MIN_LEFTOVER_BASE`, but non of the two is exact zero, the transaction reverts. +To achieve that, `MIN_LEFTOVER_BASE` is defined as `MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD/2`. +This way it is ensured that int he range of `[0, MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD]` you can perform a full liquidation (via close Factor 100%). +On the other hand a 50% liquidation in the range of `[MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD, Infinity]` will always leave at least `MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD/2`. + +**Acknowledged limitations** +This feature is highly dependent on `MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD` and therefore relies on choosing a reasonably high `MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD`. + +### 3. Bitmap access optimization + +The current bitmasks on `ReserveConfiguration` have been optimized for `writes`. +This is unintuitive, as the most common protocol interactions `read` from the configuration. +By flipping the masks: + +```diff +- uint256 internal constant LTV_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000; // prettier-ignore ++ uint256 internal constant LTV_MASK = 0x000000000000000000000000000000000000000000000000000000000000FFFF; // prettier-ignore +``` + +The access can be simplified: + +``` +function getLtv(DataTypes.ReserveConfigurationMap memory self) internal pure returns (uint256) { +- return self.data & ~LTV_MASK; ++ return self.data & LTV_MASK; +} +``` + +Which slightly reduces gas & code-size. The effect is getting more meaningful for accounts holding multiple collateral & borrow positions. + +### 4. Additional getters + +When analyzing ecosystem contracts we noticed that a lot of contracts have to pay excess gas due to the lack of fine grained getters on the protocol. +If an external integration e.g. wants to query the aToken balance of an address, it currently has to fetch `Pool.getReserveData().aTokenAddress` which will read 9 storage slots. +This is suboptimal, as the consumer is only interested in a single slot - the one containing the `aTokenAddress`. +Therefore we added a `getReserveAToken()` and `getReserveVariableDebtToken()` getters reducing gas cost by up to ~16k gas dependent on the usecase. +We plan on adding more dedicated getters in the future as we see fit. diff --git a/docs/v3.3/v3.3-properties.md b/docs/v3.3/v3.3-properties.md new file mode 100644 index 00000000..b41e2618 --- /dev/null +++ b/docs/v3.3/v3.3-properties.md @@ -0,0 +1,21 @@ +## Aave v3.3 features properties + +Formal properties in natural language of the 3.3 features. + +
+
+ +## Properties + +
+ +### 1. Bad Debt Management + +- A bad debt liquidation event should only occur when the liquidation results in the user's total collateral across all reserves being zero in the base currencyw, while the total debt across all reserves remains non-zero in the base currency. +- A user should only be considered in bad debt if their total collateral across all reserves is zero in the base currency while their total debt across all reserves remains non-zero in the base currency or if they have active borrowing. +- After a bad debt liquidation, the user's borrows should be zero. +- The deficit of all reserves should initially be zero. +- In the event of a bad debt liquidation, the reserve deficit incremented should be the difference between the user's total debt and the user's actual debt to liquidate for the respective reserve. +- The deficit of all reserves should only be covered by an authorized UMBRELLA entity which is registered on the respective `PoolAddressesProvider`. +- The deficit can only be covered to the point of zero deficit. Covering deficit in practice means burning of aTokens. +- The deficit of a reserve should only be reduced after validating the health factor and the ltv of the coverage admin. diff --git a/foundry.toml b/foundry.toml index a2c225e2..79bd2d15 100644 --- a/foundry.toml +++ b/foundry.toml @@ -20,7 +20,7 @@ ffi = true [fuzz] runs = 1000 -max_test_rejects = 400000 +max_test_rejects = 40000 [rpc_endpoints] mainnet = "${RPC_MAINNET}" diff --git a/src/contracts/instances/PoolInstance.sol b/src/contracts/instances/PoolInstance.sol index 58dd74cd..0414324d 100644 --- a/src/contracts/instances/PoolInstance.sol +++ b/src/contracts/instances/PoolInstance.sol @@ -6,7 +6,7 @@ import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; import {Errors} from '../protocol/libraries/helpers/Errors.sol'; contract PoolInstance is Pool { - uint256 public constant POOL_REVISION = 5; + uint256 public constant POOL_REVISION = 6; constructor(IPoolAddressesProvider provider) Pool(provider) {} @@ -14,19 +14,11 @@ contract PoolInstance is Pool { * @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 - * @dev Initializes the reserves deficit to zero by reusing the `__deprecatedStableBorrowRate` storage slot. + * @dev The passed PoolAddressesProvider is validated against the POOL.ADDRESSES_PROVIDER, to ensure the upgrade is done with correct intention. * @param provider The address of the PoolAddressesProvider */ function initialize(IPoolAddressesProvider provider) external virtual override initializer { require(provider == ADDRESSES_PROVIDER, Errors.INVALID_ADDRESSES_PROVIDER); - uint256 reservesListCount = _reservesCount; - for (uint256 i = 0; i < reservesListCount; i++) { - address asset = _reservesList[i]; - if (asset != address(0)) { - _reserves[asset].deficit = 0; - } - } } function getRevision() internal pure virtual override returns (uint256) { diff --git a/src/contracts/interfaces/IPool.sol b/src/contracts/interfaces/IPool.sol index 82e6b751..8bc03ca0 100644 --- a/src/contracts/interfaces/IPool.sol +++ b/src/contracts/interfaces/IPool.sol @@ -189,9 +189,8 @@ interface IPool { * @dev Emitted when the deficit of a reserve is covered. * @param reserve The address of the underlying asset of the reserve * @param amountCovered The amount of deficit covered - * @param currentDeficit The current deficit of the reserve. */ - event BadDebtCovered(address indexed reserve, uint256 amountCovered, uint256 currentDeficit); + event DeficitCovered(address indexed reserve, uint256 amountCovered); /** * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. @@ -206,7 +205,7 @@ interface IPool { * @param debtAsset The address of the underlying borrowed asset to be burned * @param amount The amount to burn */ - event BadDebtBurned(address indexed user, address indexed debtAsset, uint256 amount); + event DeficitCreated(address indexed user, address indexed debtAsset, uint256 amount); /** * @notice Mints an `amount` of aTokens to the `onBehalfOf` @@ -813,15 +812,6 @@ interface IPool { */ function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; - /** - * @notice Validate and burn all bad debt of users. - * @dev A user is considered to be in bad debt if, after liquidation, they have all collateral liquidated - * while leaving some debt unpaid. This condition indicates that the user's debt is unlikely to be repaid, - * necessitating a debt write-off to prevent further interest accrual. - * @param users The array of addresses in bad debt. - */ - function burnBadDebt(address[] calldata users) external; - /** * @notice It Covers the deficit of a specified reserve by burning the equivalent aToken `amount`. * @dev The deficit of a reserve can occur due to situations where borrowed assets are not repaid, leading to bad debt. @@ -844,6 +834,13 @@ interface IPool { */ function getReserveAToken(address asset) external view returns (address); + /** + * @notice Returns the variableDebtToken address of a reserve. + * @param asset The address of the underlying asset of the reserve + * @return The address of the variableDebtToken + */ + function getReserveVariableDebtToken(address asset) external view returns (address); + /** * @notice Gets the address of the external FlashLoanLogic */ diff --git a/src/contracts/protocol/libraries/helpers/Errors.sol b/src/contracts/protocol/libraries/helpers/Errors.sol index f5f4e46c..31c9df4d 100644 --- a/src/contracts/protocol/libraries/helpers/Errors.sol +++ b/src/contracts/protocol/libraries/helpers/Errors.sol @@ -102,5 +102,6 @@ library Errors { string public constant NOT_BORROWABLE_IN_EMODE = '100'; // Asset not borrowable in eMode string public constant USER_NOT_IN_BAD_DEBT = '101'; // The user is not in bad debt string public constant CALLER_NOT_UMBRELLA = '102'; // The caller of the function is not the umbrella contract - string public constant RESERVE_NOT_IN_DEFICIT = '103'; // The reserve is not in deficit + string public constant RESERVE_NOT_IN_DEFICIT = '103'; // The reserve is not in deficit + string public constant MUST_NOT_LEAVE_DUST = '104'; // Below a certain threshold liquidators need to take the full position } diff --git a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol index e69b212d..c804ea60 100644 --- a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -18,6 +18,7 @@ import {IAToken} from '../../../interfaces/IAToken.sol'; import {IVariableDebtToken} from '../../../interfaces/IVariableDebtToken.sol'; import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; +import {Errors} from '../helpers/Errors.sol'; /** * @title LiquidationLogic library @@ -37,7 +38,7 @@ library LiquidationLogic { // See `IPool` for descriptions event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - event BadDebtBurned(address indexed user, address indexed debtAsset, uint256 amount); + event DeficitCreated(address indexed user, address indexed debtAsset, uint256 amount); event LiquidationCall( address indexed collateralAsset, address indexed debtAsset, @@ -56,22 +57,29 @@ library LiquidationLogic { 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% + * @dev This constant represents the upper bound on the health factor, below(inclusive) which the full amount of debt becomes liquidatable. + * A value of 0.95e18 results in 0.95 */ - uint256 public constant MAX_LIQUIDATION_CLOSE_FACTOR = 1e4; + uint256 public constant CLOSE_FACTOR_HF_THRESHOLD = 0.95e18; /** - * @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 + * @dev This constant represents a base value threshold. + * If the total collateral or debt on a position is below this threshold, the close factor is raised to 100%. + * @notice The default value assumes that the basePrice is usd denominated by 8 decimals and needs to be adjusted in a non USD-denominated pool. */ - uint256 public constant CLOSE_FACTOR_HF_THRESHOLD = 0.95e18; + uint256 public constant MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD = 2000e8; + + /** + * @dev This constant represents the minimum amount of assets in base currency that need to be leftover after a liquidation, if not clearing a position completely. + * This parameter is inferred from MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD as the logic is dependent. + * Assuming a MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD of `n` a liquidation of `n+1` might result in `n/2` leftover which is assumed to be still economically liquidatable. + * This mechanic was introduced to ensure liquidators don't optimize gas by leaving some wei on the liquidation. + */ + uint256 public constant MIN_LEFTOVER_BASE = MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD / 2; struct LiquidationCallLocalVars { uint256 userCollateralBalance; - uint256 userTotalDebt; + uint256 userReserveDebt; uint256 actualDebtToLiquidate; uint256 actualCollateralToLiquidate; uint256 liquidationBonus; @@ -80,9 +88,12 @@ library LiquidationLogic { uint256 totalCollateralInBaseCurrency; uint256 totalDebtInBaseCurrency; uint256 collateralToLiquidateInBaseCurrency; + uint256 userReserveDebtInBaseCurrency; uint256 debtToRepayInBaseCurrency; - address collateralPriceSource; - address debtPriceSource; + uint256 collateralAssetPrice; + uint256 debtAssetPrice; + uint256 collateralAssetUnit; + uint256 debtAssetUnit; IAToken collateralAToken; DataTypes.ReserveCache debtReserveCache; } @@ -91,7 +102,7 @@ library LiquidationLogic { * @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, and the `BadDebtBurned()` event if the liquidation results in bad debt + * @dev Emits the `LiquidationCall()` event, and the `DeficitCreated()` event if the liquidation results in bad debt * @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 @@ -133,10 +144,10 @@ library LiquidationLogic { }) ); - (vars.userTotalDebt, vars.actualDebtToLiquidate) = _calculateDebt( - vars.debtReserveCache, - params, - vars.healthFactor + vars.collateralAToken = IAToken(collateralReserve.aTokenAddress); + vars.userCollateralBalance = vars.collateralAToken.balanceOf(params.user); + vars.userReserveDebt = IERC20(vars.debtReserveCache.variableDebtTokenAddress).balanceOf( + params.user ); ValidationLogic.validateLiquidationCall( @@ -145,13 +156,12 @@ library LiquidationLogic { debtReserve, DataTypes.ValidateLiquidationCallParams({ debtReserveCache: vars.debtReserveCache, - totalDebt: vars.userTotalDebt, + totalDebt: vars.userReserveDebt, healthFactor: vars.healthFactor, priceOracleSentinel: params.priceOracleSentinel }) ); - vars.collateralAToken = IAToken(collateralReserve.aTokenAddress); if ( params.userEModeCategory != 0 && EModeConfiguration.isReserveEnabledOnBitmap( @@ -163,8 +173,43 @@ library LiquidationLogic { } else { vars.liquidationBonus = collateralReserve.configuration.getLiquidationBonus(); } + unchecked { + vars.collateralAssetPrice = IPriceOracleGetter(params.priceOracle).getAssetPrice( + params.collateralAsset + ); + vars.debtAssetPrice = IPriceOracleGetter(params.priceOracle).getAssetPrice(params.debtAsset); + vars.collateralAssetUnit = 10 ** collateralReserve.configuration.getDecimals(); + vars.debtAssetUnit = 10 ** vars.debtReserveCache.reserveConfiguration.getDecimals(); + } - vars.userCollateralBalance = vars.collateralAToken.balanceOf(params.user); + vars.userReserveDebtInBaseCurrency = + (vars.userReserveDebt * vars.debtAssetPrice) / + vars.debtAssetUnit; + + // by default whole debt in the reserve could be liquidated + uint256 maxLiquidatableDebt = vars.userReserveDebt; + // but if debt is above MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD and health factor CLOSE_FACTOR_HF_THRESHOLD + // this amount may be adjusted + if ( + vars.userReserveDebtInBaseCurrency >= MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD && + vars.healthFactor > CLOSE_FACTOR_HF_THRESHOLD + ) { + uint256 totalDefaultLiquidatableDebtInBaseCurrency = vars.totalDebtInBaseCurrency.percentMul( + DEFAULT_LIQUIDATION_CLOSE_FACTOR + ); + + // if the debt is more then DEFAULT_LIQUIDATION_CLOSE_FACTOR % of the whole, + // then we CAN liquidate only up to DEFAULT_LIQUIDATION_CLOSE_FACTOR % + if (vars.userReserveDebtInBaseCurrency > totalDefaultLiquidatableDebtInBaseCurrency) { + maxLiquidatableDebt = + (totalDefaultLiquidatableDebtInBaseCurrency * vars.debtAssetUnit) / + vars.debtAssetPrice; + } + } + + vars.actualDebtToLiquidate = params.debtToCover > maxLiquidatableDebt + ? maxLiquidatableDebt + : params.debtToCover; ( vars.actualCollateralToLiquidate, @@ -173,24 +218,46 @@ library LiquidationLogic { vars.collateralToLiquidateInBaseCurrency, vars.debtToRepayInBaseCurrency ) = _calculateAvailableCollateralToLiquidate( - collateralReserve, - vars.debtReserveCache, - params.collateralAsset, - params.debtAsset, + collateralReserve.configuration, + vars.collateralAssetPrice, + vars.collateralAssetUnit, + vars.debtAssetPrice, + vars.debtAssetUnit, vars.actualDebtToLiquidate, vars.userCollateralBalance, - vars.liquidationBonus, - IPriceOracleGetter(params.priceOracle) + vars.liquidationBonus ); - bool isBadDebt = _isBadDebtScenario( - vars.totalCollateralInBaseCurrency, - vars.collateralToLiquidateInBaseCurrency, - vars.totalDebtInBaseCurrency, - vars.debtToRepayInBaseCurrency - ); + // to prevent accumulation of dust on the protocol, it is enforced that you either + // 1. liquidate all debt + // 2. liquidate all collateral + // 3. leave more then MIN_LEFTOVER_BASE of collateral & debt + if ( + vars.actualDebtToLiquidate < vars.userReserveDebt && + vars.actualCollateralToLiquidate + vars.liquidationProtocolFeeAmount < + vars.userCollateralBalance + ) { + bool isDebtMoreThanLeftoverThreshold = ((vars.userReserveDebt - vars.actualDebtToLiquidate) * + vars.debtAssetPrice) / + vars.debtAssetUnit >= + MIN_LEFTOVER_BASE; + + bool isCollateralMoreThanLeftoverThreshold = ((vars.userCollateralBalance - + vars.actualCollateralToLiquidate) * vars.collateralAssetPrice) / + vars.collateralAssetUnit >= + MIN_LEFTOVER_BASE; + + require( + isDebtMoreThanLeftoverThreshold && isCollateralMoreThanLeftoverThreshold, + Errors.MUST_NOT_LEAVE_DUST + ); + } + + bool isBadDebt = vars.totalCollateralInBaseCurrency == + vars.collateralToLiquidateInBaseCurrency && + vars.totalDebtInBaseCurrency != vars.debtToRepayInBaseCurrency; - if (vars.userTotalDebt == vars.actualDebtToLiquidate || isBadDebt) { + if (vars.userReserveDebt == vars.actualDebtToLiquidate || isBadDebt) { userConfig.setBorrowing(debtReserve.id, false); } @@ -213,6 +280,9 @@ library LiquidationLogic { 0 ); + // IsolationModeTotalDebt only discounts `actualDebtToLiquidate`, not the fully burned amount in case of deficit creation. + // This is by design as otherwise debt debt ceiling would render ineffective if a collateral asset faces bad debt events. + // The governance can decide the raise the ceiling to discount manifested deficit. IsolationModeLogic.updateIsolatedDebtIfIsolated( reservesData, reservesList, @@ -274,42 +344,6 @@ library LiquidationLogic { ); } - /** - * @notice Validates a user's bad debt situation and subsequently burning the debt. - * @param reservesData The state 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 burn the bad debt - * @param userEModeCategory The users active efficiency mode category - * @param reservesCount The number of available reserves - * @param oracle The price oracle - */ - function executeBadDebtCleanup( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.UserConfigurationMap storage userConfig, - address user, - uint8 userEModeCategory, - uint256 reservesCount, - address oracle - ) external { - ValidationLogic.validateUserBadDebt( - reservesData, - reservesList, - eModeCategories, - DataTypes.CalculateUserAccountDataParams({ - userConfig: userConfig, - reservesCount: reservesCount, - user: user, - oracle: oracle, - userEModeCategory: userEModeCategory - }) - ); - _burnBadDebt(reservesData, reservesList, userConfig, reservesCount, user); - } - /** * @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. @@ -400,68 +434,29 @@ library LiquidationLogic { vars.debtReserveCache.variableDebtTokenAddress ).burn( params.user, - isBadDebt ? vars.userTotalDebt : vars.actualDebtToLiquidate, + isBadDebt ? vars.userReserveDebt : vars.actualDebtToLiquidate, vars.debtReserveCache.nextVariableBorrowIndex ); - if (isBadDebt) { - debtReserve.deficit += (vars.userTotalDebt - vars.actualDebtToLiquidate).toUint128(); - emit BadDebtBurned( - params.user, - params.debtAsset, - vars.userTotalDebt - vars.actualDebtToLiquidate - ); + uint256 newDeficit = vars.userReserveDebt - vars.actualDebtToLiquidate; + if (isBadDebt && newDeficit != 0) { + debtReserve.deficit += newDeficit.toUint128(); + emit DeficitCreated(params.user, params.debtAsset, newDeficit); } } - /** - * @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; uint256 collateralToLiquidateInBaseCurrency; uint256 debtToRepayInBaseCurrency; + uint256 debtAssetPrice; + uint256 collateralAssetPrice; } /** @@ -469,10 +464,11 @@ library LiquidationLogic { * 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 collateralReserveConfiguration The data of the collateral reserve + * @param collateralAssetPrice The price of the underlying asset used as collateral + * @param collateralAssetUnit The asset units of the collateral + * @param debtAssetPrice The price of the underlying borrowed asset to be repaid with the liquidation + * @param debtAssetUnit The asset units of the debt * @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 @@ -483,55 +479,42 @@ library LiquidationLogic { * @return The amount to repay with the liquidation in the base currency used by the price feed */ function _calculateAvailableCollateralToLiquidate( - DataTypes.ReserveData storage collateralReserve, - DataTypes.ReserveCache memory debtReserveCache, - address collateralAsset, - address debtAsset, + DataTypes.ReserveConfigurationMap memory collateralReserveConfiguration, + uint256 collateralAssetPrice, + uint256 collateralAssetUnit, + uint256 debtAssetPrice, + uint256 debtAssetUnit, uint256 debtToCover, uint256 userCollateralBalance, - uint256 liquidationBonus, - IPriceOracleGetter oracle - ) internal view returns (uint256, uint256, uint256, uint256, uint256) { + uint256 liquidationBonus + ) internal pure returns (uint256, uint256, 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 + vars.debtAssetPrice = debtAssetPrice; + vars.collateralAssetPrice = collateralAssetPrice; + vars.liquidationProtocolFeePercentage = collateralReserveConfiguration .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.debtAssetPrice * debtToCover * collateralAssetUnit)) / + (vars.collateralAssetPrice * 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); + vars.debtAmountNeeded = ((vars.collateralAssetPrice * vars.collateralAmount * debtAssetUnit) / + (vars.debtAssetPrice * collateralAssetUnit)).percentDiv(liquidationBonus); } else { vars.collateralAmount = vars.maxCollateralToLiquidate; vars.debtAmountNeeded = debtToCover; } vars.collateralToLiquidateInBaseCurrency = - (vars.collateralAmount * vars.collateralPrice) / - vars.collateralAssetUnit; + (vars.collateralAmount * vars.collateralAssetPrice) / + collateralAssetUnit; - vars.debtToRepayInBaseCurrency = - (vars.debtAmountNeeded * vars.debtAssetPrice) / - vars.debtAssetUnit; + vars.debtToRepayInBaseCurrency = (vars.debtAmountNeeded * debtAssetPrice) / debtAssetUnit; if (vars.liquidationProtocolFeePercentage != 0) { vars.bonusCollateral = @@ -552,28 +535,6 @@ library LiquidationLogic { ); } - /** - * @notice Checks whether a liquidation will result in a bad debt situation for the user. - * @dev This function is invoked during the liquidation, after calculating the amounts related - * to collateral and debt that are to be liquidated and repaid, respectively. - * @param totalCollateralInBaseCurrency The total collateral of the user in the base currency used by the price feed - * @param collateralToLiquidateInBaseCurrency The collateral to liquidate in the base currency used by the price feed - * @param totalDebtInBaseCurrency The total debt of the user in the base currency used by the price feed - * @param debtToRepayInBaseCurrency The amount to repay with the liquidation in the base currency used by the price feed - * @return True if the liquidation will result in bad debt, false otherwise - */ - function _isBadDebtScenario( - uint256 totalCollateralInBaseCurrency, - uint256 collateralToLiquidateInBaseCurrency, - uint256 totalDebtInBaseCurrency, - uint256 debtToRepayInBaseCurrency - ) internal pure returns (bool) { - bool collateralIsZeroAfterLiquidation = totalCollateralInBaseCurrency == - collateralToLiquidateInBaseCurrency; - bool debtIsZeroAfterLiquidation = totalDebtInBaseCurrency == debtToRepayInBaseCurrency; - return collateralIsZeroAfterLiquidation && !debtIsZeroAfterLiquidation; - } - /** * @notice Remove a user's bad debt by burning debt tokens. * @dev This function iterates through all active reserves where the user has a debt position, @@ -609,7 +570,7 @@ library LiquidationLogic { userConfig.setBorrowing(i, false); - IVariableDebtToken vToken = IVariableDebtToken(currentReserve.variableDebtTokenAddress); + IVariableDebtToken vToken = IVariableDebtToken(reserveCache.variableDebtTokenAddress); // Fetch the scaled balance first as it is more gas-efficient uint256 userDebt = vToken.scaledBalanceOf(user); // Prior v3.1, there were cases where, after liquidation, the `isBorrowing` flag was left on @@ -620,7 +581,7 @@ library LiquidationLogic { userDebt = userDebt.rayMul(reserveCache.nextVariableBorrowIndex); vToken.burn(user, userDebt, reserveCache.nextVariableBorrowIndex); currentReserve.deficit += userDebt.toUint128(); - emit BadDebtBurned(user, reserveAddress, userDebt); + emit DeficitCreated(user, reserveAddress, userDebt); } } } diff --git a/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/src/contracts/protocol/libraries/logic/ReserveLogic.sol index 1d221620..dd124c4d 100644 --- a/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ b/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -41,7 +41,7 @@ library ReserveLogic { ); event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - event BadDebtCovered(address indexed reserve, uint256 amountDecreased, uint256 currentDeficit); + event DeficitCovered(address indexed reserve, uint256 amountDecreased); /** * @notice Returns the ongoing normalized income for the reserve. @@ -320,7 +320,7 @@ library ReserveLogic { /** * @notice Reduces a portion or all of the deficit of a specified reserve by burning the equivalent aToken `amount`. - * @dev Emits the `BadDebtCovered() event`. + * @dev Emits the `DeficitCovered() event`. * @dev If the coverage admin covers its entire balance, `ReserveUsedAsCollateralDisabled()` is emitted. * @param reservesData The state of all the reserves * @param reservesList The addresses of all the active reserves @@ -349,15 +349,15 @@ library ReserveLogic { reserveCache.nextLiquidityIndex ); - uint256 deficitToDecrease = params.amount; + uint256 balanceWriteOff = params.amount; if (params.amount > currentDeficit) { - deficitToDecrease = currentDeficit; + balanceWriteOff = currentDeficit; } bool isCollateral = userConfig.isUsingAsCollateral(reserve.id); - if (isCollateral && deficitToDecrease == userBalance) { + if (isCollateral && balanceWriteOff == userBalance) { userConfig.setUsingAsCollateral(reserve.id, false); emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); } @@ -365,7 +365,7 @@ library ReserveLogic { IAToken(reserveCache.aTokenAddress).burn( msg.sender, reserveCache.aTokenAddress, - deficitToDecrease, + balanceWriteOff, reserveCache.nextLiquidityIndex ); @@ -383,8 +383,8 @@ library ReserveLogic { ); } - reserve.deficit -= deficitToDecrease.toUint128(); + reserve.deficit -= balanceWriteOff.toUint128(); - emit BadDebtCovered(params.asset, deficitToDecrease, reserve.deficit); + emit DeficitCovered(params.asset, balanceWriteOff); } } diff --git a/src/contracts/protocol/pool/Pool.sol b/src/contracts/protocol/pool/Pool.sol index 8d0c0880..74d3274b 100644 --- a/src/contracts/protocol/pool/Pool.sol +++ b/src/contracts/protocol/pool/Pool.sol @@ -842,23 +842,6 @@ abstract contract Pool is VersionedInitializable, PoolStorage, IPool { ); } - /// @inheritdoc IPool - function burnBadDebt(address[] calldata users) external virtual override { - for (uint256 i; i < users.length; i++) { - address user = users[i]; - LiquidationLogic.executeBadDebtCleanup( - _reserves, - _reservesList, - _eModeCategories, - _usersConfig[user], - user, - _usersEModeCategory[user], - _reservesCount, - ADDRESSES_PROVIDER.getPriceOracle() - ); - } - } - /// @inheritdoc IPool function eliminateReserveDeficit(address asset, uint256 amount) external override onlyUmbrella { ReserveLogic.eliminateDeficit( @@ -887,6 +870,11 @@ abstract contract Pool is VersionedInitializable, PoolStorage, IPool { return _reserves[asset].aTokenAddress; } + /// @inheritdoc IPool + function getReserveVariableDebtToken(address asset) external view virtual returns (address) { + return _reserves[asset].variableDebtTokenAddress; + } + /// @inheritdoc IPool function getFlashLoanLogic() external pure returns (address) { return address(FlashLoanLogic); diff --git a/tests/helpers/LiquidationHelper.sol b/tests/helpers/LiquidationHelper.sol new file mode 100644 index 00000000..4c2b4184 --- /dev/null +++ b/tests/helpers/LiquidationHelper.sol @@ -0,0 +1,134 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {console} from 'forge-std/console.sol'; +import {IPool} from '../../src/contracts/interfaces/IPool.sol'; +import {IAaveOracle} from '../../src/contracts/interfaces/IAaveOracle.sol'; +import {LiquidationLogic} from '../../src/contracts/protocol/libraries/logic/LiquidationLogic.sol'; +import {ReserveConfiguration} from '../../src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol'; +import {EModeConfiguration} from '../../src/contracts/protocol/libraries/configuration/EModeConfiguration.sol'; +import {DataTypes} from '../../src/contracts/protocol/libraries/types/DataTypes.sol'; +import {PercentageMath} from '../../src/contracts/protocol/libraries/math/PercentageMath.sol'; +import {IERC20Detailed} from '../../src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol'; + +/** + * @title LiquidationHelper + * @author BGD Labs + * @notice Utility library to be used inside tests, replicating internal contract logic via external calls. + */ +library LiquidationHelper { + using PercentageMath for uint256; + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + /** + * @notice Returns the required amount of borrows in base currency to reach a certain healthfactor + */ + function _getRequiredBorrowsForHfBelow( + IPool pool, + address user, + uint256 desiredHf + ) internal view returns (uint256) { + (uint256 totalCollateralBase, , , uint256 currentLiquidationThreshold, , ) = pool + .getUserAccountData(user); + return (totalCollateralBase.percentMul(currentLiquidationThreshold + 1) * 1e18) / desiredHf; + } + + struct LocalVars { + address user; + uint256 liquidationBonus; + uint256 userEMode; + address oracle; + address vToken; + } + + function _getLiquidationParams( + IPool pool, + address user, + address collateralAsset, + address debtAsset, + uint256 liquidationAmount + ) internal view returns (uint256, uint256, uint256, uint256, uint256) { + uint256 maxLiquidatableDebt = _getMaxLiquidatableDebt(pool, user, debtAsset); + return + _getLiquidationParams( + pool, + user, + collateralAsset, + debtAsset, + liquidationAmount, + maxLiquidatableDebt + ); + } + + /** + * replicates LiquidationLogic._calculateAvailableCollateralToLiquidate without direct storage access + */ + function _getLiquidationParams( + IPool pool, + address user, + address collateralAsset, + address debtAsset, + uint256 liquidationAmount, + uint256 maxLiquidatableDebt + ) internal view returns (uint256, uint256, uint256, uint256, uint256) { + LocalVars memory local; + local.user = user; + maxLiquidatableDebt = liquidationAmount > maxLiquidatableDebt + ? maxLiquidatableDebt + : liquidationAmount; + DataTypes.ReserveDataLegacy memory collateralReserveData = pool.getReserveData(collateralAsset); + local.liquidationBonus = collateralReserveData.configuration.getLiquidationBonus(); + local.userEMode = pool.getUserEMode(local.user); + if (local.userEMode != 0) { + uint128 collateralConfig = pool.getEModeCategoryCollateralBitmap(uint8(local.userEMode)); + if (EModeConfiguration.isReserveEnabledOnBitmap(collateralConfig, collateralReserveData.id)) { + local.liquidationBonus = pool + .getEModeCategoryCollateralConfig(uint8(local.userEMode)) + .liquidationBonus; + } + } + local.oracle = pool.ADDRESSES_PROVIDER().getPriceOracle(); + local.vToken = pool.getReserveVariableDebtToken(debtAsset); + return + LiquidationLogic._calculateAvailableCollateralToLiquidate( + collateralReserveData.configuration, + IAaveOracle(local.oracle).getAssetPrice(collateralAsset), + 10 ** IERC20Detailed(collateralReserveData.aTokenAddress).decimals(), + IAaveOracle(local.oracle).getAssetPrice(debtAsset), + 10 ** IERC20Detailed(local.vToken).decimals(), + maxLiquidatableDebt, + IERC20Detailed(collateralReserveData.aTokenAddress).balanceOf(local.user), + local.liquidationBonus + ); + } + + function _getMaxLiquidatableDebt( + IPool pool, + address user, + address debtAsset + ) internal view returns (uint256) { + (, uint256 totalDebtInBaseCurrency, , , , uint256 healthFactor) = pool.getUserAccountData(user); + address oracle = pool.ADDRESSES_PROVIDER().getPriceOracle(); + address vToken = pool.getReserveVariableDebtToken(debtAsset); + uint256 maxLiquidatableDebt = IERC20Detailed(vToken).balanceOf(user); + uint256 debtAssetUnits = 10 ** IERC20Detailed(vToken).decimals(); + uint256 debtAssetPrice = IAaveOracle(oracle).getAssetPrice(debtAsset); + uint256 reserveDebtInBaseCurrency = (debtAssetPrice * maxLiquidatableDebt) / debtAssetUnits; + if ( + reserveDebtInBaseCurrency >= LiquidationLogic.MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD && + healthFactor > LiquidationLogic.CLOSE_FACTOR_HF_THRESHOLD + ) { + uint256 totalDefaultLiquidatableDebtInBaseCurrency = totalDebtInBaseCurrency.percentMul( + LiquidationLogic.DEFAULT_LIQUIDATION_CLOSE_FACTOR + ); + + if (reserveDebtInBaseCurrency > totalDefaultLiquidatableDebtInBaseCurrency) { + maxLiquidatableDebt = + (totalDefaultLiquidatableDebtInBaseCurrency * debtAssetUnits) / + debtAssetPrice; + console.log(maxLiquidatableDebt); + } + } + return maxLiquidatableDebt; + } +} diff --git a/tests/misc/rates/RateStrategy.setters.t.sol b/tests/misc/rates/RateStrategy.setters.t.sol index ead7175e..25aa1fa5 100644 --- a/tests/misc/rates/RateStrategy.setters.t.sol +++ b/tests/misc/rates/RateStrategy.setters.t.sol @@ -103,12 +103,16 @@ contract RateStrategySettersTests is RateStrategyBase { function test_reverts_SetReserveInterestRateParams_when_gt_maxRate( IDefaultInterestRateStrategyV2.InterestRateData memory rateData ) public { - vm.assume( - rateData.optimalUsageRatio >= rateStrategy.MIN_OPTIMAL_POINT() && - rateData.optimalUsageRatio <= rateStrategy.MAX_OPTIMAL_POINT() + rateData.optimalUsageRatio = uint16( + bound( + rateData.optimalUsageRatio, + rateStrategy.MIN_OPTIMAL_POINT(), + rateStrategy.MAX_OPTIMAL_POINT() + ) + ); + rateData.variableRateSlope1 = uint32( + bound(rateData.variableRateSlope1, 0, rateData.variableRateSlope2) ); - - vm.assume(rateData.variableRateSlope1 <= rateData.variableRateSlope2); vm.assume( uint256(rateData.baseVariableBorrowRate) + uint256(rateData.variableRateSlope1) + diff --git a/tests/misc/rates/RateStrategy.template.sol b/tests/misc/rates/RateStrategy.template.sol index 01e6dc9b..c2c363eb 100644 --- a/tests/misc/rates/RateStrategy.template.sol +++ b/tests/misc/rates/RateStrategy.template.sol @@ -45,12 +45,17 @@ contract RateStrategyBase is TestnetProcedures { function _validateSetRateParams( IDefaultInterestRateStrategyV2.InterestRateData memory rateData ) internal view { - vm.assume( - rateData.optimalUsageRatio >= rateStrategy.MIN_OPTIMAL_POINT() && - rateData.optimalUsageRatio <= rateStrategy.MAX_OPTIMAL_POINT() + rateData.optimalUsageRatio = uint16( + bound( + rateData.optimalUsageRatio, + rateStrategy.MIN_OPTIMAL_POINT(), + rateStrategy.MAX_OPTIMAL_POINT() + ) + ); + rateData.variableRateSlope1 = uint32( + bound(rateData.variableRateSlope1, 0, rateData.variableRateSlope2) ); - vm.assume(rateData.variableRateSlope1 < rateData.variableRateSlope2); vm.assume( uint256(rateData.baseVariableBorrowRate) + uint256(rateData.variableRateSlope1) + diff --git a/tests/protocol/pool/Pool.Deficit.sol b/tests/protocol/pool/Pool.Deficit.sol index dc98c1c4..3de50054 100644 --- a/tests/protocol/pool/Pool.Deficit.sol +++ b/tests/protocol/pool/Pool.Deficit.sol @@ -14,7 +14,7 @@ import {IAccessControl} from '../../../src/contracts/dependencies/openzeppelin/c contract PoolDeficitTests is TestnetProcedures { using stdStorage for StdStorage; - event BadDebtCovered(address indexed reserve, uint256 amountDecreased, uint256 currentDeficit); + event DeficitCovered(address indexed reserve, uint256 amountDecreased); function setUp() public virtual { initTestEnvironment(); @@ -35,7 +35,7 @@ contract PoolDeficitTests is TestnetProcedures { // eliminate deficit vm.expectEmit(address(contracts.poolProxy)); - emit BadDebtCovered(reserveToken, currentDeficit, 0); + emit DeficitCovered(reserveToken, currentDeficit); contracts.poolProxy.eliminateReserveDeficit(reserveToken, currentDeficit); } @@ -46,7 +46,7 @@ contract PoolDeficitTests is TestnetProcedures { ) public { _filterAddresses(coverageAdmin); (address reserveToken, uint256 currentDeficit) = _createReserveDeficit(supplyAmount); - vm.assume(amountToCover != 0 && amountToCover < currentDeficit); + amountToCover = uint120(bound(amountToCover, 1, currentDeficit)); vm.prank(poolAdmin); contracts.poolAddressesProvider.setAddress(bytes32('UMBRELLA'), coverageAdmin); @@ -59,7 +59,7 @@ contract PoolDeficitTests is TestnetProcedures { // eliminate deficit vm.expectEmit(address(contracts.poolProxy)); - emit BadDebtCovered(reserveToken, amountToCover, currentDeficit - amountToCover); + emit DeficitCovered(reserveToken, amountToCover); contracts.poolProxy.eliminateReserveDeficit(reserveToken, amountToCover); } @@ -70,7 +70,7 @@ contract PoolDeficitTests is TestnetProcedures { ) public { _filterAddresses(coverageAdmin); (address reserveToken, uint256 currentDeficit) = _createReserveDeficit(supplyAmount); - vm.assume(cAdminBorrowAmount != 0 && uint256(cAdminBorrowAmount) * 2 <= currentDeficit); + cAdminBorrowAmount = uint120(bound(cAdminBorrowAmount, 1, currentDeficit / 2)); vm.prank(poolAdmin); contracts.poolAddressesProvider.setAddress(bytes32('UMBRELLA'), coverageAdmin); diff --git a/tests/protocol/pool/Pool.EMode.sol b/tests/protocol/pool/Pool.EMode.sol index 24c621e9..9c9c35ab 100644 --- a/tests/protocol/pool/Pool.EMode.sol +++ b/tests/protocol/pool/Pool.EMode.sol @@ -16,6 +16,7 @@ import {PercentageMath} from '../../../src/contracts/protocol/libraries/math/Per import {IAaveOracle} from '../../../src/contracts/interfaces/IAaveOracle.sol'; import {TestnetProcedures} from '../../utils/TestnetProcedures.sol'; import {TestnetERC20} from '../../../src/contracts/mocks/testnet-helpers/TestnetERC20.sol'; +import {LiquidationHelper} from '../../helpers/LiquidationHelper.sol'; contract PoolEModeTests is TestnetProcedures { using stdStorage for StdStorage; diff --git a/tests/protocol/pool/Pool.Liquidations.CloseFactor.t.sol b/tests/protocol/pool/Pool.Liquidations.CloseFactor.t.sol new file mode 100644 index 00000000..87c01fd6 --- /dev/null +++ b/tests/protocol/pool/Pool.Liquidations.CloseFactor.t.sol @@ -0,0 +1,203 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.0; + +import 'forge-std/Test.sol'; + +import {IVariableDebtToken} from '../../../src/contracts/interfaces/IVariableDebtToken.sol'; +import {IAaveOracle} from '../../../src/contracts/interfaces/IAaveOracle.sol'; +import {IPriceOracleGetter} from '../../../src/contracts/interfaces/IPriceOracleGetter.sol'; +import {IPoolAddressesProvider} from '../../../src/contracts/interfaces/IPoolAddressesProvider.sol'; +import {IAToken, IERC20} from '../../../src/contracts/interfaces/IAToken.sol'; +import {Errors} from '../../../src/contracts/protocol/libraries/helpers/Errors.sol'; +import {UserConfiguration} from '../../../src/contracts/protocol/libraries/configuration/UserConfiguration.sol'; +import {ReserveLogic} from '../../../src/contracts/protocol/libraries/logic/ReserveLogic.sol'; +import {IERC20Detailed} from '../../../src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol'; +import {ReserveConfiguration} from '../../../src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol'; +import {PriceOracleSentinel} from '../../../src/contracts/misc/PriceOracleSentinel.sol'; +import {SequencerOracle, ISequencerOracle} from '../../../src/contracts/mocks/oracle/SequencerOracle.sol'; +import {MockAggregator} from '../../../src/contracts/mocks/oracle/CLAggregators/MockAggregator.sol'; +import {LiquidationLogic} from '../../../src/contracts/protocol/libraries/logic/LiquidationLogic.sol'; +import {DataTypes} from '../../../src/contracts/protocol/libraries/types/DataTypes.sol'; +import {PercentageMath} from '../../../src/contracts/protocol/libraries/math/PercentageMath.sol'; +import {WadRayMath} from '../../../src/contracts/protocol/libraries/math/WadRayMath.sol'; +import {TestnetProcedures} from '../../utils/TestnetProcedures.sol'; +import {LiquidationHelper} from '../../helpers/LiquidationHelper.sol'; + +contract PoolLiquidationCloseFactorTests is TestnetProcedures { + using stdStorage for StdStorage; + + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + using UserConfiguration for DataTypes.UserConfigurationMap; + using PercentageMath for uint256; + using WadRayMath for uint256; + using ReserveLogic for DataTypes.ReserveCache; + using ReserveLogic for DataTypes.ReserveData; + + address internal whale = makeAddr('whale'); + address internal liquidator = makeAddr('liquidator'); + + PriceOracleSentinel internal priceOracleSentinel; + SequencerOracle internal sequencerOracleMock; + + event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); + + function setUp() public { + initTestEnvironment(false); + + _addBorrowableLiquidity(); + _fundLiquidator(); + } + + // ## Fuzzing suite ## + function test_hf_helper(uint256 desiredHf) public { + // bounding to 0.01 as otherwise required amount spiral out of control + desiredHf = bound(desiredHf, 0.01 ether, 1 ether); + _supplyToPool(tokenList.weth, bob, 10 ether); + _borrowToBeBelowHf(bob, tokenList.usdx, desiredHf); + (, , , , , uint256 hf) = contracts.poolProxy.getUserAccountData(bob); + assertLt(hf, desiredHf); + // it's not possible to be exact here, because not every point on the scala is reachable + assertApproxEqAbs(hf, desiredHf, 0.001 ether); + } + + /** + * If the hf is below 0.95 the close factor should be 100% + */ + function test_fuzz_hf_lte_095_supply_gt_threshold_closeFactorShouldBe100( + uint256 desiredHf, + uint256 supplyAmount + ) public { + address collateralAsset = tokenList.weth; + uint256 oraclePrice = contracts.aaveOracle.getAssetPrice(collateralAsset); + uint256 lowerBound = (LiquidationLogic.MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD * + 10 ** IERC20Detailed(collateralAsset).decimals()) / oraclePrice; + supplyAmount = bound(supplyAmount, lowerBound, 1_000 ether); + desiredHf = bound(desiredHf, 0.01 ether, 0.95 ether); + _supplyToPool(collateralAsset, bob, supplyAmount); + _borrowToBeBelowHf(bob, tokenList.usdx, desiredHf); + _liquidateAndValidateCloseFactor(collateralAsset, tokenList.usdx, type(uint256).max, 1e4); + } + + /** + * If hf is above 0.95, but collateral is below threshold - cf should be 100% + */ + function test_fuzz_hf_gt_095_supply_lt_threshold_closeFactorShouldBe100( + uint256 desiredHf, + uint256 supplyAmount + ) public { + address collateralAsset = tokenList.weth; + uint256 oraclePrice = contracts.aaveOracle.getAssetPrice(collateralAsset); + uint256 upperBound = (LiquidationLogic.MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD * + 10 ** IERC20Detailed(collateralAsset).decimals()) / oraclePrice; + supplyAmount = bound(supplyAmount, 0.01 ether, upperBound); + desiredHf = bound(desiredHf, 0.96 ether, 0.99 ether); + _supplyToPool(collateralAsset, bob, supplyAmount); + _borrowToBeBelowHf(bob, tokenList.usdx, desiredHf); + _liquidateAndValidateCloseFactor(collateralAsset, tokenList.usdx, type(uint256).max, 1e4); + } + + /** + * If hf is above 0.95, but collateral is below threshold - cf should be 50% + */ + function test_fuzz_hf_gt_095_supply_gt_threshold_closeFactorShouldBe50( + uint256 desiredHf, + uint256 supplyAmount + ) public { + address collateralAsset = tokenList.weth; + uint256 oraclePrice = contracts.aaveOracle.getAssetPrice(collateralAsset); + uint256 lowerBound = (LiquidationLogic.MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD * + 10 ** IERC20Detailed(collateralAsset).decimals()) / oraclePrice; + supplyAmount = bound(supplyAmount, lowerBound * 2, 10_000 ether); + desiredHf = bound(desiredHf, 0.96 ether, 0.99 ether); + _supplyToPool(collateralAsset, bob, supplyAmount); + _borrowToBeBelowHf(bob, tokenList.usdx, desiredHf); + _liquidateAndValidateCloseFactor(collateralAsset, tokenList.usdx, type(uint256).max, 0.5e4); + } + + // ## unit test suite for coverage without fuzz + function test_hf_lte_095_supply_gt_threshold_closeFactorShouldBe100() external { + test_fuzz_hf_lte_095_supply_gt_threshold_closeFactorShouldBe100(0.94 ether, 100 ether); + } + + function test_hf_gt_095_supply_lt_threshold_closeFactorShouldBe100() external { + test_fuzz_hf_gt_095_supply_lt_threshold_closeFactorShouldBe100(0.97 ether, 0.5 ether); + } + + function test_hf_gt_095_supply_gt_threshold_closeFactorShouldBe50() external { + test_fuzz_hf_gt_095_supply_gt_threshold_closeFactorShouldBe50(0.97 ether, 100 ether); + } + + function _liquidateAndValidateCloseFactor( + address collateralAsset, + address debtAsset, + uint256 amountToLiquidate, + uint256 closeFactor + ) internal { + (, uint256 debtInBaseCurrency, , , , ) = contracts.poolProxy.getUserAccountData(bob); + // first we calculate the maximal possible liquidatable + (, uint256 debtAmountAt100, , , ) = LiquidationHelper._getLiquidationParams( + contracts.poolProxy, + bob, + collateralAsset, + debtAsset, + amountToLiquidate, + // assuming all debt is the asset we wanna liquidate + (debtInBaseCurrency * 10 ** IERC20Detailed(debtAsset).decimals()) / + contracts.aaveOracle.getAssetPrice(debtAsset) + ); + // then we calculate the exact amounts + (uint256 collateralAmount, uint256 debtAmount, , , ) = LiquidationHelper._getLiquidationParams( + contracts.poolProxy, + bob, + collateralAsset, + debtAsset, + amountToLiquidate + ); + uint256 balanceBefore = IERC20Detailed(tokenList.weth).balanceOf(liquidator); + vm.prank(liquidator); + IERC20Detailed(debtAsset).approve(address(contracts.poolProxy), type(uint256).max); + vm.prank(liquidator); + contracts.poolProxy.liquidationCall(collateralAsset, debtAsset, bob, amountToLiquidate, false); + uint256 balanceAfter = IERC20Detailed(collateralAsset).balanceOf(liquidator); + assertEq(balanceAfter - balanceBefore, collateralAmount, 'WRONG_BALANCE'); + assertApproxEqAbs(debtAmountAt100.percentMul(closeFactor), debtAmount, 1, 'WRONG_CLOSE_FACTOR'); + } + + function _borrowToBeBelowHf(address user, address assetToBorrow, uint256 desiredhf) internal { + uint256 requiredBorrowsInBase = LiquidationHelper._getRequiredBorrowsForHfBelow( + contracts.poolProxy, + user, + desiredhf + ); + uint256 amount = (requiredBorrowsInBase * (10 ** IERC20Detailed(assetToBorrow).decimals())) / + contracts.aaveOracle.getAssetPrice(assetToBorrow); + vm.mockCall( + address(contracts.aaveOracle), + abi.encodeWithSelector(IPriceOracleGetter.getAssetPrice.selector, assetToBorrow), + abi.encode(0) + ); + vm.prank(user); + contracts.poolProxy.borrow(assetToBorrow, amount, 2, 0, user); + vm.clearMockedCalls(); + } + + function _addBorrowableLiquidity() internal { + _supplyToPool(tokenList.weth, whale, 1_000_000e18); + _supplyToPool(tokenList.usdx, whale, 1_000_000_000e6); + _supplyToPool(tokenList.wbtc, whale, 10_000e8); + } + + function _fundLiquidator() internal { + deal(tokenList.weth, liquidator, 1_000_000e18); + deal(tokenList.usdx, liquidator, 1_000_000_000e6); + deal(tokenList.wbtc, liquidator, 10_000e8); + } + + function _supplyToPool(address erc20, address user, uint256 amount) internal { + deal(erc20, user, amount); + vm.startPrank(user); + IERC20(erc20).approve(address(contracts.poolProxy), amount); + contracts.poolProxy.supply(erc20, amount, user, 0); + vm.stopPrank(); + } +} diff --git a/tests/protocol/pool/Pool.Liquidations.t.sol b/tests/protocol/pool/Pool.Liquidations.t.sol index fdb4b9cb..fa39a85c 100644 --- a/tests/protocol/pool/Pool.Liquidations.t.sol +++ b/tests/protocol/pool/Pool.Liquidations.t.sol @@ -5,6 +5,7 @@ import 'forge-std/Test.sol'; import {IVariableDebtToken} from '../../../src/contracts/interfaces/IVariableDebtToken.sol'; import {IAaveOracle} from '../../../src/contracts/interfaces/IAaveOracle.sol'; +import {IPriceOracleGetter} from '../../../src/contracts/interfaces/IPriceOracleGetter.sol'; import {IPoolAddressesProvider} from '../../../src/contracts/interfaces/IPoolAddressesProvider.sol'; import {IAToken} from '../../../src/contracts/interfaces/IAToken.sol'; import {Errors} from '../../../src/contracts/protocol/libraries/helpers/Errors.sol'; @@ -19,6 +20,7 @@ import {DataTypes} from '../../../src/contracts/protocol/libraries/types/DataTyp import {PercentageMath} from '../../../src/contracts/protocol/libraries/math/PercentageMath.sol'; import {WadRayMath} from '../../../src/contracts/protocol/libraries/math/WadRayMath.sol'; import {TestnetProcedures} from '../../utils/TestnetProcedures.sol'; +import {LiquidationHelper} from '../../helpers/LiquidationHelper.sol'; contract PoolLiquidationTests is TestnetProcedures { using stdStorage for StdStorage; @@ -81,7 +83,6 @@ contract PoolLiquidationTests is TestnetProcedures { address debtPriceSource; uint256 liquidationBonus; uint256 userCollateralBalance; - DataTypes.ReserveCache debtCache; uint256 priceImpactPercent; uint256 liquidationProtocolFeeAmount; uint256 collateralToLiquidateInBaseCurrency; @@ -143,7 +144,7 @@ contract PoolLiquidationTests is TestnetProcedures { ); } - function test_liquidate_variable_borrow() public { + function test_liquidate_variable_borrow_repro() public { vm.prank(poolAdmin); contracts.poolConfiguratorProxy.setLiquidationProtocolFee(tokenList.usdx, 23_33); uint256 amount = 1.00999999e8; @@ -757,7 +758,7 @@ contract PoolLiquidationTests is TestnetProcedures { } vm.expectEmit(address(contracts.poolProxy)); - emit LiquidationLogic.BadDebtBurned( + emit LiquidationLogic.DeficitCreated( params.user, tokenList.usdx, userDebtBefore - params.actualDebtToLiquidate @@ -818,7 +819,7 @@ contract PoolLiquidationTests is TestnetProcedures { } vm.expectEmit(address(contracts.poolProxy)); - emit LiquidationLogic.BadDebtBurned( + emit LiquidationLogic.DeficitCreated( params.user, tokenList.usdx, userDebtBefore - params.actualDebtToLiquidate @@ -843,67 +844,6 @@ contract PoolLiquidationTests is TestnetProcedures { assertEq(IERC20(varDebtToken).balanceOf(params.user), 0, 'user balance doesnt match'); } - function test_burnBadDebt() public { - uint256 supplyAmount = 0.5e8; - uint256 borrowAmount = 11110e6; - uint256 len = badDebtAccounts.length; - - for (uint256 i; i < len; ++i) { - address user = badDebtAccounts[i]; - deal(tokenList.wbtc, user, supplyAmount); - vm.startPrank(user); - IERC20(tokenList.wbtc).approve(address(contracts.poolProxy), type(uint256).max); - contracts.poolProxy.supply(tokenList.wbtc, supplyAmount, user, 0); - contracts.poolProxy.borrow(tokenList.usdx, borrowAmount, 2, 0, user); - vm.stopPrank(); - } - - vm.warp(block.timestamp + 30 days); - stdstore - .target(IAaveOracle(report.aaveOracle).getSourceOfAsset(tokenList.wbtc)) - .sig('_latestAnswer()') - .checked_write(1); - - (, , address varDebtToken) = contracts.protocolDataProvider.getReserveTokensAddresses( - tokenList.usdx - ); - - uint256[] memory usersDebtBefore = new uint256[](len); - for (uint256 i; i < len; ++i) { - usersDebtBefore[i] = IERC20(varDebtToken).balanceOf(badDebtAccounts[i]); - } - - vm.expectEmit(address(contracts.poolProxy)); - emit LiquidationLogic.BadDebtBurned(badDebtAccounts[0], tokenList.usdx, usersDebtBefore[0]); - - vm.prank(bob); - contracts.poolProxy.burnBadDebt(badDebtAccounts); - - for (uint256 i; i < len; ++i) { - assertEq(IERC20(varDebtToken).balanceOf(badDebtAccounts[i]), 0); - } - } - - function test_revert_burnBadDebt_not_in_bad_debt() public { - uint256 supplyAmount = 0.5e8; - uint256 borrowAmount = 11110e6; - uint256 len = badDebtAccounts.length; - - for (uint256 i; i < len; ++i) { - address user = badDebtAccounts[i]; - deal(tokenList.wbtc, user, supplyAmount); - vm.startPrank(user); - IERC20(tokenList.wbtc).approve(address(contracts.poolProxy), type(uint256).max); - contracts.poolProxy.supply(tokenList.wbtc, supplyAmount, user, 0); - contracts.poolProxy.borrow(tokenList.usdx, borrowAmount, 2, 0, user); - vm.stopPrank(); - } - - vm.expectRevert(bytes(Errors.USER_NOT_IN_BAD_DEBT)); - vm.prank(bob); - contracts.poolProxy.burnBadDebt(badDebtAccounts); - } - function test_deficit_increased_after_liquidate_bad_debt() public { uint256 supplyAmount = 0.5e8; uint256 borrowAmount = 11000e6; @@ -937,7 +877,7 @@ contract PoolLiquidationTests is TestnetProcedures { } vm.expectEmit(address(contracts.poolProxy)); - emit LiquidationLogic.BadDebtBurned( + emit LiquidationLogic.DeficitCreated( params.user, tokenList.usdx, userDebtBefore - params.actualDebtToLiquidate @@ -1001,18 +941,12 @@ contract PoolLiquidationTests is TestnetProcedures { params.healthFactor ) = contracts.poolProxy.getUserAccountData(params.user); - (, , address variableDebtToken) = contracts.protocolDataProvider.getReserveTokensAddresses( + uint256 maxLiquidatableDebt = LiquidationHelper._getMaxLiquidatableDebt( + contracts.poolProxy, + user, params.debtAsset ); - uint256 closeFactor = params.healthFactor > LiquidationLogic.CLOSE_FACTOR_HF_THRESHOLD - ? LiquidationLogic.DEFAULT_LIQUIDATION_CLOSE_FACTOR - : LiquidationLogic.MAX_LIQUIDATION_CLOSE_FACTOR; - - uint256 maxLiquidatableDebt = (IERC20(variableDebtToken).balanceOf(params.user)).percentMul( - closeFactor - ); - params.actualDebtToLiquidate = params.liquidationAmountInput > maxLiquidatableDebt ? maxLiquidatableDebt : params.liquidationAmountInput; @@ -1020,23 +954,18 @@ contract PoolLiquidationTests is TestnetProcedures { collateralReserveData = _getReserveData(params.collateralAsset); debtReserveData = _getReserveData(params.debtAsset); - params.debtCache = debtReserveData.cache(); - ( params.actualCollateralToLiquidate, params.actualDebtToLiquidate, params.liquidationProtocolFeeAmount, params.collateralToLiquidateInBaseCurrency, params.debtToLiquidateInBaseCurrency - ) = LiquidationLogic._calculateAvailableCollateralToLiquidate( - collateralReserveData, - params.debtCache, - params.collateralPriceSource, - params.debtPriceSource, - params.actualDebtToLiquidate, - params.userCollateralBalance, - params.liquidationBonus, - IAaveOracle(report.aaveOracle) + ) = LiquidationHelper._getLiquidationParams( + contracts.poolProxy, + params.user, + params.collateralAsset, + params.debtAsset, + params.actualDebtToLiquidate ); params.isBadDebt = params.totalCollateralInBaseCurrency == params.collateralToLiquidateInBaseCurrency && @@ -1137,9 +1066,8 @@ contract PoolLiquidationTests is TestnetProcedures { } function test_liquidation_when_grace_period_disabled(uint40 liquidationGracePeriod) public { - vm.assume( - liquidationGracePeriod <= contracts.poolConfiguratorProxy.MAX_GRACE_PERIOD() && - liquidationGracePeriod != 0 + liquidationGracePeriod = uint40( + bound(liquidationGracePeriod, 1, contracts.poolConfiguratorProxy.MAX_GRACE_PERIOD()) ); address[] memory assetsInGrace = new address[](1); assetsInGrace[0] = tokenList.usdx; @@ -1191,7 +1119,9 @@ contract PoolLiquidationTests is TestnetProcedures { function test_liquidation_with_liquidation_grace_period_collateral_active( uint40 liquidationGracePeriod ) public { - vm.assume(liquidationGracePeriod <= contracts.poolConfiguratorProxy.MAX_GRACE_PERIOD()); + liquidationGracePeriod = uint40( + bound(liquidationGracePeriod, 0, contracts.poolConfiguratorProxy.MAX_GRACE_PERIOD()) + ); address[] memory assetsInGrace = new address[](1); assetsInGrace[0] = tokenList.wbtc; _testLiquidationGracePeriod(assetsInGrace, liquidationGracePeriod); @@ -1200,7 +1130,9 @@ contract PoolLiquidationTests is TestnetProcedures { function test_liquidation_with_liquidation_grace_period_debt_active( uint40 liquidationGracePeriod ) public { - vm.assume(liquidationGracePeriod <= contracts.poolConfiguratorProxy.MAX_GRACE_PERIOD()); + liquidationGracePeriod = uint40( + bound(liquidationGracePeriod, 0, contracts.poolConfiguratorProxy.MAX_GRACE_PERIOD()) + ); address[] memory assetsInGrace = new address[](1); assetsInGrace[0] = tokenList.usdx; _testLiquidationGracePeriod(assetsInGrace, liquidationGracePeriod); @@ -1209,7 +1141,9 @@ contract PoolLiquidationTests is TestnetProcedures { function test_liquidation_with_liquidation_grace_period_debt_collateral_active( uint40 liquidationGracePeriod ) public { - vm.assume(liquidationGracePeriod <= contracts.poolConfiguratorProxy.MAX_GRACE_PERIOD()); + liquidationGracePeriod = uint40( + bound(liquidationGracePeriod, 0, contracts.poolConfiguratorProxy.MAX_GRACE_PERIOD()) + ); address[] memory assetsInGrace = new address[](2); assetsInGrace[0] = tokenList.wbtc; assetsInGrace[1] = tokenList.usdx; From 6e4a93b015b40e90acfa667a18b49ffd97607b0d Mon Sep 17 00:00:00 2001 From: Lukas Date: Wed, 16 Oct 2024 15:00:17 +0200 Subject: [PATCH 13/72] refactor: improvements (#82) * fix: migrate to dedicated getters * test: cleanup tests * feat: add pdp getter * fix: remove unused validate * refacto: remove getReserveDataExtended --- .../harness/pool/SymbolicLendingPool.sol | 11 +---- foundry.toml | 2 +- .../paraswap-adapters/BaseParaSwapAdapter.sol | 14 +----- .../ParaSwapLiquiditySwapAdapter.sol | 8 +--- .../ParaSwapRepayAdapter.sol | 4 +- .../ParaSwapWithdrawSwapAdapter.sol | 4 +- .../helpers/AaveProtocolDataProvider.sol | 18 ++++---- .../helpers/WrappedTokenGatewayV3.sol | 5 ++- src/contracts/interfaces/IPool.sol | 10 ----- .../interfaces/IPoolDataProvider.sol | 7 +++ .../mocks/tests/FlashloanAttacker.sol | 3 +- .../libraries/logic/ConfiguratorLogic.sol | 14 ++---- .../libraries/logic/ValidationLogic.sol | 24 ---------- src/contracts/protocol/pool/Pool.sol | 7 --- .../paraswap-adapters/ParaswapAdapters.t.sol | 10 +---- .../ERC4626StataTokenUpgradeable.t.sol | 8 ++-- .../static-a-token/StataTokenV2Getters.sol | 3 +- tests/extensions/static-a-token/TestBase.sol | 5 +-- .../rates/RateStrategy.calculateRates.t.sol | 12 ++--- tests/protocol/pool/L2Pool.t.sol | 8 ++-- tests/protocol/pool/Pool.EMode.sol | 4 +- tests/protocol/pool/Pool.Liquidations.t.sol | 29 ------------ tests/protocol/pool/Pool.Repay.t.sol | 45 ++++++++++--------- .../PoolConfigurator.borrowCaps.t.sol | 14 ++---- .../PoolConfigurator.initReserves.t.sol | 4 +- .../PoolConfigurator.reserveRiskConfig.t.sol | 31 +++++++++++-- .../PoolConfigurator.upgradeabilty.t.sol | 31 +++++++++++-- tests/rewards/EmissionsManager.t.sol | 6 +-- tests/rewards/RewardsController.t.sol | 6 +-- tests/utils/DiffUtils.sol | 2 +- 30 files changed, 141 insertions(+), 208 deletions(-) diff --git a/certora/stata/harness/pool/SymbolicLendingPool.sol b/certora/stata/harness/pool/SymbolicLendingPool.sol index 1051ae1e..5d06a379 100644 --- a/certora/stata/harness/pool/SymbolicLendingPool.sol +++ b/certora/stata/harness/pool/SymbolicLendingPool.sol @@ -81,22 +81,13 @@ contract SymbolicLendingPool { return res; } - function getReserveDataExtended( - address asset - ) external view returns (DataTypes.ReserveData memory) { - return reserve; - } - function getConfiguration( address asset ) external view virtual returns (DataTypes.ReserveConfigurationMap memory) { return reserve.configuration; } - function getVirtualUnderlyingBalance( - address asset - ) external view virtual returns (uint128) { + function getVirtualUnderlyingBalance(address asset) external view virtual returns (uint128) { return reserve.virtualUnderlyingBalance; } - } diff --git a/foundry.toml b/foundry.toml index 79bd2d15..23192f4c 100644 --- a/foundry.toml +++ b/foundry.toml @@ -20,7 +20,7 @@ ffi = true [fuzz] runs = 1000 -max_test_rejects = 40000 +max_test_rejects = 20000 [rpc_endpoints] mainnet = "${RPC_MAINNET}" diff --git a/src/contracts/extensions/paraswap-adapters/BaseParaSwapAdapter.sol b/src/contracts/extensions/paraswap-adapters/BaseParaSwapAdapter.sol index 45988edf..8d628e56 100644 --- a/src/contracts/extensions/paraswap-adapters/BaseParaSwapAdapter.sol +++ b/src/contracts/extensions/paraswap-adapters/BaseParaSwapAdapter.sol @@ -75,25 +75,13 @@ abstract contract BaseParaSwapAdapter is FlashLoanSimpleReceiverBase, Ownable { return decimals; } - /** - * @dev Get the aToken associated to the asset - * @return address of the aToken - */ - function _getReserveData( - address asset - ) internal view returns (DataTypes.ReserveDataLegacy memory) { - return POOL.getReserveData(asset); - } - function _pullATokenAndWithdraw( address reserve, address user, uint256 amount, PermitSignature memory permitSignature ) internal { - IERC20WithPermit reserveAToken = IERC20WithPermit( - _getReserveData(address(reserve)).aTokenAddress - ); + IERC20WithPermit reserveAToken = IERC20WithPermit(POOL.getReserveAToken(reserve)); _pullATokenAndWithdraw(reserve, reserveAToken, user, amount, permitSignature); } diff --git a/src/contracts/extensions/paraswap-adapters/ParaSwapLiquiditySwapAdapter.sol b/src/contracts/extensions/paraswap-adapters/ParaSwapLiquiditySwapAdapter.sol index db855a33..918f51f2 100644 --- a/src/contracts/extensions/paraswap-adapters/ParaSwapLiquiditySwapAdapter.sol +++ b/src/contracts/extensions/paraswap-adapters/ParaSwapLiquiditySwapAdapter.sol @@ -109,9 +109,7 @@ contract ParaSwapLiquiditySwapAdapter is BaseParaSwapSellAdapter, ReentrancyGuar IParaSwapAugustus augustus, PermitSignature calldata permitParams ) external nonReentrant { - IERC20WithPermit aToken = IERC20WithPermit( - _getReserveData(address(assetToSwapFrom)).aTokenAddress - ); + IERC20WithPermit aToken = IERC20WithPermit(POOL.getReserveAToken(address(assetToSwapFrom))); if (swapAllBalanceOffset != 0) { uint256 balance = aToken.balanceOf(msg.sender); @@ -167,9 +165,7 @@ contract ParaSwapLiquiditySwapAdapter is BaseParaSwapSellAdapter, ReentrancyGuar IERC20Detailed assetToSwapTo, uint256 minAmountToReceive ) internal { - IERC20WithPermit aToken = IERC20WithPermit( - _getReserveData(address(assetToSwapFrom)).aTokenAddress - ); + IERC20WithPermit aToken = IERC20WithPermit(POOL.getReserveAToken(address(assetToSwapFrom))); uint256 amountToSwap = flashLoanAmount; uint256 balance = aToken.balanceOf(initiator); diff --git a/src/contracts/extensions/paraswap-adapters/ParaSwapRepayAdapter.sol b/src/contracts/extensions/paraswap-adapters/ParaSwapRepayAdapter.sol index 659aae7c..c38c46f6 100644 --- a/src/contracts/extensions/paraswap-adapters/ParaSwapRepayAdapter.sol +++ b/src/contracts/extensions/paraswap-adapters/ParaSwapRepayAdapter.sol @@ -226,9 +226,9 @@ contract ParaSwapRepayAdapter is BaseParaSwapBuyAdapter, ReentrancyGuard { DataTypes.InterestRateMode(rateMode) == DataTypes.InterestRateMode.VARIABLE, 'INVALID_RATE_MODE' ); - DataTypes.ReserveDataLegacy memory debtReserveData = _getReserveData(address(debtAsset)); + address variableDebtTokenAddress = POOL.getReserveVariableDebtToken(address(debtAsset)); - uint256 currentDebt = IERC20(debtReserveData.variableDebtTokenAddress).balanceOf(initiator); + uint256 currentDebt = IERC20(variableDebtTokenAddress).balanceOf(initiator); if (buyAllBalanceOffset != 0) { require(currentDebt <= debtRepayAmount, 'INSUFFICIENT_AMOUNT_TO_REPAY'); diff --git a/src/contracts/extensions/paraswap-adapters/ParaSwapWithdrawSwapAdapter.sol b/src/contracts/extensions/paraswap-adapters/ParaSwapWithdrawSwapAdapter.sol index 2522ee88..543fb026 100644 --- a/src/contracts/extensions/paraswap-adapters/ParaSwapWithdrawSwapAdapter.sol +++ b/src/contracts/extensions/paraswap-adapters/ParaSwapWithdrawSwapAdapter.sol @@ -53,9 +53,7 @@ contract ParaSwapWithdrawSwapAdapter is BaseParaSwapSellAdapter, ReentrancyGuard IParaSwapAugustus augustus, PermitSignature calldata permitParams ) external nonReentrant { - IERC20WithPermit aToken = IERC20WithPermit( - _getReserveData(address(assetToSwapFrom)).aTokenAddress - ); + IERC20WithPermit aToken = IERC20WithPermit(POOL.getReserveAToken(address(assetToSwapFrom))); if (swapAllBalanceOffset != 0) { uint256 balance = aToken.balanceOf(msg.sender); diff --git a/src/contracts/helpers/AaveProtocolDataProvider.sol b/src/contracts/helpers/AaveProtocolDataProvider.sol index 56717d98..31dfcf38 100644 --- a/src/contracts/helpers/AaveProtocolDataProvider.sol +++ b/src/contracts/helpers/AaveProtocolDataProvider.sol @@ -194,10 +194,9 @@ contract AaveProtocolDataProvider is IPoolDataProvider { /// @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(); + address variableDebtTokenAddress = IPool(ADDRESSES_PROVIDER.getPool()) + .getReserveVariableDebtToken(asset); + return IERC20Detailed(variableDebtTokenAddress).totalSupply(); } /// @inheritdoc IPoolDataProvider @@ -251,12 +250,10 @@ contract AaveProtocolDataProvider is IPoolDataProvider { address variableDebtTokenAddress ) { - DataTypes.ReserveDataLegacy memory reserve = IPool(ADDRESSES_PROVIDER.getPool()).getReserveData( - asset - ); + IPool pool = IPool(ADDRESSES_PROVIDER.getPool()); // @notice all stable debt related parameters deprecated in v3.2.0 - return (reserve.aTokenAddress, address(0), reserve.variableDebtTokenAddress); + return (pool.getReserveAToken(asset), address(0), pool.getReserveVariableDebtToken(asset)); } /// @inheritdoc IPoolDataProvider @@ -290,4 +287,9 @@ contract AaveProtocolDataProvider is IPoolDataProvider { function getVirtualUnderlyingBalance(address asset) external view override returns (uint256) { return IPool(ADDRESSES_PROVIDER.getPool()).getVirtualUnderlyingBalance(asset); } + + /// @inheritdoc IPoolDataProvider + function getReserveDeficit(address asset) external view override returns (uint256) { + return IPool(ADDRESSES_PROVIDER.getPool()).getReserveDeficit(asset); + } } diff --git a/src/contracts/helpers/WrappedTokenGatewayV3.sol b/src/contracts/helpers/WrappedTokenGatewayV3.sol index b05bb781..31c4128d 100644 --- a/src/contracts/helpers/WrappedTokenGatewayV3.sol +++ b/src/contracts/helpers/WrappedTokenGatewayV3.sol @@ -73,8 +73,9 @@ contract WrappedTokenGatewayV3 is IWrappedTokenGatewayV3, Ownable { * @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); + uint256 paybackAmount = IERC20(POOL.getReserveVariableDebtToken(address(WETH))).balanceOf( + onBehalfOf + ); if (amount < paybackAmount) { paybackAmount = amount; diff --git a/src/contracts/interfaces/IPool.sol b/src/contracts/interfaces/IPool.sol index 8bc03ca0..c3997121 100644 --- a/src/contracts/interfaces/IPool.sol +++ b/src/contracts/interfaces/IPool.sol @@ -574,16 +574,6 @@ interface IPool { */ 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 diff --git a/src/contracts/interfaces/IPoolDataProvider.sol b/src/contracts/interfaces/IPoolDataProvider.sol index a9df8903..8d6bd247 100644 --- a/src/contracts/interfaces/IPoolDataProvider.sol +++ b/src/contracts/interfaces/IPoolDataProvider.sol @@ -247,4 +247,11 @@ interface IPoolDataProvider { * @return The reserve virtual underlying balance */ function getVirtualUnderlyingBalance(address asset) external view returns (uint256); + + /** + * @notice Returns the deficit of the reserve + * @param asset The address of the underlying asset of the reserve + * @return The reserve deficit + */ + function getReserveDeficit(address asset) external view returns (uint256); } diff --git a/src/contracts/mocks/tests/FlashloanAttacker.sol b/src/contracts/mocks/tests/FlashloanAttacker.sol index 9f32fbd9..45f44ac8 100644 --- a/src/contracts/mocks/tests/FlashloanAttacker.sol +++ b/src/contracts/mocks/tests/FlashloanAttacker.sol @@ -30,9 +30,8 @@ contract FlashloanAttacker is FlashLoanSimpleReceiverBase { } function _innerBorrow(address asset) internal { - DataTypes.ReserveDataLegacy memory config = _pool.getReserveData(asset); IERC20 token = IERC20(asset); - uint256 avail = token.balanceOf(config.aTokenAddress); + uint256 avail = token.balanceOf(_pool.getReserveAToken(asset)); _pool.borrow(asset, avail, 2, 0, address(this)); } diff --git a/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol b/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol index a3d58724..9c7270a9 100644 --- a/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol +++ b/src/contracts/protocol/libraries/logic/ConfiguratorLogic.sol @@ -155,7 +155,7 @@ library ConfiguratorLogic { IPool cachedPool, ConfiguratorInputTypes.UpdateDebtTokenInput calldata input ) external { - DataTypes.ReserveDataLegacy memory reserveData = cachedPool.getReserveData(input.asset); + address variableDebtTokenAddress = cachedPool.getReserveVariableDebtToken(input.asset); uint256 decimals = cachedPool.getConfiguration(input.asset).getDecimals(); @@ -170,17 +170,9 @@ library ConfiguratorLogic { input.params ); - _upgradeTokenImplementation( - reserveData.variableDebtTokenAddress, - input.implementation, - encodedCall - ); + _upgradeTokenImplementation(variableDebtTokenAddress, input.implementation, encodedCall); - emit VariableDebtTokenUpgraded( - input.asset, - reserveData.variableDebtTokenAddress, - input.implementation - ); + emit VariableDebtTokenUpgraded(input.asset, variableDebtTokenAddress, input.implementation); } /** diff --git a/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/src/contracts/protocol/libraries/logic/ValidationLogic.sol index b365804b..e08a30e8 100644 --- a/src/contracts/protocol/libraries/logic/ValidationLogic.sol +++ b/src/contracts/protocol/libraries/logic/ValidationLogic.sol @@ -639,28 +639,4 @@ library ValidationLogic { } return validateUseAsCollateral(reservesData, reservesList, userConfig, reserveConfig); } - - /** - * @notice Validates that the user is in a bad debt situation. - * @dev This function ensures the presence of bad debt, defined as zero collateral value - * with non-zero debt value or active borrowing. Reverts if the user is not in this state. - * @param reservesData The state 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 - */ - function validateUserBadDebt( - mapping(address => DataTypes.ReserveData) storage reservesData, - mapping(uint256 => address) storage reservesList, - mapping(uint8 => DataTypes.EModeCategory) storage eModeCategories, - DataTypes.CalculateUserAccountDataParams memory params - ) internal view { - (uint256 totalCollateralInBaseCurrency, uint256 totalDebtInBaseCurrency, , , , ) = GenericLogic - .calculateUserAccountData(reservesData, reservesList, eModeCategories, params); - require( - totalCollateralInBaseCurrency == 0 && - (totalDebtInBaseCurrency != 0 || params.userConfig.isBorrowingAny()), - Errors.USER_NOT_IN_BAD_DEBT - ); - } } diff --git a/src/contracts/protocol/pool/Pool.sol b/src/contracts/protocol/pool/Pool.sol index 74d3274b..0b21af74 100644 --- a/src/contracts/protocol/pool/Pool.sol +++ b/src/contracts/protocol/pool/Pool.sol @@ -435,13 +435,6 @@ abstract contract Pool is VersionedInitializable, PoolStorage, IPool { 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 diff --git a/tests/extensions/paraswap-adapters/ParaswapAdapters.t.sol b/tests/extensions/paraswap-adapters/ParaswapAdapters.t.sol index 42674e83..695a1685 100644 --- a/tests/extensions/paraswap-adapters/ParaswapAdapters.t.sol +++ b/tests/extensions/paraswap-adapters/ParaswapAdapters.t.sol @@ -74,14 +74,8 @@ contract ParaswapAdaptersTest is TestnetProcedures { mockParaSwapFeeClaimer ); - DataTypes.ReserveDataLegacy memory wethData = contracts.poolProxy.getReserveData( - tokenList.weth - ); - DataTypes.ReserveDataLegacy memory usdxData = contracts.poolProxy.getReserveData( - tokenList.usdx - ); - aWETH = IERC20Detailed(wethData.aTokenAddress); - aUSDX = IERC20Detailed(usdxData.aTokenAddress); + aWETH = IERC20Detailed(contracts.poolProxy.getReserveAToken(tokenList.weth)); + aUSDX = IERC20Detailed(contracts.poolProxy.getReserveAToken(tokenList.usdx)); vm.prank(poolAdmin); TestnetERC20(tokenList.usdx).transferOwnership(address(mockParaSwapAugustus)); diff --git a/tests/extensions/static-a-token/ERC4626StataTokenUpgradeable.t.sol b/tests/extensions/static-a-token/ERC4626StataTokenUpgradeable.t.sol index fb0d0b3a..b193eff2 100644 --- a/tests/extensions/static-a-token/ERC4626StataTokenUpgradeable.t.sol +++ b/tests/extensions/static-a-token/ERC4626StataTokenUpgradeable.t.sol @@ -33,13 +33,11 @@ contract ERC4626StataTokenUpgradeableTest is TestnetProcedures { userPrivateKey = 0xA11CE; user = address(vm.addr(userPrivateKey)); - DataTypes.ReserveDataLegacy memory reserveData = contracts.poolProxy.getReserveData( - tokenList.usdx - ); + address aUsdx = contracts.poolProxy.getReserveAToken(tokenList.usdx); underlying = address(tokenList.usdx); - aToken = reserveData.aTokenAddress; + aToken = aUsdx; erc4626Upgradeable = new MockERC4626StataTokenUpgradeable(contracts.poolProxy); - erc4626Upgradeable.mockInit(address(reserveData.aTokenAddress)); + erc4626Upgradeable.mockInit(address(aUsdx)); } function test_7201() external pure { diff --git a/tests/extensions/static-a-token/StataTokenV2Getters.sol b/tests/extensions/static-a-token/StataTokenV2Getters.sol index d1ff188c..fc08ea19 100644 --- a/tests/extensions/static-a-token/StataTokenV2Getters.sol +++ b/tests/extensions/static-a-token/StataTokenV2Getters.sol @@ -25,8 +25,7 @@ contract StataTokenV2GettersTest is BaseTest { address underlyingAddress = address(stataTokenV2.asset()); assertEq(underlyingAddress, underlying); - DataTypes.ReserveDataLegacy memory data = contracts.poolProxy.getReserveData(underlyingAddress); - assertEq(stataTokenV2.aToken(), data.aTokenAddress); + assertEq(stataTokenV2.aToken(), contracts.poolProxy.getReserveAToken(underlyingAddress)); IERC20Metadata underlying = IERC20Metadata(underlyingAddress); assertEq(stataTokenV2.decimals(), underlying.decimals()); diff --git a/tests/extensions/static-a-token/TestBase.sol b/tests/extensions/static-a-token/TestBase.sol index 652073f7..74c90c1c 100644 --- a/tests/extensions/static-a-token/TestBase.sol +++ b/tests/extensions/static-a-token/TestBase.sol @@ -40,13 +40,10 @@ abstract contract BaseTest is TestnetProcedures { spender = vm.addr(spenderPrivateKey); initTestEnvironment(false); - DataTypes.ReserveDataLegacy memory reserveDataWETH = contracts.poolProxy.getReserveData( - tokenList.weth - ); underlying = address(weth); rewardToken = address(new TestnetERC20('LM Reward ERC20', 'RWD', 18, OWNER)); - aToken = reserveDataWETH.aTokenAddress; + aToken = contracts.poolProxy.getReserveAToken(tokenList.weth); rewardTokens.push(rewardToken); diff --git a/tests/misc/rates/RateStrategy.calculateRates.t.sol b/tests/misc/rates/RateStrategy.calculateRates.t.sol index 75d0ff90..b1c25bc3 100644 --- a/tests/misc/rates/RateStrategy.calculateRates.t.sol +++ b/tests/misc/rates/RateStrategy.calculateRates.t.sol @@ -201,7 +201,7 @@ contract RateStrategyCalculateRatesTests is RateStrategyBase { function test_fuzz_calculate_rates_80_percent_usage_added_and_virtual_equal( uint256 virtualBalanceAmount ) public view { - vm.assume(virtualBalanceAmount <= 200000000000000000); + virtualBalanceAmount = bound(virtualBalanceAmount, 0, 200000000000000000); uint256 liquidityAddedAmount = 200000000000000000 - virtualBalanceAmount; // First, calculate using only virtual balance @@ -332,9 +332,9 @@ contract RateStrategyCalculateRatesTests is RateStrategyBase { uint256 availableLiquidity, uint256 virtualBalanceAmount ) public setRateParams(rateData, tokenList.usdx) { - vm.assume(totalDebt > 0); - vm.assume(totalDebt < availableLiquidity && availableLiquidity < 1e28); - vm.assume(virtualBalanceAmount < 1e28); + availableLiquidity = bound(availableLiquidity, 2, 1e28 - 1); + totalDebt = bound(totalDebt, 1, availableLiquidity - 1); + virtualBalanceAmount = bound(virtualBalanceAmount, 0, 1e28); uint256 availableLiquidityPlusDebt = totalDebt + availableLiquidity + virtualBalanceAmount; borrowUsageRatio = totalDebt.rayDiv(availableLiquidityPlusDebt); vm.assume(borrowUsageRatio < (uint256(rateData.optimalUsageRatio) * 1e23)); @@ -421,9 +421,9 @@ contract RateStrategyCalculateRatesTests is RateStrategyBase { uint256 availableLiquidity, uint256 virtualBalanceAmount ) public setRateParams(rateData, tokenList.usdx) { - availableLiquidity = bound(availableLiquidity, 1, 1e28); + availableLiquidity = bound(availableLiquidity, 1, 1e28 - 1); totalDebt = bound(totalDebt, 1, availableLiquidity); - vm.assume(virtualBalanceAmount < 1e28); + virtualBalanceAmount = bound(virtualBalanceAmount, 0, 1e28 - 1); uint256 availableLiquidityPlusDebt = totalDebt + availableLiquidity + virtualBalanceAmount; borrowUsageRatio = totalDebt.rayDiv(availableLiquidityPlusDebt); diff --git a/tests/protocol/pool/L2Pool.t.sol b/tests/protocol/pool/L2Pool.t.sol index f91495b4..d61591c7 100644 --- a/tests/protocol/pool/L2Pool.t.sol +++ b/tests/protocol/pool/L2Pool.t.sol @@ -133,9 +133,11 @@ contract L2PoolTests is PoolTests { uint128 repayAmount ) public { vm.assume(userPk != 0); - vm.assume(supplyAmount != 0 && supplyAmount <= underlyingBalance); - vm.assume(borrowAmount != 0 && uint256(borrowAmount) * 2 <= supplyAmount); - vm.assume(repayAmount != 0 && repayAmount <= borrowAmount); + underlyingBalance = uint128(bound(underlyingBalance, 2, type(uint120).max)); + supplyAmount = uint128(bound(supplyAmount, 2, underlyingBalance)); + borrowAmount = uint128(bound(borrowAmount, 1, supplyAmount / 2)); + repayAmount = uint128(bound(repayAmount, 1, borrowAmount)); + address user = vm.addr(userPk); deal(tokenList.usdx, user, underlyingBalance); vm.startPrank(user); diff --git a/tests/protocol/pool/Pool.EMode.sol b/tests/protocol/pool/Pool.EMode.sol index 9c9c35ab..3263cc54 100644 --- a/tests/protocol/pool/Pool.EMode.sol +++ b/tests/protocol/pool/Pool.EMode.sol @@ -264,11 +264,11 @@ contract PoolEModeTests is TestnetProcedures { false ); - DataTypes.ReserveDataLegacy memory reserveData = contracts.poolProxy.getReserveData( + DataTypes.ReserveConfigurationMap memory reserveConfig = contracts.poolProxy.getConfiguration( tokenList.usdx ); uint256 bonus = amount - amount.percentDiv(liquidationBonus); - uint256 protocolFee = bonus.percentMul(reserveData.configuration.getLiquidationProtocolFee()); + uint256 protocolFee = bonus.percentMul(reserveConfig.getLiquidationProtocolFee()); assertEq(IERC20(tokenList.usdx).balanceOf(liquidator), amount - protocolFee); } diff --git a/tests/protocol/pool/Pool.Liquidations.t.sol b/tests/protocol/pool/Pool.Liquidations.t.sol index fa39a85c..117a1416 100644 --- a/tests/protocol/pool/Pool.Liquidations.t.sol +++ b/tests/protocol/pool/Pool.Liquidations.t.sol @@ -40,8 +40,6 @@ contract PoolLiquidationTests is TestnetProcedures { SequencerOracle internal sequencerOracleMock; event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); - DataTypes.ReserveData internal collateralReserveData; - DataTypes.ReserveData internal debtReserveData; function setUp() public { initTestEnvironment(); @@ -951,9 +949,6 @@ contract PoolLiquidationTests is TestnetProcedures { ? maxLiquidatableDebt : params.liquidationAmountInput; - collateralReserveData = _getReserveData(params.collateralAsset); - debtReserveData = _getReserveData(params.debtAsset); - ( params.actualCollateralToLiquidate, params.actualDebtToLiquidate, @@ -1281,30 +1276,6 @@ contract PoolLiquidationTests is TestnetProcedures { ); } - function _getReserveData(address asset) internal view returns (DataTypes.ReserveData memory) { - DataTypes.ReserveDataLegacy memory reserveDataLegacy = contracts.poolProxy.getReserveData( - asset - ); - DataTypes.ReserveData memory tempReserveData; - tempReserveData.configuration = reserveDataLegacy.configuration; - tempReserveData.liquidityIndex = reserveDataLegacy.liquidityIndex; - tempReserveData.currentLiquidityRate = reserveDataLegacy.currentLiquidityRate; - tempReserveData.variableBorrowIndex = reserveDataLegacy.variableBorrowIndex; - tempReserveData.currentVariableBorrowRate = reserveDataLegacy.currentVariableBorrowRate; - tempReserveData.lastUpdateTimestamp = reserveDataLegacy.lastUpdateTimestamp; - tempReserveData.id = reserveDataLegacy.id; - tempReserveData.aTokenAddress = reserveDataLegacy.aTokenAddress; - tempReserveData.variableDebtTokenAddress = reserveDataLegacy.variableDebtTokenAddress; - tempReserveData.interestRateStrategyAddress = reserveDataLegacy.interestRateStrategyAddress; - tempReserveData.accruedToTreasury = reserveDataLegacy.accruedToTreasury; - tempReserveData.unbacked = reserveDataLegacy.unbacked; - tempReserveData.isolationModeTotalDebt = reserveDataLegacy.isolationModeTotalDebt; - tempReserveData.virtualUnderlyingBalance = uint128( - contracts.poolProxy.getVirtualUnderlyingBalance(asset) - ); - return tempReserveData; - } - function _setLiquidationGracePeriod(address[] memory assets, uint40 gracePeriod) internal { vm.startPrank(poolAdmin); for (uint256 i = 0; i < assets.length; i++) { diff --git a/tests/protocol/pool/Pool.Repay.t.sol b/tests/protocol/pool/Pool.Repay.t.sol index 84a39ccb..5d5c94b2 100644 --- a/tests/protocol/pool/Pool.Repay.t.sol +++ b/tests/protocol/pool/Pool.Repay.t.sol @@ -225,15 +225,16 @@ contract PoolRepayTests is TestnetProcedures { function test_repayWithPermit( uint128 userPk, - uint120 supplyAmount, - uint120 underlyingBalance, - uint120 borrowAmount, - uint120 repayAmount + uint128 supplyAmount, + uint128 underlyingBalance, + uint128 borrowAmount, + uint128 repayAmount ) public { vm.assume(userPk != 0); - vm.assume(supplyAmount != 0 && supplyAmount <= underlyingBalance); - vm.assume(borrowAmount != 0 && uint256(borrowAmount) * 2 <= supplyAmount); - vm.assume(repayAmount != 0 && repayAmount <= borrowAmount); + underlyingBalance = uint128(bound(underlyingBalance, 2, type(uint120).max)); + supplyAmount = uint128(bound(supplyAmount, 2, underlyingBalance)); + borrowAmount = uint128(bound(borrowAmount, 1, supplyAmount / 2)); + repayAmount = uint128(bound(repayAmount, 1, borrowAmount)); address user = vm.addr(userPk); deal(tokenList.usdx, user, underlyingBalance); vm.startPrank(user); @@ -287,15 +288,16 @@ contract PoolRepayTests is TestnetProcedures { function test_repayWithPermit_not_failing_if_permit_was_used( uint128 userPk, - uint120 supplyAmount, - uint120 underlyingBalance, - uint120 borrowAmount, - uint120 repayAmount + uint128 supplyAmount, + uint128 underlyingBalance, + uint128 borrowAmount, + uint128 repayAmount ) public { vm.assume(userPk != 0); - vm.assume(supplyAmount != 0 && supplyAmount <= underlyingBalance); - vm.assume(borrowAmount != 0 && uint256(borrowAmount) * 2 <= supplyAmount); - vm.assume(repayAmount != 0 && repayAmount <= borrowAmount); + underlyingBalance = uint128(bound(underlyingBalance, 2, type(uint120).max)); + supplyAmount = uint128(bound(supplyAmount, 2, underlyingBalance)); + borrowAmount = uint128(bound(borrowAmount, 1, supplyAmount / 2)); + repayAmount = uint128(bound(repayAmount, 1, borrowAmount)); address user = vm.addr(userPk); deal(tokenList.usdx, user, underlyingBalance); vm.startPrank(user); @@ -351,15 +353,16 @@ contract PoolRepayTests is TestnetProcedures { function test_repayWithPermit_should_revert_if_permit_is_less_then_repay_amount( uint128 userPk, - uint120 supplyAmount, - uint120 underlyingBalance, - uint120 borrowAmount, - uint120 repayAmount + uint128 supplyAmount, + uint128 underlyingBalance, + uint128 borrowAmount, + uint128 repayAmount ) public { vm.assume(userPk != 0); - vm.assume(supplyAmount != 0 && supplyAmount <= underlyingBalance); - vm.assume(borrowAmount != 0 && uint256(borrowAmount) * 2 <= supplyAmount); - vm.assume(repayAmount != 0 && repayAmount <= borrowAmount); + underlyingBalance = uint128(bound(underlyingBalance, 2, type(uint120).max)); + supplyAmount = uint128(bound(supplyAmount, 2, underlyingBalance)); + borrowAmount = uint128(bound(borrowAmount, 1, supplyAmount / 2)); + repayAmount = uint128(bound(repayAmount, 1, borrowAmount)); address user = vm.addr(userPk); deal(tokenList.usdx, user, underlyingBalance); vm.startPrank(user); diff --git a/tests/protocol/pool/pool-configurator/PoolConfigurator.borrowCaps.t.sol b/tests/protocol/pool/pool-configurator/PoolConfigurator.borrowCaps.t.sol index 59bba274..fbd9f427 100644 --- a/tests/protocol/pool/pool-configurator/PoolConfigurator.borrowCaps.t.sol +++ b/tests/protocol/pool/pool-configurator/PoolConfigurator.borrowCaps.t.sol @@ -88,11 +88,8 @@ contract PoolConfiguratorBorrowCapTests is TestnetProcedures { 'Alice balance should match borrow amount' ); - DataTypes.ReserveDataLegacy memory reserveData = contracts.poolProxy.getReserveData( - tokenList.usdx - ); - - uint256 variableDebt = IERC20(reserveData.variableDebtTokenAddress).totalSupply(); + uint256 variableDebt = IERC20(contracts.poolProxy.getReserveVariableDebtToken(tokenList.usdx)) + .totalSupply(); assertEq( variableDebt, @@ -114,11 +111,8 @@ contract PoolConfiguratorBorrowCapTests is TestnetProcedures { ); vm.warp(block.timestamp + 30 days); - DataTypes.ReserveDataLegacy memory reserveData = contracts.poolProxy.getReserveData( - tokenList.usdx - ); - - uint256 variableDebt = IERC20(reserveData.variableDebtTokenAddress).totalSupply(); + uint256 variableDebt = IERC20(contracts.poolProxy.getReserveVariableDebtToken(tokenList.usdx)) + .totalSupply(); (uint256 borrowCapUsdx, ) = contracts.protocolDataProvider.getReserveCaps(tokenList.usdx); diff --git a/tests/protocol/pool/pool-configurator/PoolConfigurator.initReserves.t.sol b/tests/protocol/pool/pool-configurator/PoolConfigurator.initReserves.t.sol index 672f8291..968dcce0 100644 --- a/tests/protocol/pool/pool-configurator/PoolConfigurator.initReserves.t.sol +++ b/tests/protocol/pool/pool-configurator/PoolConfigurator.initReserves.t.sol @@ -20,7 +20,7 @@ contract PoolConfiguratorInitReservesTest is TestnetProcedures { ); function setUp() public { - initTestEnvironment(); + initTestEnvironment(false); } function test_initReserves_validNumberOfAssets(TestVars[128] memory t, uint8 length) public { @@ -134,7 +134,7 @@ contract PoolConfiguratorInitReservesTest is TestnetProcedures { } function test_initReserves_notEnoughDecimal(TestVars memory t) public { - vm.assume(t.underlyingDecimals < 6); + t.underlyingDecimals = uint8(bound(t.underlyingDecimals, 0, 5)); ConfiguratorInputTypes.InitReserveInput[] memory input = _generateInitConfig( t, diff --git a/tests/protocol/pool/pool-configurator/PoolConfigurator.reserveRiskConfig.t.sol b/tests/protocol/pool/pool-configurator/PoolConfigurator.reserveRiskConfig.t.sol index bcd62e00..afdc0d8b 100644 --- a/tests/protocol/pool/pool-configurator/PoolConfigurator.reserveRiskConfig.t.sol +++ b/tests/protocol/pool/pool-configurator/PoolConfigurator.reserveRiskConfig.t.sol @@ -423,7 +423,7 @@ contract PoolConfiguratorReserveRiskConfigs is TestnetProcedures { vm.stopPrank(); - reserveData = contracts.poolProxy.getReserveDataExtended(tokenList.usdx); + reserveData = _getFullReserveData(tokenList.usdx); DataTypes.ReserveCache memory cache = reserveData.cache(); uint40 initialTimestamp = uint40(block.timestamp); @@ -434,7 +434,7 @@ contract PoolConfiguratorReserveRiskConfigs is TestnetProcedures { vm.warp(block.timestamp + 365 days); // check that index is not changed after 1 year - updatedReserveData = contracts.poolProxy.getReserveDataExtended(tokenList.usdx); + updatedReserveData = _getFullReserveData(tokenList.usdx); DataTypes.ReserveCache memory cacheAfterYear = updatedReserveData.cache(); assertEq(cacheAfterYear.reserveLastUpdateTimestamp, initialTimestamp); @@ -451,7 +451,7 @@ contract PoolConfiguratorReserveRiskConfigs is TestnetProcedures { assertEq(reserveFactor, 5_00); // index and rate have changed after Reserve Factor update - updatedReserveData = contracts.poolProxy.getReserveDataExtended(tokenList.usdx); + updatedReserveData = _getFullReserveData(tokenList.usdx); DataTypes.ReserveCache memory updatedCache = updatedReserveData.cache(); assertNotEq(updatedCache.currVariableBorrowIndex, cacheAfterYear.currVariableBorrowIndex); @@ -784,4 +784,29 @@ contract PoolConfiguratorReserveRiskConfigs is TestnetProcedures { vm.expectRevert(bytes(Errors.INVALID_GRACE_PERIOD)); contracts.poolConfiguratorProxy.setReservePause(asset, false, gracePeriod); } + + function _getFullReserveData(address asset) internal returns (DataTypes.ReserveData memory) { + DataTypes.ReserveDataLegacy memory reserveDataLegacy = contracts.poolProxy.getReserveData( + asset + ); + DataTypes.ReserveData memory tempReserveData; + tempReserveData.configuration = reserveDataLegacy.configuration; + tempReserveData.liquidityIndex = reserveDataLegacy.liquidityIndex; + tempReserveData.currentLiquidityRate = reserveDataLegacy.currentLiquidityRate; + tempReserveData.variableBorrowIndex = reserveDataLegacy.variableBorrowIndex; + tempReserveData.currentVariableBorrowRate = reserveDataLegacy.currentVariableBorrowRate; + tempReserveData.lastUpdateTimestamp = reserveDataLegacy.lastUpdateTimestamp; + tempReserveData.id = reserveDataLegacy.id; + tempReserveData.aTokenAddress = reserveDataLegacy.aTokenAddress; + tempReserveData.variableDebtTokenAddress = reserveDataLegacy.variableDebtTokenAddress; + tempReserveData.interestRateStrategyAddress = reserveDataLegacy.interestRateStrategyAddress; + tempReserveData.accruedToTreasury = reserveDataLegacy.accruedToTreasury; + tempReserveData.unbacked = reserveDataLegacy.unbacked; + tempReserveData.isolationModeTotalDebt = reserveDataLegacy.isolationModeTotalDebt; + tempReserveData.virtualUnderlyingBalance = uint128( + contracts.poolProxy.getVirtualUnderlyingBalance(asset) + ); + tempReserveData.deficit = uint128(contracts.poolProxy.getReserveDeficit(asset)); + return tempReserveData; + } } diff --git a/tests/protocol/pool/pool-configurator/PoolConfigurator.upgradeabilty.t.sol b/tests/protocol/pool/pool-configurator/PoolConfigurator.upgradeabilty.t.sol index f6bb692a..98e6aa78 100644 --- a/tests/protocol/pool/pool-configurator/PoolConfigurator.upgradeabilty.t.sol +++ b/tests/protocol/pool/pool-configurator/PoolConfigurator.upgradeabilty.t.sol @@ -121,7 +121,7 @@ contract PoolConfiguratorUpgradeabilityTests is TestnetProcedures { vm.stopPrank(); - reserveData = contracts.poolProxy.getReserveDataExtended(tokenList.usdx); + reserveData = _getFullReserveData(tokenList.usdx); DataTypes.ReserveCache memory cache = reserveData.cache(); assertEq(cache.currVariableBorrowIndex, 1e27); @@ -130,7 +130,7 @@ contract PoolConfiguratorUpgradeabilityTests is TestnetProcedures { vm.warp(block.timestamp + 365 days); // check that index is not changed after 1 year - updatedReserveData = contracts.poolProxy.getReserveDataExtended(tokenList.usdx); + updatedReserveData = _getFullReserveData(tokenList.usdx); DataTypes.ReserveCache memory cacheAfterYear = updatedReserveData.cache(); assertEq(cacheAfterYear.currVariableBorrowIndex, 1e27); @@ -145,7 +145,7 @@ contract PoolConfiguratorUpgradeabilityTests is TestnetProcedures { ); // index and borrow rate have changed after IRS update - updatedReserveData = contracts.poolProxy.getReserveDataExtended(tokenList.usdx); + updatedReserveData = _getFullReserveData(tokenList.usdx); DataTypes.ReserveCache memory updatedCache = updatedReserveData.cache(); assertGt(updatedCache.currVariableBorrowIndex, 1e27); @@ -237,4 +237,29 @@ contract PoolConfiguratorUpgradeabilityTests is TestnetProcedures { input.incentivesController ); } + + function _getFullReserveData(address asset) internal returns (DataTypes.ReserveData memory) { + DataTypes.ReserveDataLegacy memory reserveDataLegacy = contracts.poolProxy.getReserveData( + asset + ); + DataTypes.ReserveData memory tempReserveData; + tempReserveData.configuration = reserveDataLegacy.configuration; + tempReserveData.liquidityIndex = reserveDataLegacy.liquidityIndex; + tempReserveData.currentLiquidityRate = reserveDataLegacy.currentLiquidityRate; + tempReserveData.variableBorrowIndex = reserveDataLegacy.variableBorrowIndex; + tempReserveData.currentVariableBorrowRate = reserveDataLegacy.currentVariableBorrowRate; + tempReserveData.lastUpdateTimestamp = reserveDataLegacy.lastUpdateTimestamp; + tempReserveData.id = reserveDataLegacy.id; + tempReserveData.aTokenAddress = reserveDataLegacy.aTokenAddress; + tempReserveData.variableDebtTokenAddress = reserveDataLegacy.variableDebtTokenAddress; + tempReserveData.interestRateStrategyAddress = reserveDataLegacy.interestRateStrategyAddress; + tempReserveData.accruedToTreasury = reserveDataLegacy.accruedToTreasury; + tempReserveData.unbacked = reserveDataLegacy.unbacked; + tempReserveData.isolationModeTotalDebt = reserveDataLegacy.isolationModeTotalDebt; + tempReserveData.virtualUnderlyingBalance = uint128( + contracts.poolProxy.getVirtualUnderlyingBalance(asset) + ); + tempReserveData.deficit = uint128(contracts.poolProxy.getReserveDeficit(asset)); + return tempReserveData; + } } diff --git a/tests/rewards/EmissionsManager.t.sol b/tests/rewards/EmissionsManager.t.sol index 4f7e7743..cd2ebeba 100644 --- a/tests/rewards/EmissionsManager.t.sol +++ b/tests/rewards/EmissionsManager.t.sol @@ -23,11 +23,7 @@ contract EmissionManagerTest is TestnetProcedures { manager = EmissionManager(report.emissionManager); rewardsController = RewardsController(report.rewardsControllerProxy); - DataTypes.ReserveDataLegacy memory reserveData = IPool(report.poolProxy).getReserveData( - tokenList.usdx - ); - - usdxAToken = reserveData.aTokenAddress; + usdxAToken = contracts.poolProxy.getReserveAToken(tokenList.usdx); } function test_new_EmissionManager() public { diff --git a/tests/rewards/RewardsController.t.sol b/tests/rewards/RewardsController.t.sol index f1323bae..a2755065 100644 --- a/tests/rewards/RewardsController.t.sol +++ b/tests/rewards/RewardsController.t.sol @@ -54,11 +54,7 @@ contract RewardsControllerTest is TestnetProcedures { vm.prank(poolAdmin); manager.setEmissionAdmin(tokenList.usdx, alice); - DataTypes.ReserveDataLegacy memory reserveData = contracts.poolProxy.getReserveData( - tokenList.usdx - ); - - usdxAToken = reserveData.aTokenAddress; + usdxAToken = contracts.poolProxy.getReserveAToken(tokenList.usdx); } function test_new_RewardsController() public returns (RewardsController) { diff --git a/tests/utils/DiffUtils.sol b/tests/utils/DiffUtils.sol index c4fef55d..69a1d673 100644 --- a/tests/utils/DiffUtils.sol +++ b/tests/utils/DiffUtils.sol @@ -22,7 +22,7 @@ contract DiffUtils is Test { string[] memory inputs = new string[](7); inputs[0] = 'npx'; - inputs[1] = '@bgd-labs/aave-cli@^1.0.0'; + inputs[1] = '@bgd-labs/aave-cli@^1.1.2'; inputs[2] = 'diff-snapshots'; inputs[3] = beforePath; inputs[4] = afterPath; From ae74fad7dd7d02c91f96a4ac0960cbe4085ed610 Mon Sep 17 00:00:00 2001 From: Lukas Date: Wed, 16 Oct 2024 15:07:12 +0200 Subject: [PATCH 14/72] fix: add note about breaking change --- docs/{v3.3 => 3.3}/Aave-v3.3-features.md | 5 +++++ docs/{v3.3 => 3.3}/v3.3-properties.md | 0 .../PoolConfigurator.reserveRiskConfig.t.sol | 2 +- .../pool-configurator/PoolConfigurator.upgradeabilty.t.sol | 2 +- 4 files changed, 7 insertions(+), 2 deletions(-) rename docs/{v3.3 => 3.3}/Aave-v3.3-features.md (97%) rename docs/{v3.3 => 3.3}/v3.3-properties.md (100%) diff --git a/docs/v3.3/Aave-v3.3-features.md b/docs/3.3/Aave-v3.3-features.md similarity index 97% rename from docs/v3.3/Aave-v3.3-features.md rename to docs/3.3/Aave-v3.3-features.md index e12d9819..dde85079 100644 --- a/docs/v3.3/Aave-v3.3-features.md +++ b/docs/3.3/Aave-v3.3-features.md @@ -109,3 +109,8 @@ If an external integration e.g. wants to query the aToken balance of an address, This is suboptimal, as the consumer is only interested in a single slot - the one containing the `aTokenAddress`. Therefore we added a `getReserveAToken()` and `getReserveVariableDebtToken()` getters reducing gas cost by up to ~16k gas dependent on the usecase. We plan on adding more dedicated getters in the future as we see fit. + +## Breaking changes + +The previously deprecated `pool.getReserveDataExtended()` was removed. +You can fetch the data via `pool.getReserveData()`, `pool.getVirtualUnderlyingBalance()` & `pool.getVirtualUnderlyingBalance()`. diff --git a/docs/v3.3/v3.3-properties.md b/docs/3.3/v3.3-properties.md similarity index 100% rename from docs/v3.3/v3.3-properties.md rename to docs/3.3/v3.3-properties.md diff --git a/tests/protocol/pool/pool-configurator/PoolConfigurator.reserveRiskConfig.t.sol b/tests/protocol/pool/pool-configurator/PoolConfigurator.reserveRiskConfig.t.sol index afdc0d8b..e5251d78 100644 --- a/tests/protocol/pool/pool-configurator/PoolConfigurator.reserveRiskConfig.t.sol +++ b/tests/protocol/pool/pool-configurator/PoolConfigurator.reserveRiskConfig.t.sol @@ -785,7 +785,7 @@ contract PoolConfiguratorReserveRiskConfigs is TestnetProcedures { contracts.poolConfiguratorProxy.setReservePause(asset, false, gracePeriod); } - function _getFullReserveData(address asset) internal returns (DataTypes.ReserveData memory) { + function _getFullReserveData(address asset) internal view returns (DataTypes.ReserveData memory) { DataTypes.ReserveDataLegacy memory reserveDataLegacy = contracts.poolProxy.getReserveData( asset ); diff --git a/tests/protocol/pool/pool-configurator/PoolConfigurator.upgradeabilty.t.sol b/tests/protocol/pool/pool-configurator/PoolConfigurator.upgradeabilty.t.sol index 98e6aa78..172e304e 100644 --- a/tests/protocol/pool/pool-configurator/PoolConfigurator.upgradeabilty.t.sol +++ b/tests/protocol/pool/pool-configurator/PoolConfigurator.upgradeabilty.t.sol @@ -238,7 +238,7 @@ contract PoolConfiguratorUpgradeabilityTests is TestnetProcedures { ); } - function _getFullReserveData(address asset) internal returns (DataTypes.ReserveData memory) { + function _getFullReserveData(address asset) internal view returns (DataTypes.ReserveData memory) { DataTypes.ReserveDataLegacy memory reserveDataLegacy = contracts.poolProxy.getReserveData( asset ); From 07c1da7cebc30e1378fd12f0a9de50e6d0eb8e75 Mon Sep 17 00:00:00 2001 From: Andrey Date: Thu, 17 Oct 2024 15:36:32 +0300 Subject: [PATCH 15/72] refactor: reuse _burnDebt (#83) Co-authored-by: Lukas --- src/contracts/interfaces/IPool.sol | 3 +- .../libraries/logic/LiquidationLogic.sol | 127 ++++++++++-------- .../protocol/libraries/logic/ReserveLogic.sol | 6 +- tests/protocol/pool/Pool.Deficit.sol | 6 +- 4 files changed, 80 insertions(+), 62 deletions(-) diff --git a/src/contracts/interfaces/IPool.sol b/src/contracts/interfaces/IPool.sol index c3997121..b45b7532 100644 --- a/src/contracts/interfaces/IPool.sol +++ b/src/contracts/interfaces/IPool.sol @@ -188,9 +188,10 @@ interface IPool { /** * @dev Emitted when the deficit of a reserve is covered. * @param reserve The address of the underlying asset of the reserve + * @param caller The caller that triggered the DeficitCovered event * @param amountCovered The amount of deficit covered */ - event DeficitCovered(address indexed reserve, uint256 amountCovered); + event DeficitCovered(address indexed reserve, address caller, uint256 amountCovered); /** * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. diff --git a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol index c804ea60..ab76c877 100644 --- a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -173,14 +173,12 @@ library LiquidationLogic { } else { vars.liquidationBonus = collateralReserve.configuration.getLiquidationBonus(); } - unchecked { - vars.collateralAssetPrice = IPriceOracleGetter(params.priceOracle).getAssetPrice( - params.collateralAsset - ); - vars.debtAssetPrice = IPriceOracleGetter(params.priceOracle).getAssetPrice(params.debtAsset); - vars.collateralAssetUnit = 10 ** collateralReserve.configuration.getDecimals(); - vars.debtAssetUnit = 10 ** vars.debtReserveCache.reserveConfiguration.getDecimals(); - } + vars.collateralAssetPrice = IPriceOracleGetter(params.priceOracle).getAssetPrice( + params.collateralAsset + ); + vars.debtAssetPrice = IPriceOracleGetter(params.priceOracle).getAssetPrice(params.debtAsset); + vars.collateralAssetUnit = 10 ** collateralReserve.configuration.getDecimals(); + vars.debtAssetUnit = 10 ** vars.debtReserveCache.reserveConfiguration.getDecimals(); vars.userReserveDebtInBaseCurrency = (vars.userReserveDebt * vars.debtAssetPrice) / @@ -188,7 +186,7 @@ library LiquidationLogic { // by default whole debt in the reserve could be liquidated uint256 maxLiquidatableDebt = vars.userReserveDebt; - // but if debt is above MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD and health factor CLOSE_FACTOR_HF_THRESHOLD + // but if debt is above or equal MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD and health factor CLOSE_FACTOR_HF_THRESHOLD // this amount may be adjusted if ( vars.userReserveDebtInBaseCurrency >= MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD && @@ -231,7 +229,7 @@ library LiquidationLogic { // to prevent accumulation of dust on the protocol, it is enforced that you either // 1. liquidate all debt // 2. liquidate all collateral - // 3. leave more then MIN_LEFTOVER_BASE of collateral & debt + // 3. leave more than MIN_LEFTOVER_BASE of collateral & debt if ( vars.actualDebtToLiquidate < vars.userReserveDebt && vars.actualCollateralToLiquidate + vars.liquidationProtocolFeeAmount < @@ -253,14 +251,6 @@ library LiquidationLogic { ); } - bool isBadDebt = vars.totalCollateralInBaseCurrency == - vars.collateralToLiquidateInBaseCurrency && - vars.totalDebtInBaseCurrency != vars.debtToRepayInBaseCurrency; - - if (vars.userReserveDebt == vars.actualDebtToLiquidate || isBadDebt) { - 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 ( @@ -271,13 +261,17 @@ library LiquidationLogic { emit ReserveUsedAsCollateralDisabled(params.collateralAsset, params.user); } - _burnDebtTokens(params, vars, debtReserve, isBadDebt); - - debtReserve.updateInterestRatesAndVirtualBalance( + bool hasNoCollateralLeft = vars.totalCollateralInBaseCurrency == + vars.collateralToLiquidateInBaseCurrency; + _burnDebtTokens( vars.debtReserveCache, + debtReserve, + userConfig, + params.user, params.debtAsset, + vars.userReserveDebt, vars.actualDebtToLiquidate, - 0 + hasNoCollateralLeft ); // IsolationModeTotalDebt only discounts `actualDebtToLiquidate`, not the fully burned amount in case of deficit creation. @@ -316,7 +310,7 @@ library LiquidationLogic { } // burn bad debt if necessary - if (isBadDebt && userConfig.isBorrowingAny()) { + if (hasNoCollateralLeft && userConfig.isBorrowingAny()) { _burnBadDebt(reservesData, reservesList, userConfig, params.reservesCount, params.user); } @@ -421,28 +415,55 @@ library LiquidationLogic { * @notice Burns the debt tokens of the user up to the amount being repaid by the liquidator * or the entire debt if the user is in a bad debt scenario. * @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 + * @param debtReserveCache The cached debt reserve parameters + * @param debtReserve The storage pointer of the debt reserve parameters + * @param userConfig The pointer of the user configuration + * @param user The user address + * @param debtAsset The debt asset address + * @param actualDebtToLiquidate The actual debt to liquidate + * @param hasNoCollateralLeft The flag representing, will user will have no collateral left after liquidation */ function _burnDebtTokens( - DataTypes.ExecuteLiquidationCallParams memory params, - LiquidationCallLocalVars memory vars, + DataTypes.ReserveCache memory debtReserveCache, DataTypes.ReserveData storage debtReserve, - bool isBadDebt + DataTypes.UserConfigurationMap storage userConfig, + address user, + address debtAsset, + uint256 userReserveDebt, + uint256 actualDebtToLiquidate, + bool hasNoCollateralLeft ) internal { - vars.debtReserveCache.nextScaledVariableDebt = IVariableDebtToken( - vars.debtReserveCache.variableDebtTokenAddress - ).burn( - params.user, - isBadDebt ? vars.userReserveDebt : vars.actualDebtToLiquidate, - vars.debtReserveCache.nextVariableBorrowIndex - ); + // Prior v3.1, there were cases where, after liquidation, the `isBorrowing` flag was left on + // even after the user debt was fully repaid, so to avoid this function reverting in the `_burnScaled` + // (see ScaledBalanceTokenBase contract), we check for any debt remaining. + if (userReserveDebt != 0) { + debtReserveCache.nextScaledVariableDebt = IVariableDebtToken( + debtReserveCache.variableDebtTokenAddress + ).burn( + user, + hasNoCollateralLeft ? userReserveDebt : actualDebtToLiquidate, + debtReserveCache.nextVariableBorrowIndex + ); + } - uint256 newDeficit = vars.userReserveDebt - vars.actualDebtToLiquidate; - if (isBadDebt && newDeficit != 0) { - debtReserve.deficit += newDeficit.toUint128(); - emit DeficitCreated(params.user, params.debtAsset, newDeficit); + uint256 outstandingDebt = userReserveDebt - actualDebtToLiquidate; + if (hasNoCollateralLeft && outstandingDebt != 0) { + debtReserve.deficit += outstandingDebt.toUint128(); + emit DeficitCreated(user, debtAsset, outstandingDebt); + + outstandingDebt = 0; + } + + if (outstandingDebt == 0) { + userConfig.setBorrowing(debtReserve.id, false); } + + debtReserve.updateInterestRatesAndVirtualBalance( + debtReserveCache, + debtAsset, + actualDebtToLiquidate, + 0 + ); } struct AvailableCollateralToLiquidateLocalVars { @@ -566,23 +587,17 @@ library LiquidationLogic { DataTypes.ReserveCache memory reserveCache = currentReserve.cache(); currentReserve.updateState(reserveCache); - currentReserve.updateInterestRatesAndVirtualBalance(reserveCache, reserveAddress, 0, 0); - - userConfig.setBorrowing(i, false); - - IVariableDebtToken vToken = IVariableDebtToken(reserveCache.variableDebtTokenAddress); - // Fetch the scaled balance first as it is more gas-efficient - uint256 userDebt = vToken.scaledBalanceOf(user); - // Prior v3.1, there were cases where, after liquidation, the `isBorrowing` flag was left on - // even after the user debt was fully repaid, so to avoid this function reverting in the `_burnScaled` - // (see ScaledBalanceTokenBase contract), we check for any debt remaining. - if (userDebt != 0) { - // Scale up the debt balance - userDebt = userDebt.rayMul(reserveCache.nextVariableBorrowIndex); - vToken.burn(user, userDebt, reserveCache.nextVariableBorrowIndex); - currentReserve.deficit += userDebt.toUint128(); - emit DeficitCreated(user, reserveAddress, userDebt); - } + + _burnDebtTokens( + reserveCache, + currentReserve, + userConfig, + user, + reserveAddress, + IERC20(reserveCache.variableDebtTokenAddress).balanceOf(user), + 0, + true + ); } } } diff --git a/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/src/contracts/protocol/libraries/logic/ReserveLogic.sol index dd124c4d..4bad160e 100644 --- a/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ b/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -41,7 +41,7 @@ library ReserveLogic { ); event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - event DeficitCovered(address indexed reserve, uint256 amountDecreased); + event DeficitCovered(address indexed reserve, address caller, uint256 amountDecreased); /** * @notice Returns the ongoing normalized income for the reserve. @@ -369,6 +369,8 @@ library ReserveLogic { reserveCache.nextLiquidityIndex ); + // using the cached "outdated" isCollateral flag, + // as for the validation the state before the burning is important if (isCollateral && userConfig.isBorrowingAny()) { ValidationLogic.validateHFAndLtv( reservesData, @@ -385,6 +387,6 @@ library ReserveLogic { reserve.deficit -= balanceWriteOff.toUint128(); - emit DeficitCovered(params.asset, balanceWriteOff); + emit DeficitCovered(params.asset, msg.sender, balanceWriteOff); } } diff --git a/tests/protocol/pool/Pool.Deficit.sol b/tests/protocol/pool/Pool.Deficit.sol index 3de50054..0c9e640e 100644 --- a/tests/protocol/pool/Pool.Deficit.sol +++ b/tests/protocol/pool/Pool.Deficit.sol @@ -14,7 +14,7 @@ import {IAccessControl} from '../../../src/contracts/dependencies/openzeppelin/c contract PoolDeficitTests is TestnetProcedures { using stdStorage for StdStorage; - event DeficitCovered(address indexed reserve, uint256 amountDecreased); + event DeficitCovered(address indexed reserve, address caller, uint256 amountDecreased); function setUp() public virtual { initTestEnvironment(); @@ -35,7 +35,7 @@ contract PoolDeficitTests is TestnetProcedures { // eliminate deficit vm.expectEmit(address(contracts.poolProxy)); - emit DeficitCovered(reserveToken, currentDeficit); + emit DeficitCovered(reserveToken, coverageAdmin, currentDeficit); contracts.poolProxy.eliminateReserveDeficit(reserveToken, currentDeficit); } @@ -59,7 +59,7 @@ contract PoolDeficitTests is TestnetProcedures { // eliminate deficit vm.expectEmit(address(contracts.poolProxy)); - emit DeficitCovered(reserveToken, amountToCover); + emit DeficitCovered(reserveToken, coverageAdmin, amountToCover); contracts.poolProxy.eliminateReserveDeficit(reserveToken, amountToCover); } From f910b01ba3b0c6d8d19230d8c44344b73b34cc94 Mon Sep 17 00:00:00 2001 From: Lukas Date: Mon, 21 Oct 2024 10:56:49 +0200 Subject: [PATCH 16/72] feat: make weth and pool public for easier validation (#85) --- src/contracts/helpers/WrappedTokenGatewayV3.sol | 4 ++-- src/contracts/helpers/interfaces/IWrappedTokenGatewayV3.sol | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/contracts/helpers/WrappedTokenGatewayV3.sol b/src/contracts/helpers/WrappedTokenGatewayV3.sol index 31c4128d..4525982a 100644 --- a/src/contracts/helpers/WrappedTokenGatewayV3.sol +++ b/src/contracts/helpers/WrappedTokenGatewayV3.sol @@ -21,8 +21,8 @@ contract WrappedTokenGatewayV3 is IWrappedTokenGatewayV3, Ownable { using UserConfiguration for DataTypes.UserConfigurationMap; using GPv2SafeERC20 for IERC20; - IWETH internal immutable WETH; - IPool internal immutable POOL; + IWETH public immutable WETH; + IPool public immutable POOL; /** * @dev Sets the WETH address and the PoolAddressesProvider address. Infinite approves pool. diff --git a/src/contracts/helpers/interfaces/IWrappedTokenGatewayV3.sol b/src/contracts/helpers/interfaces/IWrappedTokenGatewayV3.sol index ae8f5980..629991af 100644 --- a/src/contracts/helpers/interfaces/IWrappedTokenGatewayV3.sol +++ b/src/contracts/helpers/interfaces/IWrappedTokenGatewayV3.sol @@ -1,7 +1,13 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.10; +import {IWETH} from '../interfaces/IWETH.sol'; +import {IPool} from '../../interfaces/IPool.sol'; interface IWrappedTokenGatewayV3 { + function WETH() external view returns (IWETH); + + function POOL() external view returns (IPool); + function depositETH(address pool, address onBehalfOf, uint16 referralCode) external payable; function withdrawETH(address pool, uint256 amount, address onBehalfOf) external; From dd00c6ab634b63d37e7c3485da732d8203de1927 Mon Sep 17 00:00:00 2001 From: Lukas Date: Tue, 22 Oct 2024 14:18:31 +0200 Subject: [PATCH 17/72] docs: 3.3 docs & GHO improvements (#84) - refactor to assume the umbrella never has debt Co-authored-by: Ernesto Boado --- Makefile | 6 +- docs/3.3/Aave-v3.3-features.md | 61 +- docs/3.3/gas-diff.md | 1529 +++++++++++++++++ src/contracts/interfaces/IPool.sol | 2 +- .../protocol/libraries/helpers/Errors.sol | 1 + .../protocol/libraries/logic/BorrowLogic.sol | 3 +- .../libraries/logic/LiquidationLogic.sol | 3 + .../protocol/libraries/logic/ReserveLogic.sol | 67 +- .../protocol/libraries/types/DataTypes.sol | 5 + src/contracts/protocol/pool/Pool.sol | 13 +- tests/mocks/AaveV3TestListing.sol | 56 + tests/protocol/pool/Pool.Deficit.sol | 113 +- tests/protocol/pool/Pool.Liquidations.t.sol | 59 + .../PoolConfigurator.reserveRiskConfig.t.sol | 4 +- tests/utils/TestnetProcedures.sol | 2 + 15 files changed, 1843 insertions(+), 81 deletions(-) create mode 100644 docs/3.3/gas-diff.md diff --git a/Makefile b/Makefile index 8db7ae3b..e7ff98b7 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ test-contract :; forge test --match-contract ${filter} -vvv test-watch :; forge test --watch -vvv --no-match-contract DeploymentsGasLimits # Coverage -coverage-base :; forge coverage --report lcov --no-match-coverage "(scripts|tests|deployments|mocks)" +coverage-base :; forge coverage --fuzz-runs 50 --report lcov --no-match-coverage "(scripts|tests|deployments|mocks)" coverage-clean :; lcov --rc derive_function_end_line=0 --remove ./lcov.info -o ./lcov.info.p \ 'src/contracts/extensions/v3-config-engine/*' \ 'src/contracts/treasury/*' \ @@ -37,7 +37,7 @@ coverage : download :; cast etherscan-source --chain ${chain} -d src/etherscan/${chain}_${address} ${address} git-diff : @mkdir -p diffs - @npx prettier ${before} ${after} --write + # @npx prettier ${before} ${after} --write @printf '%s\n%s\n%s\n' "\`\`\`diff" "$$(git diff --no-index --ignore-space-at-eol ${before} ${after})" "\`\`\`" > diffs/${out}.md # Deploy @@ -51,3 +51,5 @@ deploy-libs : npx catapulta-verify -b broadcast/LibraryPreCompileOne.sol/${chainId}/run-latest.json make deploy-libs-two chain=${chain} npx catapulta-verify -b broadcast/LibraryPreCompileTwo.sol/${chainId}/run-latest.json + +gas-report :; forge test --fuzz-runs 50 --gas-report diff --git a/docs/3.3/Aave-v3.3-features.md b/docs/3.3/Aave-v3.3-features.md index dde85079..1f75d7ad 100644 --- a/docs/3.3/Aave-v3.3-features.md +++ b/docs/3.3/Aave-v3.3-features.md @@ -10,7 +10,7 @@ On Aave v3, some liquidation scenarios can result in a permanent "bad debt" on t This occurs when the total collateral liquidated is insufficient to cover the repayment of all debt, leaving the account with zero collateral and some remaining debt. We understand that such debt is unlikely to be repaid and adversely affects the protocol by continuing to accrue interest. -To mitigate the creation of new bad debt accounts post-liquidation and to halt further interest accrual on such liabilities, the bad debt feature introduces a new verification step during liquidation. +The bad debt feature introduces a new verification step during liquidation to mitigate the creation of new bad debt accounts post-liquidation and halt further interest accrual on such liabilities. This step checks the total collateral and total debt values of the account post-liquidation and repayment: If an account ends up with zero collateral and non-zero debt, any remaining debt in the account is burned and the new deficit created is accounted to the reserve. @@ -20,21 +20,26 @@ If the total borrower’s debt exceeds the debt repaid in base currency, the var The new `deficit` data is introduced to the `ReserveData` struct by re-utilizing the deprecated stableBorrowRate (`__deprecatedStableBorrowRate`) storage, and can be fetched via the new `getReserveDeficit` function in the Pool contract. The deficit reduction of a reserve is introduced via the `eliminateReserveDeficit` function in the Pool contract, where a permissioned entity (the registered `Umbrella` on the PoolAddressesProvider) can burn aTokens to decrease the deficit of the respective reserve. -This function only allows burning up to the currently existing deficit and validates the callers health factor and LTV before reducing the deficit. +This function only allows burning aTokens(and in the case of GHO underlying) up to the currently existing deficit and validates the caller's health factor and LTV before reducing the deficit. **Misc considerations** - For positions already in bad debt, this upgrade does not offer any solution, but recommends the DAO to clean up these positions via a `repayOnBehalf`. +- `eliminateReserveDeficit` assumes for umbrella to have the tokens to be burned. In case of assets having virtual accounting enabled, aTokens will be burned. In case of virtual accounting being disabled, the underlying will be disposed of. + Depending on the coverage asset and reserve configuration(e.g. if coverage is done via underlying, and caps don't allow depositing) it might be that it us not possible to receive the aToken. + This is expected and considered a non-issue as the elimination of the deficit has no strict time constraint. **Acknowledged limitations** - For the scope of this feature we define a bad debt situation as an account that has zero collateral, in base currency, but retains some level of debt, in base currency. Accounts with any remaining collateral potentially can be overcollateralized again. -### 2. Liquidation: 50% close factor re-design +### 2. Liquidation logic changes + +#### 2.1 Liquidation: 50% close factor re-design The Aave protocol currently implements a so-called "Close Factor" which determines how much of a debt position can be repaid in a single liquidation. -While in Aave v2, this parameter was a constant 50%, in Aave v3 there is an alteration between the default 50% and a max close factor of 100%, currently applied when a user health factor deteriorates below a certain threshold. +While in Aave v2, this parameter was a constant 50%, in Aave v3 there is an alteration between the default 50% and a max close factor of 100%, currently applied when a user health-factor deteriorates below a certain threshold. The 50% close factor has always been applied on a per reserve basis, so if a user has e.g. the following positions: @@ -44,39 +49,69 @@ The 50% close factor has always been applied on a per reserve basis, so if a use - 9k $ ETH Collateral A liquidation would only be able to liquidate 1.5k $ GHO/USDC or DAI per liquidation. -While being by design, it's also rather unintuitive and can even be problematic on smaller positions. +While being by design, it's also rather unintuitive and can even be problematic in smaller positions. If the overall position value falls below a certain threshold it might no longer be economically sound to liquidate that position - by applying the close factor to each specific reserve, this problem scope is increased unnecessarily. -Therefore in Aave v3.3 the Close Factor is altered to apply for the whole position, which on the above example would allow to liquidate the whole 3k $ GHO/USDC or DAI in a single liquidation. +Therefore in Aave v3.3 the Close Factor is altered to apply for the whole position, which in the above example would allow to liquidate the whole 3k $ GHO/USDC or DAI in a single liquidation. -### 3. Liquidation: Position size dependent 100% close factor +#### 2.2 Liquidation: Position size dependent 100% close factor For the aave protocol it is problematic to have dust debt positions, as there is no incentive to liquidate them, while on the other hand they create an ever increasing liability to the protocol. Most of these dust debt positions are caused by the 50% close factor being applied to already small positions. -In this liquidators can only liquidate 50% of a position which will decrease the overall position value to a point where the gas cost no longer outweights the liquidation bonus. +In this liquidators can only liquidate 50% of a position which will decrease the overall position value to a point where the gas cost no longer outweighs the liquidation bonus. Therefore in order to reduce the accumulation of minor debt positions, a new mechanism is introduced: Liquidations up to a 100% close factor are now allowed whenever the total principal or the total debt of the user on the specific reserve being liquidated is below a `MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD` +**Example**: +Assuming a `MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD` of 1_000e8 and a position composed as: + +- 2_300e8 collateral A +- 800e8 collateral B +- 900e8 debt A +- 1_100e8 debt B +- a health-factor at 0.96 + +In the previous system, a liquidation could have taken up to 50% of one of the two debt positions. +With the new system the `collateral B` and the `debt A` are below the `MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD`. +Therefore a liquidation could liquidate 100% of `debt A` for any principal and/or receive 100% of `collateral B` while liquidating any debt. + **Acknowledged limitations** -Liquidations are still highly influenced by gas price, liquidation bonus and secondary market liquidity. +Liquidations are still highly influenced by gas prices, liquidation-bonus and secondary market liquidity. `MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD` has to be chosen in a "best effort" way to allow for liquidations on "average" network conditions. A threshold of 2000$ for example would mean that, at a 1% bonus a liquidation cannot cost more then 20$ before no longer being liquidated by a economically reasonable liquidator. -### 4. Liquidation: Forced position cleanup +#### 2.3 Liquidation: Forced position cleanup A problem that exists with current liquidations is that for one or another reason, liquidators sometimes chose to not clean up a full positions but leave some minor dust. -As elaborated before, small debt positions can be problmatic already, but they are especially problematic with the newly introduced bad debt cleanup: +As elaborated before, small debt positions can be a burden already, but they are especially problematic with the newly introduced bad debt cleanup: - when leaving dust, the bad debt cleanup will **not** clean up debt, as it only triggers when the collateral is zero - as the bad debt cleanup slightly increases gas, for liquidators there is an incentive to leave dust To counter these problems a new mechanism is introduced to now allow any debt or collateral below `MIN_LEFTOVER_BASE` to remain after a liquidation. -If debt or collateral after the liquidation would be below `MIN_LEFTOVER_BASE`, but non of the two is exact zero, the transaction reverts. +If debt or collateral after the liquidation would be below `MIN_LEFTOVER_BASE`, but non of the two is exactly zero, the transaction reverts. To achieve that, `MIN_LEFTOVER_BASE` is defined as `MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD/2`. -This way it is ensured that int he range of `[0, MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD]` you can perform a full liquidation (via close Factor 100%). +This way it is ensured that in the range of `[0, MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD]` you can perform a full liquidation (via close Factor 100%). On the other hand a 50% liquidation in the range of `[MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD, Infinity]` will always leave at least `MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD/2`. +**Example** +Assuming a `MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD` of 1_000e8, `MIN_LEFTOVER_BASE` of 500e8 and a position composed as: + +- 400e8 collateral A +- 1000e8 collateral B +- 900e8 debt A +- 400e8 debt B +- a healthFactor at 0.94 + +In the previous system it would have been possible to liquidate any amount of debt for any respective amount of collateral. +With the new system you have to either: + +- liquidate 100% of `debt B` +- liquidate 100% of `collateral A` +- liquidate up to 400e8 of `debt A` or liquidate 100% of `debt A` +- liquidate up to 500e8 of `collateral B` or liquidate 100% of `collateral B` + **Acknowledged limitations** This feature is highly dependent on `MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD` and therefore relies on choosing a reasonably high `MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD`. diff --git a/docs/3.3/gas-diff.md b/docs/3.3/gas-diff.md new file mode 100644 index 00000000..3eba6442 --- /dev/null +++ b/docs/3.3/gas-diff.md @@ -0,0 +1,1529 @@ +```diff +diff --git a/reports/gas.old b/reports/gas.new +index 6249f68..111aa38 100644 +--- a/reports/gas.old ++++ b/reports/gas.new +@@ -3,7 +3,7 @@ + | Deployment Cost | Deployment Size | | | | | + | 827595 | 3611 | | | | | + | Function Name | min | avg | median | max | # calls | +-| balanceOf | 579 | 1100 | 579 | 2579 | 1775 | ++| balanceOf | 579 | 1102 | 579 | 2579 | 1775 | + | initialize | 157662 | 157662 | 157662 | 157662 | 30 | + + +@@ -30,26 +30,26 @@ + | balanceOf | 1442 | 1442 | 1442 | 1442 | 1 | + | canPause | 18899 | 18899 | 18899 | 18899 | 56 | + | claimRewardsToSelf | 32178 | 32178 | 32178 | 32178 | 1 | +-| createStataTokens | 2513736 | 2513736 | 2513736 | 2513736 | 23 | ++| createStataTokens | 2436116 | 2436116 | 2436116 | 2436116 | 23 | + | decimals | 1404 | 1404 | 1404 | 1404 | 1 | +-| deposit | 296168 | 296168 | 296168 | 296168 | 1 | +-| depositATokens | 176709 | 179776 | 176721 | 218511 | 55 | +-| emergencyTokenTransfer | 35389 | 153752 | 157301 | 174420 | 54 | ++| deposit | 287548 | 287548 | 287548 | 287548 | 1 | ++| depositATokens | 176775 | 179779 | 176787 | 218577 | 56 | ++| emergencyTokenTransfer | 35389 | 153894 | 157389 | 174508 | 55 | + | getReferenceAsset | 3277 | 3277 | 3277 | 3277 | 1 | + | getStataToken | 1358 | 1358 | 1358 | 1358 | 23 | + | maxRedeem | 8261 | 8261 | 8261 | 8261 | 2 | +-| maxWithdraw | 10927 | 10927 | 10927 | 10927 | 1 | +-| mint | 296262 | 296262 | 296262 | 296262 | 1 | ++| maxWithdraw | 10949 | 10949 | 10949 | 10949 | 1 | ++| mint | 287642 | 287642 | 287642 | 287642 | 1 | + | name | 10669 | 10669 | 10669 | 10669 | 1 | + | nonces | 10065 | 10065 | 10065 | 10065 | 3 | + | paused | 1255 | 5505 | 5505 | 9755 | 2 | + | permit | 31430 | 61234 | 63913 | 88360 | 3 | +-| previewDeposit | 23248 | 23248 | 23248 | 23248 | 1 | +-| redeem | 60981 | 60981 | 60981 | 60981 | 1 | ++| previewDeposit | 23270 | 23270 | 23270 | 23270 | 1 | ++| redeem | 61003 | 61003 | 61003 | 61003 | 1 | + | setPaused | 40089 | 42730 | 40089 | 63486 | 62 | + | symbol | 4181 | 4181 | 4181 | 4181 | 1 | + | transfer | 31688 | 31688 | 31688 | 31688 | 1 | +-| withdraw | 63648 | 63648 | 63648 | 63648 | 1 | ++| withdraw | 63692 | 63692 | 63692 | 63692 | 1 | + + + | src/contracts/dependencies/weth/WETH9.sol:WETH9 contract | | | | | | +@@ -58,9 +58,9 @@ + | 535043 | 2354 | | | | | + | Function Name | min | avg | median | max | # calls | + | allowance | 800 | 1500 | 800 | 2800 | 20 | +-| approve | 28992 | 45929 | 46464 | 46464 | 1763 | +-| balanceOf | 538 | 948 | 538 | 2538 | 8921 | +-| decimals | 2312 | 2312 | 2312 | 2312 | 687 | ++| approve | 28992 | 45952 | 46464 | 46464 | 2010 | ++| balanceOf | 538 | 965 | 538 | 2538 | 10527 | ++| decimals | 2312 | 2312 | 2312 | 2312 | 871 | + | symbol | 1209 | 2246 | 3209 | 3209 | 27 | + + +@@ -80,29 +80,29 @@ + | src/contracts/extensions/paraswap-adapters/ParaSwapLiquiditySwapAdapter.sol:ParaSwapLiquiditySwapAdapter contract | | | | | | + |-------------------------------------------------------------------------------------------------------------------|-----------------|--------|--------|--------|---------| + | Deployment Cost | Deployment Size | | | | | +-| 2013105 | 9946 | | | | | ++| 1907377 | 9465 | | | | | + | Function Name | min | avg | median | max | # calls | + | owner | 384 | 384 | 384 | 384 | 2 | +-| swapAndDeposit | 354784 | 445579 | 477520 | 504434 | 3 | ++| swapAndDeposit | 343811 | 435867 | 468438 | 495352 | 3 | + + + | src/contracts/extensions/paraswap-adapters/ParaSwapRepayAdapter.sol:ParaSwapRepayAdapter contract | | | | | | + |---------------------------------------------------------------------------------------------------|-----------------|--------|--------|--------|---------| + | Deployment Cost | Deployment Size | | | | | +-| 2140443 | 10623 | | | | | ++| 2033146 | 10135 | | | | | + | Function Name | min | avg | median | max | # calls | + | owner | 406 | 406 | 406 | 406 | 2 | + | rescueTokens | 36115 | 36115 | 36115 | 36115 | 1 | +-| swapAndRepay | 404190 | 512323 | 538923 | 567258 | 4 | ++| swapAndRepay | 376460 | 491714 | 520806 | 548783 | 4 | + + + | src/contracts/extensions/paraswap-adapters/ParaSwapWithdrawSwapAdapter.sol:ParaSwapWithdrawSwapAdapter contract | | | | | | + |-----------------------------------------------------------------------------------------------------------------|-----------------|--------|--------|--------|---------| + | Deployment Cost | Deployment Size | | | | | +-| 1726578 | 8547 | | | | | ++| 1587776 | 7905 | | | | | + | Function Name | min | avg | median | max | # calls | + | owner | 406 | 406 | 406 | 406 | 2 | +-| withdrawAndSwap | 354732 | 380661 | 373324 | 413928 | 3 | ++| withdrawAndSwap | 343759 | 371139 | 364527 | 405131 | 3 | + + + | src/contracts/extensions/static-a-token/StataTokenFactory.sol:StataTokenFactory contract | | | | | | +@@ -111,9 +111,9 @@ + | 0 | 0 | | | | | + | Function Name | min | avg | median | max | # calls | + | STATA_TOKEN_IMPL | 248 | 248 | 248 | 248 | 1 | +-| createStataTokens | 2483966 | 2483966 | 2483966 | 2483966 | 23 | ++| createStataTokens | 2406346 | 2406346 | 2406346 | 2406346 | 23 | + | getStataToken | 569 | 569 | 569 | 569 | 23 | +-| initialize | 24103 | 24103 | 24103 | 24103 | 655 | ++| initialize | 24103 | 24103 | 24103 | 24103 | 671 | + + + | src/contracts/extensions/static-a-token/StataTokenV2.sol:StataTokenV2 contract | | | | | | +@@ -130,24 +130,24 @@ + | canPause | 11610 | 11610 | 11610 | 11610 | 56 | + | claimRewardsToSelf | 3167 | 3167 | 3167 | 3167 | 1 | + | decimals | 618 | 618 | 618 | 618 | 1 | +-| deposit | 267243 | 267243 | 267243 | 267243 | 1 | +-| depositATokens | 157445 | 160480 | 157445 | 199187 | 55 | +-| emergencyTokenTransfer | 6081 | 124656 | 128054 | 149925 | 54 | ++| deposit | 258623 | 258623 | 258623 | 258623 | 1 | ++| depositATokens | 157511 | 160492 | 157511 | 199253 | 56 | ++| emergencyTokenTransfer | 6081 | 124802 | 128142 | 150013 | 55 | + | getReferenceAsset | 2491 | 2491 | 2491 | 2491 | 1 | + | initialize | 25518 | 231417 | 232108 | 239108 | 70 | + | maxRedeem | 7472 | 7472 | 7472 | 7472 | 2 | +-| maxWithdraw | 10138 | 10138 | 10138 | 10138 | 1 | +-| mint | 267337 | 267337 | 267337 | 267337 | 1 | ++| maxWithdraw | 10160 | 10160 | 10160 | 10160 | 1 | ++| mint | 258717 | 258717 | 258717 | 258717 | 1 | + | name | 3377 | 3377 | 3377 | 3377 | 1 | + | nonces | 2776 | 2776 | 2776 | 2776 | 3 | + | paused | 469 | 1469 | 1469 | 2469 | 2 | + | permit | 776 | 30653 | 33460 | 57725 | 3 | +-| previewDeposit | 15959 | 15959 | 15959 | 15959 | 1 | +-| redeem | 31682 | 31682 | 31682 | 31682 | 1 | ++| previewDeposit | 15981 | 15981 | 15981 | 15981 | 1 | ++| redeem | 31704 | 31704 | 31704 | 31704 | 1 | + | setPaused | 11592 | 14234 | 11592 | 34996 | 62 | + | symbol | 3389 | 3389 | 3389 | 3389 | 1 | + | transfer | 2763 | 2763 | 2763 | 2763 | 1 | +-| withdraw | 34349 | 34349 | 34349 | 34349 | 1 | ++| withdraw | 34393 | 34393 | 34393 | 34393 | 1 | + + + | src/contracts/extensions/v3-config-engine/AaveV3ConfigEngine.sol:AaveV3ConfigEngine contract | | | | | | +@@ -156,15 +156,15 @@ + | 0 | 0 | | | | | + | Function Name | min | avg | median | max | # calls | + | DEFAULT_INTEREST_RATE_STRATEGY | 270 | 270 | 270 | 270 | 5 | +-| listAssets | 1804427 | 1804427 | 1804427 | 1804427 | 1 | +-| listAssetsCustom | 1803763 | 5189401 | 5194695 | 5194695 | 649 | +-| updateAssetsEMode | 190633 | 190633 | 190633 | 190633 | 1 | +-| updateBorrowSide | 20061 | 76217 | 76217 | 132373 | 2 | ++| listAssets | 1792070 | 1792070 | 1792070 | 1792070 | 1 | ++| listAssetsCustom | 1791406 | 5156369 | 5161624 | 5161624 | 665 | ++| updateAssetsEMode | 179132 | 179132 | 179132 | 179132 | 1 | ++| updateBorrowSide | 20039 | 76074 | 76074 | 132110 | 2 | + | updateCaps | 59693 | 59693 | 59693 | 59693 | 1 | + | updateCollateralSide | 8750 | 30432 | 8874 | 62831 | 5 | +-| updateEModeCategories | 10596 | 50460 | 28409 | 101350 | 5 | ++| updateEModeCategories | 10596 | 50688 | 28454 | 101899 | 5 | + | updatePriceFeeds | 39269 | 39269 | 39269 | 39269 | 1 | +-| updateRateStrategies | 124920 | 124920 | 124920 | 124920 | 1 | ++| updateRateStrategies | 118868 | 118868 | 118868 | 118868 | 1 | + + + | src/contracts/helpers/AaveProtocolDataProvider.sol:AaveProtocolDataProvider contract | | | | | | +@@ -172,21 +172,21 @@ + | Deployment Cost | Deployment Size | | | | | + | 0 | 0 | | | | | + | Function Name | min | avg | median | max | # calls | +-| getATokenTotalSupply | 12822 | 13973 | 12866 | 25922 | 2026 | +-| getAllReservesTokens | 16144 | 28640 | 39644 | 39644 | 27 | +-| getDebtCeiling | 3244 | 3244 | 3244 | 3244 | 4 | ++| getATokenTotalSupply | 6409 | 7551 | 6453 | 19531 | 2074 | ++| getAllReservesTokens | 16077 | 28573 | 39577 | 39577 | 27 | ++| getDebtCeiling | 3222 | 3222 | 3222 | 3222 | 4 | + | getDebtCeilingDecimals | 214 | 214 | 214 | 214 | 1 | + | getFlashLoanEnabled | 3217 | 4217 | 4217 | 5217 | 110 | +-| getInterestRateStrategyAddress | 9534 | 21418 | 9534 | 43034 | 9 | +-| getIsVirtualAccActive | 3245 | 3266 | 3267 | 3267 | 2096 | +-| getLiquidationProtocolFee | 3266 | 9488 | 5266 | 16766 | 9 | +-| getPaused | 3333 | 3409 | 3355 | 5355 | 2162 | +-| getReserveCaps | 3267 | 8149 | 3267 | 16767 | 47 | +-| getReserveConfigurationData | 3659 | 3830 | 3681 | 17181 | 2476 | +-| getReserveTokensAddresses | 9510 | 15172 | 15554 | 43054 | 2739 | ++| getInterestRateStrategyAddress | 7745 | 17853 | 7745 | 37245 | 9 | ++| getIsVirtualAccActive | 3245 | 3266 | 3267 | 3267 | 2237 | ++| getLiquidationProtocolFee | 3244 | 9466 | 5244 | 16744 | 9 | ++| getPaused | 3311 | 3384 | 3333 | 5333 | 2303 | ++| getReserveCaps | 3245 | 8127 | 3245 | 16745 | 47 | ++| getReserveConfigurationData | 3637 | 3805 | 3659 | 17159 | 2621 | ++| getReserveTokensAddresses | 4808 | 5210 | 4874 | 20374 | 2902 | + | getSiloedBorrowing | 3270 | 3270 | 3270 | 3270 | 1 | +-| getTotalDebt | 54903 | 54903 | 54903 | 54903 | 3 | +-| getUserReserveData | 19863 | 28216 | 27941 | 46863 | 287 | ++| getTotalDebt | 32479 | 32479 | 32479 | 32479 | 3 | ++| getUserReserveData | 18096 | 24010 | 22556 | 41096 | 65 | + + + | src/contracts/helpers/L2Encoder.sol:L2Encoder contract | | | | | | +@@ -194,15 +194,15 @@ + | Deployment Cost | Deployment Size | | | | | + | 0 | 0 | | | | | + | Function Name | min | avg | median | max | # calls | +-| encodeBorrowParams | 8851 | 8851 | 8851 | 8851 | 3 | +-| encodeLiquidationCall | 23237 | 23237 | 23237 | 23237 | 1 | +-| encodeRepayParams | 8734 | 8734 | 8734 | 8734 | 1 | +-| encodeRepayWithATokensParams | 8761 | 8761 | 8761 | 8761 | 1 | +-| encodeRepayWithPermitParams | 13218 | 13218 | 13218 | 13218 | 51 | +-| encodeSetUserUseReserveAsCollateral | 8676 | 8676 | 8676 | 8676 | 1 | +-| encodeSupplyParams | 40279 | 40279 | 40279 | 40279 | 7 | +-| encodeSupplyWithPermitParams | 40633 | 40633 | 40633 | 40633 | 54 | +-| encodeWithdrawParams | 8620 | 8653 | 8653 | 8687 | 2 | ++| encodeBorrowParams | 7084 | 7084 | 7084 | 7084 | 3 | ++| encodeLiquidationCall | 13703 | 13703 | 13703 | 13703 | 1 | ++| encodeRepayParams | 6967 | 6967 | 6967 | 6967 | 1 | ++| encodeRepayWithATokensParams | 6994 | 6994 | 6994 | 6994 | 1 | ++| encodeRepayWithPermitParams | 7451 | 7451 | 7451 | 7451 | 55 | ++| encodeSetUserUseReserveAsCollateral | 6909 | 6909 | 6909 | 6909 | 1 | ++| encodeSupplyParams | 32012 | 32012 | 32012 | 32012 | 7 | ++| encodeSupplyWithPermitParams | 32366 | 32366 | 32366 | 32366 | 54 | ++| encodeWithdrawParams | 6853 | 6886 | 6886 | 6920 | 2 | + + + | src/contracts/helpers/WrappedTokenGatewayV3.sol:WrappedTokenGatewayV3 contract | | | | | | +@@ -210,54 +210,54 @@ + | Deployment Cost | Deployment Size | | | | | + | 0 | 0 | | | | | + | Function Name | min | avg | median | max | # calls | +-| borrowETH | 252616 | 252616 | 252616 | 252616 | 1 | +-| depositETH | 239979 | 239979 | 239979 | 239979 | 8 | ++| borrowETH | 252242 | 252242 | 252242 | 252242 | 1 | ++| depositETH | 239627 | 239627 | 239627 | 239627 | 8 | + | emergencyEtherTransfer | 33792 | 33792 | 33792 | 33792 | 1 | + | emergencyTokenTransfer | 52863 | 52863 | 52863 | 52863 | 1 | + | getWETHAddress | 200 | 200 | 200 | 200 | 1 | + | owner | 373 | 373 | 373 | 373 | 2 | + | receive | 21206 | 21206 | 21206 | 21206 | 1 | +-| repayETH | 180936 | 184941 | 182826 | 192647 | 5 | +-| withdrawETH | 233365 | 237691 | 237691 | 242018 | 2 | +-| withdrawETHWithPermit | 278174 | 281068 | 281068 | 283962 | 2 | ++| repayETH | 167702 | 171709 | 169592 | 179417 | 5 | ++| withdrawETH | 224876 | 228141 | 228141 | 231407 | 2 | ++| withdrawETHWithPermit | 267563 | 270457 | 270457 | 273351 | 2 | + + + | src/contracts/instances/ATokenInstance.sol:ATokenInstance contract | | | | | | + |--------------------------------------------------------------------|-----------------|--------|--------|--------|---------| + | Deployment Cost | Deployment Size | | | | | +-| 2316688 | 11090 | | | | | ++| 2316755 | 11090 | | | | | + | Function Name | min | avg | median | max | # calls | + | DOMAIN_SEPARATOR | 455 | 2439 | 2455 | 3539 | 59 | + | POOL | 326 | 326 | 326 | 326 | 110 | +-| RESERVE_TREASURY_ADDRESS | 419 | 796 | 419 | 2419 | 2583 | +-| UNDERLYING_ASSET_ADDRESS | 441 | 530 | 441 | 2441 | 2190 | ++| RESERVE_TREASURY_ADDRESS | 419 | 984 | 419 | 2419 | 3118 | ++| UNDERLYING_ASSET_ADDRESS | 441 | 525 | 441 | 2441 | 2331 | + | allowance | 782 | 1551 | 782 | 2782 | 26 | +-| approve | 24586 | 24586 | 24586 | 24586 | 677 | +-| balanceOf | 2749 | 4649 | 4749 | 17749 | 1855 | +-| burn | 904 | 42208 | 37139 | 63239 | 642 | +-| decimals | 356 | 375 | 356 | 2356 | 2113 | ++| approve | 24586 | 24586 | 24586 | 24586 | 678 | ++| balanceOf | 2771 | 4533 | 4771 | 17771 | 3057 | ++| burn | 904 | 38540 | 37139 | 63239 | 1267 | ++| decimals | 356 | 370 | 356 | 2356 | 2823 | + | decreaseAllowance | 7705 | 7705 | 7705 | 7705 | 1 | +-| getIncentivesController | 474 | 475 | 474 | 2474 | 2096 | ++| getIncentivesController | 474 | 475 | 474 | 2474 | 2237 | + | getPreviousIndex | 651 | 651 | 651 | 651 | 39 | + | getScaledUserBalanceAndSupply | 826 | 2730 | 2826 | 4826 | 21 | +-| handleRepayment | 594 | 594 | 594 | 594 | 615 | ++| handleRepayment | 594 | 594 | 594 | 594 | 1089 | + | increaseAllowance | 7772 | 20597 | 24872 | 24872 | 4 | +-| initialize | 146492 | 222080 | 231686 | 321621 | 11188 | +-| mint | 932 | 62097 | 64402 | 72156 | 2844 | ++| initialize | 146492 | 222913 | 231686 | 321621 | 11377 | ++| mint | 932 | 60896 | 64402 | 72156 | 3841 | + | mintToTreasury | 442 | 43917 | 49192 | 66292 | 6 | +-| name | 1004 | 1504 | 1319 | 3259 | 2262 | ++| name | 1004 | 1497 | 1319 | 3259 | 2403 | + | nonces | 652 | 2556 | 2652 | 2652 | 63 | + | permit | 1108 | 24836 | 9503 | 53488 | 180 | + | rescueTokens | 12022 | 24398 | 14240 | 46933 | 3 | +-| scaledBalanceOf | 687 | 1945 | 2687 | 2687 | 3270 | ++| scaledBalanceOf | 687 | 1728 | 2687 | 2687 | 6322 | + | scaledTotalSupply | 373 | 2327 | 2373 | 2373 | 87 | + | setIncentivesController | 11924 | 14301 | 14301 | 16678 | 2 | +-| symbol | 1069 | 1563 | 1619 | 3324 | 2244 | +-| totalSupply | 407 | 3765 | 2407 | 10463 | 2986 | +-| transfer | 576 | 105606 | 111152 | 140167 | 233 | +-| transferFrom | 2998 | 100539 | 118585 | 142842 | 846 | +-| transferOnLiquidation | 981 | 31261 | 37477 | 44277 | 440 | +-| transferUnderlyingTo | 796 | 23309 | 16488 | 33627 | 902 | ++| symbol | 1069 | 1556 | 1619 | 3324 | 2385 | ++| totalSupply | 407 | 4193 | 2407 | 10485 | 3619 | ++| transfer | 576 | 104969 | 111196 | 140211 | 234 | ++| transferFrom | 2998 | 100740 | 118629 | 165386 | 847 | ++| transferOnLiquidation | 981 | 34292 | 37499 | 44299 | 885 | ++| transferUnderlyingTo | 796 | 23926 | 16488 | 33627 | 1487 | + + + | src/contracts/instances/L2PoolInstance.sol:L2PoolInstance contract | | | | | | +@@ -267,54 +267,56 @@ + | Function Name | min | avg | median | max | # calls | + | ADDRESSES_PROVIDER | 351 | 351 | 351 | 351 | 177 | + | FLASHLOAN_PREMIUM_TOTAL | 388 | 1388 | 1388 | 2388 | 126 | +-| FLASHLOAN_PREMIUM_TO_PROTOCOL | 437 | 437 | 437 | 437 | 126 | +-| borrow(address,uint256,uint256,uint16,address) | 197559 | 206366 | 203159 | 238218 | 61 | +-| borrow(bytes32) | 203157 | 203157 | 203157 | 203157 | 3 | +-| configureEModeCategory | 7099 | 11242 | 7099 | 49224 | 61 | ++| FLASHLOAN_PREMIUM_TO_PROTOCOL | 459 | 459 | 459 | 459 | 126 | ++| borrow(address,uint256,uint256,uint16,address) | 200006 | 206720 | 202806 | 237866 | 65 | ++| borrow(bytes32) | 202826 | 202826 | 202826 | 202826 | 3 | ++| configureEModeCategory | 6370 | 10639 | 6370 | 49773 | 61 | + | configureEModeCategoryBorrowableBitmap | 23963 | 23963 | 23963 | 23963 | 2 | +-| configureEModeCategoryCollateralBitmap | 6843 | 6843 | 6843 | 6843 | 12 | +-| dropReserve | 6304 | 7660 | 6304 | 82259 | 56 | ++| configureEModeCategoryCollateralBitmap | 6815 | 6815 | 6815 | 6815 | 12 | ++| dropReserve | 6326 | 7682 | 6326 | 82303 | 56 | + | getBorrowLogic | 281 | 281 | 281 | 281 | 1 | +-| getBridgeLogic | 345 | 345 | 345 | 345 | 1 | +-| getConfiguration | 723 | 733 | 723 | 2723 | 1462 | +-| getEModeCategoryBorrowableBitmap | 2646 | 2646 | 2646 | 2646 | 2 | +-| getEModeCategoryCollateralBitmap | 2656 | 2656 | 2656 | 2656 | 12 | +-| getEModeLogic | 345 | 345 | 345 | 345 | 1 | ++| getBridgeLogic | 367 | 367 | 367 | 367 | 1 | ++| getConfiguration | 701 | 711 | 701 | 2701 | 1462 | ++| getEModeCategoryBorrowableBitmap | 2624 | 2624 | 2624 | 2624 | 2 | ++| getEModeCategoryCollateralBitmap | 2650 | 2650 | 2650 | 2650 | 12 | ++| getEModeLogic | 367 | 367 | 367 | 367 | 1 | + | getFlashLoanLogic | 347 | 347 | 347 | 347 | 1 | +-| getLiquidationGracePeriod | 2634 | 2634 | 2634 | 2634 | 55 | +-| getLiquidationLogic | 325 | 325 | 325 | 325 | 1 | +-| getPoolLogic | 324 | 324 | 324 | 324 | 1 | +-| getReserveData | 5204 | 10962 | 7204 | 29704 | 446 | +-| getReserveNormalizedIncome | 823 | 828 | 823 | 1283 | 87 | +-| getReserveNormalizedVariableDebt | 845 | 932 | 845 | 2845 | 59 | +-| getReservesList | 11126 | 11126 | 11126 | 11126 | 57 | +-| getSupplyLogic | 345 | 345 | 345 | 345 | 1 | +-| getUserAccountData | 22290 | 22290 | 22290 | 22290 | 1 | +-| getVirtualUnderlyingBalance | 724 | 724 | 724 | 724 | 4 | +-| initReserve | 6628 | 95634 | 161459 | 167597 | 254 | +-| initialize | 45443 | 45443 | 45443 | 45443 | 63 | +-| liquidationCall | 375920 | 375920 | 375920 | 375920 | 1 | +-| mintToTreasury | 77264 | 78657 | 78657 | 80050 | 2 | +-| repay(address,uint256,uint256,address) | 164468 | 164468 | 164468 | 164468 | 2 | +-| repay(bytes32) | 135484 | 135484 | 135484 | 135484 | 1 | +-| repayWithATokens | 138509 | 138509 | 138509 | 138509 | 1 | +-| repayWithPermit | 182831 | 197542 | 189266 | 209917 | 51 | ++| getLiquidationGracePeriod | 2656 | 2656 | 2656 | 2656 | 55 | ++| getLiquidationLogic | 303 | 303 | 303 | 303 | 1 | ++| getPoolLogic | 346 | 346 | 346 | 346 | 1 | ++| getReserveAToken | 632 | 684 | 632 | 2632 | 153 | ++| getReserveData | 3437 | 8197 | 3437 | 21437 | 297 | ++| getReserveNormalizedIncome | 845 | 850 | 845 | 1305 | 91 | ++| getReserveNormalizedVariableDebt | 867 | 947 | 867 | 2867 | 64 | ++| getReserveVariableDebtToken | 654 | 1987 | 2654 | 2654 | 6 | ++| getReservesList | 11148 | 11148 | 11148 | 11148 | 57 | ++| getSupplyLogic | 323 | 323 | 323 | 323 | 1 | ++| getUserAccountData | 22268 | 22268 | 22268 | 22268 | 1 | ++| getVirtualUnderlyingBalance | 746 | 746 | 746 | 746 | 4 | ++| initReserve | 6606 | 95612 | 161437 | 167575 | 254 | ++| initialize | 45421 | 45421 | 45421 | 45421 | 63 | ++| liquidationCall | 419695 | 419695 | 419695 | 419695 | 1 | ++| mintToTreasury | 77242 | 78635 | 78635 | 80028 | 2 | ++| repay(address,uint256,uint256,address) | 164134 | 164134 | 164134 | 164134 | 2 | ++| repay(bytes32) | 135150 | 135150 | 135150 | 135150 | 1 | ++| repayWithATokens | 138198 | 138198 | 138198 | 138198 | 1 | ++| repayWithPermit | 185346 | 196670 | 188981 | 209632 | 55 | + | rescueTokens | 48214 | 48214 | 48214 | 48214 | 55 | +-| resetIsolationModeTotalDebt | 4353 | 4989 | 4353 | 15353 | 201 | ++| resetIsolationModeTotalDebt | 4265 | 4901 | 4265 | 15265 | 201 | + | setConfiguration | 2148 | 4296 | 2148 | 24303 | 1647 | +-| setLiquidationGracePeriod | 6364 | 11408 | 10850 | 17012 | 165 | ++| setLiquidationGracePeriod | 6364 | 11374 | 10850 | 17012 | 165 | + | setReserveInterestRateStrategyAddress | 6384 | 7996 | 6493 | 15782 | 166 | + | setUserEMode | 22122 | 42635 | 41183 | 87512 | 7 | +-| setUserUseReserveAsCollateral(address,bool) | 53575 | 69534 | 71588 | 102788 | 17 | +-| setUserUseReserveAsCollateral(bytes32) | 73756 | 73756 | 73756 | 73756 | 1 | +-| supply(address,uint256,address,uint16) | 157134 | 204985 | 208434 | 208434 | 79 | +-| supply(bytes32) | 210512 | 210512 | 210512 | 210512 | 7 | +-| supplyWithPermit | 259775 | 259775 | 259775 | 259775 | 54 | +-| syncIndexesState | 7299 | 13932 | 7299 | 27199 | 144 | +-| syncRatesState | 16005 | 16005 | 16005 | 16005 | 144 | ++| setUserUseReserveAsCollateral(address,bool) | 53530 | 69489 | 71543 | 102743 | 17 | ++| setUserUseReserveAsCollateral(bytes32) | 73691 | 73691 | 73691 | 73691 | 1 | ++| supply(address,uint256,address,uint16) | 156781 | 204798 | 208081 | 208081 | 83 | ++| supply(bytes32) | 210137 | 210137 | 210137 | 210137 | 7 | ++| supplyWithPermit | 259422 | 259422 | 259422 | 259422 | 54 | ++| syncIndexesState | 7182 | 13815 | 7182 | 27082 | 144 | ++| syncRatesState | 15726 | 15726 | 15726 | 15726 | 144 | + | updateBridgeProtocolFee | 6230 | 6230 | 6230 | 6230 | 55 | +-| updateFlashloanPremiums | 1698 | 10043 | 6367 | 21598 | 181 | +-| withdraw | 126426 | 128867 | 128867 | 131308 | 2 | ++| updateFlashloanPremiums | 1787 | 10132 | 6456 | 21687 | 181 | ++| withdraw | 126195 | 128635 | 128635 | 131076 | 2 | + + + | src/contracts/instances/PoolConfiguratorInstance.sol:PoolConfiguratorInstance contract | | | | | | +@@ -322,132 +324,135 @@ + | Deployment Cost | Deployment Size | | | | | + | 4332868 | 19812 | | | | | + | Function Name | min | avg | median | max | # calls | +-| MAX_GRACE_PERIOD | 260 | 260 | 260 | 260 | 371 | +-| configureReserveAsCollateral | 12220 | 17479 | 12264 | 99552 | 2437 | +-| disableLiquidationGracePeriod | 17214 | 28272 | 17214 | 39535 | 109 | +-| dropReserve | 14074 | 17810 | 14074 | 104832 | 60 | ++| MAX_GRACE_PERIOD | 260 | 260 | 260 | 260 | 379 | ++| configureReserveAsCollateral | 12198 | 17150 | 12264 | 87350 | 2489 | ++| disableLiquidationGracePeriod | 17214 | 28463 | 39513 | 39513 | 111 | ++| dropReserve | 14074 | 17811 | 14074 | 104832 | 60 | + | getConfiguratorLogic | 283 | 283 | 283 | 283 | 1 | +-| getPendingLtv | 640 | 640 | 640 | 640 | 153 | +-| initReserves | 17401 | 15903182 | 4382378 | 211119271 | 1086 | +-| initialize | 72573 | 90420 | 90473 | 90473 | 683 | +-| setAssetBorrowableInEMode | 46849 | 87525 | 87622 | 100849 | 395 | +-| setAssetCollateralInEMode | 17472 | 75276 | 83781 | 83781 | 644 | +-| setBorrowCap | 11170 | 11585 | 11214 | 44169 | 2012 | +-| setBorrowableInIsolation | 10736 | 11044 | 10780 | 43726 | 1959 | +-| setDebtCeiling | 17256 | 44193 | 41675 | 98789 | 2019 | +-| setEModeCategory | 17779 | 75328 | 81448 | 81448 | 640 | +-| setLiquidationProtocolFee | 11241 | 11425 | 11285 | 44240 | 1954 | +-| setPoolPause(bool) | 17202 | 19129 | 17202 | 89863 | 113 | +-| setPoolPause(bool,uint40) | 17314 | 60091 | 17314 | 107716 | 108 | +-| setReserveActive | 14185 | 26524 | 14185 | 95296 | 66 | +-| setReserveBorrowing | 10911 | 13520 | 10955 | 41764 | 2167 | +-| setReserveFactor | 17301 | 42687 | 36685 | 124960 | 2004 | +-| setReserveFlashLoaning | 10910 | 12662 | 10954 | 43918 | 2058 | +-| setReserveFreeze | 20551 | 48154 | 52937 | 73139 | 169 | +-| setReserveInterestRateData | 17558 | 20678 | 17558 | 106484 | 57 | +-| setReserveInterestRateStrategyAddress | 17579 | 69521 | 17579 | 165156 | 99 | ++| getPendingLtv | 640 | 640 | 640 | 640 | 159 | ++| initReserves | 17401 | 15915557 | 4382636 | 211151370 | 1105 | ++| initialize | 72573 | 90421 | 90473 | 90473 | 699 | ++| setAssetBorrowableInEMode | 44971 | 81723 | 81811 | 94971 | 395 | ++| setAssetCollateralInEMode | 17472 | 69948 | 77936 | 77959 | 644 | ++| setBorrowCap | 11148 | 11576 | 11214 | 44169 | 2060 | ++| setBorrowableInIsolation | 10714 | 11037 | 10780 | 43726 | 2007 | ++| setDebtCeiling | 17256 | 33646 | 31495 | 86587 | 2067 | ++| setEModeCategory | 17779 | 75825 | 81997 | 81997 | 640 | ++| setLiquidationProtocolFee | 11219 | 11421 | 11285 | 44240 | 2002 | ++| setPoolPause(bool) | 17202 | 19127 | 17202 | 89796 | 113 | ++| setPoolPause(bool,uint40) | 17314 | 61612 | 17314 | 107583 | 108 | ++| setReserveActive | 14185 | 24676 | 14185 | 83094 | 66 | ++| setReserveBorrowing | 10889 | 13464 | 10955 | 41764 | 2215 | ++| setReserveFactor | 17301 | 42436 | 36422 | 124697 | 2052 | ++| setReserveFlashLoaning | 10888 | 12623 | 10954 | 43918 | 2106 | ++| setReserveFreeze | 20551 | 48461 | 52937 | 73139 | 173 | ++| setReserveInterestRateData | 17558 | 20465 | 17558 | 100432 | 57 | ++| setReserveInterestRateStrategyAddress | 17579 | 66821 | 17579 | 159082 | 99 | + | setReservePause(address,bool) | 17347 | 30385 | 43192 | 43192 | 111 | +-| setReservePause(address,bool,uint40) | 14424 | 38915 | 47050 | 49360 | 658 | +-| setSiloedBorrowing | 11281 | 11491 | 11325 | 94206 | 1949 | +-| setSupplyCap | 11127 | 13126 | 11171 | 44126 | 2073 | ++| setReservePause(address,bool,uint40) | 14424 | 39163 | 47028 | 49338 | 668 | ++| setSiloedBorrowing | 11259 | 11455 | 11325 | 73782 | 1997 | ++| setSupplyCap | 11105 | 13097 | 11171 | 44126 | 2121 | + | setUnbackedMintCap | 44161 | 44161 | 44161 | 44161 | 7 | +-| updateAToken | 14035 | 16293 | 14035 | 140527 | 56 | +-| updateBridgeProtocolFee | 14102 | 49291 | 51998 | 51998 | 14 | +-| updateFlashloanPremiumToProtocol | 10115 | 10509 | 10181 | 36981 | 738 | +-| updateFlashloanPremiumTotal | 14052 | 30681 | 32046 | 36946 | 738 | +-| updateVariableDebtToken | 14036 | 16184 | 14036 | 134376 | 56 | ++| updateAToken | 14035 | 15855 | 14035 | 115979 | 56 | ++| updateBridgeProtocolFee | 14102 | 49414 | 52131 | 52131 | 14 | ++| updateFlashloanPremiumToProtocol | 10137 | 10474 | 10137 | 36937 | 754 | ++| updateFlashloanPremiumTotal | 14052 | 30682 | 32002 | 36902 | 754 | ++| updateVariableDebtToken | 14036 | 15746 | 14036 | 109829 | 56 | + + + | src/contracts/instances/PoolInstance.sol:PoolInstance contract | | | | | | + |----------------------------------------------------------------|-----------------|--------|--------|--------|---------| + | Deployment Cost | Deployment Size | | | | | +-| 4814942 | 22300 | | | | | ++| 4685220 | 21709 | | | | | + | Function Name | min | avg | median | max | # calls | +-| ADDRESSES_PROVIDER | 284 | 284 | 284 | 284 | 2355 | +-| BRIDGE_PROTOCOL_FEE | 349 | 2109 | 2349 | 2349 | 25 | +-| FLASHLOAN_PREMIUM_TOTAL | 410 | 1413 | 2410 | 2410 | 1244 | +-| FLASHLOAN_PREMIUM_TO_PROTOCOL | 459 | 460 | 459 | 2459 | 1241 | +-| MAX_NUMBER_RESERVES | 286 | 286 | 286 | 286 | 111 | +-| backUnbacked | 98313 | 114497 | 111899 | 132885 | 9 | +-| borrow | 46604 | 212305 | 222258 | 261378 | 893 | +-| configureEModeCategory | 7121 | 45502 | 49246 | 49246 | 628 | +-| configureEModeCategoryBorrowableBitmap | 4041 | 23841 | 23941 | 23941 | 393 | +-| configureEModeCategoryCollateralBitmap | 3976 | 6767 | 6776 | 6776 | 577 | +-| deposit | 32702 | 202881 | 208433 | 208433 | 1117 | +-| dropReserve | 6326 | 9907 | 6326 | 82325 | 61 | +-| finalizeTransfer | 20725 | 50394 | 52834 | 87949 | 968 | +-| flashLoan | 29684 | 96524 | 75354 | 322330 | 65 | +-| flashLoanSimple | 23396 | 345141 | 191517 | 760848 | 11 | +-| getBorrowLogic | 325 | 325 | 325 | 325 | 1 | +-| getBridgeLogic | 345 | 345 | 345 | 345 | 1 | +-| getConfiguration | 745 | 876 | 745 | 2745 | 27132 | +-| getEModeCategoryBorrowableBitmap | 668 | 2591 | 2668 | 2668 | 418 | +-| getEModeCategoryCollateralBitmap | 678 | 2591 | 2678 | 2678 | 602 | +-| getEModeCategoryCollateralConfig | 885 | 1685 | 885 | 2885 | 110 | +-| getEModeCategoryData | 8291 | 8291 | 8291 | 8291 | 3 | +-| getEModeCategoryLabel | 1328 | 1642 | 1583 | 3328 | 25 | +-| getEModeLogic | 278 | 278 | 278 | 278 | 1 | +-| getFlashLoanLogic | 302 | 302 | 302 | 302 | 1 | +-| getLiquidationGracePeriod | 2656 | 2656 | 2656 | 2656 | 418 | +-| getLiquidationLogic | 347 | 347 | 347 | 347 | 1 | +-| getPoolLogic | 279 | 279 | 279 | 279 | 1 | ++| ADDRESSES_PROVIDER | 351 | 351 | 351 | 351 | 3606 | ++| BRIDGE_PROTOCOL_FEE | 415 | 2175 | 2415 | 2415 | 25 | ++| FLASHLOAN_PREMIUM_TOTAL | 388 | 1391 | 2388 | 2388 | 1276 | ++| FLASHLOAN_PREMIUM_TO_PROTOCOL | 459 | 460 | 459 | 2459 | 1273 | ++| MAX_NUMBER_RESERVES | 308 | 308 | 308 | 308 | 110 | ++| backUnbacked | 97983 | 114167 | 111569 | 132555 | 9 | ++| borrow | 46465 | 217204 | 222151 | 265705 | 1474 | ++| configureEModeCategory | 6392 | 45939 | 49795 | 49795 | 628 | ++| configureEModeCategoryBorrowableBitmap | 4063 | 23863 | 23963 | 23963 | 393 | ++| configureEModeCategoryCollateralBitmap | 4015 | 6806 | 6815 | 6815 | 577 | ++| deposit | 32349 | 202489 | 208080 | 208080 | 1119 | ++| dropReserve | 6326 | 9908 | 6326 | 82325 | 61 | ++| eliminateReserveDeficit | 6328 | 58474 | 55368 | 120838 | 330 | ++| finalizeTransfer | 20747 | 50380 | 52856 | 95613 | 970 | ++| flashLoan | 29662 | 99175 | 81700 | 321999 | 65 | ++| flashLoanSimple | 23396 | 337294 | 191187 | 740396 | 11 | ++| getBorrowLogic | 303 | 303 | 303 | 303 | 1 | ++| getBridgeLogic | 279 | 279 | 279 | 279 | 1 | ++| getConfiguration | 723 | 851 | 723 | 2723 | 28123 | ++| getEModeCategoryBorrowableBitmap | 624 | 2557 | 2624 | 2624 | 418 | ++| getEModeCategoryCollateralBitmap | 650 | 2560 | 2650 | 2650 | 603 | ++| getEModeCategoryCollateralConfig | 952 | 1744 | 952 | 2952 | 111 | ++| getEModeCategoryData | 5914 | 5914 | 5914 | 5914 | 3 | ++| getEModeCategoryLabel | 1306 | 1620 | 1561 | 3306 | 25 | ++| getEModeLogic | 300 | 300 | 300 | 300 | 1 | ++| getFlashLoanLogic | 280 | 280 | 280 | 280 | 1 | ++| getLiquidationGracePeriod | 2656 | 2656 | 2656 | 2656 | 436 | ++| getLiquidationLogic | 303 | 303 | 303 | 303 | 1 | ++| getPoolLogic | 301 | 301 | 301 | 301 | 1 | ++| getReserveAToken | 676 | 730 | 676 | 2676 | 5036 | + | getReserveAddressById | 662 | 662 | 662 | 662 | 1 | +-| getReserveData | 5248 | 10894 | 7248 | 29748 | 8983 | +-| getReserveDataExtended | 3476 | 4142 | 3476 | 5476 | 6 | +-| getReserveNormalizedIncome | 867 | 1883 | 867 | 5327 | 6560 | +-| getReserveNormalizedVariableDebt | 889 | 1072 | 889 | 6475 | 1605 | ++| getReserveData | 3459 | 9202 | 3459 | 21459 | 4042 | ++| getReserveDeficit | 609 | 609 | 609 | 609 | 282 | ++| getReserveNormalizedIncome | 889 | 1680 | 889 | 5349 | 8792 | ++| getReserveNormalizedVariableDebt | 889 | 1041 | 889 | 6475 | 2526 | ++| getReserveVariableDebtToken | 676 | 709 | 676 | 2676 | 4117 | + | getReservesCount | 392 | 392 | 392 | 392 | 2 | +-| getReservesList | 3170 | 11700 | 11170 | 99129 | 893 | +-| getSupplyLogic | 281 | 281 | 281 | 281 | 1 | +-| getUserAccountData | 12141 | 22006 | 22253 | 37375 | 556 | +-| getUserConfiguration | 703 | 758 | 703 | 2703 | 399 | +-| getUserEMode | 634 | 634 | 634 | 634 | 283 | +-| getVirtualUnderlyingBalance | 657 | 1068 | 657 | 2657 | 811 | +-| initReserve | 6564 | 177594 | 177419 | 207007 | 11154 | +-| initialize | 45378 | 45472 | 45378 | 66895 | 624 | +-| liquidationCall | 53082 | 238189 | 323142 | 382539 | 795 | +-| mintToTreasury | 77264 | 78657 | 78657 | 80050 | 2 | +-| mintUnbacked | 12183 | 118303 | 103419 | 165752 | 17 | +-| repay | 33243 | 99380 | 95853 | 164534 | 21 | +-| repayWithATokens | 128089 | 155007 | 155256 | 165893 | 57 | +-| repayWithPermit | 126966 | 164667 | 154052 | 209744 | 150 | ++| getReservesList | 3103 | 11768 | 11103 | 95886 | 891 | ++| getSupplyLogic | 345 | 345 | 345 | 345 | 1 | ++| getUserAccountData | 12119 | 22726 | 19731 | 37353 | 1922 | ++| getUserConfiguration | 703 | 883 | 703 | 2703 | 177 | ++| getUserEMode | 656 | 656 | 656 | 656 | 863 | ++| getVirtualUnderlyingBalance | 657 | 1552 | 657 | 2657 | 373 | ++| initReserve | 6628 | 177661 | 177483 | 207071 | 11343 | ++| initialize | 45443 | 45535 | 45443 | 66960 | 640 | ++| liquidationCall | 73774 | 285332 | 325227 | 511750 | 1279 | ++| mintToTreasury | 77220 | 78613 | 78613 | 80006 | 2 | ++| mintUnbacked | 12183 | 117981 | 103045 | 165378 | 17 | ++| repay | 33126 | 104506 | 107475 | 164156 | 21 | ++| repayWithATokens | 134210 | 154481 | 154860 | 165518 | 57 | ++| repayWithPermit | 129325 | 160572 | 149170 | 209303 | 165 | + | rescueTokens | 48149 | 48149 | 48149 | 48149 | 55 | +-| resetIsolationModeTotalDebt | 4265 | 4336 | 4265 | 15265 | 1860 | +-| setConfiguration | 2170 | 10372 | 2325 | 24325 | 30463 | +-| setLiquidationGracePeriod | 6386 | 12318 | 12534 | 17034 | 724 | +-| setReserveInterestRateStrategyAddress | 6406 | 7868 | 6515 | 15804 | 210 | +-| setUserEMode | 14165 | 47361 | 41117 | 94723 | 566 | +-| setUserUseReserveAsCollateral | 53552 | 72100 | 71565 | 102765 | 25 | +-| supply | 29399 | 195761 | 208456 | 216210 | 1471 | +-| supplyWithPermit | 113713 | 195952 | 218122 | 257604 | 157 | +-| syncIndexesState | 7211 | 13934 | 7211 | 62577 | 1850 | +-| syncRatesState | 13459 | 15981 | 16005 | 22505 | 1850 | +-| updateBridgeProtocolFee | 6185 | 9470 | 6185 | 23369 | 68 | +-| updateFlashloanPremiums | 1720 | 11437 | 6389 | 21620 | 1293 | +-| withdraw | 39154 | 127154 | 138193 | 177428 | 153 | ++| resetIsolationModeTotalDebt | 4287 | 4356 | 4287 | 15287 | 1908 | ++| setConfiguration | 2192 | 10347 | 2347 | 24347 | 31150 | ++| setLiquidationGracePeriod | 6364 | 12264 | 12512 | 17012 | 761 | ++| setReserveInterestRateStrategyAddress | 6384 | 7846 | 6493 | 15782 | 210 | ++| setUserEMode | 14143 | 47337 | 41095 | 94701 | 566 | ++| setUserUseReserveAsCollateral | 53574 | 72122 | 71587 | 102787 | 25 | ++| supply | 29282 | 191846 | 208081 | 215835 | 2462 | ++| supplyWithPermit | 113338 | 195577 | 217747 | 257229 | 157 | ++| syncIndexesState | 7160 | 13881 | 7160 | 62526 | 1898 | ++| syncRatesState | 13247 | 15769 | 15793 | 22293 | 1898 | ++| updateBridgeProtocolFee | 6252 | 9537 | 6252 | 23436 | 68 | ++| updateFlashloanPremiums | 1698 | 11421 | 6367 | 21598 | 1325 | ++| withdraw | 39214 | 127709 | 137875 | 177110 | 153 | + + + | src/contracts/instances/VariableDebtTokenInstance.sol:VariableDebtTokenInstance contract | | | | | | + |------------------------------------------------------------------------------------------|-----------------|--------|--------|--------|---------| + | Deployment Cost | Deployment Size | | | | | +-| 1695548 | 8190 | | | | | ++| 1695615 | 8190 | | | | | + | Function Name | min | avg | median | max | # calls | +-| UNDERLYING_ASSET_ADDRESS | 397 | 397 | 397 | 397 | 2092 | ++| UNDERLYING_ASSET_ADDRESS | 397 | 397 | 397 | 397 | 2233 | + | approveDelegation | 27009 | 27009 | 27009 | 27009 | 1 | +-| balanceOf | 675 | 4919 | 4753 | 10336 | 1720 | ++| balanceOf | 675 | 4704 | 4753 | 10753 | 2664 | + | borrowAllowance | 828 | 828 | 828 | 828 | 5 | +-| burn | 19171 | 26141 | 26171 | 26172 | 714 | +-| decimals | 334 | 334 | 334 | 334 | 2092 | ++| burn | 19171 | 26135 | 26171 | 26172 | 1196 | ++| decimals | 334 | 334 | 334 | 334 | 3436 | + | delegationWithSig | 1043 | 28679 | 21652 | 55852 | 7 | +-| getIncentivesController | 430 | 430 | 430 | 430 | 2092 | +-| initialize | 123595 | 202347 | 209016 | 299178 | 11188 | +-| mint | 26353 | 62484 | 62553 | 72340 | 885 | +-| name | 1004 | 1444 | 1319 | 3259 | 2182 | ++| getIncentivesController | 430 | 430 | 430 | 430 | 2233 | ++| initialize | 123595 | 203557 | 209016 | 299178 | 11377 | ++| mint | 26353 | 62511 | 62553 | 72340 | 1470 | ++| name | 1004 | 1440 | 1259 | 3259 | 2323 | + | nonces | 574 | 574 | 574 | 574 | 1 | +-| scaledBalanceOf | 687 | 1869 | 2687 | 2687 | 1563 | +-| scaledTotalSupply | 417 | 1962 | 2417 | 2417 | 9807 | +-| symbol | 1025 | 1455 | 1280 | 3280 | 2175 | +-| totalSupply | 4052 | 7563 | 6466 | 19052 | 15 | ++| scaledBalanceOf | 687 | 1748 | 2687 | 2687 | 2767 | ++| scaledTotalSupply | 417 | 2084 | 2417 | 2417 | 12394 | ++| symbol | 1025 | 1463 | 1340 | 3280 | 2316 | ++| totalSupply | 4052 | 8364 | 8466 | 19052 | 15 | + + + | src/contracts/misc/AaveOracle.sol:AaveOracle contract | | | | | | +@@ -457,10 +462,10 @@ + | Function Name | min | avg | median | max | # calls | + | BASE_CURRENCY | 292 | 292 | 292 | 292 | 3 | + | BASE_CURRENCY_UNIT | 261 | 261 | 261 | 261 | 1 | +-| getAssetPrice | 0 | 4948 | 7865 | 7865 | 6615 | ++| getAssetPrice | 0 | 4223 | 1365 | 7865 | 14146 | + | getAssetsPrices | 2286 | 3392 | 2286 | 5605 | 3 | + | getFallbackOracle | 364 | 1030 | 364 | 2364 | 3 | +-| getSourceOfAsset | 550 | 837 | 550 | 2550 | 327 | ++| getSourceOfAsset | 550 | 703 | 550 | 2550 | 613 | + | setAssetSources | 37323 | 52868 | 61918 | 62158 | 9 | + | setFallbackOracle | 59524 | 59524 | 59524 | 59524 | 4 | + +@@ -470,20 +475,20 @@ + | Deployment Cost | Deployment Size | | | | | + | 920973 | 4323 | | | | | + | Function Name | min | avg | median | max | # calls | +-| ADDRESSES_PROVIDER | 228 | 228 | 228 | 228 | 203 | +-| MAX_BORROW_RATE | 239 | 239 | 239 | 239 | 1064 | +-| MAX_OPTIMAL_POINT | 261 | 261 | 261 | 261 | 1376 | +-| MIN_OPTIMAL_POINT | 260 | 260 | 260 | 260 | 1373 | +-| calculateInterestRates | 0 | 3982 | 4251 | 5973 | 7502 | +-| getBaseVariableBorrowRate | 744 | 874 | 744 | 2744 | 646 | +-| getInterestRateData | 1788 | 1788 | 1788 | 1788 | 51 | +-| getInterestRateDataBps | 983 | 983 | 983 | 983 | 51 | +-| getMaxVariableBorrowRate | 968 | 968 | 968 | 968 | 337 | +-| getOptimalUsageRatio | 734 | 738 | 734 | 2734 | 490 | +-| getVariableRateSlope1 | 774 | 774 | 774 | 774 | 496 | +-| getVariableRateSlope2 | 795 | 795 | 795 | 795 | 340 | +-| setInterestRateParams(address,(uint16,uint32,uint32,uint32)) | 28281 | 29703 | 29064 | 36794 | 561 | +-| setInterestRateParams(address,bytes) | 28626 | 33049 | 29847 | 37145 | 1278 | ++| ADDRESSES_PROVIDER | 228 | 228 | 228 | 228 | 214 | ++| MAX_BORROW_RATE | 239 | 239 | 239 | 239 | 1111 | ++| MAX_OPTIMAL_POINT | 261 | 261 | 261 | 261 | 1421 | ++| MIN_OPTIMAL_POINT | 260 | 260 | 260 | 260 | 1418 | ++| calculateInterestRates | 0 | 4131 | 4251 | 5973 | 10093 | ++| getBaseVariableBorrowRate | 744 | 868 | 744 | 2744 | 673 | ++| getInterestRateData | 1788 | 1788 | 1788 | 1788 | 53 | ++| getInterestRateDataBps | 983 | 983 | 983 | 983 | 53 | ++| getMaxVariableBorrowRate | 968 | 968 | 968 | 968 | 350 | ++| getOptimalUsageRatio | 734 | 737 | 734 | 2734 | 505 | ++| getVariableRateSlope1 | 774 | 774 | 774 | 774 | 514 | ++| getVariableRateSlope2 | 795 | 795 | 795 | 795 | 351 | ++| setInterestRateParams(address,(uint16,uint32,uint32,uint32)) | 28269 | 29733 | 29064 | 36794 | 572 | ++| setInterestRateParams(address,bytes) | 28590 | 33098 | 29847 | 37133 | 1312 | + + + | src/contracts/misc/PriceOracleSentinel.sol:PriceOracleSentinel contract | | | | | | +@@ -505,26 +510,26 @@ + | Deployment Cost | Deployment Size | | | | | + | 454308 | 2052 | | | | | + | Function Name | min | avg | median | max | # calls | +-| ADDRESSES_PROVIDER | 890 | 4035 | 5390 | 5457 | 2530 | +-| BRIDGE_PROTOCOL_FEE | 955 | 5237 | 7455 | 7455 | 23 | ++| ADDRESSES_PROVIDER | 957 | 3096 | 957 | 5457 | 3781 | ++| BRIDGE_PROTOCOL_FEE | 1021 | 5303 | 7521 | 7521 | 23 | + | DOMAIN_SEPARATOR | 1061 | 3198 | 3061 | 7561 | 59 | +-| EMISSION_MANAGER | 932 | 932 | 932 | 932 | 682 | +-| FLASHLOAN_PREMIUM_TOTAL | 994 | 2025 | 2994 | 7516 | 1368 | +-| FLASHLOAN_PREMIUM_TO_PROTOCOL | 1043 | 1067 | 1065 | 7565 | 1365 | +-| MAX_GRACE_PERIOD | 5366 | 5366 | 5366 | 5366 | 371 | +-| MAX_NUMBER_RESERVES | 892 | 892 | 892 | 892 | 109 | ++| EMISSION_MANAGER | 932 | 932 | 932 | 932 | 698 | ++| FLASHLOAN_PREMIUM_TOTAL | 994 | 2005 | 2994 | 7494 | 1400 | ++| FLASHLOAN_PREMIUM_TO_PROTOCOL | 1065 | 1069 | 1065 | 7565 | 1397 | ++| MAX_GRACE_PERIOD | 5366 | 5366 | 5366 | 5366 | 379 | ++| MAX_NUMBER_RESERVES | 914 | 914 | 914 | 914 | 108 | + | POOL | 932 | 2077 | 932 | 5432 | 110 | +-| RESERVE_TREASURY_ADDRESS | 1025 | 1404 | 1025 | 7525 | 2584 | ++| RESERVE_TREASURY_ADDRESS | 1025 | 1592 | 1025 | 7525 | 3119 | + | REVISION | 866 | 866 | 866 | 866 | 8 | +-| UNDERLYING_ASSET_ADDRESS | 1003 | 1071 | 1047 | 3047 | 4282 | ++| UNDERLYING_ASSET_ADDRESS | 1003 | 1068 | 1047 | 3047 | 4564 | + | admin | 21388 | 21388 | 21388 | 21388 | 8 | + | allowance | 1394 | 2682 | 1394 | 7894 | 26 | +-| approve | 51270 | 51329 | 51306 | 51642 | 677 | ++| approve | 51270 | 51329 | 51306 | 51642 | 678 | + | approveDelegation | 53750 | 53750 | 53750 | 53750 | 1 | +-| backUnbacked | 125167 | 140822 | 138777 | 159775 | 9 | +-| balanceOf | 1284 | 5615 | 5362 | 22858 | 3575 | +-| borrow(address,uint256,uint256,uint16,address) | 73940 | 236432 | 249629 | 288773 | 953 | +-| borrow(bytes32) | 229503 | 229503 | 229503 | 229503 | 3 | ++| backUnbacked | 124837 | 140492 | 138447 | 159445 | 9 | ++| balanceOf | 1284 | 5367 | 5362 | 22880 | 5721 | ++| borrow(address,uint256,uint256,uint16,address) | 73801 | 240657 | 249254 | 293064 | 1538 | ++| borrow(bytes32) | 229172 | 229172 | 229172 | 229172 | 3 | + | borrowAllowance | 1440 | 1440 | 1440 | 1440 | 5 | + | burn | 28118 | 40728 | 28448 | 65620 | 3 | + | claimAllRewards | 119485 | 119485 | 119485 | 119485 | 1 | +@@ -533,133 +538,136 @@ + | claimRewards | 28652 | 77697 | 84102 | 113933 | 4 | + | claimRewardsOnBehalf | 116497 | 116497 | 116497 | 116497 | 1 | + | claimRewardsToSelf | 113252 | 113252 | 113252 | 113252 | 1 | +-| configureEModeCategory | 34247 | 34258 | 34258 | 34269 | 110 | +-| configureReserveAsCollateral | 44058 | 64901 | 57731 | 126489 | 489 | +-| decimals | 940 | 962 | 962 | 7462 | 4205 | ++| configureEModeCategory | 33518 | 33529 | 33529 | 33540 | 110 | ++| configureReserveAsCollateral | 44058 | 63584 | 57709 | 114287 | 493 | ++| decimals | 940 | 957 | 940 | 7462 | 6259 | + | decreaseAllowance | 34413 | 34413 | 34413 | 34413 | 1 | + | delegationWithSig | 29247 | 56385 | 45247 | 84283 | 7 | +-| deposit | 173106 | 223009 | 226046 | 235646 | 937 | +-| disableLiquidationGracePeriod | 43552 | 54782 | 43768 | 66073 | 109 | +-| dropReserve | 32618 | 37201 | 32640 | 105096 | 172 | +-| flashLoan | 59228 | 179747 | 149955 | 374161 | 65 | +-| flashLoanSimple | 50902 | 313230 | 179210 | 646184 | 11 | ++| deposit | 172753 | 222603 | 225693 | 235293 | 939 | ++| disableLiquidationGracePeriod | 43552 | 54981 | 66051 | 66051 | 111 | ++| dropReserve | 32640 | 37208 | 32640 | 105096 | 172 | ++| eliminateReserveDeficit | 33037 | 84429 | 82057 | 147715 | 330 | ++| flashLoan | 59206 | 185569 | 169698 | 374139 | 65 | ++| flashLoanSimple | 50902 | 306036 | 178880 | 625732 | 11 | + | getAllUserRewards | 9209 | 9209 | 9209 | 9209 | 1 | + | getAssetDecimals | 1265 | 1265 | 1265 | 1265 | 2 | +-| getAssetIndex | 3081 | 10042 | 9589 | 16507 | 2079 | +-| getBorrowLogic | 5387 | 5409 | 5409 | 5431 | 2 | +-| getBridgeLogic | 5451 | 5451 | 5451 | 5451 | 2 | ++| getAssetIndex | 3081 | 10058 | 9589 | 16507 | 2069 | ++| getBorrowLogic | 5387 | 5398 | 5398 | 5409 | 2 | ++| getBridgeLogic | 5385 | 5429 | 5429 | 5473 | 2 | + | getClaimer | 1234 | 7617 | 7734 | 7734 | 112 | +-| getConfiguration | 1332 | 1670 | 1354 | 7854 | 28594 | ++| getConfiguration | 1310 | 1639 | 1332 | 7832 | 29585 | + | getConfiguratorLogic | 5389 | 5389 | 5389 | 5389 | 1 | + | getDistributionEnd | 1401 | 1401 | 1401 | 1401 | 1 | +-| getEModeCategoryBorrowableBitmap | 1277 | 7422 | 7777 | 7777 | 420 | +-| getEModeCategoryCollateralBitmap | 1287 | 7511 | 7787 | 7787 | 614 | +-| getEModeCategoryCollateralConfig | 1500 | 2340 | 1500 | 8000 | 110 | +-| getEModeCategoryData | 13430 | 13430 | 13430 | 13430 | 3 | +-| getEModeCategoryLabel | 1940 | 2257 | 2198 | 3940 | 25 | +-| getEModeLogic | 5384 | 5417 | 5417 | 5451 | 2 | +-| getFlashLoanLogic | 5408 | 5430 | 5430 | 5453 | 2 | +-| getIncentivesController | 1036 | 1061 | 1080 | 7580 | 4190 | +-| getLiquidationGracePeriod | 29175 | 29194 | 29197 | 29197 | 473 | +-| getLiquidationLogic | 5431 | 5442 | 5442 | 5453 | 2 | +-| getPendingLtv | 1249 | 1249 | 1249 | 1249 | 153 | +-| getPoolLogic | 5385 | 5407 | 5407 | 5430 | 2 | ++| getEModeCategoryBorrowableBitmap | 1233 | 7387 | 7733 | 7733 | 420 | ++| getEModeCategoryCollateralBitmap | 1259 | 7473 | 7759 | 7759 | 615 | ++| getEModeCategoryCollateralConfig | 1567 | 2400 | 1567 | 8067 | 111 | ++| getEModeCategoryData | 11053 | 11053 | 11053 | 11053 | 3 | ++| getEModeCategoryLabel | 1918 | 2235 | 2176 | 3918 | 25 | ++| getEModeLogic | 5406 | 5439 | 5439 | 5473 | 2 | ++| getFlashLoanLogic | 5386 | 5419 | 5419 | 5453 | 2 | ++| getIncentivesController | 1036 | 1060 | 1080 | 7580 | 4472 | ++| getLiquidationGracePeriod | 29197 | 29197 | 29197 | 29197 | 491 | ++| getLiquidationLogic | 5409 | 5409 | 5409 | 5409 | 2 | ++| getPendingLtv | 1249 | 1249 | 1249 | 1249 | 159 | ++| getPoolLogic | 5407 | 5429 | 5429 | 5452 | 2 | + | getPreviousIndex | 1260 | 1260 | 1260 | 1260 | 39 | ++| getReserveAToken | 1241 | 1380 | 1285 | 7785 | 5189 | + | getReserveAddressById | 1271 | 1271 | 1271 | 1271 | 1 | +-| getReserveData | 5891 | 11728 | 7935 | 34935 | 9429 | +-| getReserveDataExtended | 4175 | 4841 | 4175 | 6175 | 6 | +-| getReserveNormalizedIncome | 0 | 3429 | 1476 | 10436 | 6703 | +-| getReserveNormalizedVariableDebt | 1454 | 1681 | 1498 | 11584 | 1664 | ++| getReserveData | 4124 | 10068 | 4146 | 26646 | 4339 | ++| getReserveDeficit | 1218 | 1218 | 1218 | 1218 | 282 | ++| getReserveNormalizedIncome | 0 | 2996 | 1498 | 10458 | 8939 | ++| getReserveNormalizedVariableDebt | 1476 | 1652 | 1498 | 11584 | 2590 | ++| getReserveVariableDebtToken | 1263 | 1334 | 1285 | 7785 | 4123 | + | getReservesCount | 998 | 998 | 998 | 998 | 2 | +-| getReservesList | 3794 | 13871 | 11794 | 100510 | 950 | ++| getReservesList | 3727 | 13936 | 11727 | 97241 | 948 | + | getRewardOracle | 1258 | 1258 | 1258 | 1258 | 1 | + | getRewardsByAsset | 2383 | 9751 | 10883 | 10883 | 613 | + | getRewardsData | 1600 | 1600 | 1600 | 1600 | 3 | + | getRewardsList | 1723 | 1723 | 1723 | 1723 | 30 | + | getScaledUserBalanceAndSupply | 1438 | 5057 | 3438 | 9938 | 21 | +-| getSupplyLogic | 5387 | 5419 | 5419 | 5451 | 2 | ++| getSupplyLogic | 5429 | 5440 | 5440 | 5451 | 2 | + | getTransferStrategy | 1257 | 1257 | 1257 | 1257 | 1 | +-| getUserAccountData | 12774 | 22639 | 22886 | 38008 | 557 | ++| getUserAccountData | 12752 | 23358 | 20364 | 37986 | 1923 | + | getUserAccruedRewards | 2253 | 2253 | 2253 | 2253 | 1 | + | getUserAssetIndex | 1623 | 1623 | 1623 | 1623 | 1 | +-| getUserConfiguration | 1312 | 1367 | 1312 | 3312 | 399 | +-| getUserEMode | 1243 | 1243 | 1243 | 1243 | 283 | +-| getUserRewards | 7423 | 8657 | 8711 | 17498 | 66 | +-| getVirtualUnderlyingBalance | 1266 | 1676 | 1266 | 3266 | 815 | ++| getUserConfiguration | 1312 | 1492 | 1312 | 3312 | 177 | ++| getUserEMode | 1265 | 1265 | 1265 | 1265 | 863 | ++| getUserRewards | 7423 | 8651 | 8711 | 17498 | 66 | ++| getVirtualUnderlyingBalance | 1266 | 2152 | 1266 | 3266 | 377 | + | increaseAllowance | 34480 | 47305 | 51580 | 51580 | 4 | +-| initReserve | 33274 | 33306 | 33306 | 33338 | 220 | +-| initReserves | 45683 | 33142016 | 1586149 | 213411849 | 436 | +-| liquidationCall(address,address,address,uint256,bool) | 80670 | 265778 | 350729 | 410462 | 795 | +-| liquidationCall(bytes32,bytes32) | 402793 | 402793 | 402793 | 402793 | 1 | ++| initReserve | 33316 | 33327 | 33327 | 33338 | 220 | ++| initReserves | 45683 | 33465441 | 1586662 | 212323201 | 439 | ++| liquidationCall(address,address,address,uint256,bool) | 101362 | 309730 | 352739 | 520473 | 1279 | ++| liquidationCall(bytes32,bytes32) | 432168 | 432168 | 432168 | 432168 | 1 | + | mint | 28146 | 73470 | 91246 | 91726 | 7 | +-| mintToTreasury(address[]) | 99291 | 100871 | 100871 | 102451 | 4 | ++| mintToTreasury(address[]) | 99247 | 100838 | 100838 | 102429 | 4 | + | mintToTreasury(uint256,uint256) | 26979 | 59928 | 59928 | 92877 | 2 | +-| mintUnbacked | 39385 | 145515 | 130632 | 192965 | 17 | +-| name | 1613 | 2101 | 1931 | 8371 | 4446 | ++| mintUnbacked | 39385 | 145194 | 130258 | 192591 | 17 | ++| name | 1613 | 2095 | 1931 | 8371 | 4728 | + | nonces | 1183 | 3134 | 3261 | 3261 | 64 | + | permit | 29288 | 46358 | 37821 | 81919 | 8 | +-| repay(address,uint256,uint256,address) | 60445 | 129255 | 167596 | 186974 | 13 | +-| repay(bytes32) | 157189 | 157189 | 157189 | 157189 | 1 | +-| repayWithATokens(address,uint256,uint256) | 154919 | 181702 | 182098 | 193095 | 57 | +-| repayWithATokens(bytes32) | 160214 | 160214 | 160214 | 160214 | 1 | +-| repayWithPermit(address,uint256,uint256,address,uint256,uint8,bytes32,bytes32) | 155535 | 184979 | 182716 | 218483 | 150 | +-| repayWithPermit(bytes32,bytes32,bytes32) | 190349 | 205075 | 196796 | 217554 | 51 | +-| rescueTokens | 39090 | 69890 | 70416 | 70481 | 113 | +-| resetIsolationModeTotalDebt | 32573 | 32781 | 32661 | 41891 | 112 | +-| scaledBalanceOf | 1296 | 3893 | 3296 | 7796 | 4833 | +-| scaledTotalSupply | 979 | 5054 | 7523 | 7523 | 9894 | +-| setAssetBorrowableInEMode | 97349 | 114455 | 114449 | 127676 | 394 | +-| setAssetCollateralInEMode | 44072 | 102126 | 110608 | 110608 | 642 | ++| repay(address,uint256,uint256,address) | 60328 | 129005 | 167218 | 186596 | 13 | ++| repay(bytes32) | 156855 | 156855 | 156855 | 156855 | 1 | ++| repayWithATokens(address,uint256,uint256) | 161043 | 181176 | 181714 | 192720 | 57 | ++| repayWithATokens(bytes32) | 159903 | 159903 | 159903 | 159903 | 1 | ++| repayWithPermit(address,uint256,uint256,address,uint256,uint8,bytes32,bytes32) | 157882 | 180298 | 172938 | 218102 | 165 | ++| repayWithPermit(bytes32,bytes32,bytes32) | 188729 | 203492 | 196487 | 217222 | 55 | ++| rescueTokens | 39090 | 69891 | 70416 | 70481 | 113 | ++| resetIsolationModeTotalDebt | 32573 | 32748 | 32595 | 41825 | 112 | ++| scaledBalanceOf | 1296 | 3503 | 3296 | 7796 | 9089 | ++| scaledTotalSupply | 979 | 5545 | 7523 | 7523 | 12481 | ++| setAssetBorrowableInEMode | 91538 | 108644 | 108638 | 121798 | 394 | ++| setAssetCollateralInEMode | 44072 | 96796 | 104763 | 104786 | 642 | + | setBorrowCap | 43734 | 47605 | 43734 | 70862 | 66 | +-| setBorrowableInIsolation | 67604 | 70018 | 70407 | 70407 | 13 | +-| setConfiguration | 32766 | 32777 | 32777 | 32788 | 110 | +-| setDebtCeiling | 43713 | 60872 | 43713 | 125470 | 73 | +-| setEModeCategory | 44817 | 102639 | 108823 | 108835 | 638 | ++| setBorrowableInIsolation | 67604 | 70015 | 70407 | 70407 | 13 | ++| setConfiguration | 32766 | 32788 | 32788 | 32810 | 110 | ++| setDebtCeiling | 43713 | 58531 | 43713 | 113268 | 73 | ++| setEModeCategory | 44817 | 103136 | 109372 | 109384 | 638 | + | setIncentivesController | 38478 | 40847 | 40847 | 43216 | 2 | +-| setLiquidationGracePeriod | 32833 | 37963 | 37353 | 43763 | 330 | ++| setLiquidationGracePeriod | 32833 | 37944 | 37331 | 43741 | 330 | + | setLiquidationProtocolFee | 43966 | 60573 | 69843 | 70933 | 8 | +-| setPoolPause(bool) | 43516 | 45449 | 43528 | 116161 | 113 | +-| setPoolPause(bool,uint40) | 43759 | 86554 | 43831 | 134169 | 108 | +-| setReserveActive | 40882 | 53217 | 40882 | 121965 | 66 | ++| setPoolPause(bool) | 43516 | 45446 | 43516 | 116094 | 113 | ++| setPoolPause(bool,uint40) | 43771 | 88078 | 43831 | 134036 | 108 | ++| setReserveActive | 40882 | 51369 | 40882 | 109763 | 66 | + | setReserveBorrowing | 43825 | 62281 | 68433 | 68436 | 220 | +-| setReserveFactor | 43758 | 45657 | 43758 | 151653 | 57 | ++| setReserveFactor | 43758 | 45652 | 43758 | 151390 | 57 | + | setReserveFlashLoaning | 68432 | 68452 | 68435 | 70587 | 111 | +-| setReserveFreeze | 47008 | 73282 | 74806 | 99820 | 169 | +-| setReserveInterestRateData | 44316 | 46059 | 44544 | 133943 | 56 | +-| setReserveInterestRateStrategyAddress(address,address) | 32829 | 34615 | 33178 | 42713 | 332 | +-| setReserveInterestRateStrategyAddress(address,address,bytes) | 44459 | 96824 | 44459 | 192989 | 99 | +-| setReservePause(address,bool) | 43816 | 57036 | 69873 | 69873 | 111 | +-| setReservePause(address,bool,uint40) | 41264 | 65735 | 73877 | 76187 | 658 | +-| setSiloedBorrowing | 105040 | 114886 | 118732 | 120887 | 3 | +-| setSupplyCap | 43691 | 58619 | 70807 | 70843 | 126 | ++| setReserveFreeze | 47008 | 73569 | 74806 | 99820 | 173 | ++| setReserveInterestRateData | 44328 | 45932 | 44544 | 127891 | 56 | ++| setReserveInterestRateStrategyAddress(address,address) | 32829 | 34606 | 33178 | 42691 | 332 | ++| setReserveInterestRateStrategyAddress(address,address,bytes) | 44459 | 94125 | 44459 | 186915 | 99 | ++| setReservePause(address,bool) | 43816 | 57031 | 69873 | 69873 | 111 | ++| setReservePause(address,bool,uint40) | 41264 | 65987 | 73855 | 76165 | 668 | ++| setSiloedBorrowing | 82616 | 93795 | 98308 | 100463 | 3 | ++| setSupplyCap | 43691 | 58620 | 70807 | 70843 | 126 | + | setUnbackedMintCap | 70854 | 70854 | 70854 | 70854 | 7 | +-| setUserEMode | 40463 | 73473 | 67427 | 121033 | 573 | +-| setUserUseReserveAsCollateral(address,bool) | 80249 | 96257 | 93457 | 129473 | 42 | +-| setUserUseReserveAsCollateral(bytes32) | 95254 | 95254 | 95254 | 95254 | 1 | ++| setUserEMode | 40441 | 73483 | 67405 | 121011 | 573 | ++| setUserUseReserveAsCollateral(address,bool) | 80227 | 96252 | 93456 | 129472 | 42 | ++| setUserUseReserveAsCollateral(bytes32) | 95189 | 95189 | 95189 | 95189 | 1 | + | setValue | 31565 | 31581 | 31589 | 31589 | 3 | +-| supply(address,uint256,address,uint16) | 56589 | 218981 | 226189 | 243423 | 1550 | +-| supply(bytes32) | 236846 | 236846 | 236846 | 236846 | 7 | +-| supplyWithPermit(address,uint256,address,uint16,uint256,uint8,bytes32,bytes32) | 142270 | 216334 | 241875 | 266413 | 157 | +-| supplyWithPermit(bytes32,bytes32,bytes32) | 262466 | 262515 | 262478 | 262646 | 54 | +-| symbol | 1634 | 2185 | 1996 | 8436 | 4421 | ++| supply(address,uint256,address,uint16) | 56472 | 214437 | 225814 | 243048 | 2545 | ++| supply(bytes32) | 236471 | 236471 | 236471 | 236471 | 7 | ++| supplyWithPermit(address,uint256,address,uint16,uint256,uint8,bytes32,bytes32) | 141895 | 216010 | 241512 | 266038 | 157 | ++| supplyWithPermit(bytes32,bytes32,bytes32) | 262101 | 262171 | 262161 | 262293 | 54 | ++| symbol | 1634 | 2182 | 2193 | 8436 | 4703 | + | text | 1778 | 1778 | 1778 | 1778 | 8 | +-| totalSupply | 1013 | 5916 | 3013 | 15569 | 2997 | +-| transfer | 27651 | 140023 | 149272 | 166887 | 71 | +-| transferFrom | 138593 | 138713 | 138713 | 138833 | 2 | ++| totalSupply | 1013 | 6801 | 3013 | 15591 | 3630 | ++| transfer | 27651 | 138144 | 149316 | 166931 | 71 | ++| transferFrom | 138637 | 138757 | 138757 | 138877 | 2 | + | transferOnLiquidation | 28049 | 28049 | 28049 | 28049 | 1 | + | transferUnderlyingTo | 27493 | 27493 | 27493 | 27493 | 1 | +-| updateAToken | 41743 | 43670 | 41743 | 149706 | 56 | +-| updateBridgeProtocolFee | 32511 | 37397 | 32556 | 78320 | 124 | +-| updateFlashloanPremiumToProtocol | 40424 | 40827 | 40424 | 63303 | 57 | +-| updateFlashloanPremiumTotal | 40378 | 40781 | 40378 | 63268 | 57 | +-| updateFlashloanPremiums | 32836 | 32847 | 32847 | 32858 | 110 | +-| updateVariableDebtToken | 41598 | 43419 | 41598 | 143589 | 56 | ++| updateAToken | 41743 | 43232 | 41743 | 125158 | 56 | ++| updateBridgeProtocolFee | 32556 | 37441 | 32578 | 78453 | 124 | ++| updateFlashloanPremiumToProtocol | 40424 | 40826 | 40424 | 63259 | 57 | ++| updateFlashloanPremiumTotal | 40378 | 40781 | 40378 | 63224 | 57 | ++| updateFlashloanPremiums | 32836 | 32880 | 32880 | 32925 | 110 | ++| updateVariableDebtToken | 41598 | 42980 | 41598 | 119042 | 56 | + | upgradeTo | 26845 | 28735 | 28735 | 30625 | 2 | + | upgradeToAndCall | 28747 | 152620 | 187393 | 187393 | 8 | + | value | 923 | 923 | 923 | 923 | 11 | + | values | 1203 | 1203 | 1203 | 1203 | 16 | +-| withdraw(address,uint256,address) | 66258 | 134574 | 141787 | 204532 | 23 | +-| withdraw(bytes32) | 138601 | 145682 | 145682 | 152763 | 2 | ++| withdraw(address,uint256,address) | 66318 | 134324 | 141469 | 204214 | 23 | ++| withdraw(bytes32) | 138369 | 145450 | 145450 | 152532 | 2 | + + + | src/contracts/mocks/flashloan/MockFlashLoanReceiver.sol:MockFlashLoanReceiver contract | | | | | | +@@ -683,9 +691,9 @@ + | src/contracts/mocks/helpers/MockPool.sol:MockPoolInherited contract | | | | | | + |---------------------------------------------------------------------|-----------------|-------|--------|-------|---------| + | Deployment Cost | Deployment Size | | | | | +-| 4878289 | 22516 | | | | | ++| 4748324 | 21925 | | | | | + | Function Name | min | avg | median | max | # calls | +-| initialize | 28391 | 28391 | 28391 | 28391 | 2 | ++| initialize | 28478 | 28478 | 28478 | 28478 | 2 | + + + | src/contracts/mocks/oracle/CLAggregators/MockAggregator.sol:MockAggregator contract | | | | | | +@@ -693,10 +701,10 @@ + | Deployment Cost | Deployment Size | | | | | + | 108467 | 310 | | | | | + | Function Name | min | avg | median | max | # calls | +-| _latestAnswer | 315 | 315 | 315 | 315 | 908 | ++| _latestAnswer | 315 | 315 | 315 | 315 | 2052 | + | decimals | 143 | 143 | 143 | 143 | 83 | + | description | 168 | 168 | 168 | 168 | 83 | +-| latestAnswer | 279 | 1638 | 2279 | 2279 | 8342 | ++| latestAnswer | 279 | 1341 | 2279 | 2279 | 15698 | + | name | 168 | 168 | 168 | 168 | 83 | + + +@@ -715,7 +723,7 @@ + | 273603 | 1358 | | | | | + | Function Name | min | avg | median | max | # calls | + | latestRoundData | 724 | 1527 | 729 | 4729 | 10 | +-| setAnswer | 26203 | 27465 | 26203 | 46115 | 72 | ++| setAnswer | 26203 | 27414 | 26203 | 46115 | 75 | + + + | src/contracts/mocks/swap/MockParaSwapAugustus.sol:MockParaSwapAugustus contract | | | | | | +@@ -749,17 +757,17 @@ + | src/contracts/mocks/testnet-helpers/TestnetERC20.sol:TestnetERC20 contract | | | | | | + |----------------------------------------------------------------------------|-----------------|-------|--------|-------|---------| + | Deployment Cost | Deployment Size | | | | | +-| 1032293 | 5652 | | | | | ++| 1032245 | 5652 | | | | | + | Function Name | min | avg | median | max | # calls | + | DOMAIN_SEPARATOR | 2339 | 2339 | 2339 | 2339 | 55 | + | allowance | 833 | 1944 | 2833 | 2833 | 9 | +-| approve | 26300 | 46290 | 46584 | 46584 | 5444 | +-| balanceOf | 648 | 1079 | 648 | 2648 | 11009 | +-| decimals | 311 | 1487 | 2311 | 2311 | 18442 | +-| mint | 36475 | 60304 | 53587 | 70795 | 3951 | +-| name | 3236 | 3236 | 3236 | 3236 | 412 | ++| approve | 26300 | 46244 | 46584 | 46584 | 5840 | ++| balanceOf | 648 | 1071 | 648 | 2648 | 16219 | ++| decimals | 311 | 1468 | 2311 | 2311 | 19433 | ++| mint | 36475 | 60296 | 53587 | 70795 | 3981 | ++| name | 3236 | 3236 | 3236 | 3236 | 431 | + | nonces | 2601 | 2601 | 2601 | 2601 | 55 | +-| permit | 76469 | 76508 | 76493 | 76661 | 102 | ++| permit | 76457 | 76510 | 76493 | 76661 | 107 | + | symbol | 1323 | 2323 | 2323 | 3323 | 56 | + | totalSupply | 348 | 748 | 348 | 2348 | 2490 | + | transfer | 46925 | 51017 | 51701 | 51701 | 7 | +@@ -782,10 +790,10 @@ + | Deployment Cost | Deployment Size | | | | | + | 117447 | 326 | | | | | + | Function Name | min | avg | median | max | # calls | +-| HALF_PERCENTAGE_FACTOR | 146 | 146 | 146 | 146 | 104 | +-| PERCENTAGE_FACTOR | 223 | 223 | 223 | 223 | 157 | ++| HALF_PERCENTAGE_FACTOR | 146 | 146 | 146 | 146 | 94 | ++| PERCENTAGE_FACTOR | 223 | 223 | 223 | 223 | 148 | + | percentDiv | 316 | 424 | 428 | 428 | 58 | +-| percentMul | 333 | 420 | 431 | 431 | 58 | ++| percentMul | 333 | 407 | 431 | 431 | 58 | + + + | src/contracts/mocks/tests/WadRayMathWrapper.sol:WadRayMathWrapper contract | | | | | | +@@ -796,20 +804,20 @@ + | HALF_RAY | 246 | 246 | 246 | 246 | 1 | + | HALF_WAD | 223 | 223 | 223 | 223 | 92 | + | RAY | 224 | 224 | 224 | 224 | 1 | +-| WAD | 179 | 179 | 179 | 179 | 136 | +-| WAD_RAY_RATIO | 268 | 268 | 268 | 268 | 379 | ++| WAD | 179 | 179 | 179 | 179 | 139 | ++| WAD_RAY_RATIO | 268 | 268 | 268 | 268 | 375 | + | rayDiv | 494 | 494 | 494 | 494 | 4 | + | rayMul | 497 | 497 | 497 | 497 | 3 | + | rayToWad | 384 | 387 | 384 | 398 | 113 | +-| wadDiv | 426 | 517 | 538 | 538 | 59 | +-| wadMul | 333 | 402 | 431 | 431 | 61 | +-| wadToRay | 280 | 352 | 357 | 357 | 107 | ++| wadDiv | 426 | 519 | 538 | 538 | 59 | ++| wadMul | 333 | 406 | 431 | 431 | 61 | ++| wadToRay | 280 | 349 | 357 | 357 | 103 | + + + | src/contracts/mocks/tokens/MockATokenRepayment.sol:MockATokenRepayment contract | | | | | | + |---------------------------------------------------------------------------------|-----------------|-------|--------|-------|---------| + | Deployment Cost | Deployment Size | | | | | +-| 2334681 | 11175 | | | | | ++| 2334748 | 11175 | | | | | + | Function Name | min | avg | median | max | # calls | + | RESERVE_TREASURY_ADDRESS | 419 | 419 | 419 | 419 | 1 | + | getIncentivesController | 474 | 474 | 474 | 474 | 1 | +@@ -821,7 +829,7 @@ + | src/contracts/mocks/tokens/MockDebtTokens.sol:MockVariableDebtToken contract | | | | | | + |------------------------------------------------------------------------------|-----------------|-------|--------|-------|---------| + | Deployment Cost | Deployment Size | | | | | +-| 1695959 | 8194 | | | | | ++| 1696026 | 8194 | | | | | + | Function Name | min | avg | median | max | # calls | + | getIncentivesController | 430 | 430 | 430 | 430 | 1 | + | initialize | 56093 | 56093 | 56093 | 56093 | 1 | +@@ -832,7 +840,7 @@ + | src/contracts/mocks/tokens/MockScaledToken.sol:MockScaledToken contract | | | | | | + |-------------------------------------------------------------------------|-----------------|-------|--------|-------|---------| + | Deployment Cost | Deployment Size | | | | | +-| 1004529 | 4790 | | | | | ++| 1004596 | 4790 | | | | | + | Function Name | min | avg | median | max | # calls | + | balanceOf | 584 | 584 | 584 | 584 | 4 | + | setStorage | 67846 | 67846 | 67846 | 67846 | 1 | +@@ -888,23 +896,23 @@ + | Deployment Cost | Deployment Size | | | | | + | 847989 | 4139 | | | | | + | Function Name | min | avg | median | max | # calls | +-| DEFAULT_ADMIN_ROLE | 282 | 282 | 282 | 282 | 1382 | ++| DEFAULT_ADMIN_ROLE | 282 | 282 | 282 | 282 | 1414 | + | FLASH_BORROWER_ROLE | 315 | 315 | 315 | 315 | 20 | +-| POOL_ADMIN_ROLE | 292 | 292 | 292 | 292 | 681 | ++| POOL_ADMIN_ROLE | 292 | 292 | 292 | 292 | 697 | + | addAssetListingAdmin | 50955 | 50955 | 50955 | 50955 | 3 | + | addBridge | 51021 | 51021 | 51021 | 51021 | 14 | + | addEmergencyAdmin | 50956 | 50956 | 50956 | 50956 | 3 | + | addFlashBorrower | 50977 | 52114 | 50977 | 55528 | 4 | +-| addPoolAdmin | 50988 | 50999 | 51000 | 51000 | 668 | ++| addPoolAdmin | 50988 | 50999 | 51000 | 51000 | 684 | + | addRiskAdmin | 51021 | 51021 | 51021 | 51021 | 14 | + | grantRole | 51474 | 52044 | 51474 | 56036 | 8 | + | hasRole | 737 | 2526 | 2737 | 2737 | 19 | +-| isAssetListingAdmin | 809 | 2089 | 2809 | 2809 | 1807 | ++| isAssetListingAdmin | 809 | 2085 | 2809 | 2809 | 1842 | + | isBridge | 2786 | 2786 | 2786 | 2786 | 26 | + | isEmergencyAdmin | 742 | 2737 | 2742 | 2742 | 948 | + | isFlashBorrower | 2828 | 2828 | 2828 | 2828 | 66 | +-| isPoolAdmin | 752 | 1249 | 752 | 2752 | 28889 | +-| isRiskAdmin | 742 | 1123 | 742 | 2742 | 23250 | ++| isPoolAdmin | 752 | 1242 | 752 | 2752 | 29456 | ++| isRiskAdmin | 742 | 1117 | 742 | 2742 | 23738 | + | removeAssetListingAdmin | 29047 | 29047 | 29047 | 29047 | 2 | + | removeBridge | 29016 | 29016 | 29016 | 29016 | 1 | + | removeEmergencyAdmin | 28992 | 28992 | 28992 | 28992 | 1 | +@@ -919,24 +927,24 @@ + | Deployment Cost | Deployment Size | | | | | + | 1571699 | 8177 | | | | | + | Function Name | min | avg | median | max | # calls | +-| getACLAdmin | 477 | 681 | 477 | 2477 | 763 | +-| getACLManager | 531 | 968 | 531 | 2531 | 27795 | +-| getAddress | 543 | 1045 | 543 | 2543 | 10118 | ++| getACLAdmin | 477 | 679 | 477 | 2477 | 780 | ++| getACLManager | 531 | 962 | 531 | 2531 | 28362 | ++| getAddress | 543 | 1182 | 543 | 2543 | 1035 | + | getMarketId | 1346 | 1346 | 1346 | 1346 | 6 | +-| getPool | 466 | 776 | 466 | 2466 | 14575 | +-| getPoolConfigurator | 509 | 725 | 509 | 2509 | 67952 | +-| getPoolDataProvider | 486 | 1203 | 486 | 2486 | 2089 | +-| getPriceOracle | 574 | 2254 | 2574 | 2574 | 4344 | +-| getPriceOracleSentinel | 487 | 2467 | 2487 | 2487 | 1788 | +-| owner | 363 | 363 | 363 | 363 | 686 | ++| getPool | 466 | 777 | 466 | 2466 | 14817 | ++| getPoolConfigurator | 509 | 723 | 509 | 2509 | 69291 | ++| getPoolDataProvider | 486 | 1201 | 486 | 2486 | 2137 | ++| getPriceOracle | 574 | 1904 | 2574 | 2574 | 8259 | ++| getPriceOracleSentinel | 487 | 2475 | 2487 | 2487 | 2857 | ++| owner | 363 | 363 | 363 | 363 | 702 | + | setACLAdmin | 24013 | 45794 | 47617 | 47617 | 24 | + | setACLManager | 24056 | 37484 | 39110 | 47660 | 4 | +-| setAddress | 24622 | 35608 | 31536 | 48636 | 5 | ++| setAddress | 24622 | 48054 | 48360 | 48636 | 280 | + | setAddressAsProxy | 24328 | 224316 | 57038 | 507830 | 5 | + | setMarketId | 24420 | 28552 | 28552 | 32685 | 2 | +-| setPoolConfiguratorImpl | 24012 | 287005 | 295057 | 533894 | 4 | ++| setPoolConfiguratorImpl | 24012 | 287022 | 295092 | 533894 | 4 | + | setPoolDataProvider | 24101 | 37529 | 39155 | 47705 | 4 | +-| setPoolImpl | 24057 | 273450 | 281500 | 506744 | 4 | ++| setPoolImpl | 24057 | 273500 | 281568 | 506809 | 4 | + | setPriceOracle | 24080 | 37508 | 39134 | 47684 | 4 | + | setPriceOracleSentinel | 24123 | 40943 | 47727 | 47727 | 6 | + +@@ -949,7 +957,7 @@ + | getAddressesProviderAddressById | 519 | 519 | 519 | 519 | 4 | + | getAddressesProviderIdByAddress | 556 | 1222 | 556 | 2556 | 6 | + | getAddressesProvidersList | 671 | 3400 | 3288 | 5014 | 5 | +-| owner | 329 | 2323 | 2329 | 2329 | 683 | ++| owner | 329 | 2323 | 2329 | 2329 | 699 | + | registerAddressesProvider | 24438 | 104006 | 119920 | 119920 | 6 | + | unregisterAddressesProvider | 26441 | 39021 | 39997 | 49652 | 4 | + +@@ -959,7 +967,7 @@ + | Deployment Cost | Deployment Size | | | | | + | 833790 | 3948 | | | | | + | Function Name | min | avg | median | max | # calls | +-| configureAssets | 284134 | 284424 | 284194 | 289908 | 518 | ++| configureAssets | 284134 | 284422 | 284194 | 289908 | 518 | + | getEmissionAdmin | 547 | 547 | 547 | 547 | 6 | + | getRewardsController | 385 | 1385 | 1385 | 2385 | 2 | + | owner | 384 | 384 | 384 | 384 | 2 | +@@ -977,17 +985,17 @@ + | Deployment Cost | Deployment Size | | | | | + | 3131951 | 14452 | | | | | + | Function Name | min | avg | median | max | # calls | +-| EMISSION_MANAGER | 326 | 326 | 326 | 326 | 685 | ++| EMISSION_MANAGER | 326 | 326 | 326 | 326 | 701 | + | claimAllRewards | 92263 | 92263 | 92263 | 92263 | 1 | + | claimAllRewardsOnBehalf | 94562 | 94562 | 94562 | 94562 | 1 | + | claimAllRewardsToSelf | 92062 | 92062 | 92062 | 92062 | 1 | +-| claimRewards | 952 | 72531 | 84890 | 97899 | 155 | ++| claimRewards | 952 | 71217 | 84899 | 97899 | 135 | + | claimRewardsOnBehalf | 88363 | 88363 | 88363 | 88363 | 1 | + | claimRewardsToSelf | 85866 | 85866 | 85866 | 85866 | 1 | + | configureAssets | 246530 | 246750 | 246530 | 252244 | 518 | + | getAllUserRewards | 8567 | 8567 | 8567 | 8567 | 1 | + | getAssetDecimals | 656 | 656 | 656 | 656 | 2 | +-| getAssetIndex | 2466 | 7696 | 8974 | 11392 | 2079 | ++| getAssetIndex | 2466 | 7708 | 8974 | 11392 | 2069 | + | getClaimer | 625 | 2589 | 2625 | 2625 | 112 | + | getDistributionEnd | 789 | 789 | 789 | 789 | 1 | + | getEmissionManager | 258 | 258 | 258 | 258 | 5 | +@@ -998,9 +1006,9 @@ + | getTransferStrategy | 648 | 648 | 648 | 648 | 1 | + | getUserAccruedRewards | 1641 | 1641 | 1641 | 1641 | 1 | + | getUserAssetIndex | 1005 | 1005 | 1005 | 1005 | 1 | +-| getUserRewards | 6793 | 7959 | 8081 | 12368 | 66 | +-| handleAction | 728 | 2287 | 2728 | 38069 | 8227 | +-| initialize | 26065 | 45245 | 45250 | 53154 | 683 | ++| getUserRewards | 6793 | 7953 | 8081 | 12368 | 66 | ++| handleAction | 728 | 2270 | 2728 | 38069 | 11810 | ++| initialize | 26065 | 45245 | 45250 | 53154 | 699 | + | setClaimer | 24279 | 24279 | 24279 | 24279 | 59 | + | setDistributionEnd | 8884 | 8884 | 8884 | 8884 | 2 | + | setEmissionPerSecond | 24303 | 24303 | 24303 | 24303 | 2 | +@@ -1036,7 +1044,7 @@ + | Deployment Cost | Deployment Size | | | | | + | 0 | 0 | | | | | + | Function Name | min | avg | median | max | # calls | +-| initialize | 90680 | 90680 | 90680 | 90680 | 708 | ++| initialize | 90680 | 90680 | 90680 | 90680 | 724 | + + + | src/contracts/treasury/RevenueSplitter.sol:RevenueSplitter contract | | | | | | +@@ -1049,23 +1057,23 @@ + | SPLIT_PERCENTAGE_RECIPIENT_A | 170 | 170 | 170 | 170 | 491 | + | receive | 0 | 0 | 0 | 0 | 56 | + | splitNativeRevenue | 23633 | 90996 | 92645 | 92645 | 57 | +-| splitRevenue | 24246 | 129585 | 135765 | 135765 | 112 | ++| splitRevenue | 24246 | 128965 | 135765 | 135765 | 112 | + + + | src/deployments/projects/aave-v3-batched/batches/AaveV3GettersBatchOne.sol:AaveV3GettersBatchOne contract | | | | | | + |-----------------------------------------------------------------------------------------------------------|-----------------|-----|--------|-----|---------| + | Deployment Cost | Deployment Size | | | | | +-| 5027098 | 32657 | | | | | ++| 5076368 | 33025 | | | | | + | Function Name | min | avg | median | max | # calls | +-| getGettersReportOne | 968 | 968 | 968 | 968 | 705 | ++| getGettersReportOne | 968 | 968 | 968 | 968 | 721 | + + + | src/deployments/projects/aave-v3-batched/batches/AaveV3GettersBatchTwo.sol:AaveV3GettersBatchTwo contract | | | | | | + |-----------------------------------------------------------------------------------------------------------|-----------------|-----|--------|-----|---------| + | Deployment Cost | Deployment Size | | | | | +-| 1506020 | 11284 | | | | | ++| 1403193 | 10809 | | | | | + | Function Name | min | avg | median | max | # calls | +-| getGettersReportTwo | 533 | 533 | 533 | 533 | 679 | ++| getGettersReportTwo | 533 | 533 | 533 | 533 | 695 | + + + | src/deployments/projects/aave-v3-batched/batches/AaveV3HelpersBatchOne.sol:AaveV3HelpersBatchOne contract | | | | | | +@@ -1073,21 +1081,21 @@ + | Deployment Cost | Deployment Size | | | | | + | 7236222 | 34331 | | | | | + | Function Name | min | avg | median | max | # calls | +-| getConfigEngineReport | 1693 | 1693 | 1693 | 1693 | 653 | ++| getConfigEngineReport | 1693 | 1693 | 1693 | 1693 | 669 | + + + | src/deployments/projects/aave-v3-batched/batches/AaveV3HelpersBatchTwo.sol:AaveV3HelpersBatchTwo contract | | | | | | + |-----------------------------------------------------------------------------------------------------------|-----------------|-----|--------|-----|---------| + | Deployment Cost | Deployment Size | | | | | +-| 7474689 | 32895 | | | | | ++| 7364790 | 32366 | | | | | + | Function Name | min | avg | median | max | # calls | +-| staticATokenReport | 968 | 968 | 968 | 968 | 653 | ++| staticATokenReport | 968 | 968 | 968 | 968 | 669 | + + + | src/deployments/projects/aave-v3-batched/batches/AaveV3L2PoolBatch.sol:AaveV3L2PoolBatch contract | | | | | | + |---------------------------------------------------------------------------------------------------|-----------------|-----|--------|-----|---------| + | Deployment Cost | Deployment Size | | | | | +-| 9598548 | 43985 | | | | | ++| 9468557 | 43394 | | | | | + | Function Name | min | avg | median | max | # calls | + | getPoolReport | 533 | 533 | 533 | 533 | 76 | + +@@ -1097,13 +1105,13 @@ + | Deployment Cost | Deployment Size | | | | | + | 1046333 | 6958 | | | | | + | Function Name | min | avg | median | max | # calls | +-| getMiscReport | 533 | 533 | 533 | 533 | 705 | ++| getMiscReport | 533 | 533 | 533 | 533 | 721 | + + + | src/deployments/projects/aave-v3-batched/batches/AaveV3ParaswapBatch.sol:AaveV3ParaswapBatch contract | | | | | | + |-------------------------------------------------------------------------------------------------------|-----------------|-----|--------|-----|---------| + | Deployment Cost | Deployment Size | | | | | +-| 6402821 | 33403 | | | | | ++| 6050676 | 31792 | | | | | + | Function Name | min | avg | median | max | # calls | + | getParaswapReport | 968 | 968 | 968 | 968 | 34 | + +@@ -1113,15 +1121,15 @@ + | Deployment Cost | Deployment Size | | | | | + | 7501711 | 40894 | | | | | + | Function Name | min | avg | median | max | # calls | +-| getPeripheryReport | 1512 | 3509 | 3512 | 5512 | 705 | ++| getPeripheryReport | 1512 | 3509 | 3512 | 5512 | 721 | + + + | src/deployments/projects/aave-v3-batched/batches/AaveV3PoolBatch.sol:AaveV3PoolBatch contract | | | | | | + |-----------------------------------------------------------------------------------------------|-----------------|-----|--------|-----|---------| + | Deployment Cost | Deployment Size | | | | | +-| 9328324 | 42738 | | | | | ++| 9198474 | 42147 | | | | | + | Function Name | min | avg | median | max | # calls | +-| getPoolReport | 533 | 533 | 533 | 533 | 629 | ++| getPoolReport | 533 | 533 | 533 | 533 | 645 | + + + | src/deployments/projects/aave-v3-batched/batches/AaveV3SetupBatch.sol:AaveV3SetupBatch contract | | | | | | +@@ -1129,17 +1137,17 @@ + | Deployment Cost | Deployment Size | | | | | + | 5190443 | 28372 | | | | | + | Function Name | min | avg | median | max | # calls | +-| getInitialReport | 619 | 619 | 619 | 619 | 705 | +-| setMarketReport | 632452 | 635166 | 632452 | 773432 | 653 | +-| setupAaveV3Market | 2168961 | 2661798 | 2661889 | 2687948 | 681 | ++| getInitialReport | 619 | 619 | 619 | 619 | 721 | ++| setMarketReport | 632452 | 635101 | 632452 | 773432 | 669 | ++| setupAaveV3Market | 2168938 | 2661797 | 2661866 | 2688148 | 697 | + + + | src/deployments/projects/aave-v3-batched/batches/AaveV3TokensBatch.sol:AaveV3TokensBatch contract | | | | | | + |---------------------------------------------------------------------------------------------------|-----------------|-----|--------|-----|---------| + | Deployment Cost | Deployment Size | | | | | +-| 4228121 | 20353 | | | | | ++| 4228255 | 20353 | | | | | + | Function Name | min | avg | median | max | # calls | +-| getTokensReport | 533 | 533 | 533 | 533 | 679 | ++| getTokensReport | 533 | 533 | 533 | 533 | 695 | + + + | tests/extensions/static-a-token/ERC20AaveLMUpgradable.t.sol:MockERC20AaveLMUpgradeable contract | | | | | | +@@ -1147,20 +1155,20 @@ + | Deployment Cost | Deployment Size | | | | | + | 1871016 | 8613 | | | | | + | Function Name | min | avg | median | max | # calls | +-| claimRewards | 58219 | 96127 | 58645 | 173391 | 55 | +-| claimRewardsOnBehalf | 34383 | 88909 | 59174 | 177643 | 165 | +-| claimRewardsToSelf | 57729 | 108168 | 58155 | 172901 | 55 | +-| collectAndUpdateRewards | 48341 | 85724 | 57313 | 130455 | 56 | +-| getClaimableRewards | 6163 | 6511 | 6580 | 26280 | 726 | ++| claimRewards | 58219 | 106593 | 58645 | 173391 | 55 | ++| claimRewardsOnBehalf | 34383 | 77121 | 59165 | 177643 | 165 | ++| claimRewardsToSelf | 57729 | 91435 | 58146 | 172901 | 55 | ++| collectAndUpdateRewards | 48341 | 86973 | 57313 | 130455 | 56 | ++| getClaimableRewards | 6163 | 6508 | 6580 | 26280 | 718 | + | getReferenceAsset | 2495 | 2495 | 2495 | 2495 | 1 | +-| getTotalClaimableRewards | 10950 | 11550 | 11367 | 24654 | 56 | +-| getUnclaimedRewards | 818 | 818 | 818 | 818 | 226 | ++| getTotalClaimableRewards | 10950 | 11543 | 11367 | 24654 | 56 | ++| getUnclaimedRewards | 818 | 818 | 818 | 818 | 218 | + | isRegisteredRewardToken | 575 | 1241 | 575 | 2575 | 3 | +-| mint | 53655 | 96993 | 97646 | 100854 | 526 | ++| mint | 53655 | 97053 | 97646 | 100854 | 524 | + | mockInit | 79952 | 79952 | 79952 | 79952 | 16 | + | refreshRewardTokens | 116549 | 116557 | 116557 | 116975 | 498 | + | rewardTokens | 1012 | 1012 | 1012 | 1012 | 1 | +-| transfer | 60144 | 76481 | 73061 | 103101 | 110 | ++| transfer | 60126 | 77064 | 73023 | 103110 | 110 | + + + | tests/extensions/static-a-token/ERC20AaveLMUpgradable.t.sol:MockScaledTestnetERC20 contract | | | | | | +@@ -1169,38 +1177,38 @@ + | 1058431 | 5780 | | | | | + | Function Name | min | avg | median | max | # calls | + | decimals | 2333 | 2333 | 2333 | 2333 | 498 | +-| getScaledUserBalanceAndSupply | 735 | 2754 | 2735 | 4735 | 207 | +-| mint | 51332 | 67662 | 68648 | 68648 | 526 | +-| scaledTotalSupply | 394 | 1831 | 2394 | 2394 | 2576 | +-| transfer | 29803 | 45994 | 46975 | 46975 | 526 | ++| getScaledUserBalanceAndSupply | 735 | 2756 | 2735 | 4735 | 187 | ++| mint | 51332 | 67722 | 68648 | 68648 | 524 | ++| scaledTotalSupply | 394 | 1835 | 2394 | 2394 | 2566 | ++| transfer | 29803 | 46055 | 46975 | 46975 | 524 | + + + | tests/extensions/static-a-token/ERC4626StataTokenUpgradeable.t.sol:MockERC4626StataTokenUpgradeable contract | | | | | | + |--------------------------------------------------------------------------------------------------------------|-----------------|--------|--------|--------|---------| + | Deployment Cost | Deployment Size | | | | | +-| 2145705 | 10019 | | | | | ++| 2145772 | 10019 | | | | | + | Function Name | min | avg | median | max | # calls | +-| approve | 26451 | 45885 | 46405 | 46495 | 110 | ++| approve | 26451 | 45698 | 46393 | 46495 | 110 | + | balanceOf | 607 | 607 | 607 | 607 | 551 | +-| convertToAssets | 2937 | 2937 | 2937 | 2937 | 55 | +-| convertToShares | 15938 | 15938 | 15938 | 15938 | 55 | ++| convertToAssets | 2959 | 2959 | 2959 | 2959 | 55 | ++| convertToShares | 15960 | 15960 | 15960 | 15960 | 55 | + | decimals | 540 | 540 | 540 | 540 | 55 | +-| depositATokens | 51658 | 192672 | 206714 | 206822 | 606 | +-| depositWithPermit | 68043 | 234965 | 243428 | 332863 | 275 | ++| depositATokens | 51680 | 192734 | 206780 | 206888 | 606 | ++| depositWithPermit | 68065 | 234851 | 243518 | 332532 | 275 | + | latestAnswer | 19765 | 19765 | 19765 | 19765 | 56 | +-| maxDeposit | 28852 | 41793 | 42490 | 42490 | 58 | +-| maxMint | 9466 | 9466 | 9466 | 9466 | 1 | +-| maxRedeem | 2593 | 5823 | 7434 | 7444 | 165 | +-| mint | 74355 | 193537 | 193542 | 312717 | 110 | ++| maxDeposit | 23063 | 36025 | 36723 | 36723 | 58 | ++| maxMint | 7677 | 7677 | 7677 | 7677 | 1 | ++| maxRedeem | 2571 | 5816 | 7434 | 7444 | 165 | ++| mint | 66100 | 185119 | 185098 | 304097 | 110 | + | mockInit | 134255 | 134255 | 134255 | 134255 | 28 | +-| previewDeposit | 2981 | 11647 | 15981 | 15981 | 165 | +-| previewMint | 2977 | 2977 | 2977 | 2977 | 55 | +-| previewRedeem | 2913 | 2913 | 2913 | 2913 | 110 | +-| previewWithdraw | 2959 | 2959 | 2959 | 2959 | 55 | +-| redeem | 174631 | 174853 | 174883 | 174979 | 55 | +-| redeemATokens | 40731 | 121302 | 161131 | 162073 | 165 | +-| totalAssets | 2930 | 3193 | 2930 | 17930 | 57 | +-| withdraw | 51143 | 114477 | 114439 | 177723 | 110 | ++| previewDeposit | 3003 | 11669 | 16003 | 16003 | 165 | ++| previewMint | 2999 | 2999 | 2999 | 2999 | 55 | ++| previewRedeem | 2935 | 2935 | 2935 | 2935 | 110 | ++| previewWithdraw | 2981 | 2981 | 2981 | 2981 | 55 | ++| redeem | 174347 | 174562 | 174647 | 174683 | 55 | ++| redeemATokens | 40753 | 121354 | 161233 | 162139 | 165 | ++| totalAssets | 2952 | 3215 | 2952 | 17952 | 57 | ++| withdraw | 51165 | 114345 | 114313 | 177449 | 110 | + + + | tests/extensions/v3-config-engine/mocks/AaveV3MockAssetEModeUpdate.sol:AaveV3MockAssetEModeUpdate contract | | | | | | +@@ -1208,7 +1216,7 @@ + | Deployment Cost | Deployment Size | | | | | + | 795244 | 3745 | | | | | + | Function Name | min | avg | median | max | # calls | +-| execute | 217757 | 217757 | 217757 | 217757 | 1 | ++| execute | 206256 | 206256 | 206256 | 206256 | 1 | + + + | tests/extensions/v3-config-engine/mocks/AaveV3MockBorrowUpdate.sol:AaveV3MockBorrowUpdate contract | | | | | | +@@ -1216,7 +1224,7 @@ + | Deployment Cost | Deployment Size | | | | | + | 768952 | 3555 | | | | | + | Function Name | min | avg | median | max | # calls | +-| execute | 159137 | 159137 | 159137 | 159137 | 1 | ++| execute | 158874 | 158874 | 158874 | 158874 | 1 | + + + | tests/extensions/v3-config-engine/mocks/AaveV3MockBorrowUpdateNoChange.sol:AaveV3MockBorrowUpdateNoChange contract | | | | | | +@@ -1224,7 +1232,7 @@ + | Deployment Cost | Deployment Size | | | | | + | 775440 | 3585 | | | | | + | Function Name | min | avg | median | max | # calls | +-| execute | 47048 | 47048 | 47048 | 47048 | 1 | ++| execute | 47026 | 47026 | 47026 | 47026 | 1 | + + + | tests/extensions/v3-config-engine/mocks/AaveV3MockCapUpdate.sol:AaveV3MockCapUpdate contract | | | | | | +@@ -1272,7 +1280,7 @@ + | Deployment Cost | Deployment Size | | | | | + | 737875 | 3329 | | | | | + | Function Name | min | avg | median | max | # calls | +-| execute | 128344 | 128344 | 128344 | 128344 | 2 | ++| execute | 128893 | 128893 | 128893 | 128893 | 2 | + + + | tests/extensions/v3-config-engine/mocks/AaveV3MockEModeCategoryUpdate.sol:AaveV3MockEModeCategoryUpdateEdgeBonus contract | | | | | | +@@ -1280,7 +1288,7 @@ + | Deployment Cost | Deployment Size | | | | | + | 738487 | 3332 | | | | | + | Function Name | min | avg | median | max | # calls | +-| execute | 55082 | 55082 | 55082 | 55082 | 1 | ++| execute | 55127 | 55127 | 55127 | 55127 | 1 | + + + | tests/extensions/v3-config-engine/mocks/AaveV3MockEModeCategoryUpdateNoChange.sol:AaveV3MockEModeCategoryUpdateNoChange contract | | | | | | +@@ -1296,7 +1304,7 @@ + | Deployment Cost | Deployment Size | | | | | + | 833716 | 3923 | | | | | + | Function Name | min | avg | median | max | # calls | +-| execute | 1795274 | 1795274 | 1795274 | 1795274 | 1 | ++| execute | 1782917 | 1782917 | 1782917 | 1782917 | 1 | + | newListings | 2697 | 2697 | 2697 | 2697 | 4 | + + +@@ -1305,7 +1313,7 @@ + | Deployment Cost | Deployment Size | | | | | + | 897931 | 4363 | | | | | + | Function Name | min | avg | median | max | # calls | +-| execute | 1795295 | 1795295 | 1795295 | 1795295 | 1 | ++| execute | 1782938 | 1782938 | 1782938 | 1782938 | 1 | + | newListingsCustom | 3170 | 3170 | 3170 | 3170 | 4 | + + +@@ -1322,31 +1330,31 @@ + | Deployment Cost | Deployment Size | | | | | + | 760739 | 3517 | | | | | + | Function Name | min | avg | median | max | # calls | +-| execute | 151474 | 151474 | 151474 | 151474 | 1 | ++| execute | 145422 | 145422 | 145422 | 145422 | 1 | + | rateStrategiesUpdates | 1175 | 1175 | 1175 | 1175 | 4 | + + + | tests/harness/VariableDebtToken.sol:VariableDebtTokenHarness contract | | | | | | + |-----------------------------------------------------------------------|-----------------|--------|--------|--------|---------| + | Deployment Cost | Deployment Size | | | | | +-| 1699482 | 8210 | | | | | ++| 1699549 | 8210 | | | | | + | Function Name | min | avg | median | max | # calls | + | DEBT_TOKEN_REVISION | 305 | 305 | 305 | 305 | 717 | + | POOL | 282 | 282 | 282 | 282 | 717 | + | UNDERLYING_ASSET_ADDRESS | 375 | 1201 | 375 | 2375 | 937 | + | allowance | 902 | 902 | 902 | 902 | 1 | + | approve | 22100 | 22100 | 22100 | 22100 | 1 | +-| approveDelegation | 48605 | 48632 | 48629 | 48677 | 55 | +-| burn | 52003 | 52032 | 52027 | 52075 | 110 | ++| approveDelegation | 48605 | 48634 | 48629 | 48677 | 55 | ++| burn | 52003 | 52030 | 52027 | 52075 | 110 | + | decimals | 334 | 334 | 334 | 334 | 717 | + | decreaseAllowance | 22121 | 22121 | 22121 | 22121 | 1 | + | getIncentivesController | 430 | 430 | 430 | 430 | 717 | + | increaseAllowance | 22121 | 22121 | 22121 | 22121 | 1 | +-| initialize | 29537 | 150404 | 179132 | 247980 | 440 | +-| mint | 86731 | 88007 | 86767 | 91790 | 220 | ++| initialize | 29623 | 151326 | 179120 | 247968 | 440 | ++| mint | 86731 | 88005 | 86767 | 91790 | 220 | + | name | 1004 | 1325 | 1259 | 1789 | 717 | + | scaledBalanceOf | 687 | 687 | 687 | 687 | 220 | +-| symbol | 1025 | 1360 | 1280 | 1810 | 717 | ++| symbol | 1025 | 1362 | 1280 | 1810 | 717 | + | transfer | 22143 | 22143 | 22143 | 22143 | 1 | + | transferFrom | 22369 | 22369 | 22369 | 22369 | 1 | + +@@ -1356,9 +1364,9 @@ + | Deployment Cost | Deployment Size | | | | | + | 3356095 | 13616 | | | | | + | Function Name | min | avg | median | max | # calls | +-| USDX_ADDRESS | 293 | 293 | 293 | 293 | 645 | +-| WBTC_ADDRESS | 249 | 249 | 249 | 249 | 645 | +-| execute | 5115928 | 5116789 | 5116858 | 5116858 | 648 | ++| USDX_ADDRESS | 293 | 293 | 293 | 293 | 661 | ++| WBTC_ADDRESS | 249 | 249 | 249 | 249 | 661 | ++| execute | 5081210 | 5083600 | 5083787 | 5083787 | 664 | + + + | tests/mocks/AugustusRegistryMock.sol:AugustusRegistryMock contract | | | | | | +@@ -1395,4 +1403,4 @@ + + + +-Ran 60 test suites in 125.59s (1013.00s CPU time): 741 tests passed, 0 failed, 0 skipped (741 total tests) ++Ran 62 test suites in 118.40s (747.13s CPU time): 757 tests passed, 0 failed, 0 skipped (757 total tests) +``` diff --git a/src/contracts/interfaces/IPool.sol b/src/contracts/interfaces/IPool.sol index b45b7532..301b81c3 100644 --- a/src/contracts/interfaces/IPool.sol +++ b/src/contracts/interfaces/IPool.sol @@ -807,7 +807,7 @@ interface IPool { * @notice It Covers the deficit of a specified reserve by burning the equivalent aToken `amount`. * @dev The deficit of a reserve can occur due to situations where borrowed assets are not repaid, leading to bad debt. * @param asset The address of the underlying asset to cover the dificit. - * @param amount The amount to be covered. + * @param amount The amount to be covered, in aToken or underlying on non-virtual accounted assets */ function eliminateReserveDeficit(address asset, uint256 amount) external; diff --git a/src/contracts/protocol/libraries/helpers/Errors.sol b/src/contracts/protocol/libraries/helpers/Errors.sol index 31c9df4d..f1ee040a 100644 --- a/src/contracts/protocol/libraries/helpers/Errors.sol +++ b/src/contracts/protocol/libraries/helpers/Errors.sol @@ -104,4 +104,5 @@ library Errors { string public constant CALLER_NOT_UMBRELLA = '102'; // The caller of the function is not the umbrella contract string public constant RESERVE_NOT_IN_DEFICIT = '103'; // The reserve is not in deficit string public constant MUST_NOT_LEAVE_DUST = '104'; // Below a certain threshold liquidators need to take the full position + string public constant USER_CANNOT_HAVE_DEBT = '105'; // Thrown when a user tries to interact with a method that requires a position without debt } diff --git a/src/contracts/protocol/libraries/logic/BorrowLogic.sol b/src/contracts/protocol/libraries/logic/BorrowLogic.sol index c4ed26ed..611a76d5 100644 --- a/src/contracts/protocol/libraries/logic/BorrowLogic.sol +++ b/src/contracts/protocol/libraries/logic/BorrowLogic.sol @@ -213,8 +213,9 @@ library BorrowLogic { paybackAmount, reserveCache.nextLiquidityIndex ); + bool isCollateral = userConfig.isUsingAsCollateral(reserve.id); // in case of aToken repayment the msg.sender must always repay on behalf of itself - if (IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender) == 0) { + if (isCollateral && IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender) == 0) { userConfig.setUsingAsCollateral(reserve.id, false); emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); } diff --git a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol index ab76c877..fbe22cf3 100644 --- a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -310,6 +310,8 @@ library LiquidationLogic { } // burn bad debt if necessary + // Each additional debt asset already adds around ~75k gas to the liquidation. + // To keep the liquidation gas under control, 0 usd collateral positions are not touched, as there is no immediate benefit in burning or transfering to treasury. if (hasNoCollateralLeft && userConfig.isBorrowingAny()) { _burnBadDebt(reservesData, reservesList, userConfig, params.reservesCount, params.user); } @@ -585,6 +587,7 @@ library LiquidationLogic { DataTypes.ReserveData storage currentReserve = reservesData[reserveAddress]; DataTypes.ReserveCache memory reserveCache = currentReserve.cache(); + if (!reserveCache.reserveConfiguration.getActive()) continue; currentReserve.updateState(reserveCache); diff --git a/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/src/contracts/protocol/libraries/logic/ReserveLogic.sol index 4bad160e..fd3898b4 100644 --- a/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ b/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -320,20 +320,17 @@ library ReserveLogic { /** * @notice Reduces a portion or all of the deficit of a specified reserve by burning the equivalent aToken `amount`. + * The caller of this method MUST always be the Umbrella contract and the Umbrella contract is assumed to never have debt. * @dev Emits the `DeficitCovered() event`. * @dev If the coverage admin covers its entire balance, `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 eliminateDeficit function */ - function eliminateDeficit( + function executeEliminateDeficit( 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 + DataTypes.ExecuteEliminateDeficitParams memory params ) external { require(params.amount != 0, Errors.INVALID_AMOUNT); @@ -341,13 +338,12 @@ library ReserveLogic { uint256 currentDeficit = reserve.deficit; require(currentDeficit != 0, Errors.RESERVE_NOT_IN_DEFICIT); + require(!userConfig.isBorrowingAny(), Errors.USER_CANNOT_HAVE_DEBT); DataTypes.ReserveCache memory reserveCache = reserve.cache(); reserve.updateState(reserveCache); - - uint256 userBalance = IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender).rayMul( - reserveCache.nextLiquidityIndex - ); + bool isActive = reserveCache.reserveConfiguration.getActive(); + require(isActive, Errors.RESERVE_INACTIVE); uint256 balanceWriteOff = params.amount; @@ -355,34 +351,33 @@ library ReserveLogic { balanceWriteOff = currentDeficit; } - bool isCollateral = userConfig.isUsingAsCollateral(reserve.id); - - if (isCollateral && balanceWriteOff == userBalance) { - userConfig.setUsingAsCollateral(reserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); - } - - IAToken(reserveCache.aTokenAddress).burn( - msg.sender, - reserveCache.aTokenAddress, - balanceWriteOff, - reserveCache.nextLiquidityIndex - ); - - // using the cached "outdated" isCollateral flag, - // as for the validation the state before the burning is important - if (isCollateral && userConfig.isBorrowingAny()) { - ValidationLogic.validateHFAndLtv( - reservesData, - reservesList, - eModeCategories, - userConfig, - params.asset, + if (reserveCache.reserveConfiguration.getIsVirtualAccActive()) { + IAToken(reserveCache.aTokenAddress).burn( + msg.sender, + reserveCache.aTokenAddress, + balanceWriteOff, + reserveCache.nextLiquidityIndex + ); + // update ir due to updateState + reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, 0, 0); + } else { + // This is a special case to allow mintable assets (ex. GHO), which by definition cannot be supplied + // and thus do not use virtual underlying balances. + // In that case, the procedure is 1) sending the underlying asset to the aToken and + // 2) trigger the handleRepayment() for the aToken to dispose of those assets + IERC20(params.asset).safeTransferFrom( + msg.sender, + reserveCache.aTokenAddress, + balanceWriteOff + ); + IAToken(reserveCache.aTokenAddress).handleRepayment( msg.sender, - params.reservesCount, - params.oracle, - params.userEModeCategory + // In the context of GHO it's only relevant that the address has no debt. + // Passing the pool is fitting as it's handeling the repayment on behalf of the protocol. + address(this), + balanceWriteOff ); + // updating the IR is not needed in this case, as the IR is constant for assets without virtual accounting. } reserve.deficit -= balanceWriteOff.toUint128(); diff --git a/src/contracts/protocol/libraries/types/DataTypes.sol b/src/contracts/protocol/libraries/types/DataTypes.sol index 9f72b2ab..1e18c403 100644 --- a/src/contracts/protocol/libraries/types/DataTypes.sol +++ b/src/contracts/protocol/libraries/types/DataTypes.sol @@ -218,6 +218,11 @@ library DataTypes { uint8 userEModeCategory; } + struct ExecuteEliminateDeficitParams { + address asset; + uint256 amount; + } + struct ExecuteSetUserEModeParams { uint256 reservesCount; address oracle; diff --git a/src/contracts/protocol/pool/Pool.sol b/src/contracts/protocol/pool/Pool.sol index 0b21af74..3035af82 100644 --- a/src/contracts/protocol/pool/Pool.sol +++ b/src/contracts/protocol/pool/Pool.sol @@ -837,19 +837,10 @@ abstract contract Pool is VersionedInitializable, PoolStorage, IPool { /// @inheritdoc IPool function eliminateReserveDeficit(address asset, uint256 amount) external override onlyUmbrella { - ReserveLogic.eliminateDeficit( + ReserveLogic.executeEliminateDeficit( _reserves, - _reservesList, - _eModeCategories, _usersConfig[msg.sender], - DataTypes.ExecuteWithdrawParams({ - asset: asset, - amount: amount, - to: address(0), // not used - reservesCount: _reservesCount, - oracle: ADDRESSES_PROVIDER.getPriceOracle(), - userEModeCategory: _usersEModeCategory[msg.sender] - }) + DataTypes.ExecuteEliminateDeficitParams({asset: asset, amount: amount}) ); } diff --git a/tests/mocks/AaveV3TestListing.sol b/tests/mocks/AaveV3TestListing.sol index 65dc9ccb..58249960 100644 --- a/tests/mocks/AaveV3TestListing.sol +++ b/tests/mocks/AaveV3TestListing.sol @@ -6,6 +6,7 @@ import {TestnetERC20} from '../../src/contracts/mocks/testnet-helpers/TestnetERC import {MockAggregator} from '../../src/contracts/mocks/oracle/CLAggregators/MockAggregator.sol'; import {ACLManager} from '../../src/contracts/protocol/configuration/ACLManager.sol'; import {MarketReport} from '../../src/deployments/interfaces/IMarketReportTypes.sol'; +import {IPoolConfigurator, ConfiguratorInputTypes} from '../../src/contracts/interfaces/IPoolConfigurator.sol'; /** * @dev Smart contract for token listing, for testing purposes @@ -25,10 +26,14 @@ contract AaveV3TestListing is AaveV3Payload { address public immutable WETH_ADDRESS; address public immutable WETH_MOCK_PRICE_FEED; + address public immutable GHO_ADDRESS; + address public immutable GHO_MOCK_PRICE_FEED; + address immutable ATOKEN_IMPLEMENTATION; address immutable VARIABLE_DEBT_TOKEN_IMPLEMENTATION; ACLManager immutable ACL_MANAGER; + IPoolConfigurator immutable CONFIGURATOR; constructor( IEngine customEngine, @@ -45,10 +50,61 @@ contract AaveV3TestListing is AaveV3Payload { WETH_ADDRESS = weth9; WETH_MOCK_PRICE_FEED = address(new MockAggregator(1800e8)); + GHO_ADDRESS = address(new TestnetERC20('GHO', 'GHO', 18, erc20Owner)); + GHO_MOCK_PRICE_FEED = address(new MockAggregator(1e8)); + ATOKEN_IMPLEMENTATION = report.aToken; VARIABLE_DEBT_TOKEN_IMPLEMENTATION = report.variableDebtToken; ACL_MANAGER = ACLManager(report.aclManager); + CONFIGURATOR = IPoolConfigurator(report.poolConfiguratorProxy); + } + + // list a token with virtual accounting deactivated (ex. GHO) + function _preExecute() internal override { + IEngine.InterestRateInputData memory rateParams = IEngine.InterestRateInputData({ + optimalUsageRatio: 45_00, + baseVariableBorrowRate: 0, + variableRateSlope1: 4_00, + variableRateSlope2: 60_00 + }); + ConfiguratorInputTypes.InitReserveInput[] + memory reserves = new ConfiguratorInputTypes.InitReserveInput[](1); + reserves[0] = ConfiguratorInputTypes.InitReserveInput({ + aTokenImpl: ATOKEN_IMPLEMENTATION, + variableDebtTokenImpl: VARIABLE_DEBT_TOKEN_IMPLEMENTATION, + useVirtualBalance: false, + interestRateStrategyAddress: CONFIG_ENGINE.DEFAULT_INTEREST_RATE_STRATEGY(), + underlyingAsset: GHO_ADDRESS, + treasury: CONFIG_ENGINE.COLLECTOR(), + incentivesController: CONFIG_ENGINE.REWARDS_CONTROLLER(), + aTokenName: 'aGHO', + aTokenSymbol: 'aGHO', + variableDebtTokenName: 'vGHO', + variableDebtTokenSymbol: 'vGHO', + params: bytes(''), + interestRateData: abi.encode(rateParams) + }); + CONFIGURATOR.initReserves(reserves); + } + + function priceFeedsUpdates() public view override returns (IEngine.PriceFeedUpdate[] memory) { + IEngine.PriceFeedUpdate[] memory feeds = new IEngine.PriceFeedUpdate[](1); + feeds[0] = IEngine.PriceFeedUpdate({asset: GHO_ADDRESS, priceFeed: GHO_MOCK_PRICE_FEED}); + return feeds; + } + + function borrowsUpdates() public view override returns (IEngine.BorrowUpdate[] memory) { + IEngine.BorrowUpdate[] memory borrows = new IEngine.BorrowUpdate[](1); + borrows[0] = IEngine.BorrowUpdate({ + asset: GHO_ADDRESS, + enabledToBorrow: EngineFlags.ENABLED, + borrowableInIsolation: EngineFlags.DISABLED, + withSiloedBorrowing: EngineFlags.DISABLED, + flashloanable: EngineFlags.DISABLED, + reserveFactor: 10_00 + }); + return borrows; } function newListingsCustom() diff --git a/tests/protocol/pool/Pool.Deficit.sol b/tests/protocol/pool/Pool.Deficit.sol index 0c9e640e..942220b3 100644 --- a/tests/protocol/pool/Pool.Deficit.sol +++ b/tests/protocol/pool/Pool.Deficit.sol @@ -5,11 +5,13 @@ import 'forge-std/Test.sol'; import 'forge-std/StdStorage.sol'; import {IERC20} from '../../../src/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; +import {IERC20Detailed} from '../../../src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol'; import {IPool, DataTypes} from '../../../src/contracts/interfaces/IPool.sol'; import {Errors} from '../../../src/contracts/protocol/libraries/helpers/Errors.sol'; import {IAaveOracle} from '../../../src/contracts/interfaces/IAaveOracle.sol'; import {TestnetProcedures} from '../../utils/TestnetProcedures.sol'; import {IAccessControl} from '../../../src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol'; +import {IAToken} from '../../../src/contracts/interfaces/IAToken.sol'; contract PoolDeficitTests is TestnetProcedures { using stdStorage for StdStorage; @@ -22,7 +24,10 @@ contract PoolDeficitTests is TestnetProcedures { function test_eliminateReserveDeficit(address coverageAdmin, uint120 supplyAmount) public { _filterAddresses(coverageAdmin); - (address reserveToken, uint256 currentDeficit) = _createReserveDeficit(supplyAmount); + (address reserveToken, uint256 currentDeficit) = _createReserveDeficit( + supplyAmount, + tokenList.usdx + ); vm.prank(poolAdmin); contracts.poolAddressesProvider.setAddress(bytes32('UMBRELLA'), coverageAdmin); @@ -39,13 +44,75 @@ contract PoolDeficitTests is TestnetProcedures { contracts.poolProxy.eliminateReserveDeficit(reserveToken, currentDeficit); } + function test_eliminateReserveDeficit_surplus( + address coverageAdmin, + uint120 supplyAmount + ) public { + _filterAddresses(coverageAdmin); + (address reserveToken, uint256 currentDeficit) = _createReserveDeficit( + supplyAmount, + tokenList.usdx + ); + + vm.prank(poolAdmin); + contracts.poolAddressesProvider.setAddress(bytes32('UMBRELLA'), coverageAdmin); + + deal(reserveToken, coverageAdmin, currentDeficit); + + vm.startPrank(coverageAdmin); + IERC20(reserveToken).approve(report.poolProxy, UINT256_MAX); + contracts.poolProxy.supply(reserveToken, currentDeficit, coverageAdmin, 0); + + // eliminate deficit + vm.expectEmit(address(contracts.poolProxy)); + emit DeficitCovered(reserveToken, coverageAdmin, currentDeficit); + contracts.poolProxy.eliminateReserveDeficit(reserveToken, currentDeficit + 1000); + } + + function test_eliminateReserveDeficit_virtualAccDisabled( + address coverageAdmin, + uint80 supplyAmount + ) public { + supplyAmount = uint80(bound(supplyAmount, type(uint8).max, type(uint80).max)); + _filterAddresses(coverageAdmin); + (address reserveToken, uint256 currentDeficit) = _createReserveDeficit( + supplyAmount, + tokenList.gho + ); + + vm.prank(poolAdmin); + contracts.poolAddressesProvider.setAddress(bytes32('UMBRELLA'), coverageAdmin); + + deal(reserveToken, coverageAdmin, currentDeficit); + + vm.startPrank(coverageAdmin); + IERC20(reserveToken).approve(report.poolProxy, UINT256_MAX); + + // eliminate deficit + vm.expectCall( + contracts.poolProxy.getReserveAToken(tokenList.gho), + abi.encodeWithSelector( + IAToken.handleRepayment.selector, + address(coverageAdmin), + address(contracts.poolProxy), + currentDeficit + ) + ); + vm.expectEmit(address(contracts.poolProxy)); + emit DeficitCovered(reserveToken, coverageAdmin, currentDeficit); + contracts.poolProxy.eliminateReserveDeficit(reserveToken, currentDeficit); + } + function test_eliminateReserveDeficit_parcial( address coverageAdmin, uint120 supplyAmount, uint120 amountToCover ) public { _filterAddresses(coverageAdmin); - (address reserveToken, uint256 currentDeficit) = _createReserveDeficit(supplyAmount); + (address reserveToken, uint256 currentDeficit) = _createReserveDeficit( + supplyAmount, + tokenList.usdx + ); amountToCover = uint120(bound(amountToCover, 1, currentDeficit)); vm.prank(poolAdmin); @@ -63,13 +130,16 @@ contract PoolDeficitTests is TestnetProcedures { contracts.poolProxy.eliminateReserveDeficit(reserveToken, amountToCover); } - function test_reverts_eliminateReserveDeficit_invalid_hf( + function test_reverts_eliminateReserveDeficit_has_borrows( address coverageAdmin, uint120 supplyAmount, uint120 cAdminBorrowAmount ) public { _filterAddresses(coverageAdmin); - (address reserveToken, uint256 currentDeficit) = _createReserveDeficit(supplyAmount); + (address reserveToken, uint256 currentDeficit) = _createReserveDeficit( + supplyAmount, + tokenList.usdx + ); cAdminBorrowAmount = uint120(bound(cAdminBorrowAmount, 1, currentDeficit / 2)); vm.prank(poolAdmin); @@ -82,7 +152,7 @@ contract PoolDeficitTests is TestnetProcedures { contracts.poolProxy.supply(reserveToken, currentDeficit, coverageAdmin, 0); contracts.poolProxy.borrow(reserveToken, cAdminBorrowAmount, 2, 0, coverageAdmin); - vm.expectRevert(bytes(Errors.HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD)); + vm.expectRevert(bytes(Errors.USER_CANNOT_HAVE_DEBT)); contracts.poolProxy.eliminateReserveDeficit(reserveToken, currentDeficit); } @@ -91,7 +161,10 @@ contract PoolDeficitTests is TestnetProcedures { uint120 supplyAmount ) public { _filterAddresses(caller); - (address reserveToken, uint256 currentDeficit) = _createReserveDeficit(supplyAmount); + (address reserveToken, uint256 currentDeficit) = _createReserveDeficit( + supplyAmount, + tokenList.usdx + ); vm.expectRevert(bytes(Errors.CALLER_NOT_UMBRELLA)); vm.prank(caller); @@ -104,7 +177,7 @@ contract PoolDeficitTests is TestnetProcedures { ) public { _filterAddresses(coverageAdmin); - (address reserveToken, ) = _createReserveDeficit(supplyAmount); + (address reserveToken, ) = _createReserveDeficit(supplyAmount, tokenList.usdx); vm.prank(poolAdmin); contracts.poolAddressesProvider.setAddress(bytes32('UMBRELLA'), coverageAdmin); @@ -128,22 +201,28 @@ contract PoolDeficitTests is TestnetProcedures { contracts.poolProxy.eliminateReserveDeficit(tokenList.usdx, 1); } - function _createReserveDeficit(uint120 supplyAmount) internal returns (address, uint256) { + function _createReserveDeficit( + uint120 supplyAmount, + address borrowAsset + ) internal returns (address, uint256) { vm.assume(supplyAmount != 0); deal(tokenList.wbtc, alice, supplyAmount); vm.prank(alice); contracts.poolProxy.supply(tokenList.wbtc, supplyAmount, alice, 0); (, , uint256 availableBorrowsBase, , , ) = contracts.poolProxy.getUserAccountData(alice); - uint256 borrowAmount = availableBorrowsBase / 1e2; // base unit -> usdx unit + uint256 borrowAmount = (availableBorrowsBase * 10 ** IERC20Detailed(borrowAsset).decimals()) / + contracts.aaveOracle.getAssetPrice(borrowAsset); // setup available amount to borrow - deal(tokenList.usdx, carol, borrowAmount); + deal(borrowAsset, carol, borrowAmount); vm.prank(carol); - contracts.poolProxy.supply(tokenList.usdx, borrowAmount, carol, 0); + IERC20(borrowAsset).approve(address(contracts.poolProxy), borrowAmount); + vm.prank(carol); + contracts.poolProxy.supply(borrowAsset, borrowAmount, carol, 0); vm.prank(alice); - contracts.poolProxy.borrow(tokenList.usdx, borrowAmount, 2, 0, alice); + contracts.poolProxy.borrow(borrowAsset, borrowAmount, 2, 0, alice); vm.stopPrank(); vm.warp(block.timestamp + 30 days); @@ -155,15 +234,17 @@ contract PoolDeficitTests is TestnetProcedures { _calcPrice(IAaveOracle(report.aaveOracle).getAssetPrice(tokenList.wbtc), 20_00) ); - deal(tokenList.usdx, bob, borrowAmount); + deal(borrowAsset, bob, borrowAmount); + vm.prank(bob); + IERC20(borrowAsset).approve(address(contracts.poolProxy), borrowAmount); vm.prank(bob); - contracts.poolProxy.liquidationCall(tokenList.wbtc, tokenList.usdx, alice, borrowAmount, false); + contracts.poolProxy.liquidationCall(tokenList.wbtc, borrowAsset, alice, borrowAmount, false); - uint256 currentDeficit = contracts.poolProxy.getReserveDeficit(tokenList.usdx); + uint256 currentDeficit = contracts.poolProxy.getReserveDeficit(borrowAsset); assertGt(currentDeficit, 0); - return (tokenList.usdx, currentDeficit); + return (borrowAsset, currentDeficit); } function _filterAddresses(address user) internal view { diff --git a/tests/protocol/pool/Pool.Liquidations.t.sol b/tests/protocol/pool/Pool.Liquidations.t.sol index 117a1416..eddd929d 100644 --- a/tests/protocol/pool/Pool.Liquidations.t.sol +++ b/tests/protocol/pool/Pool.Liquidations.t.sol @@ -53,6 +53,9 @@ contract PoolLiquidationTests is TestnetProcedures { vm.startPrank(carol); contracts.poolProxy.supply(tokenList.usdx, 100_000e6, carol, 0); contracts.poolProxy.supply(tokenList.weth, 100e18, carol, 0); + deal(tokenList.gho, carol, 100_000e18); + IERC20(tokenList.gho).approve(address(contracts.poolProxy), type(uint256).max); + contracts.poolProxy.supply(tokenList.gho, 100_000e18, carol, 0); vm.stopPrank(); sequencerOracleMock = new SequencerOracle(poolAdmin); @@ -787,6 +790,7 @@ contract PoolLiquidationTests is TestnetProcedures { contracts.poolProxy.supply(tokenList.wbtc, amount, alice, 0); contracts.poolProxy.borrow(tokenList.usdx, borrowAmount, 2, 0, alice); vm.warp(block.timestamp + 30 days); + contracts.poolProxy.borrow(tokenList.weth, secondBorrowAmount, 2, 0, alice); contracts.poolProxy.borrow(tokenList.wbtc, secondBorrowAmount, 2, 0, alice); vm.stopPrank(); @@ -894,6 +898,61 @@ contract PoolLiquidationTests is TestnetProcedures { ); } + function test_deficit_increased_after_liquidate_bad_debt_virtualAccounting_disabled() public { + uint256 supplyAmount = 0.5e8; + uint256 borrowAmount = 11000e18; + deal(tokenList.gho, bob, 100_000e18); + vm.prank(bob); + IERC20(tokenList.gho).approve(address(contracts.poolProxy), type(uint256).max); + vm.startPrank(alice); + contracts.poolProxy.supply(tokenList.wbtc, supplyAmount, alice, 0); + contracts.poolProxy.borrow(tokenList.gho, borrowAmount, 2, 0, alice); + vm.stopPrank(); + + vm.warp(block.timestamp + 30 days); + LiquidationInput memory params = _loadLiquidationInput( + alice, + tokenList.wbtc, + tokenList.gho, + UINT256_MAX, + tokenList.wbtc, + 20_00 + ); + + (, , address varDebtToken) = contracts.protocolDataProvider.getReserveTokensAddresses( + params.debtAsset + ); + uint256 userDebtBefore = IERC20(varDebtToken).balanceOf(params.user); + uint256 liquidatorBalanceBefore; + if (params.receiveAToken) { + (address atoken, , ) = contracts.protocolDataProvider.getReserveTokensAddresses( + params.collateralAsset + ); + liquidatorBalanceBefore = IERC20(atoken).balanceOf(bob); + } else { + liquidatorBalanceBefore = IERC20(params.collateralAsset).balanceOf(bob); + } + + vm.expectEmit(address(contracts.poolProxy)); + emit LiquidationLogic.DeficitCreated( + params.user, + tokenList.gho, + userDebtBefore - params.actualDebtToLiquidate + ); + vm.prank(bob); + contracts.poolProxy.liquidationCall( + params.collateralAsset, + params.debtAsset, + params.user, + params.liquidationAmountInput, + params.receiveAToken + ); + assertEq( + contracts.poolProxy.getReserveDeficit(tokenList.gho), + userDebtBefore - params.actualDebtToLiquidate + ); + } + function _loadLiquidationInput( address user, address collateralAsset, diff --git a/tests/protocol/pool/pool-configurator/PoolConfigurator.reserveRiskConfig.t.sol b/tests/protocol/pool/pool-configurator/PoolConfigurator.reserveRiskConfig.t.sol index e5251d78..e367ac90 100644 --- a/tests/protocol/pool/pool-configurator/PoolConfigurator.reserveRiskConfig.t.sol +++ b/tests/protocol/pool/pool-configurator/PoolConfigurator.reserveRiskConfig.t.sol @@ -634,6 +634,8 @@ contract PoolConfiguratorReserveRiskConfigs is TestnetProcedures { assertTrue(pS == address(0)); assertTrue(pV != address(0)); + uint256 lengthBefore = contracts.poolProxy.getReservesList().length; + vm.prank(poolAdmin); contracts.poolConfiguratorProxy.dropReserve(tokenList.usdx); @@ -668,7 +670,7 @@ contract PoolConfiguratorReserveRiskConfigs is TestnetProcedures { assertEq(isFrozen, false); } { - assertEq(contracts.poolProxy.getReservesList().length, 2); + assertEq(contracts.poolProxy.getReservesList().length, lengthBefore - 1); assertEq(contracts.poolProxy.getReserveAddressById(reserveDataUsdx.id), address(0)); } } diff --git a/tests/utils/TestnetProcedures.sol b/tests/utils/TestnetProcedures.sol index 7f12bc76..121e3f70 100644 --- a/tests/utils/TestnetProcedures.sol +++ b/tests/utils/TestnetProcedures.sol @@ -76,6 +76,7 @@ contract TestnetProcedures is Test, DeployUtils, FfiUtils, DefaultMarketInput { address wbtc; address weth; address usdx; + address gho; } struct EModeCategoryInput { @@ -229,6 +230,7 @@ contract TestnetProcedures is Test, DeployUtils, FfiUtils, DefaultMarketInput { assetsList.wbtc = testnetListingPayload.WBTC_ADDRESS(); assetsList.usdx = testnetListingPayload.USDX_ADDRESS(); + assetsList.gho = testnetListingPayload.GHO_ADDRESS(); ACLManager manager = ACLManager(r.aclManager); From 0c6fac8a1421f21bc62eaf26eb79bd05ee183ed8 Mon Sep 17 00:00:00 2001 From: Lukas Date: Tue, 22 Oct 2024 14:43:38 +0200 Subject: [PATCH 18/72] fix: remove incomplete properties --- docs/3.3/Aave-v3.3-features.md | 2 +- docs/3.3/v3.3-properties.md | 21 --------------------- 2 files changed, 1 insertion(+), 22 deletions(-) delete mode 100644 docs/3.3/v3.3-properties.md diff --git a/docs/3.3/Aave-v3.3-features.md b/docs/3.3/Aave-v3.3-features.md index 1f75d7ad..be4d046e 100644 --- a/docs/3.3/Aave-v3.3-features.md +++ b/docs/3.3/Aave-v3.3-features.md @@ -20,7 +20,7 @@ If the total borrower’s debt exceeds the debt repaid in base currency, the var The new `deficit` data is introduced to the `ReserveData` struct by re-utilizing the deprecated stableBorrowRate (`__deprecatedStableBorrowRate`) storage, and can be fetched via the new `getReserveDeficit` function in the Pool contract. The deficit reduction of a reserve is introduced via the `eliminateReserveDeficit` function in the Pool contract, where a permissioned entity (the registered `Umbrella` on the PoolAddressesProvider) can burn aTokens to decrease the deficit of the respective reserve. -This function only allows burning aTokens(and in the case of GHO underlying) up to the currently existing deficit and validates the caller's health factor and LTV before reducing the deficit. +This function only allows burning aTokens(and in the case of GHO underlying) up to the currently existing deficit and validates that the caller has no open borrow positions. **Misc considerations** diff --git a/docs/3.3/v3.3-properties.md b/docs/3.3/v3.3-properties.md deleted file mode 100644 index b41e2618..00000000 --- a/docs/3.3/v3.3-properties.md +++ /dev/null @@ -1,21 +0,0 @@ -## Aave v3.3 features properties - -Formal properties in natural language of the 3.3 features. - -
-
- -## Properties - -
- -### 1. Bad Debt Management - -- A bad debt liquidation event should only occur when the liquidation results in the user's total collateral across all reserves being zero in the base currencyw, while the total debt across all reserves remains non-zero in the base currency. -- A user should only be considered in bad debt if their total collateral across all reserves is zero in the base currency while their total debt across all reserves remains non-zero in the base currency or if they have active borrowing. -- After a bad debt liquidation, the user's borrows should be zero. -- The deficit of all reserves should initially be zero. -- In the event of a bad debt liquidation, the reserve deficit incremented should be the difference between the user's total debt and the user's actual debt to liquidate for the respective reserve. -- The deficit of all reserves should only be covered by an authorized UMBRELLA entity which is registered on the respective `PoolAddressesProvider`. -- The deficit can only be covered to the point of zero deficit. Covering deficit in practice means burning of aTokens. -- The deficit of a reserve should only be reduced after validating the health factor and the ltv of the coverage admin. From 0e195bb435a7705b51a2e69e541a9df8a1f73899 Mon Sep 17 00:00:00 2001 From: Lukas Date: Wed, 23 Oct 2024 11:59:01 +0200 Subject: [PATCH 19/72] finding: remove unused error --- src/contracts/protocol/libraries/helpers/Errors.sol | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/contracts/protocol/libraries/helpers/Errors.sol b/src/contracts/protocol/libraries/helpers/Errors.sol index f1ee040a..ab2ce741 100644 --- a/src/contracts/protocol/libraries/helpers/Errors.sol +++ b/src/contracts/protocol/libraries/helpers/Errors.sol @@ -100,9 +100,8 @@ library Errors { 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 - string public constant USER_NOT_IN_BAD_DEBT = '101'; // The user is not in bad debt - string public constant CALLER_NOT_UMBRELLA = '102'; // The caller of the function is not the umbrella contract - string public constant RESERVE_NOT_IN_DEFICIT = '103'; // The reserve is not in deficit - string public constant MUST_NOT_LEAVE_DUST = '104'; // Below a certain threshold liquidators need to take the full position - string public constant USER_CANNOT_HAVE_DEBT = '105'; // Thrown when a user tries to interact with a method that requires a position without debt + string public constant CALLER_NOT_UMBRELLA = '101'; // The caller of the function is not the umbrella contract + string public constant RESERVE_NOT_IN_DEFICIT = '102'; // The reserve is not in deficit + string public constant MUST_NOT_LEAVE_DUST = '103'; // Below a certain threshold liquidators need to take the full position + string public constant USER_CANNOT_HAVE_DEBT = '104'; // Thrown when a user tries to interact with a method that requires a position without debt } From 95fc118d00e56eca45c917bc33c93733d539b7fa Mon Sep 17 00:00:00 2001 From: Lukas Date: Wed, 23 Oct 2024 12:06:59 +0200 Subject: [PATCH 20/72] finding: Validationlogic was imported but never used --- src/contracts/protocol/libraries/logic/ReserveLogic.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/src/contracts/protocol/libraries/logic/ReserveLogic.sol index fd3898b4..7da0e59b 100644 --- a/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ b/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -14,7 +14,6 @@ import {DataTypes} from '../types/DataTypes.sol'; import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; import {IAToken} from '../../../interfaces/IAToken.sol'; import {UserConfiguration} from '../configuration/UserConfiguration.sol'; -import {ValidationLogic} from './ValidationLogic.sol'; /** * @title ReserveLogic library From a473403da1beab95963469e09b713305d8d8012f Mon Sep 17 00:00:00 2001 From: Lukas Date: Wed, 23 Oct 2024 12:34:08 +0200 Subject: [PATCH 21/72] finding: unnecessary calculations in LiquiationLogic --- .../libraries/logic/LiquidationLogic.sol | 19 +--- tests/helpers/LiquidationHelper.sol | 4 +- .../pool/Pool.Liquidations.CloseFactor.t.sol | 4 +- tests/protocol/pool/Pool.Liquidations.t.sol | 95 +++++-------------- 4 files changed, 33 insertions(+), 89 deletions(-) diff --git a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol index fbe22cf3..fdf8757c 100644 --- a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -89,7 +89,6 @@ library LiquidationLogic { uint256 totalDebtInBaseCurrency; uint256 collateralToLiquidateInBaseCurrency; uint256 userReserveDebtInBaseCurrency; - uint256 debtToRepayInBaseCurrency; uint256 collateralAssetPrice; uint256 debtAssetPrice; uint256 collateralAssetUnit; @@ -213,8 +212,7 @@ library LiquidationLogic { vars.actualCollateralToLiquidate, vars.actualDebtToLiquidate, vars.liquidationProtocolFeeAmount, - vars.collateralToLiquidateInBaseCurrency, - vars.debtToRepayInBaseCurrency + vars.collateralToLiquidateInBaseCurrency ) = _calculateAvailableCollateralToLiquidate( collateralReserve.configuration, vars.collateralAssetPrice, @@ -477,8 +475,6 @@ library LiquidationLogic { uint256 liquidationProtocolFeePercentage; uint256 liquidationProtocolFee; uint256 collateralToLiquidateInBaseCurrency; - uint256 debtToRepayInBaseCurrency; - uint256 debtAssetPrice; uint256 collateralAssetPrice; } @@ -499,7 +495,6 @@ library LiquidationLogic { * @return The amount to repay with the liquidation * @return The fee taken from the liquidation bonus amount to be paid to the protocol * @return The collateral amount to liquidate in the base currency used by the price feed - * @return The amount to repay with the liquidation in the base currency used by the price feed */ function _calculateAvailableCollateralToLiquidate( DataTypes.ReserveConfigurationMap memory collateralReserveConfiguration, @@ -510,16 +505,15 @@ library LiquidationLogic { uint256 debtToCover, uint256 userCollateralBalance, uint256 liquidationBonus - ) internal pure returns (uint256, uint256, uint256, uint256, uint256) { + ) internal pure returns (uint256, uint256, uint256, uint256) { AvailableCollateralToLiquidateLocalVars memory vars; - vars.debtAssetPrice = debtAssetPrice; vars.collateralAssetPrice = collateralAssetPrice; vars.liquidationProtocolFeePercentage = collateralReserveConfiguration .getLiquidationProtocolFee(); // This is the base collateral to liquidate based on the given debt to cover vars.baseCollateral = - ((vars.debtAssetPrice * debtToCover * collateralAssetUnit)) / + ((debtAssetPrice * debtToCover * collateralAssetUnit)) / (vars.collateralAssetPrice * debtAssetUnit); vars.maxCollateralToLiquidate = vars.baseCollateral.percentMul(liquidationBonus); @@ -527,7 +521,7 @@ library LiquidationLogic { if (vars.maxCollateralToLiquidate > userCollateralBalance) { vars.collateralAmount = userCollateralBalance; vars.debtAmountNeeded = ((vars.collateralAssetPrice * vars.collateralAmount * debtAssetUnit) / - (vars.debtAssetPrice * collateralAssetUnit)).percentDiv(liquidationBonus); + (debtAssetPrice * collateralAssetUnit)).percentDiv(liquidationBonus); } else { vars.collateralAmount = vars.maxCollateralToLiquidate; vars.debtAmountNeeded = debtToCover; @@ -537,8 +531,6 @@ library LiquidationLogic { (vars.collateralAmount * vars.collateralAssetPrice) / collateralAssetUnit; - vars.debtToRepayInBaseCurrency = (vars.debtAmountNeeded * debtAssetPrice) / debtAssetUnit; - if (vars.liquidationProtocolFeePercentage != 0) { vars.bonusCollateral = vars.collateralAmount - @@ -553,8 +545,7 @@ library LiquidationLogic { vars.collateralAmount, vars.debtAmountNeeded, vars.liquidationProtocolFee, - vars.collateralToLiquidateInBaseCurrency, - vars.debtToRepayInBaseCurrency + vars.collateralToLiquidateInBaseCurrency ); } diff --git a/tests/helpers/LiquidationHelper.sol b/tests/helpers/LiquidationHelper.sol index 4c2b4184..a47cf92f 100644 --- a/tests/helpers/LiquidationHelper.sol +++ b/tests/helpers/LiquidationHelper.sol @@ -47,7 +47,7 @@ library LiquidationHelper { address collateralAsset, address debtAsset, uint256 liquidationAmount - ) internal view returns (uint256, uint256, uint256, uint256, uint256) { + ) internal view returns (uint256, uint256, uint256, uint256) { uint256 maxLiquidatableDebt = _getMaxLiquidatableDebt(pool, user, debtAsset); return _getLiquidationParams( @@ -70,7 +70,7 @@ library LiquidationHelper { address debtAsset, uint256 liquidationAmount, uint256 maxLiquidatableDebt - ) internal view returns (uint256, uint256, uint256, uint256, uint256) { + ) internal view returns (uint256, uint256, uint256, uint256) { LocalVars memory local; local.user = user; maxLiquidatableDebt = liquidationAmount > maxLiquidatableDebt diff --git a/tests/protocol/pool/Pool.Liquidations.CloseFactor.t.sol b/tests/protocol/pool/Pool.Liquidations.CloseFactor.t.sol index 87c01fd6..a140627c 100644 --- a/tests/protocol/pool/Pool.Liquidations.CloseFactor.t.sol +++ b/tests/protocol/pool/Pool.Liquidations.CloseFactor.t.sol @@ -135,7 +135,7 @@ contract PoolLiquidationCloseFactorTests is TestnetProcedures { ) internal { (, uint256 debtInBaseCurrency, , , , ) = contracts.poolProxy.getUserAccountData(bob); // first we calculate the maximal possible liquidatable - (, uint256 debtAmountAt100, , , ) = LiquidationHelper._getLiquidationParams( + (, uint256 debtAmountAt100, , ) = LiquidationHelper._getLiquidationParams( contracts.poolProxy, bob, collateralAsset, @@ -146,7 +146,7 @@ contract PoolLiquidationCloseFactorTests is TestnetProcedures { contracts.aaveOracle.getAssetPrice(debtAsset) ); // then we calculate the exact amounts - (uint256 collateralAmount, uint256 debtAmount, , , ) = LiquidationHelper._getLiquidationParams( + (uint256 collateralAmount, uint256 debtAmount, , ) = LiquidationHelper._getLiquidationParams( contracts.poolProxy, bob, collateralAsset, diff --git a/tests/protocol/pool/Pool.Liquidations.t.sol b/tests/protocol/pool/Pool.Liquidations.t.sol index eddd929d..1726c410 100644 --- a/tests/protocol/pool/Pool.Liquidations.t.sol +++ b/tests/protocol/pool/Pool.Liquidations.t.sol @@ -87,11 +87,9 @@ contract PoolLiquidationTests is TestnetProcedures { uint256 priceImpactPercent; uint256 liquidationProtocolFeeAmount; uint256 collateralToLiquidateInBaseCurrency; - uint256 debtToLiquidateInBaseCurrency; uint256 totalCollateralInBaseCurrency; uint256 totalDebtInBaseCurrency; uint256 healthFactor; - bool isBadDebt; } function test_liquidate_variable_borrow_same_collateral_and_borrow() public { @@ -203,13 +201,7 @@ contract PoolLiquidationTests is TestnetProcedures { params.receiveAToken ); - _afterLiquidationChecksVariable( - params, - bob, - liquidatorBalanceBefore, - userDebtBefore, - params.isBadDebt - ); + _afterLiquidationChecksVariable(params, bob, liquidatorBalanceBefore, userDebtBefore); } function test_liquidate_variable_borrow_no_fee() public { @@ -266,13 +258,7 @@ contract PoolLiquidationTests is TestnetProcedures { params.liquidationAmountInput, params.receiveAToken ); - _afterLiquidationChecksVariable( - params, - bob, - liquidatorBalanceBefore, - userDebtBefore, - params.isBadDebt - ); + _afterLiquidationChecksVariable(params, bob, liquidatorBalanceBefore, userDebtBefore); } function test_partial_liquidate_variable_borrow() public { @@ -327,13 +313,7 @@ contract PoolLiquidationTests is TestnetProcedures { params.receiveAToken ); - _afterLiquidationChecksVariable( - params, - bob, - liquidatorBalanceBefore, - userDebtBefore, - params.isBadDebt - ); + _afterLiquidationChecksVariable(params, bob, liquidatorBalanceBefore, userDebtBefore); } function test_partial_liquidate_atokens_variable_borrow() public { @@ -389,13 +369,7 @@ contract PoolLiquidationTests is TestnetProcedures { params.receiveAToken ); - _afterLiquidationChecksVariable( - params, - bob, - liquidatorBalanceBefore, - userDebtBefore, - params.isBadDebt - ); + _afterLiquidationChecksVariable(params, bob, liquidatorBalanceBefore, userDebtBefore); } function test_full_liquidate_atokens_multiple_variable_borrows() public { @@ -644,13 +618,7 @@ contract PoolLiquidationTests is TestnetProcedures { params.receiveAToken ); - _afterLiquidationChecksVariable( - params, - bob, - liquidatorBalanceBefore, - userDebtBefore, - params.isBadDebt - ); + _afterLiquidationChecksVariable(params, bob, liquidatorBalanceBefore, userDebtBefore); } function test_liquidate_emode_position_without_emode_oracle() public { @@ -717,13 +685,7 @@ contract PoolLiquidationTests is TestnetProcedures { params.receiveAToken ); - _afterLiquidationChecksVariable( - params, - bob, - liquidatorBalanceBefore, - userDebtBefore, - params.isBadDebt - ); + _afterLiquidationChecksVariable(params, bob, liquidatorBalanceBefore, userDebtBefore); } function test_liquidate_borrow_bad_debt() public { @@ -772,13 +734,7 @@ contract PoolLiquidationTests is TestnetProcedures { params.liquidationAmountInput, params.receiveAToken ); - _afterLiquidationChecksVariable( - params, - bob, - liquidatorBalanceBefore, - userDebtBefore, - params.isBadDebt - ); + _afterLiquidationChecksVariable(params, bob, liquidatorBalanceBefore, userDebtBefore); } function test_liquidate_borrow_burn_multiple_assets_bad_debt() public { @@ -834,13 +790,7 @@ contract PoolLiquidationTests is TestnetProcedures { params.liquidationAmountInput, params.receiveAToken ); - _afterLiquidationChecksVariable( - params, - bob, - liquidatorBalanceBefore, - userDebtBefore, - params.isBadDebt - ); + _afterLiquidationChecksVariable(params, bob, liquidatorBalanceBefore, userDebtBefore); // check second borrow (, , varDebtToken) = contracts.protocolDataProvider.getReserveTokensAddresses(tokenList.wbtc); assertEq(IERC20(varDebtToken).balanceOf(params.user), 0, 'user balance doesnt match'); @@ -1012,8 +962,7 @@ contract PoolLiquidationTests is TestnetProcedures { params.actualCollateralToLiquidate, params.actualDebtToLiquidate, params.liquidationProtocolFeeAmount, - params.collateralToLiquidateInBaseCurrency, - params.debtToLiquidateInBaseCurrency + params.collateralToLiquidateInBaseCurrency ) = LiquidationHelper._getLiquidationParams( contracts.poolProxy, params.user, @@ -1021,9 +970,6 @@ contract PoolLiquidationTests is TestnetProcedures { params.debtAsset, params.actualDebtToLiquidate ); - params.isBadDebt = - params.totalCollateralInBaseCurrency == params.collateralToLiquidateInBaseCurrency && - params.totalDebtInBaseCurrency != params.debtToLiquidateInBaseCurrency; return params; } @@ -1305,8 +1251,7 @@ contract PoolLiquidationTests is TestnetProcedures { LiquidationInput memory params, address liquidator, uint256 liquidatorBalanceBefore, - uint256 userBalanceBefore, - bool isBadDebt + uint256 userBalanceBefore ) internal view { (address collateralBalance, , ) = contracts.protocolDataProvider.getReserveTokensAddresses( params.collateralAsset @@ -1327,12 +1272,20 @@ contract PoolLiquidationTests is TestnetProcedures { 'liquidator balance doesnt match' ); } - assertApproxEqAbs( - IERC20(variableDebtToken).balanceOf(params.user), - isBadDebt ? 0 : userBalanceBefore - params.actualDebtToLiquidate, - 1, - 'user balance doesnt match' - ); + ( + params.totalCollateralInBaseCurrency, + params.totalDebtInBaseCurrency, + , + , + , + params.healthFactor + ) = contracts.poolProxy.getUserAccountData(params.user); + if (params.totalCollateralInBaseCurrency == 0) { + require( + !contracts.poolProxy.getUserConfiguration(params.user).isBorrowingAny(), + 'BAD_DEBT_MUST_BE_CLEARED' + ); + } } function _setLiquidationGracePeriod(address[] memory assets, uint40 gracePeriod) internal { From 69baa1d31e175a59df3298ca55f4bf0d0f606a19 Mon Sep 17 00:00:00 2001 From: Lukas Date: Wed, 23 Oct 2024 14:07:31 +0200 Subject: [PATCH 22/72] fix: allow 100% vf liquidations if collateral is below threshold --- .../protocol/libraries/logic/LiquidationLogic.sol | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol index fbe22cf3..cf10c63c 100644 --- a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -89,6 +89,7 @@ library LiquidationLogic { uint256 totalDebtInBaseCurrency; uint256 collateralToLiquidateInBaseCurrency; uint256 userReserveDebtInBaseCurrency; + uint256 userReserveCollateralInBaseCurrency; uint256 debtToRepayInBaseCurrency; uint256 collateralAssetPrice; uint256 debtAssetPrice; @@ -184,11 +185,16 @@ library LiquidationLogic { (vars.userReserveDebt * vars.debtAssetPrice) / vars.debtAssetUnit; + vars.userReserveCollateralInBaseCurrency = + (vars.userCollateralBalance * vars.collateralAssetPrice) / + vars.collateralAssetUnit; + // by default whole debt in the reserve could be liquidated uint256 maxLiquidatableDebt = vars.userReserveDebt; - // but if debt is above or equal MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD and health factor CLOSE_FACTOR_HF_THRESHOLD - // this amount may be adjusted + // but if debt and collateral is above or equal MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD + // and health factor is above CLOSE_FACTOR_HF_THRESHOLD this amount may be adjusted if ( + vars.userReserveCollateralInBaseCurrency >= MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD && vars.userReserveDebtInBaseCurrency >= MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD && vars.healthFactor > CLOSE_FACTOR_HF_THRESHOLD ) { From 677173cc8455e96baedd7bf807d896585e6b3e19 Mon Sep 17 00:00:00 2001 From: Lukas Date: Wed, 23 Oct 2024 22:46:04 +0200 Subject: [PATCH 23/72] fix: add test for 100% close factor --- tests/helpers/LiquidationHelper.sol | 17 ++++++++++++--- .../pool/Pool.Liquidations.CloseFactor.t.sol | 21 +++++++++++++++++++ tests/protocol/pool/Pool.Liquidations.t.sol | 1 + 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/tests/helpers/LiquidationHelper.sol b/tests/helpers/LiquidationHelper.sol index 4c2b4184..3ad80996 100644 --- a/tests/helpers/LiquidationHelper.sol +++ b/tests/helpers/LiquidationHelper.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.10; -import {console} from 'forge-std/console.sol'; import {IPool} from '../../src/contracts/interfaces/IPool.sol'; import {IAaveOracle} from '../../src/contracts/interfaces/IAaveOracle.sol'; import {LiquidationLogic} from '../../src/contracts/protocol/libraries/logic/LiquidationLogic.sol'; @@ -48,7 +47,7 @@ library LiquidationHelper { address debtAsset, uint256 liquidationAmount ) internal view returns (uint256, uint256, uint256, uint256, uint256) { - uint256 maxLiquidatableDebt = _getMaxLiquidatableDebt(pool, user, debtAsset); + uint256 maxLiquidatableDebt = _getMaxLiquidatableDebt(pool, user, collateralAsset, debtAsset); return _getLiquidationParams( pool, @@ -105,17 +104,30 @@ library LiquidationHelper { function _getMaxLiquidatableDebt( IPool pool, address user, + address collateralAsset, address debtAsset ) internal view returns (uint256) { (, uint256 totalDebtInBaseCurrency, , , , uint256 healthFactor) = pool.getUserAccountData(user); address oracle = pool.ADDRESSES_PROVIDER().getPriceOracle(); + uint256 reserveCollateralInBaseCurrency; + { + address aToken = pool.getReserveAToken(collateralAsset); + uint256 maxLiquidatableCollateral = IERC20Detailed(aToken).balanceOf(user); + uint256 collateralAssetUnits = 10 ** IERC20Detailed(aToken).decimals(); + uint256 collateralAssetPrice = IAaveOracle(oracle).getAssetPrice(collateralAsset); + reserveCollateralInBaseCurrency = + (collateralAssetPrice * maxLiquidatableCollateral) / + collateralAssetUnits; + } address vToken = pool.getReserveVariableDebtToken(debtAsset); uint256 maxLiquidatableDebt = IERC20Detailed(vToken).balanceOf(user); uint256 debtAssetUnits = 10 ** IERC20Detailed(vToken).decimals(); uint256 debtAssetPrice = IAaveOracle(oracle).getAssetPrice(debtAsset); uint256 reserveDebtInBaseCurrency = (debtAssetPrice * maxLiquidatableDebt) / debtAssetUnits; + if ( reserveDebtInBaseCurrency >= LiquidationLogic.MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD && + reserveCollateralInBaseCurrency >= LiquidationLogic.MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD && healthFactor > LiquidationLogic.CLOSE_FACTOR_HF_THRESHOLD ) { uint256 totalDefaultLiquidatableDebtInBaseCurrency = totalDebtInBaseCurrency.percentMul( @@ -126,7 +138,6 @@ library LiquidationHelper { maxLiquidatableDebt = (totalDefaultLiquidatableDebtInBaseCurrency * debtAssetUnits) / debtAssetPrice; - console.log(maxLiquidatableDebt); } } return maxLiquidatableDebt; diff --git a/tests/protocol/pool/Pool.Liquidations.CloseFactor.t.sol b/tests/protocol/pool/Pool.Liquidations.CloseFactor.t.sol index 87c01fd6..bdecf05e 100644 --- a/tests/protocol/pool/Pool.Liquidations.CloseFactor.t.sol +++ b/tests/protocol/pool/Pool.Liquidations.CloseFactor.t.sol @@ -127,6 +127,27 @@ contract PoolLiquidationCloseFactorTests is TestnetProcedures { test_fuzz_hf_gt_095_supply_gt_threshold_closeFactorShouldBe50(0.97 ether, 100 ether); } + function test_hf_gt_095_borrow_gt_threshold_collateral_lt_threshold_closeFactorShouldBe100() + external + { + // supply slightly less then threshold as usdx and weth collateral + _supplyToPool( + tokenList.usdx, + bob, + (LiquidationLogic.MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD - 1e8) / 1e2 + ); + uint256 oraclePrice = contracts.aaveOracle.getAssetPrice(tokenList.weth); + uint256 supplyLtThreshold = ((LiquidationLogic.MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD - 1e8) * + 10 ** IERC20Detailed(tokenList.weth).decimals()) / oraclePrice; + _supplyToPool(tokenList.weth, bob, supplyLtThreshold); + // borrow above threshold + _borrowToBeBelowHf(bob, tokenList.usdx, 0.97 ether); + (, uint256 debtInBaseCurrency, , , , uint256 hf) = contracts.poolProxy.getUserAccountData(bob); + assertGt(debtInBaseCurrency, LiquidationLogic.MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD); + assertGt(hf, 0.95 ether); + _liquidateAndValidateCloseFactor(tokenList.weth, tokenList.usdx, type(uint256).max, 1e4); + } + function _liquidateAndValidateCloseFactor( address collateralAsset, address debtAsset, diff --git a/tests/protocol/pool/Pool.Liquidations.t.sol b/tests/protocol/pool/Pool.Liquidations.t.sol index eddd929d..95b78d16 100644 --- a/tests/protocol/pool/Pool.Liquidations.t.sol +++ b/tests/protocol/pool/Pool.Liquidations.t.sol @@ -1001,6 +1001,7 @@ contract PoolLiquidationTests is TestnetProcedures { uint256 maxLiquidatableDebt = LiquidationHelper._getMaxLiquidatableDebt( contracts.poolProxy, user, + params.collateralAsset, params.debtAsset ); From a223bed9ba864b1f60700119b9688eafd5a9d81d Mon Sep 17 00:00:00 2001 From: Lukas Date: Wed, 23 Oct 2024 11:44:52 +0200 Subject: [PATCH 24/72] finding: not considering fee when validating min_leftover --- .../libraries/logic/LiquidationLogic.sol | 3 ++- .../pool/Pool.Liquidations.CloseFactor.t.sol | 26 ++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol index fbe22cf3..2596dc01 100644 --- a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -241,7 +241,8 @@ library LiquidationLogic { MIN_LEFTOVER_BASE; bool isCollateralMoreThanLeftoverThreshold = ((vars.userCollateralBalance - - vars.actualCollateralToLiquidate) * vars.collateralAssetPrice) / + vars.actualCollateralToLiquidate - + vars.liquidationProtocolFeeAmount) * vars.collateralAssetPrice) / vars.collateralAssetUnit >= MIN_LEFTOVER_BASE; diff --git a/tests/protocol/pool/Pool.Liquidations.CloseFactor.t.sol b/tests/protocol/pool/Pool.Liquidations.CloseFactor.t.sol index 87c01fd6..a965741c 100644 --- a/tests/protocol/pool/Pool.Liquidations.CloseFactor.t.sol +++ b/tests/protocol/pool/Pool.Liquidations.CloseFactor.t.sol @@ -127,6 +127,30 @@ contract PoolLiquidationCloseFactorTests is TestnetProcedures { test_fuzz_hf_gt_095_supply_gt_threshold_closeFactorShouldBe50(0.97 ether, 100 ether); } + function test_shouldRevertIfCloseFactorIs100ButCollateralIsBelowThreshold() external { + uint256 usdxSupply = LiquidationLogic.MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD / 1e2; + // supply collateral below threshold + _supplyToPool(tokenList.usdx, bob, usdxSupply); + // supply differe collateral to increase borrowing power + _supplyToPool(tokenList.weth, bob, 4 ether); + // borrow enough so close factor is at 100% + _borrowToBeBelowHf(bob, tokenList.usdx, 0.93 ether); + + // this test is a bit fragile as it's implicitly assuming that 44e6 is the bonus, without the fee + uint256 liquidationAmount = (usdxSupply / 2) - 44e6; + vm.prank(liquidator); + IERC20Detailed(tokenList.usdx).approve(address(contracts.poolProxy), type(uint256).max); + vm.prank(liquidator); + vm.expectRevert(bytes(Errors.MUST_NOT_LEAVE_DUST)); + contracts.poolProxy.liquidationCall( + tokenList.usdx, + tokenList.usdx, + bob, + liquidationAmount, + false + ); + } + function _liquidateAndValidateCloseFactor( address collateralAsset, address debtAsset, @@ -153,7 +177,7 @@ contract PoolLiquidationCloseFactorTests is TestnetProcedures { debtAsset, amountToLiquidate ); - uint256 balanceBefore = IERC20Detailed(tokenList.weth).balanceOf(liquidator); + uint256 balanceBefore = IERC20Detailed(collateralAsset).balanceOf(liquidator); vm.prank(liquidator); IERC20Detailed(debtAsset).approve(address(contracts.poolProxy), type(uint256).max); vm.prank(liquidator); From b1f7f58b1381509b682d62a810691947cf65fa79 Mon Sep 17 00:00:00 2001 From: Lukas Date: Tue, 29 Oct 2024 08:06:08 +0100 Subject: [PATCH 25/72] finding: unnecessary IAccessControl import --- src/contracts/protocol/pool/Pool.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/src/contracts/protocol/pool/Pool.sol b/src/contracts/protocol/pool/Pool.sol index 3035af82..5c95417b 100644 --- a/src/contracts/protocol/pool/Pool.sol +++ b/src/contracts/protocol/pool/Pool.sol @@ -17,7 +17,6 @@ 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 {IAccessControl} from '../../dependencies/openzeppelin/contracts/IAccessControl.sol'; import {PoolStorage} from './PoolStorage.sol'; /** From 17444f654d9d634040e6d39c7f680e64f5f4c6e1 Mon Sep 17 00:00:00 2001 From: Lukas Date: Tue, 29 Oct 2024 08:38:32 +0100 Subject: [PATCH 26/72] finding: misc natspec issues --- src/contracts/interfaces/IPool.sol | 4 +++- src/contracts/protocol/libraries/logic/BorrowLogic.sol | 2 +- src/contracts/protocol/libraries/logic/ReserveLogic.sol | 4 +++- src/contracts/protocol/pool/Pool.sol | 8 ++++---- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/contracts/interfaces/IPool.sol b/src/contracts/interfaces/IPool.sol index 301b81c3..398cb08b 100644 --- a/src/contracts/interfaces/IPool.sol +++ b/src/contracts/interfaces/IPool.sol @@ -804,7 +804,9 @@ interface IPool { function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; /** - * @notice It Covers the deficit of a specified reserve by burning the equivalent aToken `amount`. + * @notice It Covers the deficit of a specified reserve by burning: + * - the equivalent aToken `amount` for assets with virtual accounting enabled + * - the equivalent `amount` of underlying for assets with virtual accounting disabled (e.g. GHO) * @dev The deficit of a reserve can occur due to situations where borrowed assets are not repaid, leading to bad debt. * @param asset The address of the underlying asset to cover the dificit. * @param amount The amount to be covered, in aToken or underlying on non-virtual accounted assets diff --git a/src/contracts/protocol/libraries/logic/BorrowLogic.sol b/src/contracts/protocol/libraries/logic/BorrowLogic.sol index 611a76d5..ce3b5ed5 100644 --- a/src/contracts/protocol/libraries/logic/BorrowLogic.sol +++ b/src/contracts/protocol/libraries/logic/BorrowLogic.sol @@ -206,6 +206,7 @@ library BorrowLogic { paybackAmount ); + // in case of aToken repayment the msg.sender must always repay on behalf of itself if (params.useATokens) { IAToken(reserveCache.aTokenAddress).burn( msg.sender, @@ -214,7 +215,6 @@ library BorrowLogic { reserveCache.nextLiquidityIndex ); bool isCollateral = userConfig.isUsingAsCollateral(reserve.id); - // in case of aToken repayment the msg.sender must always repay on behalf of itself if (isCollateral && IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender) == 0) { userConfig.setUsingAsCollateral(reserve.id, false); emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); diff --git a/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/src/contracts/protocol/libraries/logic/ReserveLogic.sol index fd3898b4..54f259f7 100644 --- a/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ b/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -319,7 +319,9 @@ library ReserveLogic { } /** - * @notice Reduces a portion or all of the deficit of a specified reserve by burning the equivalent aToken `amount`. + * @notice Reduces a portion or all of the deficit of a specified reserve by burning: + * - the equivalent aToken `amount` for assets with virtual accounting enabled + * - the equivalent `amount` of underlying for assets with virtual accounting disabled (e.g. GHO) * The caller of this method MUST always be the Umbrella contract and the Umbrella contract is assumed to never have debt. * @dev Emits the `DeficitCovered() event`. * @dev If the coverage admin covers its entire balance, `ReserveUsedAsCollateralDisabled()` is emitted. diff --git a/src/contracts/protocol/pool/Pool.sol b/src/contracts/protocol/pool/Pool.sol index 3035af82..eb15252a 100644 --- a/src/contracts/protocol/pool/Pool.sol +++ b/src/contracts/protocol/pool/Pool.sol @@ -41,6 +41,9 @@ abstract contract Pool is VersionedInitializable, PoolStorage, IPool { IPoolAddressesProvider public immutable ADDRESSES_PROVIDER; + // @notice The name used to fetch the UMBRELLA contract + bytes32 public constant UMBRELLA = 'UMBRELLA'; + /** * @dev Only pool configurator can call functions marked by this modifier. */ @@ -69,10 +72,7 @@ abstract contract Pool is VersionedInitializable, PoolStorage, IPool { * @dev Only the umbrella contract can call functions marked by this modifier. */ modifier onlyUmbrella() { - require( - ADDRESSES_PROVIDER.getAddress(bytes32('UMBRELLA')) == msg.sender, - Errors.CALLER_NOT_UMBRELLA - ); + require(ADDRESSES_PROVIDER.getAddress(UMBRELLA) == msg.sender, Errors.CALLER_NOT_UMBRELLA); _; } From 8fe1aa6ab9dde5ee383994411aa8ed4ffadeb11e Mon Sep 17 00:00:00 2001 From: Lukas Date: Tue, 29 Oct 2024 09:30:27 +0100 Subject: [PATCH 27/72] fix: apply stermies suggestions to eliminateReserveDeficit --- .../protocol/libraries/logic/ReserveLogic.sol | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/src/contracts/protocol/libraries/logic/ReserveLogic.sol index fd3898b4..4c373a75 100644 --- a/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ b/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -351,6 +351,21 @@ library ReserveLogic { balanceWriteOff = currentDeficit; } + uint256 userBalance = reserveCache.reserveConfiguration.getIsVirtualAccActive() + ? IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender).rayMul( + reserveCache.nextLiquidityIndex + ) + : IERC20(params.asset).balanceOf(msg.sender); + require(balanceWriteOff <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + bool isCollateral = userConfig.isUsingAsCollateral(reserve.id); + if (isCollateral && balanceWriteOff == userBalance) { + userConfig.setUsingAsCollateral(reserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); + } + + // update ir due to updateState + reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, 0, 0); + if (reserveCache.reserveConfiguration.getIsVirtualAccActive()) { IAToken(reserveCache.aTokenAddress).burn( msg.sender, @@ -358,8 +373,6 @@ library ReserveLogic { balanceWriteOff, reserveCache.nextLiquidityIndex ); - // update ir due to updateState - reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, 0, 0); } else { // This is a special case to allow mintable assets (ex. GHO), which by definition cannot be supplied // and thus do not use virtual underlying balances. From c21a2d27928ce184375d5915eaadd6b468618f44 Mon Sep 17 00:00:00 2001 From: Lukas Date: Tue, 29 Oct 2024 10:22:35 +0100 Subject: [PATCH 28/72] fix: improve tests --- tests/protocol/pool/Pool.Deficit.sol | 74 +++++++++++++++++++++++++--- 1 file changed, 67 insertions(+), 7 deletions(-) diff --git a/tests/protocol/pool/Pool.Deficit.sol b/tests/protocol/pool/Pool.Deficit.sol index 942220b3..b38168c4 100644 --- a/tests/protocol/pool/Pool.Deficit.sol +++ b/tests/protocol/pool/Pool.Deficit.sol @@ -12,17 +12,22 @@ import {IAaveOracle} from '../../../src/contracts/interfaces/IAaveOracle.sol'; import {TestnetProcedures} from '../../utils/TestnetProcedures.sol'; import {IAccessControl} from '../../../src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol'; import {IAToken} from '../../../src/contracts/interfaces/IAToken.sol'; +import {UserConfiguration} from '../../../src/contracts/protocol/libraries/configuration/UserConfiguration.sol'; contract PoolDeficitTests is TestnetProcedures { using stdStorage for StdStorage; + using UserConfiguration for DataTypes.UserConfigurationMap; event DeficitCovered(address indexed reserve, address caller, uint256 amountDecreased); function setUp() public virtual { - initTestEnvironment(); + initTestEnvironment(false); } - function test_eliminateReserveDeficit(address coverageAdmin, uint120 supplyAmount) public { + function test_eliminateReserveDeficit_exactDeficit( + address coverageAdmin, + uint120 supplyAmount + ) public { _filterAddresses(coverageAdmin); (address reserveToken, uint256 currentDeficit) = _createReserveDeficit( supplyAmount, @@ -32,19 +37,29 @@ contract PoolDeficitTests is TestnetProcedures { vm.prank(poolAdmin); contracts.poolAddressesProvider.setAddress(bytes32('UMBRELLA'), coverageAdmin); - deal(reserveToken, coverageAdmin, currentDeficit); + DataTypes.ReserveDataLegacy memory reserveData = contracts.poolProxy.getReserveData( + reserveToken + ); vm.startPrank(coverageAdmin); + // +1 to account for imprecision on supply + deal(reserveToken, coverageAdmin, currentDeficit + 1); IERC20(reserveToken).approve(report.poolProxy, UINT256_MAX); - contracts.poolProxy.supply(reserveToken, currentDeficit, coverageAdmin, 0); + contracts.poolProxy.supply(reserveToken, currentDeficit + 1, coverageAdmin, 0); + DataTypes.UserConfigurationMap memory userConfigBefore = contracts + .poolProxy + .getUserConfiguration(coverageAdmin); + assertEq(userConfigBefore.isUsingAsCollateral(reserveData.id), true); // eliminate deficit vm.expectEmit(address(contracts.poolProxy)); emit DeficitCovered(reserveToken, coverageAdmin, currentDeficit); contracts.poolProxy.eliminateReserveDeficit(reserveToken, currentDeficit); + + assertEq(contracts.poolProxy.getReserveDeficit(reserveToken), 0); } - function test_eliminateReserveDeficit_surplus( + function test_eliminateReserveDeficit_exactUserBalance( address coverageAdmin, uint120 supplyAmount ) public { @@ -57,16 +72,59 @@ contract PoolDeficitTests is TestnetProcedures { vm.prank(poolAdmin); contracts.poolAddressesProvider.setAddress(bytes32('UMBRELLA'), coverageAdmin); + DataTypes.ReserveDataLegacy memory reserveData = contracts.poolProxy.getReserveData( + reserveToken + ); + + vm.startPrank(coverageAdmin); deal(reserveToken, coverageAdmin, currentDeficit); + IERC20(reserveToken).approve(report.poolProxy, UINT256_MAX); + contracts.poolProxy.supply(reserveToken, currentDeficit / 2, coverageAdmin, 0); + DataTypes.UserConfigurationMap memory userConfigBefore = contracts + .poolProxy + .getUserConfiguration(coverageAdmin); + assertEq(userConfigBefore.isUsingAsCollateral(reserveData.id), true); + + uint256 deficitToCover = IERC20(reserveData.aTokenAddress).balanceOf(coverageAdmin); + contracts.poolProxy.eliminateReserveDeficit(reserveToken, deficitToCover); + + DataTypes.UserConfigurationMap memory userConfigAfter = contracts + .poolProxy + .getUserConfiguration(coverageAdmin); + assertEq(userConfigAfter.isUsingAsCollateral(reserveData.id), false); + } + + function test_eliminateReserveDeficit_surplus( + address coverageAdmin, + uint120 supplyAmount + ) public { + _filterAddresses(coverageAdmin); + (address reserveToken, uint256 currentDeficit) = _createReserveDeficit( + supplyAmount, + tokenList.usdx + ); + + vm.prank(poolAdmin); + contracts.poolAddressesProvider.setAddress(bytes32('UMBRELLA'), coverageAdmin); + + deal(reserveToken, coverageAdmin, currentDeficit + 1000); vm.startPrank(coverageAdmin); IERC20(reserveToken).approve(report.poolProxy, UINT256_MAX); - contracts.poolProxy.supply(reserveToken, currentDeficit, coverageAdmin, 0); + contracts.poolProxy.supply(reserveToken, currentDeficit + 1000, coverageAdmin, 0); // eliminate deficit vm.expectEmit(address(contracts.poolProxy)); emit DeficitCovered(reserveToken, coverageAdmin, currentDeficit); contracts.poolProxy.eliminateReserveDeficit(reserveToken, currentDeficit + 1000); + + DataTypes.ReserveDataLegacy memory reserveData = contracts.poolProxy.getReserveData( + reserveToken + ); + DataTypes.UserConfigurationMap memory userConfig = contracts.poolProxy.getUserConfiguration( + coverageAdmin + ); + assertEq(userConfig.isUsingAsCollateral(reserveData.id), true); } function test_eliminateReserveDeficit_virtualAccDisabled( @@ -207,9 +265,11 @@ contract PoolDeficitTests is TestnetProcedures { ) internal returns (address, uint256) { vm.assume(supplyAmount != 0); deal(tokenList.wbtc, alice, supplyAmount); - vm.prank(alice); + vm.startPrank(alice); + IERC20(tokenList.wbtc).approve(address(contracts.poolProxy), supplyAmount); contracts.poolProxy.supply(tokenList.wbtc, supplyAmount, alice, 0); (, , uint256 availableBorrowsBase, , , ) = contracts.poolProxy.getUserAccountData(alice); + vm.stopPrank(); uint256 borrowAmount = (availableBorrowsBase * 10 ** IERC20Detailed(borrowAsset).decimals()) / contracts.aaveOracle.getAssetPrice(borrowAsset); From 5e489ba591599c30f80f254fabb9ce028a306abc Mon Sep 17 00:00:00 2001 From: Lukas Date: Tue, 29 Oct 2024 10:26:27 +0100 Subject: [PATCH 29/72] fix: remove obsolete comment --- src/contracts/protocol/libraries/logic/ReserveLogic.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/src/contracts/protocol/libraries/logic/ReserveLogic.sol index 4c373a75..b0dc9754 100644 --- a/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ b/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -390,7 +390,6 @@ library ReserveLogic { address(this), balanceWriteOff ); - // updating the IR is not needed in this case, as the IR is constant for assets without virtual accounting. } reserve.deficit -= balanceWriteOff.toUint128(); From cd4d59db866d7488c6ee6b2317a3aed1718780f3 Mon Sep 17 00:00:00 2001 From: Lukas Date: Tue, 29 Oct 2024 14:55:35 +0100 Subject: [PATCH 30/72] fix: move is collateral logic --- .../protocol/libraries/logic/ReserveLogic.sol | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/src/contracts/protocol/libraries/logic/ReserveLogic.sol index b0dc9754..a2107694 100644 --- a/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ b/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -357,16 +357,18 @@ library ReserveLogic { ) : IERC20(params.asset).balanceOf(msg.sender); require(balanceWriteOff <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - bool isCollateral = userConfig.isUsingAsCollateral(reserve.id); - if (isCollateral && balanceWriteOff == userBalance) { - userConfig.setUsingAsCollateral(reserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); - } // update ir due to updateState reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, 0, 0); if (reserveCache.reserveConfiguration.getIsVirtualAccActive()) { + // assets without virtual accounting can never be a collateral + bool isCollateral = userConfig.isUsingAsCollateral(reserve.id); + if (isCollateral && balanceWriteOff == userBalance) { + userConfig.setUsingAsCollateral(reserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); + } + IAToken(reserveCache.aTokenAddress).burn( msg.sender, reserveCache.aTokenAddress, @@ -383,6 +385,7 @@ library ReserveLogic { reserveCache.aTokenAddress, balanceWriteOff ); + // it is assumed that handleRepayment does not touch the variable debt balance IAToken(reserveCache.aTokenAddress).handleRepayment( msg.sender, // In the context of GHO it's only relevant that the address has no debt. From d4ae764a858914181f874968cf720a433348df70 Mon Sep 17 00:00:00 2001 From: Lukas Date: Tue, 29 Oct 2024 15:13:30 +0100 Subject: [PATCH 31/72] finding: cache lastUpdated --- .../protocol/libraries/logic/ReserveLogic.sol | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/src/contracts/protocol/libraries/logic/ReserveLogic.sol index fd3898b4..c660d306 100644 --- a/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ b/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -111,6 +111,7 @@ library ReserveLogic { //solium-disable-next-line reserve.lastUpdateTimestamp = uint40(block.timestamp); + reserveCache.reserveLastUpdateTimestamp = uint40(block.timestamp); } /** @@ -351,15 +352,30 @@ library ReserveLogic { balanceWriteOff = currentDeficit; } + uint256 userBalance = reserveCache.reserveConfiguration.getIsVirtualAccActive() + ? IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender).rayMul( + reserveCache.nextLiquidityIndex + ) + : IERC20(params.asset).balanceOf(msg.sender); + require(balanceWriteOff <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + // update ir due to updateState + reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, 0, 0); + if (reserveCache.reserveConfiguration.getIsVirtualAccActive()) { + // assets without virtual accounting can never be a collateral + bool isCollateral = userConfig.isUsingAsCollateral(reserve.id); + if (isCollateral && balanceWriteOff == userBalance) { + userConfig.setUsingAsCollateral(reserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); + } + IAToken(reserveCache.aTokenAddress).burn( msg.sender, reserveCache.aTokenAddress, balanceWriteOff, reserveCache.nextLiquidityIndex ); - // update ir due to updateState - reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, 0, 0); } else { // This is a special case to allow mintable assets (ex. GHO), which by definition cannot be supplied // and thus do not use virtual underlying balances. @@ -370,6 +386,7 @@ library ReserveLogic { reserveCache.aTokenAddress, balanceWriteOff ); + // it is assumed that handleRepayment does not touch the variable debt balance IAToken(reserveCache.aTokenAddress).handleRepayment( msg.sender, // In the context of GHO it's only relevant that the address has no debt. @@ -377,7 +394,6 @@ library ReserveLogic { address(this), balanceWriteOff ); - // updating the IR is not needed in this case, as the IR is constant for assets without virtual accounting. } reserve.deficit -= balanceWriteOff.toUint128(); From ab8066b66825c65fbf2da715d2e5ed1e267abb74 Mon Sep 17 00:00:00 2001 From: Lukas Date: Tue, 29 Oct 2024 15:45:08 +0100 Subject: [PATCH 32/72] fix: dont disable collateral fix: remove double code --- src/contracts/protocol/libraries/logic/LiquidationLogic.sol | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol index fbe22cf3..f17a655c 100644 --- a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -255,7 +255,8 @@ library LiquidationLogic { // we set the currency as not being used as collateral anymore if ( vars.actualCollateralToLiquidate + vars.liquidationProtocolFeeAmount == - vars.userCollateralBalance + vars.userCollateralBalance && + !(msg.sender == params.user && params.receiveAToken) ) { userConfig.setUsingAsCollateral(collateralReserve.id, false); emit ReserveUsedAsCollateralDisabled(params.collateralAsset, params.user); From a2180eea7ba3505dcc768f8f3f95d3b0863bc45b Mon Sep 17 00:00:00 2001 From: Lukas Date: Thu, 31 Oct 2024 08:53:42 +0100 Subject: [PATCH 33/72] fix: call handleRepayment when clearing deficit --- src/contracts/protocol/libraries/logic/LiquidationLogic.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol index fbe22cf3..b1f24288 100644 --- a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -453,6 +453,7 @@ library LiquidationLogic { debtReserve.deficit += outstandingDebt.toUint128(); emit DeficitCreated(user, debtAsset, outstandingDebt); + IAToken(debtReserveCache.aTokenAddress).handleRepayment(msg.sender, user, outstandingDebt); outstandingDebt = 0; } From 181577b3e71b5d7999c5b00c33e93c7f2cdbbeb3 Mon Sep 17 00:00:00 2001 From: Lukas Date: Thu, 31 Oct 2024 13:03:44 +0100 Subject: [PATCH 34/72] fix: gho accounting --- .../libraries/logic/LiquidationLogic.sol | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol index b1f24288..7d8ab3d3 100644 --- a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -20,6 +20,10 @@ import {IPriceOracleGetter} from '../../../interfaces/IPriceOracleGetter.sol'; import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.sol'; import {Errors} from '../helpers/Errors.sol'; +interface IGhoVariableDebtToken { + function getBalanceFromInterest(address user) external view returns (uint256); +} + /** * @title LiquidationLogic library * @author Aave @@ -450,10 +454,25 @@ library LiquidationLogic { uint256 outstandingDebt = userReserveDebt - actualDebtToLiquidate; if (hasNoCollateralLeft && outstandingDebt != 0) { + // Special handling of GHO + // implicitly assuming that virtual acc !active == GHO, which is true + if (!debtReserveCache.reserveConfiguration.getIsVirtualAccActive()) { + uint256 accruedInterest = IGhoVariableDebtToken(debtReserveCache.variableDebtTokenAddress) + .getBalanceFromInterest(user); + // HandleRepayment will first discount the protocol fee from an internal `accumulatedDebtInterest` variable + // and then burn the excess GHO + if (accruedInterest != 0 && accruedInterest > actualDebtToLiquidate) { + // in order to clean the `accumulatedDebtInterest` storage the function will need to be called with at least the accruedInterest + uint256 amountToBurn = accruedInterest - actualDebtToLiquidate; + IAToken(debtReserveCache.aTokenAddress).handleRepayment(msg.sender, user, amountToBurn); + } + // In the case of GHO, all obligations are to the protocol + // therefore the protocol assumes the losses on interest and only tracks the pure deficit + outstandingDebt -= accruedInterest; + } debtReserve.deficit += outstandingDebt.toUint128(); emit DeficitCreated(user, debtAsset, outstandingDebt); - IAToken(debtReserveCache.aTokenAddress).handleRepayment(msg.sender, user, outstandingDebt); outstandingDebt = 0; } From 3aaee6007d31f828ac9a75643fad8c7ef749941f Mon Sep 17 00:00:00 2001 From: Lukas Date: Thu, 31 Oct 2024 13:05:47 +0100 Subject: [PATCH 35/72] fix: docs --- src/contracts/protocol/libraries/logic/LiquidationLogic.sol | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol index 7d8ab3d3..09e2ef25 100644 --- a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -462,7 +462,8 @@ library LiquidationLogic { // HandleRepayment will first discount the protocol fee from an internal `accumulatedDebtInterest` variable // and then burn the excess GHO if (accruedInterest != 0 && accruedInterest > actualDebtToLiquidate) { - // in order to clean the `accumulatedDebtInterest` storage the function will need to be called with at least the accruedInterest + // in order to clean the `accumulatedDebtInterest` storage the function will need to be called with the accruedInterest + // discounted by the actualDebtToLiquidate, as in the main flow `handleRepayment` will be called with actualDebtToLiquidate already uint256 amountToBurn = accruedInterest - actualDebtToLiquidate; IAToken(debtReserveCache.aTokenAddress).handleRepayment(msg.sender, user, amountToBurn); } From dbfd840129a26407c9bc9d20c55d34ea3fdea3ad Mon Sep 17 00:00:00 2001 From: Lukas Date: Thu, 31 Oct 2024 16:04:12 +0100 Subject: [PATCH 36/72] fix: logic patch --- src/contracts/protocol/libraries/logic/LiquidationLogic.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol index 09e2ef25..da0065e9 100644 --- a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -465,11 +465,11 @@ library LiquidationLogic { // in order to clean the `accumulatedDebtInterest` storage the function will need to be called with the accruedInterest // discounted by the actualDebtToLiquidate, as in the main flow `handleRepayment` will be called with actualDebtToLiquidate already uint256 amountToBurn = accruedInterest - actualDebtToLiquidate; + // In the case of GHO, all obligations are to the protocol + // therefore the protocol assumes the losses on interest and only tracks the pure deficit by discounting be the not collected & burned debt + outstandingDebt -= amountToBurn; IAToken(debtReserveCache.aTokenAddress).handleRepayment(msg.sender, user, amountToBurn); } - // In the case of GHO, all obligations are to the protocol - // therefore the protocol assumes the losses on interest and only tracks the pure deficit - outstandingDebt -= accruedInterest; } debtReserve.deficit += outstandingDebt.toUint128(); emit DeficitCreated(user, debtAsset, outstandingDebt); From 3fba8d0838ca33be55a2bb469146522138d01523 Mon Sep 17 00:00:00 2001 From: Lukas Date: Thu, 31 Oct 2024 16:35:21 +0100 Subject: [PATCH 37/72] fix: comment out test as doesn't make sense with the mock --- tests/protocol/pool/Pool.Liquidations.t.sol | 108 ++++++++++---------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/tests/protocol/pool/Pool.Liquidations.t.sol b/tests/protocol/pool/Pool.Liquidations.t.sol index eddd929d..0789f039 100644 --- a/tests/protocol/pool/Pool.Liquidations.t.sol +++ b/tests/protocol/pool/Pool.Liquidations.t.sol @@ -898,60 +898,60 @@ contract PoolLiquidationTests is TestnetProcedures { ); } - function test_deficit_increased_after_liquidate_bad_debt_virtualAccounting_disabled() public { - uint256 supplyAmount = 0.5e8; - uint256 borrowAmount = 11000e18; - deal(tokenList.gho, bob, 100_000e18); - vm.prank(bob); - IERC20(tokenList.gho).approve(address(contracts.poolProxy), type(uint256).max); - vm.startPrank(alice); - contracts.poolProxy.supply(tokenList.wbtc, supplyAmount, alice, 0); - contracts.poolProxy.borrow(tokenList.gho, borrowAmount, 2, 0, alice); - vm.stopPrank(); - - vm.warp(block.timestamp + 30 days); - LiquidationInput memory params = _loadLiquidationInput( - alice, - tokenList.wbtc, - tokenList.gho, - UINT256_MAX, - tokenList.wbtc, - 20_00 - ); - - (, , address varDebtToken) = contracts.protocolDataProvider.getReserveTokensAddresses( - params.debtAsset - ); - uint256 userDebtBefore = IERC20(varDebtToken).balanceOf(params.user); - uint256 liquidatorBalanceBefore; - if (params.receiveAToken) { - (address atoken, , ) = contracts.protocolDataProvider.getReserveTokensAddresses( - params.collateralAsset - ); - liquidatorBalanceBefore = IERC20(atoken).balanceOf(bob); - } else { - liquidatorBalanceBefore = IERC20(params.collateralAsset).balanceOf(bob); - } - - vm.expectEmit(address(contracts.poolProxy)); - emit LiquidationLogic.DeficitCreated( - params.user, - tokenList.gho, - userDebtBefore - params.actualDebtToLiquidate - ); - vm.prank(bob); - contracts.poolProxy.liquidationCall( - params.collateralAsset, - params.debtAsset, - params.user, - params.liquidationAmountInput, - params.receiveAToken - ); - assertEq( - contracts.poolProxy.getReserveDeficit(tokenList.gho), - userDebtBefore - params.actualDebtToLiquidate - ); - } + // function test_deficit_increased_after_liquidate_bad_debt_virtualAccounting_disabled() public { + // uint256 supplyAmount = 0.5e8; + // uint256 borrowAmount = 11000e18; + // deal(tokenList.gho, bob, 100_000e18); + // vm.prank(bob); + // IERC20(tokenList.gho).approve(address(contracts.poolProxy), type(uint256).max); + // vm.startPrank(alice); + // contracts.poolProxy.supply(tokenList.wbtc, supplyAmount, alice, 0); + // contracts.poolProxy.borrow(tokenList.gho, borrowAmount, 2, 0, alice); + // vm.stopPrank(); + + // vm.warp(block.timestamp + 30 days); + // LiquidationInput memory params = _loadLiquidationInput( + // alice, + // tokenList.wbtc, + // tokenList.gho, + // UINT256_MAX, + // tokenList.wbtc, + // 20_00 + // ); + + // (, , address varDebtToken) = contracts.protocolDataProvider.getReserveTokensAddresses( + // params.debtAsset + // ); + // uint256 userDebtBefore = IERC20(varDebtToken).balanceOf(params.user); + // uint256 liquidatorBalanceBefore; + // if (params.receiveAToken) { + // (address atoken, , ) = contracts.protocolDataProvider.getReserveTokensAddresses( + // params.collateralAsset + // ); + // liquidatorBalanceBefore = IERC20(atoken).balanceOf(bob); + // } else { + // liquidatorBalanceBefore = IERC20(params.collateralAsset).balanceOf(bob); + // } + + // vm.expectEmit(address(contracts.poolProxy)); + // emit LiquidationLogic.DeficitCreated( + // params.user, + // tokenList.gho, + // userDebtBefore - params.actualDebtToLiquidate + // ); + // vm.prank(bob); + // contracts.poolProxy.liquidationCall( + // params.collateralAsset, + // params.debtAsset, + // params.user, + // params.liquidationAmountInput, + // params.receiveAToken + // ); + // assertEq( + // contracts.poolProxy.getReserveDeficit(tokenList.gho), + // userDebtBefore - params.actualDebtToLiquidate + // ); + // } function _loadLiquidationInput( address user, From 4f101bab2310ff6d09e307b621f32c202a331399 Mon Sep 17 00:00:00 2001 From: Lukas Date: Thu, 31 Oct 2024 17:29:16 +0100 Subject: [PATCH 38/72] test: add tests --- .../libraries/logic/LiquidationLogic.sol | 10 ++- tests/protocol/pool/Pool.Liquidations.t.sol | 76 +++++++++++++++++++ 2 files changed, 85 insertions(+), 1 deletion(-) diff --git a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol index f17a655c..c539bdbc 100644 --- a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -256,7 +256,15 @@ library LiquidationLogic { if ( vars.actualCollateralToLiquidate + vars.liquidationProtocolFeeAmount == vars.userCollateralBalance && - !(msg.sender == params.user && params.receiveAToken) + !(msg.sender == params.user && + params.receiveAToken && + ValidationLogic.validateAutomaticUseAsCollateral( + reservesData, + reservesList, + userConfig, + collateralReserve.configuration, + address(vars.collateralAToken) + )) ) { userConfig.setUsingAsCollateral(collateralReserve.id, false); emit ReserveUsedAsCollateralDisabled(params.collateralAsset, params.user); diff --git a/tests/protocol/pool/Pool.Liquidations.t.sol b/tests/protocol/pool/Pool.Liquidations.t.sol index eddd929d..ba7b4a3d 100644 --- a/tests/protocol/pool/Pool.Liquidations.t.sol +++ b/tests/protocol/pool/Pool.Liquidations.t.sol @@ -653,6 +653,82 @@ contract PoolLiquidationTests is TestnetProcedures { ); } + function test_self_liquidate_position_shoulKeepCollateralEnabled() public { + uint256 borrowAmount = 11000e6; + + vm.startPrank(alice); + contracts.poolProxy.supply(tokenList.wbtc, 0.5e8, alice, 0); + contracts.poolProxy.setUserUseReserveAsCollateral(tokenList.wbtc, true); + contracts.poolProxy.borrow(tokenList.usdx, borrowAmount, 2, 0, alice); + vm.stopPrank(); + + LiquidationInput memory params = _loadLiquidationInput( + alice, + tokenList.wbtc, + tokenList.usdx, + UINT256_MAX, + tokenList.wbtc, + 40_00 + ); + params.receiveAToken = true; + + (, , address varDebtToken) = contracts.protocolDataProvider.getReserveTokensAddresses( + params.debtAsset + ); + + // Liquidate + vm.prank(alice); + contracts.poolProxy.liquidationCall( + params.collateralAsset, + params.debtAsset, + params.user, + type(uint256).max, + params.receiveAToken + ); + uint256 id = contracts.poolProxy.getReserveData(params.collateralAsset).id; + assertEq(contracts.poolProxy.getUserConfiguration(alice).isUsingAsCollateral(id), true); + } + + function test_self_liquidate_isolated_position_shoulDisableCollateral() public { + uint256 borrowAmount = 11000e6; + vm.startPrank(poolAdmin); + contracts.poolConfiguratorProxy.setDebtCeiling(tokenList.wbtc, 12_000_00); + contracts.poolConfiguratorProxy.setBorrowableInIsolation(tokenList.usdx, true); + vm.stopPrank(); + + vm.startPrank(alice); + contracts.poolProxy.supply(tokenList.wbtc, 0.5e8, alice, 0); + contracts.poolProxy.setUserUseReserveAsCollateral(tokenList.wbtc, true); + contracts.poolProxy.borrow(tokenList.usdx, borrowAmount, 2, 0, alice); + vm.stopPrank(); + + LiquidationInput memory params = _loadLiquidationInput( + alice, + tokenList.wbtc, + tokenList.usdx, + UINT256_MAX, + tokenList.wbtc, + 40_00 + ); + params.receiveAToken = true; + + (, , address varDebtToken) = contracts.protocolDataProvider.getReserveTokensAddresses( + params.debtAsset + ); + + // Liquidate + vm.prank(alice); + contracts.poolProxy.liquidationCall( + params.collateralAsset, + params.debtAsset, + params.user, + type(uint256).max, + params.receiveAToken + ); + uint256 id = contracts.poolProxy.getReserveData(params.collateralAsset).id; + assertEq(contracts.poolProxy.getUserConfiguration(alice).isUsingAsCollateral(id), false); + } + function test_liquidate_emode_position_without_emode_oracle() public { EModeCategoryInput memory ct = _genCategoryOne(); From 05a2b55816993c7cdfb1c2b069fc775c3efd7611 Mon Sep 17 00:00:00 2001 From: Lukas Date: Thu, 31 Oct 2024 17:32:01 +0100 Subject: [PATCH 39/72] fix: add comment --- src/contracts/protocol/libraries/logic/LiquidationLogic.sol | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol index c539bdbc..5163155d 100644 --- a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -253,6 +253,8 @@ library LiquidationLogic { // If the collateral being liquidated is equal to the user balance, // we set the currency as not being used as collateral anymore + // For the special case of msg.sender == params.user (self liquidation) + // the collateral will only be disabled if it would not be automatically reenabled upon supplying if ( vars.actualCollateralToLiquidate + vars.liquidationProtocolFeeAmount == vars.userCollateralBalance && From 2d5ec46918c43fed010083b00a50be44adc05253 Mon Sep 17 00:00:00 2001 From: Lukas Date: Mon, 4 Nov 2024 12:56:49 +0100 Subject: [PATCH 40/72] Update src/contracts/protocol/libraries/logic/LiquidationLogic.sol Co-authored-by: Ernesto Boado --- src/contracts/protocol/libraries/logic/LiquidationLogic.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol index 5163155d..6b5f41a3 100644 --- a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -253,7 +253,7 @@ library LiquidationLogic { // If the collateral being liquidated is equal to the user balance, // we set the currency as not being used as collateral anymore - // For the special case of msg.sender == params.user (self liquidation) + // For the special case of msg.sender == params.user (self-liquidation) with aToken // the collateral will only be disabled if it would not be automatically reenabled upon supplying if ( vars.actualCollateralToLiquidate + vars.liquidationProtocolFeeAmount == From 73a23b9f586d78d5fe47dd009af471dd378112ed Mon Sep 17 00:00:00 2001 From: Lukas Date: Mon, 4 Nov 2024 13:19:53 +0100 Subject: [PATCH 41/72] fix: suppl 1 wei surplus --- tests/protocol/pool/Pool.Deficit.sol | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/protocol/pool/Pool.Deficit.sol b/tests/protocol/pool/Pool.Deficit.sol index 942220b3..8c980b56 100644 --- a/tests/protocol/pool/Pool.Deficit.sol +++ b/tests/protocol/pool/Pool.Deficit.sol @@ -32,11 +32,11 @@ contract PoolDeficitTests is TestnetProcedures { vm.prank(poolAdmin); contracts.poolAddressesProvider.setAddress(bytes32('UMBRELLA'), coverageAdmin); - deal(reserveToken, coverageAdmin, currentDeficit); + deal(reserveToken, coverageAdmin, currentDeficit + 1); vm.startPrank(coverageAdmin); IERC20(reserveToken).approve(report.poolProxy, UINT256_MAX); - contracts.poolProxy.supply(reserveToken, currentDeficit, coverageAdmin, 0); + contracts.poolProxy.supply(reserveToken, currentDeficit + 1, coverageAdmin, 0); // eliminate deficit vm.expectEmit(address(contracts.poolProxy)); @@ -57,11 +57,11 @@ contract PoolDeficitTests is TestnetProcedures { vm.prank(poolAdmin); contracts.poolAddressesProvider.setAddress(bytes32('UMBRELLA'), coverageAdmin); - deal(reserveToken, coverageAdmin, currentDeficit); + deal(reserveToken, coverageAdmin, currentDeficit + 1); vm.startPrank(coverageAdmin); IERC20(reserveToken).approve(report.poolProxy, UINT256_MAX); - contracts.poolProxy.supply(reserveToken, currentDeficit, coverageAdmin, 0); + contracts.poolProxy.supply(reserveToken, currentDeficit + 1, coverageAdmin, 0); // eliminate deficit vm.expectEmit(address(contracts.poolProxy)); From ffe466da97bbf7c2ece41a624745e2caa38a43bb Mon Sep 17 00:00:00 2001 From: Lukas Date: Tue, 5 Nov 2024 11:14:17 +0100 Subject: [PATCH 42/72] fix: remove non functional test --- tests/protocol/pool/Pool.Deficit.sol | 34 ---------------------------- 1 file changed, 34 deletions(-) diff --git a/tests/protocol/pool/Pool.Deficit.sol b/tests/protocol/pool/Pool.Deficit.sol index 942220b3..dbcddb41 100644 --- a/tests/protocol/pool/Pool.Deficit.sol +++ b/tests/protocol/pool/Pool.Deficit.sol @@ -69,40 +69,6 @@ contract PoolDeficitTests is TestnetProcedures { contracts.poolProxy.eliminateReserveDeficit(reserveToken, currentDeficit + 1000); } - function test_eliminateReserveDeficit_virtualAccDisabled( - address coverageAdmin, - uint80 supplyAmount - ) public { - supplyAmount = uint80(bound(supplyAmount, type(uint8).max, type(uint80).max)); - _filterAddresses(coverageAdmin); - (address reserveToken, uint256 currentDeficit) = _createReserveDeficit( - supplyAmount, - tokenList.gho - ); - - vm.prank(poolAdmin); - contracts.poolAddressesProvider.setAddress(bytes32('UMBRELLA'), coverageAdmin); - - deal(reserveToken, coverageAdmin, currentDeficit); - - vm.startPrank(coverageAdmin); - IERC20(reserveToken).approve(report.poolProxy, UINT256_MAX); - - // eliminate deficit - vm.expectCall( - contracts.poolProxy.getReserveAToken(tokenList.gho), - abi.encodeWithSelector( - IAToken.handleRepayment.selector, - address(coverageAdmin), - address(contracts.poolProxy), - currentDeficit - ) - ); - vm.expectEmit(address(contracts.poolProxy)); - emit DeficitCovered(reserveToken, coverageAdmin, currentDeficit); - contracts.poolProxy.eliminateReserveDeficit(reserveToken, currentDeficit); - } - function test_eliminateReserveDeficit_parcial( address coverageAdmin, uint120 supplyAmount, From 104a288094dbb56386363156b8b14de8f0a96d50 Mon Sep 17 00:00:00 2001 From: Lukas Date: Wed, 6 Nov 2024 10:13:16 +0100 Subject: [PATCH 43/72] Update src/contracts/protocol/libraries/logic/LiquidationLogic.sol Co-authored-by: Ernesto Boado --- src/contracts/protocol/libraries/logic/LiquidationLogic.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol index da0065e9..3c4674b6 100644 --- a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -459,7 +459,7 @@ library LiquidationLogic { if (!debtReserveCache.reserveConfiguration.getIsVirtualAccActive()) { uint256 accruedInterest = IGhoVariableDebtToken(debtReserveCache.variableDebtTokenAddress) .getBalanceFromInterest(user); - // HandleRepayment will first discount the protocol fee from an internal `accumulatedDebtInterest` variable + // handleRepayment() will first discount the protocol fee from an internal `accumulatedDebtInterest` variable // and then burn the excess GHO if (accruedInterest != 0 && accruedInterest > actualDebtToLiquidate) { // in order to clean the `accumulatedDebtInterest` storage the function will need to be called with the accruedInterest From b5163635b1d8a125d745cb33e7595104a5fec03f Mon Sep 17 00:00:00 2001 From: Lukas Date: Wed, 6 Nov 2024 10:13:22 +0100 Subject: [PATCH 44/72] Update src/contracts/protocol/libraries/logic/LiquidationLogic.sol Co-authored-by: Ernesto Boado --- src/contracts/protocol/libraries/logic/LiquidationLogic.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol index 3c4674b6..ec4ae127 100644 --- a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -466,7 +466,7 @@ library LiquidationLogic { // discounted by the actualDebtToLiquidate, as in the main flow `handleRepayment` will be called with actualDebtToLiquidate already uint256 amountToBurn = accruedInterest - actualDebtToLiquidate; // In the case of GHO, all obligations are to the protocol - // therefore the protocol assumes the losses on interest and only tracks the pure deficit by discounting be the not collected & burned debt + // therefore the protocol assumes the losses on interest and only tracks the pure deficit by discounting the not-collected & burned debt outstandingDebt -= amountToBurn; IAToken(debtReserveCache.aTokenAddress).handleRepayment(msg.sender, user, amountToBurn); } From 5ca633bf3440f9e9b46b0c7c1b17b2124687cb34 Mon Sep 17 00:00:00 2001 From: Lukas Date: Wed, 6 Nov 2024 10:15:45 +0100 Subject: [PATCH 45/72] docs: add explanatory comment --- .../protocol/libraries/logic/LiquidationLogic.sol | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol index ec4ae127..f3c1a19d 100644 --- a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -454,8 +454,18 @@ library LiquidationLogic { uint256 outstandingDebt = userReserveDebt - actualDebtToLiquidate; if (hasNoCollateralLeft && outstandingDebt != 0) { - // Special handling of GHO - // implicitly assuming that virtual acc !active == GHO, which is true + /** + * Special handling of GHO. Implicitly assuming that virtual acc !active == GHO, which is true. + * Scenario 1: The amount of GHO debt being liquidated is greater or equal to the GHO accrued interest. + * In this case, the outer handleRepayment will clear the storage and all additional operations can be skipped. + * Scenario 2: The amount of debt being liquidated is lower than the GHO accrued interest. + * In this case handleRepayment will be called with the difference required to clear the storage. + * If we assume a liquidation of n debt, and m accrued interest, the difference is k = m-n. + * Therefore we call handleRepayment(k). + * Additionally, as the dao (GHO issuer) accepts the loss on interest, we need to discount k from + * the deficit (via reducing outstandingDebt). + * Note: If a non GHO asset is liquidated and GHO bad debt is created in the process, Scenario 2 applies with n = 0. + */ if (!debtReserveCache.reserveConfiguration.getIsVirtualAccActive()) { uint256 accruedInterest = IGhoVariableDebtToken(debtReserveCache.variableDebtTokenAddress) .getBalanceFromInterest(user); From 0b21084877923496cac22ad0ea0b610b1e5cd0b5 Mon Sep 17 00:00:00 2001 From: Lukas Date: Wed, 6 Nov 2024 10:16:38 +0100 Subject: [PATCH 46/72] refactor: better remove test --- tests/protocol/pool/Pool.Liquidations.t.sol | 55 --------------------- 1 file changed, 55 deletions(-) diff --git a/tests/protocol/pool/Pool.Liquidations.t.sol b/tests/protocol/pool/Pool.Liquidations.t.sol index 0789f039..33fc77ab 100644 --- a/tests/protocol/pool/Pool.Liquidations.t.sol +++ b/tests/protocol/pool/Pool.Liquidations.t.sol @@ -898,61 +898,6 @@ contract PoolLiquidationTests is TestnetProcedures { ); } - // function test_deficit_increased_after_liquidate_bad_debt_virtualAccounting_disabled() public { - // uint256 supplyAmount = 0.5e8; - // uint256 borrowAmount = 11000e18; - // deal(tokenList.gho, bob, 100_000e18); - // vm.prank(bob); - // IERC20(tokenList.gho).approve(address(contracts.poolProxy), type(uint256).max); - // vm.startPrank(alice); - // contracts.poolProxy.supply(tokenList.wbtc, supplyAmount, alice, 0); - // contracts.poolProxy.borrow(tokenList.gho, borrowAmount, 2, 0, alice); - // vm.stopPrank(); - - // vm.warp(block.timestamp + 30 days); - // LiquidationInput memory params = _loadLiquidationInput( - // alice, - // tokenList.wbtc, - // tokenList.gho, - // UINT256_MAX, - // tokenList.wbtc, - // 20_00 - // ); - - // (, , address varDebtToken) = contracts.protocolDataProvider.getReserveTokensAddresses( - // params.debtAsset - // ); - // uint256 userDebtBefore = IERC20(varDebtToken).balanceOf(params.user); - // uint256 liquidatorBalanceBefore; - // if (params.receiveAToken) { - // (address atoken, , ) = contracts.protocolDataProvider.getReserveTokensAddresses( - // params.collateralAsset - // ); - // liquidatorBalanceBefore = IERC20(atoken).balanceOf(bob); - // } else { - // liquidatorBalanceBefore = IERC20(params.collateralAsset).balanceOf(bob); - // } - - // vm.expectEmit(address(contracts.poolProxy)); - // emit LiquidationLogic.DeficitCreated( - // params.user, - // tokenList.gho, - // userDebtBefore - params.actualDebtToLiquidate - // ); - // vm.prank(bob); - // contracts.poolProxy.liquidationCall( - // params.collateralAsset, - // params.debtAsset, - // params.user, - // params.liquidationAmountInput, - // params.receiveAToken - // ); - // assertEq( - // contracts.poolProxy.getReserveDeficit(tokenList.gho), - // userDebtBefore - params.actualDebtToLiquidate - // ); - // } - function _loadLiquidationInput( address user, address collateralAsset, From 707d652a7bb401932b1f80820b3889c05cfa877d Mon Sep 17 00:00:00 2001 From: Lukas Date: Wed, 6 Nov 2024 11:08:34 +0100 Subject: [PATCH 47/72] fix: clearify it's the interest on the bad debt only --- src/contracts/protocol/libraries/logic/LiquidationLogic.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol index f3c1a19d..ae1b20ce 100644 --- a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -462,8 +462,8 @@ library LiquidationLogic { * In this case handleRepayment will be called with the difference required to clear the storage. * If we assume a liquidation of n debt, and m accrued interest, the difference is k = m-n. * Therefore we call handleRepayment(k). - * Additionally, as the dao (GHO issuer) accepts the loss on interest, we need to discount k from - * the deficit (via reducing outstandingDebt). + * Additionally, as the dao (GHO issuer) accepts the loss on interest on the bad debt, + * we need to discount k from the deficit (via reducing outstandingDebt). * Note: If a non GHO asset is liquidated and GHO bad debt is created in the process, Scenario 2 applies with n = 0. */ if (!debtReserveCache.reserveConfiguration.getIsVirtualAccActive()) { From 1eb834b61e55709217672733c337560e16997cdc Mon Sep 17 00:00:00 2001 From: Lukas Date: Wed, 6 Nov 2024 11:27:38 +0100 Subject: [PATCH 48/72] docs: add a sentence to docs --- docs/3.3/Aave-v3.3-features.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/3.3/Aave-v3.3-features.md b/docs/3.3/Aave-v3.3-features.md index be4d046e..c6db5653 100644 --- a/docs/3.3/Aave-v3.3-features.md +++ b/docs/3.3/Aave-v3.3-features.md @@ -16,6 +16,7 @@ If an account ends up with zero collateral and non-zero debt, any remaining debt In terms of implementation, the feature checks whether the liquidation will result in a bad debt situation by comparing whether the total borrower’s collateral equals the collateral liquidated in the base currency. If the total borrower’s debt exceeds the debt repaid in base currency, the variable debt tokens of the borrower are burned, and it is accounted to the respective reserve as a deficit. +For technical reasons in the special case of GHO, the protocol will burn it's claims on accrued GHO-interest when burning bad debt. The new `deficit` data is introduced to the `ReserveData` struct by re-utilizing the deprecated stableBorrowRate (`__deprecatedStableBorrowRate`) storage, and can be fetched via the new `getReserveDeficit` function in the Pool contract. From d45702a3b21365cf32d501051bc93fb782b7b8f1 Mon Sep 17 00:00:00 2001 From: Lukas Date: Wed, 6 Nov 2024 11:39:28 +0100 Subject: [PATCH 49/72] docs: improve docs --- docs/3.3/Aave-v3.3-features.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/3.3/Aave-v3.3-features.md b/docs/3.3/Aave-v3.3-features.md index c6db5653..cd8181a2 100644 --- a/docs/3.3/Aave-v3.3-features.md +++ b/docs/3.3/Aave-v3.3-features.md @@ -16,7 +16,12 @@ If an account ends up with zero collateral and non-zero debt, any remaining debt In terms of implementation, the feature checks whether the liquidation will result in a bad debt situation by comparing whether the total borrower’s collateral equals the collateral liquidated in the base currency. If the total borrower’s debt exceeds the debt repaid in base currency, the variable debt tokens of the borrower are burned, and it is accounted to the respective reserve as a deficit. -For technical reasons in the special case of GHO, the protocol will burn it's claims on accrued GHO-interest when burning bad debt. + +The vGHO token, opposed to the usual variable debt token, maintains a custom storage per user debt, to track the amount of debt that on repayment will be redirected to the treasury. +When calling `GHO.handleRepay(amount)` the fee to the treasury will be discounted from amount and the rest will be burned. +In the case of bad debt burning the vGHO token will be burned, but no corresponding GHO will be repayed just yet. +Therefore this would leave users with zero balance, but a pending accrued fee storage. +To solve that situation, the protocol will burn it's claims on accrued GHO-interest when burning bad debt by resetting the accrued fee storage to zero. The new `deficit` data is introduced to the `ReserveData` struct by re-utilizing the deprecated stableBorrowRate (`__deprecatedStableBorrowRate`) storage, and can be fetched via the new `getReserveDeficit` function in the Pool contract. From bacdbf0d6f71d7c4d027cbb0b50b587c428f2e2d Mon Sep 17 00:00:00 2001 From: Lukas Date: Wed, 13 Nov 2024 10:21:09 +0100 Subject: [PATCH 50/72] fix: dont disable collateral alternative --- .../libraries/logic/LiquidationLogic.sol | 22 ++++----- tests/protocol/pool/Pool.Liquidations.t.sol | 45 +++++++++++++++++++ 2 files changed, 54 insertions(+), 13 deletions(-) diff --git a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol index 6b5f41a3..49662178 100644 --- a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -253,20 +253,9 @@ library LiquidationLogic { // If the collateral being liquidated is equal to the user balance, // we set the currency as not being used as collateral anymore - // For the special case of msg.sender == params.user (self-liquidation) with aToken - // the collateral will only be disabled if it would not be automatically reenabled upon supplying if ( vars.actualCollateralToLiquidate + vars.liquidationProtocolFeeAmount == - vars.userCollateralBalance && - !(msg.sender == params.user && - params.receiveAToken && - ValidationLogic.validateAutomaticUseAsCollateral( - reservesData, - reservesList, - userConfig, - collateralReserve.configuration, - address(vars.collateralAToken) - )) + vars.userCollateralBalance ) { userConfig.setUsingAsCollateral(collateralReserve.id, false); emit ReserveUsedAsCollateralDisabled(params.collateralAsset, params.user); @@ -407,7 +396,14 @@ library LiquidationLogic { vars.actualCollateralToLiquidate ); - if (liquidatorPreviousATokenBalance == 0) { + if ( + liquidatorPreviousATokenBalance == 0 || + // For the special case of msg.sender == params.user (self-liquidation) the liquidatorPreviousATokenBalance + // will not yet be 0, but the liquidation will result in collateral being fully liquidated and then resupplied. + (msg.sender == params.user && + vars.actualCollateralToLiquidate + vars.liquidationProtocolFeeAmount == + vars.userCollateralBalance) + ) { DataTypes.UserConfigurationMap storage liquidatorConfig = usersConfig[msg.sender]; if ( ValidationLogic.validateAutomaticUseAsCollateral( diff --git a/tests/protocol/pool/Pool.Liquidations.t.sol b/tests/protocol/pool/Pool.Liquidations.t.sol index ba7b4a3d..5cc3ff72 100644 --- a/tests/protocol/pool/Pool.Liquidations.t.sol +++ b/tests/protocol/pool/Pool.Liquidations.t.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.0; import 'forge-std/Test.sol'; +import {IAccessControl} from '../../../src/contracts/dependencies/openzeppelin/contracts/IAccessControl.sol'; import {IVariableDebtToken} from '../../../src/contracts/interfaces/IVariableDebtToken.sol'; import {IAaveOracle} from '../../../src/contracts/interfaces/IAaveOracle.sol'; import {IPriceOracleGetter} from '../../../src/contracts/interfaces/IPriceOracleGetter.sol'; @@ -729,6 +730,50 @@ contract PoolLiquidationTests is TestnetProcedures { assertEq(contracts.poolProxy.getUserConfiguration(alice).isUsingAsCollateral(id), false); } + function test_self_liquidate_isolated_position_shoulEnableCollateralIfIsolatedSupplier() public { + uint256 borrowAmount = 11000e6; + vm.startPrank(poolAdmin); + IAccessControl(address(contracts.aclManager)).grantRole( + keccak256('ISOLATED_COLLATERAL_SUPPLIER'), + alice + ); + contracts.poolConfiguratorProxy.setDebtCeiling(tokenList.wbtc, 12_000_00); + contracts.poolConfiguratorProxy.setBorrowableInIsolation(tokenList.usdx, true); + vm.stopPrank(); + + vm.startPrank(alice); + contracts.poolProxy.supply(tokenList.wbtc, 0.5e8, alice, 0); + contracts.poolProxy.setUserUseReserveAsCollateral(tokenList.wbtc, true); + contracts.poolProxy.borrow(tokenList.usdx, borrowAmount, 2, 0, alice); + vm.stopPrank(); + + LiquidationInput memory params = _loadLiquidationInput( + alice, + tokenList.wbtc, + tokenList.usdx, + UINT256_MAX, + tokenList.wbtc, + 40_00 + ); + params.receiveAToken = true; + + (, , address varDebtToken) = contracts.protocolDataProvider.getReserveTokensAddresses( + params.debtAsset + ); + + // Liquidate + vm.prank(alice); + contracts.poolProxy.liquidationCall( + params.collateralAsset, + params.debtAsset, + params.user, + type(uint256).max, + params.receiveAToken + ); + uint256 id = contracts.poolProxy.getReserveData(params.collateralAsset).id; + assertEq(contracts.poolProxy.getUserConfiguration(alice).isUsingAsCollateral(id), true); + } + function test_liquidate_emode_position_without_emode_oracle() public { EModeCategoryInput memory ct = _genCategoryOne(); From 38e0b156ae6d59373717eb37c3ac2c3ed25e3544 Mon Sep 17 00:00:00 2001 From: Lukas Date: Mon, 18 Nov 2024 10:12:25 +0100 Subject: [PATCH 51/72] docs: clearify docs --- .../libraries/configuration/ReserveConfiguration.sol | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol b/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol index 52f9c725..a618342c 100644 --- a/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol +++ b/src/contracts/protocol/libraries/configuration/ReserveConfiguration.sol @@ -511,7 +511,10 @@ library ReserveConfiguration { /** * @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. + * Virtual accounting being disabled means that the asset: + * - is GHO + * - can never be supplied + * - the interest rate strategy is not influenced by the virtual balance * @param self The reserve configuration * @return The active state */ From 2a59531c8859e77b140f720281ad399865f2da71 Mon Sep 17 00:00:00 2001 From: Lukas Date: Mon, 18 Nov 2024 10:18:00 +0100 Subject: [PATCH 52/72] fix: address comments by stermi docs: alter comment fix: refine comment fix: layout fix: remove imprecise sentence fix: spell check fix: revert lib changes --- docs/3.3/Aave-v3.3-features.md | 16 +++++++++++----- .../libraries/logic/LiquidationLogic.sol | 2 +- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/docs/3.3/Aave-v3.3-features.md b/docs/3.3/Aave-v3.3-features.md index cd8181a2..aaf25e79 100644 --- a/docs/3.3/Aave-v3.3-features.md +++ b/docs/3.3/Aave-v3.3-features.md @@ -17,11 +17,17 @@ If an account ends up with zero collateral and non-zero debt, any remaining debt In terms of implementation, the feature checks whether the liquidation will result in a bad debt situation by comparing whether the total borrower’s collateral equals the collateral liquidated in the base currency. If the total borrower’s debt exceeds the debt repaid in base currency, the variable debt tokens of the borrower are burned, and it is accounted to the respective reserve as a deficit. -The vGHO token, opposed to the usual variable debt token, maintains a custom storage per user debt, to track the amount of debt that on repayment will be redirected to the treasury. -When calling `GHO.handleRepay(amount)` the fee to the treasury will be discounted from amount and the rest will be burned. -In the case of bad debt burning the vGHO token will be burned, but no corresponding GHO will be repayed just yet. -Therefore this would leave users with zero balance, but a pending accrued fee storage. -To solve that situation, the protocol will burn it's claims on accrued GHO-interest when burning bad debt by resetting the accrued fee storage to zero. +Conceptually the bad debt cleanup is seen as step **after** the actual liquidation. +In the special case of vGHO, the liquidation process is split into two steps: +1. vGHO.burn, burning the variable debt token. +2. `aGHO.handleRepayment(address user, address onBehalfOf, uint256 amount)` which will first discount the fee from the amount as this is the part that belongs to the treasury and then burn the remaining GHO. + +When a deficit is created in GHO, there is the possibility that the no fee or only part of the fee is repaid to the treasury, but in any case, all corresponding vGHO is burned. +This would leave the protocol in an inconsistent state as the user would have stale accrued fee storage, but no more debt so the accrued fee will likely never be redirected to the treasury. +Therefore in order to maintain proper accounting and not leave users with stale fee storage on the vGHO token, the protocol will reset the accrued fee storage on the vGHO token when burning bad debt and discount the created deficit accordingly. +In practice, this means the protocol will burn the claims / accept the loss on the accrued fee when burning bad debt. +It is important to note, that this only applies to the **bad debt** part of the liquidation. +If GHO is the liquidated asset, it is possible that part of the fee or even the full fee is repaid to the treasury. The new `deficit` data is introduced to the `ReserveData` struct by re-utilizing the deprecated stableBorrowRate (`__deprecatedStableBorrowRate`) storage, and can be fetched via the new `getReserveDeficit` function in the Pool contract. diff --git a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol index ae1b20ce..eabd5df1 100644 --- a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -464,7 +464,7 @@ library LiquidationLogic { * Therefore we call handleRepayment(k). * Additionally, as the dao (GHO issuer) accepts the loss on interest on the bad debt, * we need to discount k from the deficit (via reducing outstandingDebt). - * Note: If a non GHO asset is liquidated and GHO bad debt is created in the process, Scenario 2 applies with n = 0. + * Note: If a non GHO asset is liquidated and GHO bad debt is created in the process, Scenario 2 applies with n = 0. */ if (!debtReserveCache.reserveConfiguration.getIsVirtualAccActive()) { uint256 accruedInterest = IGhoVariableDebtToken(debtReserveCache.variableDebtTokenAddress) From e741c4df95c0e7343442c32d03ce61c121f885b7 Mon Sep 17 00:00:00 2001 From: Lukas Date: Mon, 18 Nov 2024 23:57:19 +0100 Subject: [PATCH 53/72] lint: lint markdown --- docs/3.3/Aave-v3.3-features.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/3.3/Aave-v3.3-features.md b/docs/3.3/Aave-v3.3-features.md index aaf25e79..7c895c0b 100644 --- a/docs/3.3/Aave-v3.3-features.md +++ b/docs/3.3/Aave-v3.3-features.md @@ -19,6 +19,7 @@ If the total borrower’s debt exceeds the debt repaid in base currency, the var Conceptually the bad debt cleanup is seen as step **after** the actual liquidation. In the special case of vGHO, the liquidation process is split into two steps: + 1. vGHO.burn, burning the variable debt token. 2. `aGHO.handleRepayment(address user, address onBehalfOf, uint256 amount)` which will first discount the fee from the amount as this is the part that belongs to the treasury and then burn the remaining GHO. From 665b480ab89a62b0b3b9dbab21479292b3142772 Mon Sep 17 00:00:00 2001 From: Lukas Date: Tue, 19 Nov 2024 21:28:24 +0100 Subject: [PATCH 54/72] feat: update to use new proxy & change stata naming (#75) --- certora/stata/harness/StataTokenV2Harness.sol | 2 +- lib/solidity-utils | 2 +- .../stata-token/StataTokenFactory.sol | 20 ++++++----- .../interfaces/IStataTokenFactory.sol | 27 +++++++++++++++ .../procedures/AaveV3HelpersProcedureTwo.sol | 4 +-- .../procedures/AaveV3SetupProcedure.sol | 14 ++++---- .../procedures/AaveV3TreasuryProcedure.sol | 5 ++- src/deployments/interfaces/IProxyAdmin.sol | 34 ------------------- .../batches/AaveV3PeripheryBatch.sol | 6 ++-- .../stata-token/StataTokenV2Getters.sol | 4 +-- .../stata-token/StataTokenV2Rescuable.sol | 2 -- tests/extensions/stata-token/TestBase.sol | 8 ----- 12 files changed, 56 insertions(+), 72 deletions(-) delete mode 100644 src/deployments/interfaces/IProxyAdmin.sol diff --git a/certora/stata/harness/StataTokenV2Harness.sol b/certora/stata/harness/StataTokenV2Harness.sol index 8b61aec7..1c552930 100644 --- a/certora/stata/harness/StataTokenV2Harness.sol +++ b/certora/stata/harness/StataTokenV2Harness.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.10; import {IERC20} from 'openzeppelin-contracts/contracts/interfaces/IERC20.sol'; -import {StataTokenV2, IPool, IRewardsController} from '../munged/src/contracts/extensions/static-a-token/StataTokenV2.sol'; +import {StataTokenV2, IPool, IRewardsController} from '../munged/src/contracts/extensions/stata-token/StataTokenV2.sol'; import {SymbolicLendingPool} from './pool/SymbolicLendingPool.sol'; contract StataTokenV2Harness is StataTokenV2 { diff --git a/lib/solidity-utils b/lib/solidity-utils index b3c5def7..55d9b81d 160000 --- a/lib/solidity-utils +++ b/lib/solidity-utils @@ -1 +1 @@ -Subproject commit b3c5def7c72b1fc9a1d20e7f2b67feb55e652a06 +Subproject commit 55d9b81d2ea8b0a78b85a46b343f64a979f543da diff --git a/src/contracts/extensions/stata-token/StataTokenFactory.sol b/src/contracts/extensions/stata-token/StataTokenFactory.sol index 5ca2bb28..3de7890a 100644 --- a/src/contracts/extensions/stata-token/StataTokenFactory.sol +++ b/src/contracts/extensions/stata-token/StataTokenFactory.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.10; import {IERC20Metadata} from 'solidity-utils/contracts/oz-common/interfaces/IERC20Metadata.sol'; -import {ITransparentProxyFactory} from 'solidity-utils/contracts/transparent-proxy/interfaces/ITransparentProxyFactory.sol'; +import {ITransparentProxyFactory, ProxyAdmin} from 'solidity-utils/contracts/transparent-proxy/interfaces/ITransparentProxyFactory.sol'; import {Initializable} from 'solidity-utils/contracts/transparent-proxy/Initializable.sol'; import {IPool, DataTypes} from '../../../contracts/interfaces/IPool.sol'; import {StataTokenV2} from './StataTokenV2.sol'; @@ -16,9 +16,16 @@ import {IStataTokenFactory} from './interfaces/IStataTokenFactory.sol'; * @author BGD labs */ contract StataTokenFactory is Initializable, IStataTokenFactory { + ///@inheritdoc IStataTokenFactory IPool public immutable POOL; + + ///@inheritdoc IStataTokenFactory address public immutable PROXY_ADMIN; + + ///@inheritdoc IStataTokenFactory ITransparentProxyFactory public immutable TRANSPARENT_PROXY_FACTORY; + + ///@inheritdoc IStataTokenFactory address public immutable STATA_TOKEN_IMPL; mapping(address => address) internal _underlyingToStataToken; @@ -50,19 +57,16 @@ contract StataTokenFactory is Initializable, IStataTokenFactory { if (reserveData.aTokenAddress == address(0)) revert NotListedUnderlying(reserveData.aTokenAddress); bytes memory symbol = abi.encodePacked( - 'stat', - IERC20Metadata(reserveData.aTokenAddress).symbol(), - 'v2' + 'w', + IERC20Metadata(reserveData.aTokenAddress).symbol() ); address stataToken = TRANSPARENT_PROXY_FACTORY.createDeterministic( STATA_TOKEN_IMPL, - PROXY_ADMIN, + ProxyAdmin(PROXY_ADMIN), abi.encodeWithSelector( StataTokenV2.initialize.selector, reserveData.aTokenAddress, - string( - abi.encodePacked('Static ', IERC20Metadata(reserveData.aTokenAddress).name(), ' v2') - ), + string(abi.encodePacked('Wrapped ', IERC20Metadata(reserveData.aTokenAddress).name())), string(symbol) ), bytes32(uint256(uint160(underlyings[i]))) diff --git a/src/contracts/extensions/stata-token/interfaces/IStataTokenFactory.sol b/src/contracts/extensions/stata-token/interfaces/IStataTokenFactory.sol index 2eaf187b..5566d023 100644 --- a/src/contracts/extensions/stata-token/interfaces/IStataTokenFactory.sol +++ b/src/contracts/extensions/stata-token/interfaces/IStataTokenFactory.sol @@ -1,9 +1,36 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.10; +import {ITransparentProxyFactory} from 'solidity-utils/contracts/transparent-proxy/interfaces/ITransparentProxyFactory.sol'; +import {IPool, IPoolAddressesProvider} from '../../../interfaces/IPool.sol'; + interface IStataTokenFactory { error NotListedUnderlying(address underlying); + /** + * @notice The pool associated with the factory. + * @return The pool address. + */ + function POOL() external view returns (IPool); + + /** + * @notice The proxy admin used for all tokens created via the factory. + * @return The proxy admin address. + */ + function PROXY_ADMIN() external view returns (address); + + /** + * @notice The proxy factory used for all tokens created via the stata factory. + * @return The proxy factory address. + */ + function TRANSPARENT_PROXY_FACTORY() external view returns (ITransparentProxyFactory); + + /** + * @notice The stata implementation used for all tokens created via the factory. + * @return The implementation address. + */ + function STATA_TOKEN_IMPL() external view returns (address); + /** * @notice Creates new StataTokens * @param underlyings the addresses of the underlyings to create. diff --git a/src/deployments/contracts/procedures/AaveV3HelpersProcedureTwo.sol b/src/deployments/contracts/procedures/AaveV3HelpersProcedureTwo.sol index 99a9b5a1..12890f5d 100644 --- a/src/deployments/contracts/procedures/AaveV3HelpersProcedureTwo.sol +++ b/src/deployments/contracts/procedures/AaveV3HelpersProcedureTwo.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.0; import '../../interfaces/IMarketReportTypes.sol'; -import {ITransparentProxyFactory} from 'solidity-utils/contracts/transparent-proxy/interfaces/ITransparentProxyFactory.sol'; +import {ITransparentProxyFactory, ProxyAdmin} from 'solidity-utils/contracts/transparent-proxy/interfaces/ITransparentProxyFactory.sol'; import {TransparentProxyFactory} from 'solidity-utils/contracts/transparent-proxy/TransparentProxyFactory.sol'; import {StataTokenV2} from '../../../contracts/extensions/stata-token/StataTokenV2.sol'; import {StataTokenFactory} from '../../../contracts/extensions/stata-token/StataTokenFactory.sol'; @@ -33,7 +33,7 @@ contract AaveV3HelpersProcedureTwo is IErrors { staticATokenReport.transparentProxyFactory ).create( staticATokenReport.staticATokenFactoryImplementation, - proxyAdmin, + ProxyAdmin(proxyAdmin), abi.encodeWithSelector(StataTokenFactory.initialize.selector) ); diff --git a/src/deployments/contracts/procedures/AaveV3SetupProcedure.sol b/src/deployments/contracts/procedures/AaveV3SetupProcedure.sol index 481bbd5d..8e6357fe 100644 --- a/src/deployments/contracts/procedures/AaveV3SetupProcedure.sol +++ b/src/deployments/contracts/procedures/AaveV3SetupProcedure.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.0; import '../../interfaces/IMarketReportTypes.sol'; -import {IOwnable} from 'solidity-utils/contracts/transparent-proxy/interfaces/IOwnable.sol'; +import {Ownable} from '../../../contracts/dependencies/openzeppelin/contracts/Ownable.sol'; import {ACLManager} from '../../../contracts/protocol/configuration/ACLManager.sol'; import {IPoolConfigurator} from '../../../contracts/interfaces/IPoolConfigurator.sol'; import {IPoolAddressesProvider} from '../../../contracts/interfaces/IPoolAddressesProvider.sol'; @@ -99,7 +99,7 @@ contract AaveV3SetupProcedure { poolAddressesProvider, providerId ); - IOwnable(poolAddressesProviderRegistry).transferOwnership(marketOwner); + Ownable(poolAddressesProviderRegistry).transferOwnership(marketOwner); } else { poolAddressesProviderRegistry = providerRegistry; } @@ -137,7 +137,7 @@ contract AaveV3SetupProcedure { IRewardsController(report.rewardsControllerProxy).EMISSION_MANAGER() ); emissionManager.setRewardsController(report.rewardsControllerProxy); - IOwnable(address(emissionManager)).transferOwnership(input.poolAdmin); + Ownable(address(emissionManager)).transferOwnership(input.poolAdmin); } else { provider.setAddress(controllerId, input.rewardsControllerProxy); report.rewardsControllerProxy = provider.getAddress(controllerId); @@ -199,15 +199,15 @@ contract AaveV3SetupProcedure { } function _transferMarketOwnership(Roles memory roles, InitialReport memory report) internal { - address addressesProviderOwner = IOwnable(report.poolAddressesProvider).owner(); - address marketOwner = IOwnable(report.poolAddressesProviderRegistry).owner(); + address addressesProviderOwner = Ownable(report.poolAddressesProvider).owner(); + address marketOwner = Ownable(report.poolAddressesProviderRegistry).owner(); if (addressesProviderOwner == address(this)) { - IOwnable(report.poolAddressesProvider).transferOwnership(roles.marketOwner); + Ownable(report.poolAddressesProvider).transferOwnership(roles.marketOwner); } if (marketOwner == address(this)) { - IOwnable(report.poolAddressesProviderRegistry).transferOwnership(roles.marketOwner); + Ownable(report.poolAddressesProviderRegistry).transferOwnership(roles.marketOwner); } } diff --git a/src/deployments/contracts/procedures/AaveV3TreasuryProcedure.sol b/src/deployments/contracts/procedures/AaveV3TreasuryProcedure.sol index f904f559..76f6650b 100644 --- a/src/deployments/contracts/procedures/AaveV3TreasuryProcedure.sol +++ b/src/deployments/contracts/procedures/AaveV3TreasuryProcedure.sol @@ -3,7 +3,6 @@ pragma solidity ^0.8.0; import {ProxyAdmin} from 'solidity-utils/contracts/transparent-proxy/ProxyAdmin.sol'; import {TransparentUpgradeableProxy} from 'solidity-utils/contracts/transparent-proxy/TransparentUpgradeableProxy.sol'; -import {IOwnable} from 'solidity-utils/contracts/transparent-proxy/interfaces/IOwnable.sol'; import {Collector} from '../../../contracts/treasury/Collector.sol'; import '../../interfaces/IMarketReportTypes.sol'; @@ -30,7 +29,7 @@ contract AaveV3TreasuryProcedure { treasuryReport.treasury = address( new TransparentUpgradeableProxy{salt: salt}( treasuryReport.treasuryImplementation, - deployedProxyAdmin, + ProxyAdmin(deployedProxyAdmin), abi.encodeWithSelector( treasuryImplementation.initialize.selector, address(treasuryOwner), @@ -46,7 +45,7 @@ contract AaveV3TreasuryProcedure { treasuryReport.treasury = address( new TransparentUpgradeableProxy( treasuryReport.treasuryImplementation, - deployedProxyAdmin, + ProxyAdmin(deployedProxyAdmin), abi.encodeWithSelector( treasuryImplementation.initialize.selector, address(treasuryOwner), diff --git a/src/deployments/interfaces/IProxyAdmin.sol b/src/deployments/interfaces/IProxyAdmin.sol deleted file mode 100644 index 819ad7f9..00000000 --- a/src/deployments/interfaces/IProxyAdmin.sol +++ /dev/null @@ -1,34 +0,0 @@ -/** - * @dev OpenZeppelin Contracts v4.4.1 (proxy/transparent/ProxyAdmin.sol) - * From https://github.com/OpenZeppelin/openzeppelin-contracts/tree/8b778fa20d6d76340c5fac1ed66c80273f05b95a - * - * BGD Labs adaptations: - * - Linting - */ - -pragma solidity ^0.8.0; - -import 'solidity-utils/contracts/transparent-proxy/TransparentUpgradeableProxy.sol'; -import 'solidity-utils/contracts/transparent-proxy/interfaces/IOwnable.sol'; - -/** - * @dev This is an auxiliary contract meant to be assigned as the admin of a {TransparentUpgradeableProxy}. For an - * explanation of why you would want to use this see the documentation for {TransparentUpgradeableProxy}. - */ -interface IProxyAdmin is IOwnable { - function getProxyImplementation( - TransparentUpgradeableProxy proxy - ) external view returns (address); - - function getProxyAdmin(TransparentUpgradeableProxy proxy) external view returns (address); - - function changeProxyAdmin(TransparentUpgradeableProxy proxy, address newAdmin) external; - - function upgrade(TransparentUpgradeableProxy proxy, address implementation) external; - - function upgradeAndCall( - TransparentUpgradeableProxy proxy, - address implementation, - bytes memory data - ) external payable; -} diff --git a/src/deployments/projects/aave-v3-batched/batches/AaveV3PeripheryBatch.sol b/src/deployments/projects/aave-v3-batched/batches/AaveV3PeripheryBatch.sol index bf02940b..ce332dfe 100644 --- a/src/deployments/projects/aave-v3-batched/batches/AaveV3PeripheryBatch.sol +++ b/src/deployments/projects/aave-v3-batched/batches/AaveV3PeripheryBatch.sol @@ -5,10 +5,9 @@ import {AaveV3TreasuryProcedure} from '../../../contracts/procedures/AaveV3Treas import {AaveV3OracleProcedure} from '../../../contracts/procedures/AaveV3OracleProcedure.sol'; import {AaveV3IncentiveProcedure} from '../../../contracts/procedures/AaveV3IncentiveProcedure.sol'; import {AaveV3DefaultRateStrategyProcedure} from '../../../contracts/procedures/AaveV3DefaultRateStrategyProcedure.sol'; -import {IOwnable} from 'solidity-utils/contracts/transparent-proxy/interfaces/IOwnable.sol'; +import {Ownable} from '../../../../contracts/dependencies/openzeppelin/contracts/Ownable.sol'; import '../../../interfaces/IMarketReportTypes.sol'; import {IRewardsController} from '../../../../contracts/rewards/interfaces/IRewardsController.sol'; -import {IOwnable} from 'solidity-utils/contracts/transparent-proxy/interfaces/IOwnable.sol'; import {RevenueSplitter} from '../../../../contracts/treasury/RevenueSplitter.sol'; contract AaveV3PeripheryBatch is @@ -25,8 +24,7 @@ contract AaveV3PeripheryBatch is address setupBatch ) { if (config.proxyAdmin == address(0)) { - _report.proxyAdmin = address(new ProxyAdmin{salt: config.salt}()); - IOwnable(_report.proxyAdmin).transferOwnership(poolAdmin); + _report.proxyAdmin = address(new ProxyAdmin{salt: config.salt}(poolAdmin)); } else { _report.proxyAdmin = config.proxyAdmin; } diff --git a/tests/extensions/stata-token/StataTokenV2Getters.sol b/tests/extensions/stata-token/StataTokenV2Getters.sol index 4e151c27..c329b247 100644 --- a/tests/extensions/stata-token/StataTokenV2Getters.sol +++ b/tests/extensions/stata-token/StataTokenV2Getters.sol @@ -16,8 +16,8 @@ contract StataTokenV2GettersTest is BaseTest { } function test_getters() public view { - assertEq(stataTokenV2.name(), 'Static Aave Local WETH v2'); - assertEq(stataTokenV2.symbol(), 'stataLocWETHv2'); + assertEq(stataTokenV2.name(), 'Wrapped Aave Local WETH'); + assertEq(stataTokenV2.symbol(), 'waLocWETH'); address referenceAsset = stataTokenV2.getReferenceAsset(); assertEq(referenceAsset, aToken); diff --git a/tests/extensions/stata-token/StataTokenV2Rescuable.sol b/tests/extensions/stata-token/StataTokenV2Rescuable.sol index 652e72f1..e8ccad49 100644 --- a/tests/extensions/stata-token/StataTokenV2Rescuable.sol +++ b/tests/extensions/stata-token/StataTokenV2Rescuable.sol @@ -44,8 +44,6 @@ contract StataTokenV2RescuableTest is BaseTest { _fundAToken(donation, address(stataTokenV2)); _fund4626(stake, address(this)); - address treasury = IAToken(aToken).RESERVE_TREASURY_ADDRESS(); - vm.expectEmit(true, true, true, true); emit ERC20Rescued(poolAdmin, aToken, address(this), donation); vm.startPrank(poolAdmin); diff --git a/tests/extensions/stata-token/TestBase.sol b/tests/extensions/stata-token/TestBase.sol index 36457337..e7cfab41 100644 --- a/tests/extensions/stata-token/TestBase.sol +++ b/tests/extensions/stata-token/TestBase.sol @@ -64,14 +64,6 @@ abstract contract BaseTest is TestnetProcedures { vm.warp(block.timestamp + blocks * 12); // assuming a block is around 12seconds } - function testAdmin() public { - vm.stopPrank(); - vm.startPrank(proxyAdmin); - assertEq(TransparentUpgradeableProxy(payable(address(stataTokenV2))).admin(), proxyAdmin); - assertEq(TransparentUpgradeableProxy(payable(address(factory))).admin(), proxyAdmin); - vm.stopPrank(); - } - function _fundUnderlying(uint256 assets, address receiver) internal { deal(underlying, receiver, assets); } From 2edfb979d2bc6c472032e502a3879db17c41e351 Mon Sep 17 00:00:00 2001 From: Lukas Date: Wed, 20 Nov 2024 15:49:04 +0100 Subject: [PATCH 55/72] fix: fixing fv failures after code update & upgrade ci (#76) (#77) Co-authored-by: Michael Morami <91594326+MichaelMorami@users.noreply.github.com> Co-authored-by: Nissan Levi <124057587+nisnislevi@users.noreply.github.com> --- .github/workflows/certora-basic.yml | 21 +++++------- .github/workflows/certora-stata.yml | 10 +++--- certora/basic/scripts/run-all.sh | 6 +++- certora/basic/specs/EModeConfiguration.spec | 33 +++++++++++++++---- certora/basic/specs/stableRemoved.spec | 4 +-- certora/stata/applyHarness.patch | 12 +++---- .../extensions/stata-token/README.md | 2 +- 7 files changed, 53 insertions(+), 35 deletions(-) diff --git a/.github/workflows/certora-basic.yml b/.github/workflows/certora-basic.yml index 4e418d0e..c3641210 100644 --- a/.github/workflows/certora-basic.yml +++ b/.github/workflows/certora-basic.yml @@ -25,21 +25,16 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Check key - env: - CERTORAKEY: ${{ secrets.CERTORAKEY }} - run: echo "key length" ${#CERTORAKEY} - - name: Install python - uses: actions/setup-python@v2 + uses: actions/setup-python@v5 with: { python-version: 3.9 } - name: Install java - uses: actions/setup-java@v1 - with: { java-version: "11", java-package: jre } + uses: actions/setup-java@v4 + with: { distribution: "zulu", java-version: "11", java-package: jre } - name: Install certora cli - run: pip install certora-cli==7.14.2 + run: pip install certora-cli==7.17.2 - name: Install solc run: | @@ -75,7 +70,7 @@ jobs: - NEW-pool-simple-properties.conf --rule cannotDepositZeroAmount --msg "cannotDepositZeroAmount" - NEW-pool-simple-properties.conf --rule cannotWithdrawZeroAmount --msg "cannotWithdrawZeroAmount" - NEW-pool-simple-properties.conf --rule cannotWithdrawFromInactiveReserve --msg "cannotWithdrawFromInactiveReserve" - - NEW-pool-simple-properties.conf --rule cannotBorrowZeroAmount --msg "cannotBorrowZeroAmount" - - NEW-pool-simple-properties.conf --rule cannotBorrowOnInactiveReserve --msg "cannotBorrowOnInactiveReserve" - - NEW-pool-simple-properties.conf --rule cannotBorrowOnReserveDisabledForBorrowing --msg "cannotBorrowOnReserveDisabledForBorrowing" - - NEW-pool-simple-properties.conf --rule cannotBorrowOnFrozenReserve --msg "cannotBorrowOnFrozenReserve" + - NEW-pool-simple-properties.conf --rule_sanity none --rule cannotBorrowZeroAmount --msg "cannotBorrowZeroAmount" + - NEW-pool-simple-properties.conf --rule_sanity none --rule cannotBorrowOnInactiveReserve --msg "cannotBorrowOnInactiveReserve" + - NEW-pool-simple-properties.conf --rule_sanity none --rule cannotBorrowOnReserveDisabledForBorrowing --msg "cannotBorrowOnReserveDisabledForBorrowing" + - NEW-pool-simple-properties.conf --rule_sanity none --rule cannotBorrowOnFrozenReserve --msg "cannotBorrowOnFrozenReserve" diff --git a/.github/workflows/certora-stata.yml b/.github/workflows/certora-stata.yml index f01da4fd..4a451edd 100644 --- a/.github/workflows/certora-stata.yml +++ b/.github/workflows/certora-stata.yml @@ -18,20 +18,20 @@ jobs: github.ref == format('refs/heads/{0}', github.event.repository.default_branch)) steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: submodules: recursive - name: Install python - uses: actions/setup-python@v2 + uses: actions/setup-python@v5 with: { python-version: 3.9 } - name: Install java - uses: actions/setup-java@v1 - with: { java-version: "11", java-package: jre } + uses: actions/setup-java@v4 + with: { distribution: "zulu", java-version: "11", java-package: jre } - name: Install certora cli - run: pip install certora-cli==7.14.2 + run: pip install certora-cli==7.17.2 - name: Install solc run: | wget https://github.com/ethereum/solidity/releases/download/v0.8.20/solc-static-linux diff --git a/certora/basic/scripts/run-all.sh b/certora/basic/scripts/run-all.sh index 3185e1d3..6d49ffef 100644 --- a/certora/basic/scripts/run-all.sh +++ b/certora/basic/scripts/run-all.sh @@ -1,4 +1,4 @@ -CMN="--compilation_steps_only" +#CMN="--compilation_steps_only" #CMN="--typecheck_only" @@ -72,24 +72,28 @@ echo echo "******** Running: simple:6 ***************" certoraRun $CMN certora/basic/conf/NEW-pool-simple-properties.conf \ --rule cannotBorrowZeroAmount \ + --rule_sanity none \ --msg "simple:6: NEW :: cannotBorrowZeroAmount" echo echo "******** Running: simple:7 ***************" certoraRun $CMN certora/basic/conf/NEW-pool-simple-properties.conf \ --rule cannotBorrowOnInactiveReserve \ + --rule_sanity none \ --msg "simple:7: NEW :: cannotBorrowOnInactiveReserve" echo echo "******** Running: simple:8 ***************" certoraRun $CMN certora/basic/conf/NEW-pool-simple-properties.conf \ --rule cannotBorrowOnReserveDisabledForBorrowing \ + --rule_sanity none \ --msg "simple:8: NEW :: cannotBorrowOnReserveDisabledForBorrowing" echo echo "******** Running: simple:9 ***************" certoraRun $CMN certora/basic/conf/NEW-pool-simple-properties.conf \ --rule cannotBorrowOnFrozenReserve \ + --rule_sanity none \ --msg "simple:9: NEW :: cannotBorrowOnFrozenReserve" diff --git a/certora/basic/specs/EModeConfiguration.spec b/certora/basic/specs/EModeConfiguration.spec index 5158a2a9..c3823476 100644 --- a/certora/basic/specs/EModeConfiguration.spec +++ b/certora/basic/specs/EModeConfiguration.spec @@ -6,11 +6,37 @@ methods { } +/*===================================================================================== + Rule: setCollateralIntegrity / setBorrowableIntegrity: + We check the integrity of the functions setReserveBitmapBit (which is a setter) and + isReserveEnabledOnBitmap (which is a getter), simply by setting an arbitrary value to arbitrary + location, and then reading it using the getter. + + Note: the functions setCollateral and isCollateralAsset are envelopes to the above setter and getter + and are implemented in the harness. + + Status: PASS + Link: + =====================================================================================*/ rule setCollateralIntegrity(uint256 reserveIndex, bool collateral) { setCollateral(reserveIndex,collateral); assert isCollateralAsset(reserveIndex) == collateral; } +rule setBorrowableIntegrity(uint256 reserveIndex, bool borrowable) { + setBorrowable(reserveIndex,borrowable); + assert isBorrowableAsset(reserveIndex) == borrowable; +} + + + +/*===================================================================================== + Rule: independencyOfCollateralSetters / independencyOfBorrowableSetters: + We check that when calling to setReserveBitmapBit(index,val) only the value at the given + index may be altered. + Status: PASS + Link: + =====================================================================================*/ rule independencyOfCollateralSetters(uint256 reserveIndex, bool collateral) { uint256 reserveIndex_other; @@ -20,13 +46,6 @@ rule independencyOfCollateralSetters(uint256 reserveIndex, bool collateral) { assert (reserveIndex != reserveIndex_other => before == after); } - - -rule setBorrowableIntegrity(uint256 reserveIndex, bool borrowable) { - setBorrowable(reserveIndex,borrowable); - assert isBorrowableAsset(reserveIndex) == borrowable; -} - rule independencyOfBorrowableSetters(uint256 reserveIndex, bool borrowable) { uint256 reserveIndex_other; diff --git a/certora/basic/specs/stableRemoved.spec b/certora/basic/specs/stableRemoved.spec index 59e0bbbc..bbd7f3ee 100644 --- a/certora/basic/specs/stableRemoved.spec +++ b/certora/basic/specs/stableRemoved.spec @@ -89,7 +89,7 @@ rule stableFieldsUntouched(method f, env e, address _asset) uint128 __deprecatedStableBorrowRate_BEFORE = reserve.__deprecatedStableBorrowRate; address __deprecatedStableDebtTokenAddress_BEFORE = reserve.__deprecatedStableDebtTokenAddress; uint128 currentStableBorrowRate_BEFORE = reserveLegasy.currentStableBorrowRate; - address stableDebtTokenAddress_BEFORE = reserveLegasy.stableDebtTokenAddress; + // address stableDebtTokenAddress_BEFORE = reserveLegasy.stableDebtTokenAddress; calldataarg args; f(e,args); @@ -105,6 +105,6 @@ rule stableFieldsUntouched(method f, env e, address _asset) assert __deprecatedStableBorrowRate_BEFORE == __deprecatedStableBorrowRate_AFTER; assert __deprecatedStableDebtTokenAddress_BEFORE == __deprecatedStableDebtTokenAddress_AFTER; assert currentStableBorrowRate_BEFORE == currentStableBorrowRate_AFTER; - assert stableDebtTokenAddress_BEFORE == stableDebtTokenAddress_AFTER; + // assert stableDebtTokenAddress_BEFORE == stableDebtTokenAddress_AFTER; } diff --git a/certora/stata/applyHarness.patch b/certora/stata/applyHarness.patch index 9756bc6b..e0525293 100644 --- a/certora/stata/applyHarness.patch +++ b/certora/stata/applyHarness.patch @@ -9,9 +9,9 @@ diff -ruN src/core/instances/ATokenInstance.sol src/core/instances/ATokenInstanc --- src/contracts/instances/ATokenInstance.sol 2024-09-05 19:01:54 +++ src/contracts/instances/ATokenInstance.sol 2024-09-05 11:33:23 @@ -35,15 +35,15 @@ - + _domainSeparator = _calculateDomainSeparator(); - + - emit Initialized( - underlyingAsset, - address(POOL), @@ -34,12 +34,12 @@ diff -ruN src/core/instances/ATokenInstance.sol src/core/instances/ATokenInstanc + // ); } } -diff -ruN src/periphery/contracts/static-a-token/ERC20AaveLMUpgradeable.sol src/periphery/contracts/static-a-token/ERC20AaveLMUpgradeable.sol ---- src/contracts/extensions/static-a-token/ERC20AaveLMUpgradeable.sol 2024-09-05 19:01:54 -+++ src/contracts/extensions/static-a-token/ERC20AaveLMUpgradeable.sol 2024-09-05 13:48:31 +diff -ruN src/periphery/contracts/static-a-token/ERC20AaveLMUpgradeable.sol src/periphery/contracts/stata-token/ERC20AaveLMUpgradeable.sol +--- src/contracts/extensions/stata-token/ERC20AaveLMUpgradeable.sol 2024-09-05 19:01:54 ++++ src/contracts/extensions/stata-token/ERC20AaveLMUpgradeable.sol 2024-09-05 13:48:31 @@ -147,7 +147,7 @@ } - + ///@inheritdoc IERC20AaveLM - function rewardTokens() external view returns (address[] memory) { + function rewardTokens() public view returns (address[] memory) { diff --git a/src/contracts/extensions/stata-token/README.md b/src/contracts/extensions/stata-token/README.md index 68463073..83e85b2f 100644 --- a/src/contracts/extensions/stata-token/README.md +++ b/src/contracts/extensions/stata-token/README.md @@ -1,7 +1,7 @@ # stataToken - Static aToken vault/wrapper

- +

## About From af4bfb0783d0e6260381706a51225fa3e5f0336c Mon Sep 17 00:00:00 2001 From: Lukas Date: Wed, 20 Nov 2024 23:32:31 +0100 Subject: [PATCH 56/72] fix: properly resolve conflicts --- src/contracts/extensions/stata-token/StataTokenFactory.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/contracts/extensions/stata-token/StataTokenFactory.sol b/src/contracts/extensions/stata-token/StataTokenFactory.sol index 708025b1..880211a0 100644 --- a/src/contracts/extensions/stata-token/StataTokenFactory.sol +++ b/src/contracts/extensions/stata-token/StataTokenFactory.sol @@ -62,7 +62,7 @@ contract StataTokenFactory is Initializable, IStataTokenFactory { abi.encodeWithSelector( StataTokenV2.initialize.selector, aTokenAddress, - string(abi.encodePacked('Wrapped ', IERC20Metadata(reserveData.aTokenAddress).name())), + string(abi.encodePacked('Wrapped ', IERC20Metadata(aTokenAddress).name())), string(symbol) ), bytes32(uint256(uint160(underlyings[i]))) From 3008691636ef1df9a72f20ab3c3afaa594149674 Mon Sep 17 00:00:00 2001 From: Lukas Date: Wed, 20 Nov 2024 23:33:27 +0100 Subject: [PATCH 57/72] fix: adjust to new rescuable --- src/contracts/extensions/stata-token/StataTokenV2.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/src/contracts/extensions/stata-token/StataTokenV2.sol b/src/contracts/extensions/stata-token/StataTokenV2.sol index 27083407..2debbb91 100644 --- a/src/contracts/extensions/stata-token/StataTokenV2.sol +++ b/src/contracts/extensions/stata-token/StataTokenV2.sol @@ -59,7 +59,6 @@ contract StataTokenV2 is else _unpause(); } - /// @inheritdoc IRescuable function whoCanRescue() public view override returns (address) { return POOL_ADDRESSES_PROVIDER.getACLAdmin(); } From 58e60a249c04f7e67e551a6d9952ba87c54cdc6a Mon Sep 17 00:00:00 2001 From: Lukas Date: Thu, 21 Nov 2024 16:11:32 +0100 Subject: [PATCH 58/72] fix: update aave-cli to resolve eMode bug in json report (#79) - also updates catapulta to support more networks --- package-lock.json | 1186 +++++++++++++++++++++++++++++-------- package.json | 4 +- tests/utils/DiffUtils.sol | 2 +- 3 files changed, 934 insertions(+), 258 deletions(-) diff --git a/package-lock.json b/package-lock.json index 42e85c43..55d45dea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,8 @@ "version": "1.0.0", "license": "BUSL1.1", "dependencies": { - "@bgd-labs/aave-cli": "^1.1.4", - "catapulta-verify": "^1.1.1" + "@bgd-labs/aave-cli": "^1.1.12", + "catapulta-verify": "^1.2.1" }, "devDependencies": { "prettier": "^2.8.3", @@ -27,30 +27,31 @@ "license": "Apache-2.0" }, "node_modules/@bgd-labs/aave-address-book": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@bgd-labs/aave-address-book/-/aave-address-book-4.2.0.tgz", - "integrity": "sha512-FBMeAySqu4oBfefJpuNR9KVy0qvL+hr/N05BiqHhI+uma0EleGl1SvHo3mtb0Faqjq71krEXRYAdwGer5F7o9g==" + "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.4", - "resolved": "https://registry.npmjs.org/@bgd-labs/aave-cli/-/aave-cli-1.1.4.tgz", - "integrity": "sha512-qytoLzCiGMz9uHyofE2g7vSTH0nbLboMs0TXxki6sYbCt8EROcrczm6oC5K9642qGkMXCTtYQlIsK74ryJXxCA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@bgd-labs/aave-cli/-/aave-cli-1.1.12.tgz", + "integrity": "sha512-PuxWcdmNmNjVHP9hzZpJ6LYyM6MViJCQQ7U4yEPjiAGQ0mQ9aJIfAq5EpNds6r4OmmxufZ+Ely6f8QkIrDXDdA==", "dependencies": { - "@bgd-labs/aave-address-book": "^4.2.0", + "@bgd-labs/aave-address-book": "^4.5.1", "@bgd-labs/aave-v3-governance-cache": "^1.0.8", - "@bgd-labs/js-utils": "^1.4.2", - "@commander-js/extra-typings": "^11.1.0", - "@inquirer/prompts": "^3.3.2", + "@bgd-labs/js-utils": "^1.4.6", + "@bgd-labs/rpc-env": "^2.1.1", + "@commander-js/extra-typings": "^12.1.0", + "@inquirer/prompts": "^7.1.0", + "blockstore-core": "^5.0.2", "chalk": "^4.1.2", - "commander": "^11.1.0", + "commander": "^12.1.0", "deepmerge": "^4.3.1", "dotenv": "^16.4.1", "find-object-paths": "^1.1.0", "gray-matter": "^4.0.3", "ipfs-unixfs-importer": "^15.3.1", "json-bigint": "^1.0.0", - "object-hash": "^3.0.0", - "viem": "^2.21.32", + "viem": "^2.21.48", "zod": "^3.23.8" }, "bin": { @@ -67,8 +68,9 @@ } }, "node_modules/@bgd-labs/js-utils": { - "version": "1.4.2", - "license": "MIT", + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@bgd-labs/js-utils/-/js-utils-1.4.6.tgz", + "integrity": "sha512-0IA3fbHo/PJvtBPZ0q0zepsmsbZRAujchdd7GVsKJcJQ2xQulWYUZ9IeV+TTroR9wukKBgf6teYxEjCx0FVfuA==", "dependencies": { "@supercharge/promise-pool": "^3.1.1", "bs58": "^5.0.0", @@ -82,176 +84,616 @@ "viem": "^2.0.3" } }, + "node_modules/@bgd-labs/rpc-env": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@bgd-labs/rpc-env/-/rpc-env-2.1.1.tgz", + "integrity": "sha512-m3WAyez8ySgaNNrDOf4MCvtDQAF67Y/HTfUirW0D4G9rFvpqiWxU7+NVfGaI3RPd5DoUcZFwGDxnXUPibNL2CQ==", + "bin": { + "rpc-env": "dist/cli.js" + } + }, + "node_modules/@chainsafe/is-ip": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@chainsafe/is-ip/-/is-ip-2.0.2.tgz", + "integrity": "sha512-ndGqEMG1W5WkGagaqOZHpPU172AGdxr+LD15sv3WIUvT5oCFUrG1Y0CW/v2Egwj4JXEvSibaIIIqImsm98y1nA==" + }, + "node_modules/@chainsafe/netmask": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@chainsafe/netmask/-/netmask-2.0.0.tgz", + "integrity": "sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg==", + "dependencies": { + "@chainsafe/is-ip": "^2.0.1" + } + }, "node_modules/@commander-js/extra-typings": { - "version": "11.1.0", - "license": "MIT", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@commander-js/extra-typings/-/extra-typings-12.1.0.tgz", + "integrity": "sha512-wf/lwQvWAA0goIghcb91dQYpkLBcyhOhQNqG/VgWhnKzgt+UOMvra7EX/2fv70arm5RW+PUHoQHHDa6/p77Eqg==", "peerDependencies": { - "commander": "11.1.x" + "commander": "~12.1.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.12", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, "node_modules/@inquirer/checkbox": { - "version": "1.5.2", - "license": "MIT", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.2.tgz", + "integrity": "sha512-+gznPl8ip8P8HYHYecDtUtdsh1t2jvb+sWCD72GAiZ9m45RqwrLmReDaqdC0umQfamtFXVRoMVJ2/qINKGm9Tg==", "dependencies": { - "@inquirer/core": "^6.0.0", - "@inquirer/type": "^1.1.6", + "@inquirer/core": "^10.1.0", + "@inquirer/figures": "^1.0.8", + "@inquirer/type": "^3.0.1", "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "figures": "^3.2.0" + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=14.18.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" } }, "node_modules/@inquirer/confirm": { - "version": "2.0.17", - "license": "MIT", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.0.2.tgz", + "integrity": "sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==", "dependencies": { - "@inquirer/core": "^6.0.0", - "@inquirer/type": "^1.1.6", - "chalk": "^4.1.2" + "@inquirer/core": "^10.1.0", + "@inquirer/type": "^3.0.1" }, "engines": { - "node": ">=14.18.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" } }, "node_modules/@inquirer/core": { - "version": "6.0.0", - "license": "MIT", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.0.tgz", + "integrity": "sha512-I+ETk2AL+yAVbvuKx5AJpQmoaWhpiTFOg/UJb7ZkMAK4blmtG8ATh5ct+T/8xNld0CZG/2UhtkdMwpgvld92XQ==", "dependencies": { - "@inquirer/type": "^1.1.6", - "@types/mute-stream": "^0.0.4", - "@types/node": "^20.10.7", - "@types/wrap-ansi": "^3.0.0", + "@inquirer/figures": "^1.0.8", + "@inquirer/type": "^3.0.1", "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "cli-spinners": "^2.9.2", "cli-width": "^4.1.0", - "figures": "^3.2.0", - "mute-stream": "^1.0.0", - "run-async": "^3.0.0", + "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0" + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=14.18.0" + "node": ">=18" } }, "node_modules/@inquirer/editor": { - "version": "1.2.15", - "license": "MIT", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.1.0.tgz", + "integrity": "sha512-K1gGWsxEqO23tVdp5MT3H799OZ4ER1za7Dlc8F4um0W7lwSv0KGR/YyrUEyimj0g7dXZd8XknM/5QA2/Uy+TbA==", "dependencies": { - "@inquirer/core": "^6.0.0", - "@inquirer/type": "^1.1.6", - "chalk": "^4.1.2", + "@inquirer/core": "^10.1.0", + "@inquirer/type": "^3.0.1", "external-editor": "^3.1.0" }, "engines": { - "node": ">=14.18.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" } }, "node_modules/@inquirer/expand": { - "version": "1.1.16", - "license": "MIT", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.2.tgz", + "integrity": "sha512-WdgCX1cUtinz+syKyZdJomovULYlKUWZbVYZzhf+ZeeYf4htAQ3jLymoNs3koIAKfZZl3HUBb819ClCBfyznaw==", "dependencies": { - "@inquirer/core": "^6.0.0", - "@inquirer/type": "^1.1.6", - "chalk": "^4.1.2", - "figures": "^3.2.0" + "@inquirer/core": "^10.1.0", + "@inquirer/type": "^3.0.1", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=14.18.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.8.tgz", + "integrity": "sha512-tKd+jsmhq21AP1LhexC0pPwsCxEhGgAkg28byjJAd+xhmIs8LUX8JbUc3vBf3PhLxWiB5EvyBE5X7JSPAqMAqg==", + "engines": { + "node": ">=18" } }, "node_modules/@inquirer/input": { - "version": "1.2.16", - "license": "MIT", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.0.2.tgz", + "integrity": "sha512-yCLCraigU085EcdpIVEDgyfGv4vBiE4I+k1qRkc9C5dMjWF42ADMGy1RFU94+eZlz4YlkmFsiyHZy0W1wdhaNg==", + "dependencies": { + "@inquirer/core": "^10.1.0", + "@inquirer/type": "^3.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.2.tgz", + "integrity": "sha512-MKQhYofdUNk7eqJtz52KvM1dH6R93OMrqHduXCvuefKrsiMjHiMwjc3NZw5Imm2nqY7gWd9xdhYrtcHMJQZUxA==", "dependencies": { - "@inquirer/core": "^6.0.0", - "@inquirer/type": "^1.1.6", - "chalk": "^4.1.2" + "@inquirer/core": "^10.1.0", + "@inquirer/type": "^3.0.1" }, "engines": { - "node": ">=14.18.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" } }, "node_modules/@inquirer/password": { - "version": "1.1.16", - "license": "MIT", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.2.tgz", + "integrity": "sha512-tQXGSu7IO07gsYlGy3VgXRVsbOWqFBMbqAUrJSc1PDTQQ5Qdm+QVwkP0OC0jnUZ62D19iPgXOMO+tnWG+HhjNQ==", "dependencies": { - "@inquirer/core": "^6.0.0", - "@inquirer/type": "^1.1.6", - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2" + "@inquirer/core": "^10.1.0", + "@inquirer/type": "^3.0.1", + "ansi-escapes": "^4.3.2" }, "engines": { - "node": ">=14.18.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" } }, "node_modules/@inquirer/prompts": { - "version": "3.3.2", - "license": "MIT", - "dependencies": { - "@inquirer/checkbox": "^1.5.2", - "@inquirer/confirm": "^2.0.17", - "@inquirer/core": "^6.0.0", - "@inquirer/editor": "^1.2.15", - "@inquirer/expand": "^1.1.16", - "@inquirer/input": "^1.2.16", - "@inquirer/password": "^1.1.16", - "@inquirer/rawlist": "^1.2.16", - "@inquirer/select": "^1.3.3" + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.1.0.tgz", + "integrity": "sha512-5U/XiVRH2pp1X6gpNAjWOglMf38/Ys522ncEHIKT1voRUvSj/DQnR22OVxHnwu5S+rCFaUiPQ57JOtMFQayqYA==", + "dependencies": { + "@inquirer/checkbox": "^4.0.2", + "@inquirer/confirm": "^5.0.2", + "@inquirer/editor": "^4.1.0", + "@inquirer/expand": "^4.0.2", + "@inquirer/input": "^4.0.2", + "@inquirer/number": "^3.0.2", + "@inquirer/password": "^4.0.2", + "@inquirer/rawlist": "^4.0.2", + "@inquirer/search": "^3.0.2", + "@inquirer/select": "^4.0.2" }, "engines": { - "node": ">=14.18.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" } }, "node_modules/@inquirer/rawlist": { - "version": "1.2.16", - "license": "MIT", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.2.tgz", + "integrity": "sha512-3XGcskMoVF8H0Dl1S5TSZ3rMPPBWXRcM0VeNVsS4ByWeWjSeb0lPqfnBg6N7T0608I1B2bSVnbi2cwCrmOD1Yw==", + "dependencies": { + "@inquirer/core": "^10.1.0", + "@inquirer/type": "^3.0.1", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/search": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.2.tgz", + "integrity": "sha512-Zv4FC7w4dJ13BOJfKRQCICQfShinGjb1bCEIHxTSnjj2telu3+3RHwHubPG9HyD4aix5s+lyAMEK/wSFD75HLA==", "dependencies": { - "@inquirer/core": "^6.0.0", - "@inquirer/type": "^1.1.6", - "chalk": "^4.1.2" + "@inquirer/core": "^10.1.0", + "@inquirer/figures": "^1.0.8", + "@inquirer/type": "^3.0.1", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=14.18.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" } }, "node_modules/@inquirer/select": { - "version": "1.3.3", - "license": "MIT", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.2.tgz", + "integrity": "sha512-uSWUzaSYAEj0hlzxa1mUB6VqrKaYx0QxGBLZzU4xWFxaSyGaXxsSE4OSOwdU24j0xl8OajgayqFXW0l2bkl2kg==", "dependencies": { - "@inquirer/core": "^6.0.0", - "@inquirer/type": "^1.1.6", + "@inquirer/core": "^10.1.0", + "@inquirer/figures": "^1.0.8", + "@inquirer/type": "^3.0.1", "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "figures": "^3.2.0" + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=14.18.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" } }, "node_modules/@inquirer/type": { - "version": "1.2.1", - "license": "MIT", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.1.tgz", + "integrity": "sha512-+ksJMIy92sOAiAccGpcKZUc3bYO07cADnscIxHBknEm3uNts3movSmBofc1908BNy5edKscxYeAdaX1NXkHS6A==", "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" } }, "node_modules/@ipld/dag-pb": { @@ -265,6 +707,63 @@ "npm": ">=7.0.0" } }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" + }, + "node_modules/@libp2p/interface": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@libp2p/interface/-/interface-2.2.1.tgz", + "integrity": "sha512-5dvsnf9+S5DoXCk5H3HNpe8lKzuXTi0k2On8Cdqr6YrkmrhCimow63AxtaUOVkH7GVBTTi8Q1jSx3aleX7KcEA==", + "dependencies": { + "@multiformats/multiaddr": "^12.2.3", + "it-pushable": "^3.2.3", + "it-stream-types": "^2.0.1", + "multiformats": "^13.1.0", + "progress-events": "^1.0.0", + "uint8arraylist": "^2.4.8" + } + }, + "node_modules/@libp2p/logger": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@libp2p/logger/-/logger-5.1.4.tgz", + "integrity": "sha512-pVQ2odi6rcOR412wM0dg7eZ1+wPHPo5D7W8vIn3YyB2FLodQD7CZXXfg7Z9Yaqlc4BVbkNXDWL/jlUss9wL2Ow==", + "dependencies": { + "@libp2p/interface": "^2.2.1", + "@multiformats/multiaddr": "^12.2.3", + "interface-datastore": "^8.3.0", + "multiformats": "^13.1.0", + "weald": "^1.0.2" + } + }, + "node_modules/@multiformats/dns": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@multiformats/dns/-/dns-1.0.6.tgz", + "integrity": "sha512-nt/5UqjMPtyvkG9BQYdJ4GfLK3nMqGpFZOzf4hAmIa0sJh2LlS9YKXZ4FgwBDsaHvzZqR/rUFIywIc7pkHNNuw==", + "dependencies": { + "@types/dns-packet": "^5.6.5", + "buffer": "^6.0.3", + "dns-packet": "^5.6.1", + "hashlru": "^2.3.0", + "p-queue": "^8.0.1", + "progress-events": "^1.0.0", + "uint8arrays": "^5.0.2" + } + }, + "node_modules/@multiformats/multiaddr": { + "version": "12.3.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.3.1.tgz", + "integrity": "sha512-yoGODQY4nIj41ENJClucS8FtBoe8w682bzbKldEQr9lSlfdHqAsRC+vpJAOBpiMwPps1tHua4kxrDmvprdhoDQ==", + "dependencies": { + "@chainsafe/is-ip": "^2.0.1", + "@chainsafe/netmask": "^2.0.0", + "@multiformats/dns": "^1.0.3", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" + } + }, "node_modules/@multiformats/murmur3": { "version": "2.1.8", "license": "Apache-2.0 OR MIT", @@ -342,41 +841,28 @@ }, "node_modules/@supercharge/promise-pool": { "version": "3.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@supercharge/promise-pool/-/promise-pool-3.2.0.tgz", + "integrity": "sha512-pj0cAALblTZBPtMltWOlZTQSLT07jIaFNeM8TWoJD1cQMgDB9mcMlVMoetiB35OzNJpqQ2b+QEtwiR9f20mADg==", "engines": { "node": ">=8" } }, - "node_modules/@types/mute-stream": { - "version": "0.0.4", - "license": "MIT", + "node_modules/@types/dns-packet": { + "version": "5.6.5", + "resolved": "https://registry.npmjs.org/@types/dns-packet/-/dns-packet-5.6.5.tgz", + "integrity": "sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q==", "dependencies": { "@types/node": "*" } }, - "node_modules/@types/mute-stream/node_modules/@types/node": { - "version": "22.5.5", - "license": "MIT", - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/@types/mute-stream/node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" - }, "node_modules/@types/node": { - "version": "20.12.7", - "license": "MIT", + "version": "22.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.1.tgz", + "integrity": "sha512-p8Yy/8sw1caA8CdRIQBG5tiLHmxtQKObCijiAa9Ez+d4+PRffM4054xbju0msf+cvhJpnFEeNjxmVT/0ipktrg==", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.8" } }, - "node_modules/@types/wrap-ansi": { - "version": "3.0.0", - "license": "MIT" - }, "node_modules/abitype": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.6.tgz", @@ -399,7 +885,8 @@ }, "node_modules/ansi-escapes": { "version": "4.3.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dependencies": { "type-fest": "^0.21.3" }, @@ -412,14 +899,16 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { "version": "4.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, @@ -432,14 +921,16 @@ }, "node_modules/argparse": { "version": "1.0.10", - "license": "MIT", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/base-x": { "version": "4.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", + "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" }, "node_modules/base64-js": { "version": "1.5.1", @@ -475,9 +966,25 @@ "readable-stream": "^3.4.0" } }, + "node_modules/blockstore-core": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/blockstore-core/-/blockstore-core-5.0.2.tgz", + "integrity": "sha512-y7/BHdYLO3YCpJMg6Ue7b4Oz4FT1HWSZoHHdlsaJTsvoE8XieXb6kUCB9UkkUBDw2x4neRDwlgYBpyK77+Ro2Q==", + "dependencies": { + "@libp2p/logger": "^5.0.1", + "interface-blockstore": "^5.0.0", + "interface-store": "^6.0.0", + "it-drain": "^3.0.7", + "it-filter": "^3.1.1", + "it-merge": "^3.0.5", + "it-pushable": "^3.2.3", + "multiformats": "^13.2.3" + } + }, "node_modules/bs58": { "version": "5.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", + "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", "dependencies": { "base-x": "^4.0.0" } @@ -505,18 +1012,20 @@ } }, "node_modules/catapulta-verify": { - "version": "1.1.1", - "license": "MIT", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/catapulta-verify/-/catapulta-verify-1.2.1.tgz", + "integrity": "sha512-yXJ0/WV/3w6WLrVUoe2maEqPlGDyCwQ9oIk2vUiw+kfEG7zMlFzSQB8xf7sAo8kUKk/fwaMEn9AQrb84Ubae4Q==", + "dependencies": { + "@bgd-labs/rpc-env": "^2.0.1" + }, "bin": { "catapulta-verify": "out/index.mjs" - }, - "peerDependencies": { - "typescript": "^5.0.0" } }, "node_modules/chalk": { "version": "4.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -530,28 +1039,21 @@ }, "node_modules/chardet": { "version": "0.7.0", - "license": "MIT" - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, "node_modules/cli-width": { "version": "4.1.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "engines": { "node": ">= 12" } }, "node_modules/color-convert": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { "color-name": "~1.1.4" }, @@ -561,13 +1063,15 @@ }, "node_modules/color-name": { "version": "1.1.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/commander": { - "version": "11.1.0", - "license": "MIT", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/debug": { @@ -592,6 +1096,17 @@ "node": ">=0.10.0" } }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/dotenv": { "version": "16.4.5", "license": "BSD-2-Clause", @@ -604,54 +1119,51 @@ }, "node_modules/emoji-regex": { "version": "8.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/esbuild": { - "version": "0.19.12", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", "hasInstallScript": true, - "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "license": "MIT", - "engines": { - "node": ">=0.8.0" + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" } }, "node_modules/esprima": { "version": "4.0.1", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -660,9 +1172,15 @@ "node": ">=4" } }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, "node_modules/extend-shallow": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dependencies": { "is-extendable": "^0.1.0" }, @@ -672,7 +1190,8 @@ }, "node_modules/external-editor": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -682,26 +1201,15 @@ "node": ">=4" } }, - "node_modules/figures": { - "version": "3.2.0", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/find-object-paths": { "version": "1.1.0", "license": "GPL-3.0-or-later" }, "node_modules/fsevents": { "version": "2.3.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, "optional": true, "os": [ "darwin" @@ -711,8 +1219,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.7.3", - "license": "MIT", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", "dependencies": { "resolve-pkg-maps": "^1.0.0" }, @@ -722,7 +1231,8 @@ }, "node_modules/gray-matter": { "version": "4.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", "dependencies": { "js-yaml": "^3.13.1", "kind-of": "^6.0.2", @@ -743,14 +1253,21 @@ }, "node_modules/has-flag": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { "node": ">=8" } }, + "node_modules/hashlru": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hashlru/-/hashlru-2.3.0.tgz", + "integrity": "sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A==" + }, "node_modules/iconv-lite": { "version": "0.4.24", - "license": "MIT", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -788,6 +1305,15 @@ "multiformats": "^13.2.3" } }, + "node_modules/interface-datastore": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/interface-datastore/-/interface-datastore-8.3.1.tgz", + "integrity": "sha512-3r0ETmHIi6HmvM5sc09QQiCD3gUfwtEM/AAChOyAd/UAKT69uk8LXfTSUBufbUIO/dU65Vj8nb9O6QjwW8vDSQ==", + "dependencies": { + "interface-store": "^6.0.0", + "uint8arrays": "^5.1.0" + } + }, "node_modules/interface-store": { "version": "6.0.2", "license": "Apache-2.0 OR MIT" @@ -823,14 +1349,16 @@ }, "node_modules/is-extendable": { "version": "0.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "engines": { "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "engines": { "node": ">=8" } @@ -857,10 +1385,31 @@ "version": "3.0.6", "license": "Apache-2.0 OR MIT" }, + "node_modules/it-drain": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/it-drain/-/it-drain-3.0.7.tgz", + "integrity": "sha512-vy6S1JKjjHSIFHgBpLpD1zhkCRl3z1zYWUxE14+kAYf+BL9ssWSFImJfhl361IIcwr0ofw8etzg11VqqB+ntUA==" + }, + "node_modules/it-filter": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/it-filter/-/it-filter-3.1.1.tgz", + "integrity": "sha512-TOXmVuaSkxlLp2hXKoMTra0WMZMKVFxE3vSsbIA+PbADNCBAHhjJ/lM31vBOUTddHMO34Ku++vU8T9PLlBxQtg==", + "dependencies": { + "it-peekable": "^3.0.0" + } + }, "node_modules/it-first": { "version": "3.0.6", "license": "Apache-2.0 OR MIT" }, + "node_modules/it-merge": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/it-merge/-/it-merge-3.0.5.tgz", + "integrity": "sha512-2l7+mPf85pyRF5pqi0dKcA54E5Jm/2FyY5GsOaN51Ta0ipC7YZ3szuAsH8wOoB6eKY4XsU4k2X+mzPmFBMayEA==", + "dependencies": { + "it-pushable": "^3.2.3" + } + }, "node_modules/it-parallel-batch": { "version": "3.0.6", "license": "Apache-2.0 OR MIT", @@ -868,9 +1417,28 @@ "it-batch": "^3.0.0" } }, + "node_modules/it-peekable": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/it-peekable/-/it-peekable-3.0.5.tgz", + "integrity": "sha512-JWQOGMt6rKiPcY30zUVMR4g6YxkpueTwHVE7CMs/aGqCf4OydM6w+7ZM3PvmO1e0TocjuR4aL8xyZWR46cTqCQ==" + }, + "node_modules/it-pushable": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.2.3.tgz", + "integrity": "sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==", + "dependencies": { + "p-defer": "^4.0.0" + } + }, + "node_modules/it-stream-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.2.tgz", + "integrity": "sha512-Rz/DEZ6Byn/r9+/SBCuJhpPATDF9D+dz5pbgSUyBsCDtza6wtNATrz/jz1gDyNanC3XdLboriHnOC925bZRBww==" + }, "node_modules/js-yaml": { "version": "3.14.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -888,7 +1456,8 @@ }, "node_modules/kind-of": { "version": "6.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "engines": { "node": ">=0.10.0" } @@ -927,10 +1496,11 @@ } }, "node_modules/mute-stream": { - "version": "1.0.0", - "license": "ISC", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/node-fetch": { @@ -951,20 +1521,79 @@ } } }, - "node_modules/object-hash": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/os-tmpdir": { "version": "1.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "engines": { "node": ">=0.10.0" } }, + "node_modules/ox": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.1.2.tgz", + "integrity": "sha512-ak/8K0Rtphg9vnRJlbOdaX9R7cmxD2MiSthjWGaQdMk3D7hrAlDoM+6Lxn7hN52Za3vrXfZ7enfke/5WjolDww==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "dependencies": { + "@adraffy/ens-normalize": "^1.10.1", + "@noble/curves": "^1.6.0", + "@noble/hashes": "^1.5.0", + "@scure/bip32": "^1.5.0", + "@scure/bip39": "^1.4.0", + "abitype": "^1.0.6", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/p-defer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-4.0.1.tgz", + "integrity": "sha512-Mr5KC5efvAK5VUptYEIopP1bakB85k2IWXaRC0rsh1uwn1L6M0LVml8OIQ4Gudg4oyZakf7FmeRLkMMtZW1i5A==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.0.1.tgz", + "integrity": "sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^6.1.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.3.tgz", + "integrity": "sha512-UJUyfKbwvr/uZSV6btANfb+0t/mOhKV/KXcCUTp8FcQI+v/0d+wXqH4htrW0E4rR6WiEO/EPvUFiV9D5OI4vlw==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/prettier": { "version": "2.8.8", "dev": true, @@ -1037,18 +1666,12 @@ }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/run-async": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "funding": [ @@ -1069,11 +1692,13 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/section-matter": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" @@ -1098,7 +1723,8 @@ }, "node_modules/signal-exit": { "version": "4.1.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "engines": { "node": ">=14" }, @@ -1117,7 +1743,8 @@ }, "node_modules/sprintf-js": { "version": "1.0.3", - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "node_modules/string_decoder": { "version": "1.3.0", @@ -1128,7 +1755,8 @@ }, "node_modules/string-width": { "version": "4.2.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -1140,7 +1768,8 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -1150,14 +1779,16 @@ }, "node_modules/strip-bom-string": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", "engines": { "node": ">=0.10.0" } }, "node_modules/supports-color": { "version": "7.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { "has-flag": "^4.0.0" }, @@ -1167,7 +1798,8 @@ }, "node_modules/tmp": { "version": "0.0.33", - "license": "MIT", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dependencies": { "os-tmpdir": "~1.0.2" }, @@ -1180,11 +1812,12 @@ "license": "MIT" }, "node_modules/tsx": { - "version": "4.7.2", - "license": "MIT", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", + "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==", "dependencies": { - "esbuild": "~0.19.10", - "get-tsconfig": "^4.7.2" + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" }, "bin": { "tsx": "dist/cli.mjs" @@ -1198,7 +1831,8 @@ }, "node_modules/type-fest": { "version": "0.21.3", - "license": "(MIT OR CC0-1.0)", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "engines": { "node": ">=10" }, @@ -1209,6 +1843,7 @@ "node_modules/typescript": { "version": "5.4.4", "license": "Apache-2.0", + "optional": true, "peer": true, "bin": { "tsc": "bin/tsc", @@ -1241,17 +1876,18 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "license": "MIT" + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" }, "node_modules/util-deprecate": { "version": "1.0.2", "license": "MIT" }, "node_modules/viem": { - "version": "2.21.32", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.21.32.tgz", - "integrity": "sha512-2oXt5JNIb683oy7C8wuIJ/SeL3XtHVMEQpy1U2TA6WMnJQ4ScssRvyPwYLcaP6mKlrGXE/cR/V7ncWpvLUVPYQ==", + "version": "2.21.48", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.21.48.tgz", + "integrity": "sha512-/hBHyG1gdIIuiQv0z9YmzXl5eWJa0UCZGwkeuQzH2Bmg6FIEwZeEcxgiytXZydip+p2wMBFa1jdr7o5O1+mrIg==", "funding": [ { "type": "github", @@ -1259,13 +1895,13 @@ } ], "dependencies": { - "@adraffy/ens-normalize": "1.11.0", "@noble/curves": "1.6.0", "@noble/hashes": "1.5.0", "@scure/bip32": "1.5.0", "@scure/bip39": "1.4.0", "abitype": "1.0.6", "isows": "1.0.6", + "ox": "0.1.2", "webauthn-p256": "0.0.10", "ws": "8.18.0" }, @@ -1278,6 +1914,34 @@ } } }, + "node_modules/weald": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/weald/-/weald-1.0.4.tgz", + "integrity": "sha512-+kYTuHonJBwmFhP1Z4YQK/dGi3jAnJGCYhyODFpHK73rbxnp9lnZQj7a2m+WVgn8fXr5bJaxUpF6l8qZpPeNWQ==", + "dependencies": { + "ms": "^3.0.0-canary.1", + "supports-color": "^9.4.0" + } + }, + "node_modules/weald/node_modules/ms": { + "version": "3.0.0-canary.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-3.0.0-canary.1.tgz", + "integrity": "sha512-kh8ARjh8rMN7Du2igDRO9QJnqCb2xYTJxyQYK7vJJS4TvLLmsbyhiKpSW+t+y26gyOyMd0riphX0GeWKU3ky5g==", + "engines": { + "node": ">=12.13" + } + }, + "node_modules/weald/node_modules/supports-color": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", + "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/webauthn-p256": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/webauthn-p256/-/webauthn-p256-0.0.10.tgz", @@ -1307,7 +1971,8 @@ }, "node_modules/wrap-ansi": { "version": "6.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -1342,6 +2007,17 @@ "dev": true, "license": "ISC" }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zod": { "version": "3.23.8", "license": "MIT", diff --git a/package.json b/package.json index 331a1ea8..0252e056 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "prettier-plugin-solidity": "^1.1.1" }, "dependencies": { - "@bgd-labs/aave-cli": "^1.1.4", - "catapulta-verify": "^1.1.1" + "@bgd-labs/aave-cli": "^1.1.12", + "catapulta-verify": "^1.2.1" } } diff --git a/tests/utils/DiffUtils.sol b/tests/utils/DiffUtils.sol index c67a9084..fd93080a 100644 --- a/tests/utils/DiffUtils.sol +++ b/tests/utils/DiffUtils.sol @@ -22,7 +22,7 @@ contract DiffUtils is Test { string[] memory inputs = new string[](7); inputs[0] = 'npx'; - inputs[1] = '@bgd-labs/aave-cli@^1.1.4'; + inputs[1] = '@bgd-labs/aave-cli@^1.1.12'; inputs[2] = 'diff-snapshots'; inputs[3] = beforePath; inputs[4] = afterPath; From 8b94bae59ef81c08a1871d121952862c7339a041 Mon Sep 17 00:00:00 2001 From: Lukas Date: Mon, 25 Nov 2024 20:26:44 +0100 Subject: [PATCH 59/72] refactor: move logic to liquidationlogic (#122) --- .../libraries/logic/LiquidationLogic.sol | 85 +++++++++++++++++++ .../protocol/libraries/logic/ReserveLogic.sol | 85 ------------------- src/contracts/protocol/pool/Pool.sol | 2 +- 3 files changed, 86 insertions(+), 86 deletions(-) diff --git a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol index 4d430ec2..0db2ca33 100644 --- a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -43,6 +43,7 @@ library LiquidationLogic { event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); event DeficitCreated(address indexed user, address indexed debtAsset, uint256 amount); + event DeficitCovered(address indexed reserve, address caller, uint256 amountDecreased); event LiquidationCall( address indexed collateralAsset, address indexed debtAsset, @@ -81,6 +82,90 @@ library LiquidationLogic { */ uint256 public constant MIN_LEFTOVER_BASE = MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD / 2; + /** + * @notice Reduces a portion or all of the deficit of a specified reserve by burning: + * - the equivalent aToken `amount` for assets with virtual accounting enabled + * - the equivalent `amount` of underlying for assets with virtual accounting disabled (e.g. GHO) + * The caller of this method MUST always be the Umbrella contract and the Umbrella contract is assumed to never have debt. + * @dev Emits the `DeficitCovered() event`. + * @dev If the coverage admin covers its entire balance, `ReserveUsedAsCollateralDisabled()` is emitted. + * @param reservesData The state of all the reserves + * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets + * @param params The additional parameters needed to execute the eliminateDeficit function + */ + function executeEliminateDeficit( + mapping(address => DataTypes.ReserveData) storage reservesData, + DataTypes.UserConfigurationMap storage userConfig, + DataTypes.ExecuteEliminateDeficitParams memory params + ) external { + require(params.amount != 0, Errors.INVALID_AMOUNT); + + DataTypes.ReserveData storage reserve = reservesData[params.asset]; + uint256 currentDeficit = reserve.deficit; + + require(currentDeficit != 0, Errors.RESERVE_NOT_IN_DEFICIT); + require(!userConfig.isBorrowingAny(), Errors.USER_CANNOT_HAVE_DEBT); + + DataTypes.ReserveCache memory reserveCache = reserve.cache(); + reserve.updateState(reserveCache); + bool isActive = reserveCache.reserveConfiguration.getActive(); + require(isActive, Errors.RESERVE_INACTIVE); + + uint256 balanceWriteOff = params.amount; + + if (params.amount > currentDeficit) { + balanceWriteOff = currentDeficit; + } + + uint256 userBalance = reserveCache.reserveConfiguration.getIsVirtualAccActive() + ? IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender).rayMul( + reserveCache.nextLiquidityIndex + ) + : IERC20(params.asset).balanceOf(msg.sender); + require(balanceWriteOff <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); + + // update ir due to updateState + reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, 0, 0); + + if (reserveCache.reserveConfiguration.getIsVirtualAccActive()) { + // assets without virtual accounting can never be a collateral + bool isCollateral = userConfig.isUsingAsCollateral(reserve.id); + if (isCollateral && balanceWriteOff == userBalance) { + userConfig.setUsingAsCollateral(reserve.id, false); + emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); + } + + IAToken(reserveCache.aTokenAddress).burn( + msg.sender, + reserveCache.aTokenAddress, + balanceWriteOff, + reserveCache.nextLiquidityIndex + ); + } else { + // This is a special case to allow mintable assets (ex. GHO), which by definition cannot be supplied + // and thus do not use virtual underlying balances. + // In that case, the procedure is 1) sending the underlying asset to the aToken and + // 2) trigger the handleRepayment() for the aToken to dispose of those assets + IERC20(params.asset).safeTransferFrom( + msg.sender, + reserveCache.aTokenAddress, + balanceWriteOff + ); + // it is assumed that handleRepayment does not touch the variable debt balance + IAToken(reserveCache.aTokenAddress).handleRepayment( + msg.sender, + // In the context of GHO it's only relevant that the address has no debt. + // Passing the pool is fitting as it's handeling the repayment on behalf of the protocol. + address(this), + balanceWriteOff + ); + } + + reserve.deficit -= balanceWriteOff.toUint128(); + + emit DeficitCovered(params.asset, msg.sender, balanceWriteOff); + } + struct LiquidationCallLocalVars { uint256 userCollateralBalance; uint256 userReserveDebt; diff --git a/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/src/contracts/protocol/libraries/logic/ReserveLogic.sol index c92c628e..805ae634 100644 --- a/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ b/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -40,7 +40,6 @@ library ReserveLogic { ); event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - event DeficitCovered(address indexed reserve, address caller, uint256 amountDecreased); /** * @notice Returns the ongoing normalized income for the reserve. @@ -317,88 +316,4 @@ library ReserveLogic { return reserveCache; } - - /** - * @notice Reduces a portion or all of the deficit of a specified reserve by burning: - * - the equivalent aToken `amount` for assets with virtual accounting enabled - * - the equivalent `amount` of underlying for assets with virtual accounting disabled (e.g. GHO) - * The caller of this method MUST always be the Umbrella contract and the Umbrella contract is assumed to never have debt. - * @dev Emits the `DeficitCovered() event`. - * @dev If the coverage admin covers its entire balance, `ReserveUsedAsCollateralDisabled()` is emitted. - * @param reservesData The state of all the reserves - * @param userConfig The user configuration mapping that tracks the supplied/borrowed assets - * @param params The additional parameters needed to execute the eliminateDeficit function - */ - function executeEliminateDeficit( - mapping(address => DataTypes.ReserveData) storage reservesData, - DataTypes.UserConfigurationMap storage userConfig, - DataTypes.ExecuteEliminateDeficitParams memory params - ) external { - require(params.amount != 0, Errors.INVALID_AMOUNT); - - DataTypes.ReserveData storage reserve = reservesData[params.asset]; - uint256 currentDeficit = reserve.deficit; - - require(currentDeficit != 0, Errors.RESERVE_NOT_IN_DEFICIT); - require(!userConfig.isBorrowingAny(), Errors.USER_CANNOT_HAVE_DEBT); - - DataTypes.ReserveCache memory reserveCache = reserve.cache(); - reserve.updateState(reserveCache); - bool isActive = reserveCache.reserveConfiguration.getActive(); - require(isActive, Errors.RESERVE_INACTIVE); - - uint256 balanceWriteOff = params.amount; - - if (params.amount > currentDeficit) { - balanceWriteOff = currentDeficit; - } - - uint256 userBalance = reserveCache.reserveConfiguration.getIsVirtualAccActive() - ? IAToken(reserveCache.aTokenAddress).scaledBalanceOf(msg.sender).rayMul( - reserveCache.nextLiquidityIndex - ) - : IERC20(params.asset).balanceOf(msg.sender); - require(balanceWriteOff <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - - // update ir due to updateState - reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, 0, 0); - - if (reserveCache.reserveConfiguration.getIsVirtualAccActive()) { - // assets without virtual accounting can never be a collateral - bool isCollateral = userConfig.isUsingAsCollateral(reserve.id); - if (isCollateral && balanceWriteOff == userBalance) { - userConfig.setUsingAsCollateral(reserve.id, false); - emit ReserveUsedAsCollateralDisabled(params.asset, msg.sender); - } - - IAToken(reserveCache.aTokenAddress).burn( - msg.sender, - reserveCache.aTokenAddress, - balanceWriteOff, - reserveCache.nextLiquidityIndex - ); - } else { - // This is a special case to allow mintable assets (ex. GHO), which by definition cannot be supplied - // and thus do not use virtual underlying balances. - // In that case, the procedure is 1) sending the underlying asset to the aToken and - // 2) trigger the handleRepayment() for the aToken to dispose of those assets - IERC20(params.asset).safeTransferFrom( - msg.sender, - reserveCache.aTokenAddress, - balanceWriteOff - ); - // it is assumed that handleRepayment does not touch the variable debt balance - IAToken(reserveCache.aTokenAddress).handleRepayment( - msg.sender, - // In the context of GHO it's only relevant that the address has no debt. - // Passing the pool is fitting as it's handeling the repayment on behalf of the protocol. - address(this), - balanceWriteOff - ); - } - - reserve.deficit -= balanceWriteOff.toUint128(); - - emit DeficitCovered(params.asset, msg.sender, balanceWriteOff); - } } diff --git a/src/contracts/protocol/pool/Pool.sol b/src/contracts/protocol/pool/Pool.sol index e59a6f8a..e9933fc1 100644 --- a/src/contracts/protocol/pool/Pool.sol +++ b/src/contracts/protocol/pool/Pool.sol @@ -840,7 +840,7 @@ abstract contract Pool is VersionedInitializable, PoolStorage, IPool { /// @inheritdoc IPool function eliminateReserveDeficit(address asset, uint256 amount) external override onlyUmbrella { - ReserveLogic.executeEliminateDeficit( + LiquidationLogic.executeEliminateDeficit( _reserves, _usersConfig[msg.sender], DataTypes.ExecuteEliminateDeficitParams({asset: asset, amount: amount}) From b21b164c6018152e6bc51794dc840779b3088884 Mon Sep 17 00:00:00 2001 From: Lukas Date: Tue, 26 Nov 2024 10:55:14 +0100 Subject: [PATCH 60/72] docs: add properties (#94) --- docs/3.3/Aave-v3.3-properties.md | 38 ++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 docs/3.3/Aave-v3.3-properties.md diff --git a/docs/3.3/Aave-v3.3-properties.md b/docs/3.3/Aave-v3.3-properties.md new file mode 100644 index 00000000..5af93105 --- /dev/null +++ b/docs/3.3/Aave-v3.3-properties.md @@ -0,0 +1,38 @@ +# Aave v3.3 features properties + +Formal properties in natural language of the 3.3 features. + +## Properties + +### 1. Deficit Management + +- The deficit of all reserves should initially be zero, even if bad debt was created before the protocol upgrade. +- Deficits are tracked within the `reserve.deficit` and accumulate over the curse of multiple deficit creations. +- Deficits can only be reduced by burning a claim, and thus reducing the protocols obligations in `reserve.deficit`. +- The burning of claims can be performed via `pool.eliminateReserveDeficit()`. In case of assets having virtual accounting enabled, aTokens will be burned. In case of virtual accounting being disabled, the underlying will be disposed of. +- The burning of claims can only be performed by a permissioned `UMBRELLA` entity registered on the `PoolAddressesProvider`. +- The `pool.eliminateReserveDeficit()` requires for the `UMBRELLA` entity to never have any debt. +- claims can only be burned trough `pool.eliminateReserveDeficit()` up to the current obligations stored in `reserve.deficit`. +- A deficit should be created as the result of a liquidation. A liquidation only creates a deficit if the users total collateral across all reserves being zero in the base currency, while the total debt across all reserves remains non-zero in the base currency as the result of the liquidation. +- Edge case: when liquidating yourself with `receiveAToken=true`, it is possible that bad debt is created although after the liquidation the user will end up with the liquidated, non-zero collateral. +- Whenever a deficit is created as a result of a liquidation, the user's excess debt should be burned and accounted for as deficit. +- Deficit added during the liquidation can't be more than the user's debt +- Deficit can only be created and eliminated for an `active` reserve. +- Edge case: deficit can be created and eliminated even is a reserve is `paused` in case it is not the main liquidated asset. Both actions don't affect a user negatively, and preventing the burning of bad debt on paused reserves could create overhead for the protocol. + +### 2. Liquidation mechanics + +- A liquidation can only be performed once a users health-factor drops below 1. +- A maximum of `totalUserDebt * CLOSE_FACTOR` can be liquidated in a single liquidation, while the upper bound is further restrained by the available collateral, liquidationBonus and protocolFee. +- The **default** `CLOSE_FACTOR` is defined as `DEFAULT_LIQUIDATION_CLOSE_FACTOR` and limits the liquidation to 50% of the users todal debt. +- When liquidating a position, the liquidation must either: + - liquidate a full debt position **or** + - liquidate a full collateral position **or** + - leave at least a value of `MIN_LEFTOVER_BASE` on both collateral and debt side + - Edge case: when liquidating yourself with `receiveAToken=true`, it is possible that a position <`MIN_LEFTOVER_BASE` is created as a result of a liquidation. + +There are certain mutually inclusive conditions which increases the `CLOSE_FACTOR` to 100%: + +- when a users health-factor drops `<=0.95` **or** +- if the users total value of the debt position to be liquidated is below `MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD` +- if the users total value of the collateral position to be liquidated is below `MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD` From 38b0cdd7b92588f0a1db4a1f5287ab86c16ca4f5 Mon Sep 17 00:00:00 2001 From: Harsh Pandey Date: Tue, 26 Nov 2024 15:50:06 +0530 Subject: [PATCH 61/72] fix: func visibility (#123) --- src/contracts/interfaces/IPool.sol | 2 +- src/contracts/protocol/pool/Pool.sol | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/contracts/interfaces/IPool.sol b/src/contracts/interfaces/IPool.sol index 398cb08b..58b7020b 100644 --- a/src/contracts/interfaces/IPool.sol +++ b/src/contracts/interfaces/IPool.sol @@ -749,7 +749,7 @@ interface IPool { * @param asset The address of the underlying asset * @return Timestamp when the liquidation grace period will end **/ - function getLiquidationGracePeriod(address asset) external returns (uint40); + function getLiquidationGracePeriod(address asset) external view returns (uint40); /** * @notice Returns the total fee on flash loans diff --git a/src/contracts/protocol/pool/Pool.sol b/src/contracts/protocol/pool/Pool.sol index e9933fc1..41e11f7e 100644 --- a/src/contracts/protocol/pool/Pool.sol +++ b/src/contracts/protocol/pool/Pool.sol @@ -795,7 +795,9 @@ abstract contract Pool is VersionedInitializable, PoolStorage, IPool { } /// @inheritdoc IPool - function getLiquidationGracePeriod(address asset) external virtual override returns (uint40) { + function getLiquidationGracePeriod( + address asset + ) external view virtual override returns (uint40) { return _reserves[asset].liquidationGracePeriodUntil; } From be37b99b8fd47b5087e918bb2d4726d6470ab5c5 Mon Sep 17 00:00:00 2001 From: Lukas Date: Wed, 27 Nov 2024 11:56:27 +0100 Subject: [PATCH 62/72] cleanup: remove obsolete remappings (#81) --- certora/stata/conf/verifyDoubleClaim.conf | 4 +--- certora/stata/conf/verifyERC4626.conf | 4 +--- certora/stata/conf/verifyERC4626DepositSummarization.conf | 4 +--- certora/stata/conf/verifyERC4626Extended.conf | 4 +--- certora/stata/conf/verifyERC4626MintDepositSummarization.conf | 4 +--- certora/stata/conf/verifyStataToken.conf | 4 +--- remappings.txt | 2 -- 7 files changed, 6 insertions(+), 20 deletions(-) diff --git a/certora/stata/conf/verifyDoubleClaim.conf b/certora/stata/conf/verifyDoubleClaim.conf index 7c71fa79..d7839d0b 100644 --- a/certora/stata/conf/verifyDoubleClaim.conf +++ b/certora/stata/conf/verifyDoubleClaim.conf @@ -21,8 +21,6 @@ "StataTokenV2Harness:_reward_A=DummyERC20_rewardToken" ], "packages": [ -// "aave-v3-core/=certora/stata/munged/src/core", - // "aave-v3-periphery/=certora/stata/munged/src/periphery", "solidity-utils/=certora/stata/munged/lib/solidity-utils/src", "forge-std/=certora/stata/munged/lib/forge-std/src", "openzeppelin-contracts-upgradeable/=certora/stata/munged/lib/solidity-utils/lib/openzeppelin-contracts-upgradeable", @@ -37,4 +35,4 @@ "loop_iter": "2", "optimistic_hashing": true, "build_cache": true, -} \ No newline at end of file +} diff --git a/certora/stata/conf/verifyERC4626.conf b/certora/stata/conf/verifyERC4626.conf index 74e08a5a..d8129a6d 100644 --- a/certora/stata/conf/verifyERC4626.conf +++ b/certora/stata/conf/verifyERC4626.conf @@ -21,8 +21,6 @@ "StataTokenV2Harness:_reward_A=DummyERC20_rewardToken" ], "packages": [ -// "aave-v3-core/=certora/stata/munged/src/contracts", -// "aave-v3-periphery/=certora/stata/munged/src/contracts/extensions", "solidity-utils/=certora/stata/munged/lib/solidity-utils/src", "forge-std/=certora/stata/munged/lib/forge-std/src", "openzeppelin-contracts-upgradeable/=certora/stata/munged/lib/solidity-utils/lib/openzeppelin-contracts-upgradeable", @@ -37,4 +35,4 @@ "loop_iter": "1", "optimistic_hashing": true, "build_cache": true, -} \ No newline at end of file +} diff --git a/certora/stata/conf/verifyERC4626DepositSummarization.conf b/certora/stata/conf/verifyERC4626DepositSummarization.conf index cc18484d..28930b3f 100644 --- a/certora/stata/conf/verifyERC4626DepositSummarization.conf +++ b/certora/stata/conf/verifyERC4626DepositSummarization.conf @@ -21,8 +21,6 @@ "StataTokenV2Harness:_reward_A=DummyERC20_rewardToken" ], "packages": [ -// "aave-v3-core/=certora/stata/munged/src/core", -// "aave-v3-periphery/=certora/stata/munged/src/periphery", "solidity-utils/=certora/stata/munged/lib/solidity-utils/src", "forge-std/=certora/stata/munged/lib/forge-std/src", "openzeppelin-contracts-upgradeable/=certora/stata/munged/lib/solidity-utils/lib/openzeppelin-contracts-upgradeable", @@ -36,4 +34,4 @@ "loop_iter": "1", "optimistic_hashing": true, "build_cache": true, -} \ No newline at end of file +} diff --git a/certora/stata/conf/verifyERC4626Extended.conf b/certora/stata/conf/verifyERC4626Extended.conf index b9e5e77c..f6a2b2f6 100644 --- a/certora/stata/conf/verifyERC4626Extended.conf +++ b/certora/stata/conf/verifyERC4626Extended.conf @@ -21,8 +21,6 @@ "StataTokenV2Harness:_reward_A=DummyERC20_rewardToken" ], "packages": [ -// "aave-v3-core/=certora/stata/munged/src/core", - // "aave-v3-periphery/=certora/stata/munged/src/periphery", "solidity-utils/=certora/stata/munged/lib/solidity-utils/src", "forge-std/=certora/stata/munged/lib/forge-std/src", "openzeppelin-contracts-upgradeable/=certora/stata/munged/lib/solidity-utils/lib/openzeppelin-contracts-upgradeable", @@ -37,4 +35,4 @@ "loop_iter": "1", "optimistic_hashing": true, "build_cache": true, -} \ No newline at end of file +} diff --git a/certora/stata/conf/verifyERC4626MintDepositSummarization.conf b/certora/stata/conf/verifyERC4626MintDepositSummarization.conf index b968b7ea..4b02aad6 100644 --- a/certora/stata/conf/verifyERC4626MintDepositSummarization.conf +++ b/certora/stata/conf/verifyERC4626MintDepositSummarization.conf @@ -21,8 +21,6 @@ "StataTokenV2Harness:_reward_A=DummyERC20_rewardToken" ], "packages": [ - //"aave-v3-core/=certora/stata/munged/src/core", - //"aave-v3-periphery/=certora/stata/munged/src/periphery", "solidity-utils/=certora/stata/munged/lib/solidity-utils/src", "forge-std/=certora/stata/munged/lib/forge-std/src", "openzeppelin-contracts-upgradeable/=certora/stata/munged/lib/solidity-utils/lib/openzeppelin-contracts-upgradeable", @@ -38,4 +36,4 @@ "loop_iter": "1", "optimistic_hashing": true, "build_cache": true, -} \ No newline at end of file +} diff --git a/certora/stata/conf/verifyStataToken.conf b/certora/stata/conf/verifyStataToken.conf index fa701c86..af5e04c9 100644 --- a/certora/stata/conf/verifyStataToken.conf +++ b/certora/stata/conf/verifyStataToken.conf @@ -21,8 +21,6 @@ "StataTokenV2Harness:_reward_A=DummyERC20_rewardToken" ], "packages": [ -// "aave-v3-core/=certora/stata/munged/src/core", - // "aave-v3-periphery/=certora/stata/munged/src/periphery", "solidity-utils/=certora/stata/munged/lib/solidity-utils/src", "forge-std/=certora/stata/munged/lib/forge-std/src", "openzeppelin-contracts-upgradeable/=certora/stata/munged/lib/solidity-utils/lib/openzeppelin-contracts-upgradeable", @@ -37,4 +35,4 @@ "loop_iter": "1", "optimistic_hashing": true, "build_cache": true, -} \ No newline at end of file +} diff --git a/remappings.txt b/remappings.txt index 78eeabcf..0cb8682c 100644 --- a/remappings.txt +++ b/remappings.txt @@ -1,5 +1,3 @@ -aave-v3-core/=src/core/ -aave-v3-periphery/=src/periphery/ solidity-utils/=lib/solidity-utils/src/ forge-std/=lib/forge-std/src/ ds-test/=lib/forge-std/lib/ds-test/src/ From 12e529bdc48d425d5bd9c96eb78149951d4befd0 Mon Sep 17 00:00:00 2001 From: Ian Flexa <85500650+ianflexa@users.noreply.github.com> Date: Wed, 27 Nov 2024 12:12:29 -0400 Subject: [PATCH 63/72] Fix: validationLogic and BridgeLogic titles (#127) * fix: correct validation lib title * fix: add bridge title --- src/contracts/protocol/libraries/logic/BridgeLogic.sol | 5 +++++ src/contracts/protocol/libraries/logic/ValidationLogic.sol | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/contracts/protocol/libraries/logic/BridgeLogic.sol b/src/contracts/protocol/libraries/logic/BridgeLogic.sol index 3b4d469b..c1e7ecb0 100644 --- a/src/contracts/protocol/libraries/logic/BridgeLogic.sol +++ b/src/contracts/protocol/libraries/logic/BridgeLogic.sol @@ -14,6 +14,11 @@ import {Errors} from '../helpers/Errors.sol'; import {ValidationLogic} from './ValidationLogic.sol'; import {ReserveLogic} from './ReserveLogic.sol'; +/** + * @title BridgeLogic library + * @author Aave + * @notice Implements functions to mint unbacked aTokens and back the unbacked tokens. + */ library BridgeLogic { using ReserveLogic for DataTypes.ReserveCache; using ReserveLogic for DataTypes.ReserveData; diff --git a/src/contracts/protocol/libraries/logic/ValidationLogic.sol b/src/contracts/protocol/libraries/logic/ValidationLogic.sol index e08a30e8..05903d65 100644 --- a/src/contracts/protocol/libraries/logic/ValidationLogic.sol +++ b/src/contracts/protocol/libraries/logic/ValidationLogic.sol @@ -24,7 +24,7 @@ import {SafeCast} from '../../../dependencies/openzeppelin/contracts/SafeCast.so import {IncentivizedERC20} from '../../tokenization/base/IncentivizedERC20.sol'; /** - * @title ReserveLogic library + * @title ValidationLogic library * @author Aave * @notice Implements functions to validate the different actions of the protocol */ From 0160ab55a1e4351765deca759ae93cd1c6088bc5 Mon Sep 17 00:00:00 2001 From: Ian Flexa <85500650+ianflexa@users.noreply.github.com> Date: Wed, 27 Nov 2024 12:47:07 -0400 Subject: [PATCH 64/72] fix: filtering reserves aTokens (#128) --- tests/protocol/pool/Pool.Deficit.sol | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/protocol/pool/Pool.Deficit.sol b/tests/protocol/pool/Pool.Deficit.sol index 741a2bdd..3f814c52 100644 --- a/tests/protocol/pool/Pool.Deficit.sol +++ b/tests/protocol/pool/Pool.Deficit.sol @@ -285,5 +285,8 @@ contract PoolDeficitTests is TestnetProcedures { vm.assume(user != tokenList.wbtc); vm.assume(user != tokenList.weth); vm.assume(user != 0xcF63D4456FCF098EF4012F6dbd2FA3a30f122D43); + vm.assume(user != contracts.poolProxy.getReserveAToken(tokenList.usdx)); + vm.assume(user != contracts.poolProxy.getReserveAToken(tokenList.wbtc)); + vm.assume(user != contracts.poolProxy.getReserveAToken(tokenList.weth)); } } From 7aabb1bf55feb0bad3ad4dae35d8bb561e07f800 Mon Sep 17 00:00:00 2001 From: Lukas Date: Mon, 9 Dec 2024 10:22:11 +0100 Subject: [PATCH 65/72] docs: update example to not overlap with other mechanics --- docs/3.3/Aave-v3.3-features.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/docs/3.3/Aave-v3.3-features.md b/docs/3.3/Aave-v3.3-features.md index 7c895c0b..ee0b7fa6 100644 --- a/docs/3.3/Aave-v3.3-features.md +++ b/docs/3.3/Aave-v3.3-features.md @@ -71,7 +71,7 @@ Therefore in Aave v3.3 the Close Factor is altered to apply for the whole positi For the aave protocol it is problematic to have dust debt positions, as there is no incentive to liquidate them, while on the other hand they create an ever increasing liability to the protocol. Most of these dust debt positions are caused by the 50% close factor being applied to already small positions. -In this liquidators can only liquidate 50% of a position which will decrease the overall position value to a point where the gas cost no longer outweighs the liquidation bonus. +In this case, liquidators can only liquidate 50% of a position which will decrease the overall position value to a point where the gas cost no longer outweighs the liquidation bonus. Therefore in order to reduce the accumulation of minor debt positions, a new mechanism is introduced: Liquidations up to a 100% close factor are now allowed whenever the total principal or the total debt of the user on the specific reserve being liquidated is below a `MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD` @@ -79,15 +79,13 @@ Liquidations up to a 100% close factor are now allowed whenever the total princi **Example**: Assuming a `MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD` of 1_000e8 and a position composed as: -- 2_300e8 collateral A -- 800e8 collateral B -- 900e8 debt A -- 1_100e8 debt B +- 1200 $ collateral A +- 900 $ debt B - a health-factor at 0.96 -In the previous system, a liquidation could have taken up to 50% of one of the two debt positions. -With the new system the `collateral B` and the `debt A` are below the `MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD`. -Therefore a liquidation could liquidate 100% of `debt A` for any principal and/or receive 100% of `collateral B` while liquidating any debt. +In the previous system, a liquidation could have liquidated up to 50% of `debt B`. +With the new system the debt position is below the `MIN_BASE_MAX_CLOSE_FACTOR_THRESHOLD`. +Therefore a liquidation could liquidate 100% of `debt B`. **Acknowledged limitations** Liquidations are still highly influenced by gas prices, liquidation-bonus and secondary market liquidity. From 9ed7ad7446b5b8323f78701df68e865f42441a26 Mon Sep 17 00:00:00 2001 From: sendra Date: Mon, 9 Dec 2024 12:58:23 +0100 Subject: [PATCH 66/72] feat: update solidity utils lib with linea updates --- lib/forge-std | 2 +- lib/solidity-utils | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/forge-std b/lib/forge-std index 07263d19..d3db4ef9 160000 --- a/lib/forge-std +++ b/lib/forge-std @@ -1 +1 @@ -Subproject commit 07263d193d621c4b2b0ce8b4d54af58f6957d97d +Subproject commit d3db4ef90a72b7d24aa5a2e5c649593eaef7801d diff --git a/lib/solidity-utils b/lib/solidity-utils index 55d9b81d..6f72233c 160000 --- a/lib/solidity-utils +++ b/lib/solidity-utils @@ -1 +1 @@ -Subproject commit 55d9b81d2ea8b0a78b85a46b343f64a979f543da +Subproject commit 6f72233c112ed0df5b6c3e02a2a3d04a56e3b2bc From 12df3fdf666242d0746f8dae393dcf6e749357ee Mon Sep 17 00:00:00 2001 From: sendra Date: Mon, 9 Dec 2024 13:04:14 +0100 Subject: [PATCH 67/72] fix: correct inherit docs contract --- src/contracts/extensions/stata-token/StataTokenV2.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/contracts/extensions/stata-token/StataTokenV2.sol b/src/contracts/extensions/stata-token/StataTokenV2.sol index 27083407..206c2daf 100644 --- a/src/contracts/extensions/stata-token/StataTokenV2.sol +++ b/src/contracts/extensions/stata-token/StataTokenV2.sol @@ -59,7 +59,7 @@ contract StataTokenV2 is else _unpause(); } - /// @inheritdoc IRescuable + /// @inheritdoc Rescuable function whoCanRescue() public view override returns (address) { return POOL_ADDRESSES_PROVIDER.getACLAdmin(); } From 9a6add741c8024c49186a08aca14192f6268be50 Mon Sep 17 00:00:00 2001 From: Lukas Date: Mon, 9 Dec 2024 14:21:19 +0100 Subject: [PATCH 68/72] docs: add mixbytes stata token v2 audit (#85) --- ...StataToken(watoken)SecurityAuditReport.pdf | Bin 0 -> 1140486 bytes ...rapping.jpeg => stata-token-wrapping.jpeg} | Bin 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 audits/2024-12-05_MixBytes_AaveStataToken(watoken)SecurityAuditReport.pdf rename resources/{static-a-token-wrapping.jpeg => stata-token-wrapping.jpeg} (100%) diff --git a/audits/2024-12-05_MixBytes_AaveStataToken(watoken)SecurityAuditReport.pdf b/audits/2024-12-05_MixBytes_AaveStataToken(watoken)SecurityAuditReport.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9c744a3ef26dbeacb8e51b25a3699dfe8ffd8531 GIT binary patch literal 1140486 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 z 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�NbPl~4mAZ8tn#6Q{rjls2Ql~eQQ#3EWA|an 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

RffH^;H;1!*Iw+{vNw3W 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%0ACh5>Iodplh5NR#aNCRb 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 z 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%0ACh5>Iodplh5NR#aNCRbPoJA_v>2rN zN5|bXoy->mt*W_Oi^EU1Gk%;oeuYVD(&@~cc|!S2;ovHA=AE&-_`8rZ(;%O?qPgXU z$p(7N`*Gk$@5w-;_gt#@#?ZvfG1+7CZ&Te7s?A>%nw9@#=z;w8q1E|2Tq#t_q`_!G zK*&TQsmw>g70$JIG-eOdGR3tl*Xxmoy|64Ok+!E|A|~lh5An$58rf=Dos3h#wZG2K@A4n;pYWgc^L}eV#;D7fRgf0!8#EFF#l@M@lT4&0KEPit zF{-anl{>*6KL@t>x%v!gUPJu%dY2R$Fc*>LuqdR=XN8%j?2DU-t-m3K1S@R)R%no< z(Byf_d^2PHLMBCMVSz3`?^4mh%}(gPRLkVyeT2gdzx14*W}16=Lu2EH!*lm7Ui{vB zix=;s?>-?&jO~LuMMk8fU1}k{dt{U~Z6{>wRsykJ552#C*+cvH<60PuYhfa;g<^6| zH1ly=qlfauNUjx66E7tX(bZ%Pts|SMe69Fd$rjO8$=i}oCC6GF)vv^ zx#ko2KaO`@5zYEW5+y?=N>=%FQg6Ma!oTe1Uh%*HQfDbGQ>s-JWlEP9m#W=N?ueUs zZVCBGq*^@pgk#?Sf9SFFBsaQ+WjA?2^XsX>~X{~!~=>>(nf&jQUIN-N^QPTe1= z^}AYK5!VLSh%4>-3zynvv}_TL>_-Ra* z%{Z8Bm=p?_!w$lX)m47&{+tVoWuDTar|*+9MeZCZ-yg^xXtyo#RFQjtyX%(y_)607 z`4T#XyYgeQH?Fk4`R2m47e304UrFMx zsHxdrQBzY{;jga~QG0ubzgg7bG9J(RIhltdbci3Qz11&qF zJ)q?*T1nds0MWN9t!vrS_`B!;Tb0P{*iior;<3c5}I zB+TbtJMQTrTd1!ccXzO>tCd}y4fOh$Sl!2VKDXk7%0D}G&?I|%Tz-YFSg`5{3Q1WHUb2y!bqL6f%~o8r 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 Date: Tue, 10 Dec 2024 19:22:33 +0100 Subject: [PATCH 69/72] fix: consider deficit as part of unbacked this patch, prevent termporarily overpaying liquidity providers while the deficit is not resolved fix: add tests to check ir invariants fix: move update rates --- docs/3.3/Aave-v3.3-features.md | 4 + docs/3.3/Aave-v3.3-properties.md | 1 + .../libraries/logic/LiquidationLogic.sol | 5 +- .../protocol/libraries/logic/ReserveLogic.sol | 2 +- tests/protocol/pool/Pool.Deficit.sol | 217 ++++++++++-------- 5 files changed, 125 insertions(+), 104 deletions(-) diff --git a/docs/3.3/Aave-v3.3-features.md b/docs/3.3/Aave-v3.3-features.md index ee0b7fa6..00a62ff7 100644 --- a/docs/3.3/Aave-v3.3-features.md +++ b/docs/3.3/Aave-v3.3-features.md @@ -160,3 +160,7 @@ We plan on adding more dedicated getters in the future as we see fit. The previously deprecated `pool.getReserveDataExtended()` was removed. You can fetch the data via `pool.getReserveData()`, `pool.getVirtualUnderlyingBalance()` & `pool.getVirtualUnderlyingBalance()`. + +While the interface of `calculateInterestRates` did not change, the usage assumptions changed. +Instead of passing `reserve.unbacked` you now have to pass `reserve.deficit + reserve.unbacked`. +The rational being that both values represent unbacked tokens on the pool. diff --git a/docs/3.3/Aave-v3.3-properties.md b/docs/3.3/Aave-v3.3-properties.md index 5af93105..57c90c60 100644 --- a/docs/3.3/Aave-v3.3-properties.md +++ b/docs/3.3/Aave-v3.3-properties.md @@ -19,6 +19,7 @@ Formal properties in natural language of the 3.3 features. - Deficit added during the liquidation can't be more than the user's debt - Deficit can only be created and eliminated for an `active` reserve. - Edge case: deficit can be created and eliminated even is a reserve is `paused` in case it is not the main liquidated asset. Both actions don't affect a user negatively, and preventing the burning of bad debt on paused reserves could create overhead for the protocol. +- For the interest rate calculation, deficit is treated equally as the unbacked parameter, given that it should be reducing utilisation. ### 2. Liquidation mechanics diff --git a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol index 0db2ca33..183f6f1b 100644 --- a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -124,9 +124,6 @@ library LiquidationLogic { : IERC20(params.asset).balanceOf(msg.sender); require(balanceWriteOff <= userBalance, Errors.NOT_ENOUGH_AVAILABLE_USER_BALANCE); - // update ir due to updateState - reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, 0, 0); - if (reserveCache.reserveConfiguration.getIsVirtualAccActive()) { // assets without virtual accounting can never be a collateral bool isCollateral = userConfig.isUsingAsCollateral(reserve.id); @@ -163,6 +160,8 @@ library LiquidationLogic { reserve.deficit -= balanceWriteOff.toUint128(); + reserve.updateInterestRatesAndVirtualBalance(reserveCache, params.asset, 0, 0); + emit DeficitCovered(params.asset, msg.sender, balanceWriteOff); } diff --git a/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/src/contracts/protocol/libraries/logic/ReserveLogic.sol index 805ae634..758f5c79 100644 --- a/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ b/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -179,7 +179,7 @@ library ReserveLogic { reserve.interestRateStrategyAddress ).calculateInterestRates( DataTypes.CalculateInterestRatesParams({ - unbacked: reserve.unbacked, + unbacked: reserve.unbacked + reserve.deficit, liquidityAdded: liquidityAdded, liquidityTaken: liquidityTaken, totalDebt: totalVariableDebt, diff --git a/tests/protocol/pool/Pool.Deficit.sol b/tests/protocol/pool/Pool.Deficit.sol index 3f814c52..2fc453aa 100644 --- a/tests/protocol/pool/Pool.Deficit.sol +++ b/tests/protocol/pool/Pool.Deficit.sol @@ -4,6 +4,7 @@ pragma solidity ^0.8.0; import 'forge-std/Test.sol'; import 'forge-std/StdStorage.sol'; +import {IPriceOracleGetter} from '../../../src/contracts/interfaces/IPriceOracleGetter.sol'; import {IERC20} from '../../../src/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; import {IERC20Detailed} from '../../../src/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol'; import {IPool, DataTypes} from '../../../src/contracts/interfaces/IPool.sol'; @@ -26,27 +27,23 @@ contract PoolDeficitTests is TestnetProcedures { function test_eliminateReserveDeficit_exactDeficit( address coverageAdmin, - uint120 supplyAmount + uint120 borrowAmount ) public { _filterAddresses(coverageAdmin); - (address reserveToken, uint256 currentDeficit) = _createReserveDeficit( - supplyAmount, - tokenList.usdx - ); + uint256 currentDeficit = _createReserveDeficit(borrowAmount, tokenList.usdx); vm.prank(poolAdmin); contracts.poolAddressesProvider.setAddress(bytes32('UMBRELLA'), coverageAdmin); - deal(reserveToken, coverageAdmin, currentDeficit + 1); DataTypes.ReserveDataLegacy memory reserveData = contracts.poolProxy.getReserveData( - reserveToken + tokenList.usdx ); - vm.startPrank(coverageAdmin); // +1 to account for imprecision on supply - deal(reserveToken, coverageAdmin, currentDeficit + 1); - IERC20(reserveToken).approve(report.poolProxy, UINT256_MAX); - contracts.poolProxy.supply(reserveToken, currentDeficit + 1, coverageAdmin, 0); + _mintATokens(tokenList.usdx, coverageAdmin, currentDeficit + 1); + + vm.startPrank(coverageAdmin); + IERC20(tokenList.usdx).approve(report.poolProxy, UINT256_MAX); DataTypes.UserConfigurationMap memory userConfigBefore = contracts .poolProxy .getUserConfiguration(coverageAdmin); @@ -54,40 +51,37 @@ contract PoolDeficitTests is TestnetProcedures { // eliminate deficit vm.expectEmit(address(contracts.poolProxy)); - emit DeficitCovered(reserveToken, coverageAdmin, currentDeficit); - contracts.poolProxy.eliminateReserveDeficit(reserveToken, currentDeficit); + emit DeficitCovered(tokenList.usdx, coverageAdmin, currentDeficit); + contracts.poolProxy.eliminateReserveDeficit(tokenList.usdx, currentDeficit); - assertEq(contracts.poolProxy.getReserveDeficit(reserveToken), 0); + assertEq(contracts.poolProxy.getReserveDeficit(tokenList.usdx), 0); } - function test_eliminateReserveDeficit_exactUserBalance( + function test_eliminateReserveDeficit_fullUserBalance( address coverageAdmin, - uint120 supplyAmount + uint120 borrowAmount ) public { _filterAddresses(coverageAdmin); - (address reserveToken, uint256 currentDeficit) = _createReserveDeficit( - supplyAmount, - tokenList.usdx - ); + uint256 currentDeficit = _createReserveDeficit(borrowAmount, tokenList.usdx); vm.prank(poolAdmin); contracts.poolAddressesProvider.setAddress(bytes32('UMBRELLA'), coverageAdmin); DataTypes.ReserveDataLegacy memory reserveData = contracts.poolProxy.getReserveData( - reserveToken + tokenList.usdx ); + _mintATokens(tokenList.usdx, coverageAdmin, currentDeficit / 2); + vm.startPrank(coverageAdmin); - deal(reserveToken, coverageAdmin, currentDeficit); - IERC20(reserveToken).approve(report.poolProxy, UINT256_MAX); - contracts.poolProxy.supply(reserveToken, currentDeficit / 2, coverageAdmin, 0); + IERC20(tokenList.usdx).approve(report.poolProxy, UINT256_MAX); DataTypes.UserConfigurationMap memory userConfigBefore = contracts .poolProxy .getUserConfiguration(coverageAdmin); assertEq(userConfigBefore.isUsingAsCollateral(reserveData.id), true); uint256 deficitToCover = IERC20(reserveData.aTokenAddress).balanceOf(coverageAdmin); - contracts.poolProxy.eliminateReserveDeficit(reserveToken, deficitToCover); + contracts.poolProxy.eliminateReserveDeficit(tokenList.usdx, deficitToCover); DataTypes.UserConfigurationMap memory userConfigAfter = contracts .poolProxy @@ -97,30 +91,25 @@ contract PoolDeficitTests is TestnetProcedures { function test_eliminateReserveDeficit_surplus( address coverageAdmin, - uint120 supplyAmount + uint120 borrowAmount ) public { _filterAddresses(coverageAdmin); - (address reserveToken, uint256 currentDeficit) = _createReserveDeficit( - supplyAmount, - tokenList.usdx - ); + uint256 currentDeficit = _createReserveDeficit(borrowAmount, tokenList.usdx); vm.prank(poolAdmin); contracts.poolAddressesProvider.setAddress(bytes32('UMBRELLA'), coverageAdmin); - deal(reserveToken, coverageAdmin, currentDeficit + 1000); - - vm.startPrank(coverageAdmin); - IERC20(reserveToken).approve(report.poolProxy, UINT256_MAX); - contracts.poolProxy.supply(reserveToken, currentDeficit + 1000, coverageAdmin, 0); + _mintATokens(tokenList.usdx, coverageAdmin, currentDeficit + 1000); // eliminate deficit + vm.startPrank(coverageAdmin); + IERC20(tokenList.usdx).approve(report.poolProxy, UINT256_MAX); vm.expectEmit(address(contracts.poolProxy)); - emit DeficitCovered(reserveToken, coverageAdmin, currentDeficit); - contracts.poolProxy.eliminateReserveDeficit(reserveToken, currentDeficit + 1000); + emit DeficitCovered(tokenList.usdx, coverageAdmin, currentDeficit); + contracts.poolProxy.eliminateReserveDeficit(tokenList.usdx, currentDeficit + 1000); DataTypes.ReserveDataLegacy memory reserveData = contracts.poolProxy.getReserveData( - reserveToken + tokenList.usdx ); DataTypes.UserConfigurationMap memory userConfig = contracts.poolProxy.getUserConfiguration( coverageAdmin @@ -130,86 +119,73 @@ contract PoolDeficitTests is TestnetProcedures { function test_eliminateReserveDeficit_parcial( address coverageAdmin, - uint120 supplyAmount, + uint120 borrowAmount, uint120 amountToCover ) public { _filterAddresses(coverageAdmin); - (address reserveToken, uint256 currentDeficit) = _createReserveDeficit( - supplyAmount, - tokenList.usdx - ); + uint256 currentDeficit = _createReserveDeficit(borrowAmount, tokenList.usdx); amountToCover = uint120(bound(amountToCover, 1, currentDeficit)); vm.prank(poolAdmin); contracts.poolAddressesProvider.setAddress(bytes32('UMBRELLA'), coverageAdmin); - deal(reserveToken, coverageAdmin, currentDeficit); - - vm.startPrank(coverageAdmin); - IERC20(reserveToken).approve(report.poolProxy, UINT256_MAX); - contracts.poolProxy.supply(reserveToken, currentDeficit, coverageAdmin, 0); + _mintATokens(tokenList.usdx, coverageAdmin, currentDeficit); // eliminate deficit + vm.startPrank(coverageAdmin); + IERC20(tokenList.usdx).approve(report.poolProxy, UINT256_MAX); vm.expectEmit(address(contracts.poolProxy)); - emit DeficitCovered(reserveToken, coverageAdmin, amountToCover); - contracts.poolProxy.eliminateReserveDeficit(reserveToken, amountToCover); + emit DeficitCovered(tokenList.usdx, coverageAdmin, amountToCover); + contracts.poolProxy.eliminateReserveDeficit(tokenList.usdx, amountToCover); } function test_reverts_eliminateReserveDeficit_has_borrows( address coverageAdmin, - uint120 supplyAmount, + uint120 borrowAmount, uint120 cAdminBorrowAmount ) public { _filterAddresses(coverageAdmin); - (address reserveToken, uint256 currentDeficit) = _createReserveDeficit( - supplyAmount, - tokenList.usdx - ); + uint256 currentDeficit = _createReserveDeficit(borrowAmount, tokenList.usdx); cAdminBorrowAmount = uint120(bound(cAdminBorrowAmount, 1, currentDeficit / 2)); vm.prank(poolAdmin); contracts.poolAddressesProvider.setAddress(bytes32('UMBRELLA'), coverageAdmin); - deal(reserveToken, coverageAdmin, currentDeficit); - + _mintATokens(tokenList.usdx, coverageAdmin, currentDeficit); vm.startPrank(coverageAdmin); - IERC20(reserveToken).approve(report.poolProxy, UINT256_MAX); - contracts.poolProxy.supply(reserveToken, currentDeficit, coverageAdmin, 0); - contracts.poolProxy.borrow(reserveToken, cAdminBorrowAmount, 2, 0, coverageAdmin); + IERC20(tokenList.usdx).approve(report.poolProxy, UINT256_MAX); + contracts.poolProxy.borrow(tokenList.usdx, cAdminBorrowAmount, 2, 0, coverageAdmin); vm.expectRevert(bytes(Errors.USER_CANNOT_HAVE_DEBT)); - contracts.poolProxy.eliminateReserveDeficit(reserveToken, currentDeficit); + contracts.poolProxy.eliminateReserveDeficit(tokenList.usdx, currentDeficit); } function test_reverts_eliminateReserveDeficit_invalid_caller( address caller, - uint120 supplyAmount + uint120 borrowAmount ) public { _filterAddresses(caller); - (address reserveToken, uint256 currentDeficit) = _createReserveDeficit( - supplyAmount, - tokenList.usdx - ); + uint256 currentDeficit = _createReserveDeficit(borrowAmount, tokenList.usdx); vm.expectRevert(bytes(Errors.CALLER_NOT_UMBRELLA)); vm.prank(caller); - contracts.poolProxy.eliminateReserveDeficit(reserveToken, currentDeficit); + contracts.poolProxy.eliminateReserveDeficit(tokenList.usdx, currentDeficit); } function test_reverts_eliminateReserveDeficit_invalid_amount( address coverageAdmin, - uint120 supplyAmount + uint120 borrowAmount ) public { _filterAddresses(coverageAdmin); - (address reserveToken, ) = _createReserveDeficit(supplyAmount, tokenList.usdx); + _createReserveDeficit(borrowAmount, tokenList.usdx); vm.prank(poolAdmin); contracts.poolAddressesProvider.setAddress(bytes32('UMBRELLA'), coverageAdmin); vm.startPrank(coverageAdmin); vm.expectRevert(bytes(Errors.INVALID_AMOUNT)); - contracts.poolProxy.eliminateReserveDeficit(reserveToken, 0); + contracts.poolProxy.eliminateReserveDeficit(tokenList.usdx, 0); } function test_reverts_eliminateReserveDeficit_reserve_not_in_deficit( @@ -226,40 +202,49 @@ contract PoolDeficitTests is TestnetProcedures { contracts.poolProxy.eliminateReserveDeficit(tokenList.usdx, 1); } - function _createReserveDeficit( - uint120 supplyAmount, - address borrowAsset - ) internal returns (address, uint256) { - vm.assume(supplyAmount != 0); - deal(tokenList.wbtc, alice, supplyAmount); - vm.startPrank(alice); - IERC20(tokenList.wbtc).approve(address(contracts.poolProxy), supplyAmount); - contracts.poolProxy.supply(tokenList.wbtc, supplyAmount, alice, 0); - (, , uint256 availableBorrowsBase, , , ) = contracts.poolProxy.getUserAccountData(alice); - vm.stopPrank(); + function test_interestRate() external { + address coverageAdmin = makeAddr('covAdmin'); + vm.prank(poolAdmin); + contracts.poolAddressesProvider.setAddress(bytes32('UMBRELLA'), coverageAdmin); + _mintATokens(tokenList.usdx, bob, 1_000_000 ether); + vm.prank(bob); - uint256 borrowAmount = (availableBorrowsBase * 10 ** IERC20Detailed(borrowAsset).decimals()) / - contracts.aaveOracle.getAssetPrice(borrowAsset); + contracts.poolProxy.borrow(tokenList.usdx, 200_000 ether, 2, 0, bob); + _checkIrInvariant(tokenList.usdx); - // setup available amount to borrow - deal(borrowAsset, carol, borrowAmount); - vm.prank(carol); - IERC20(borrowAsset).approve(address(contracts.poolProxy), borrowAmount); - vm.prank(carol); - contracts.poolProxy.supply(borrowAsset, borrowAmount, carol, 0); + uint256 deficit = _createReserveDeficit(500_000 ether, tokenList.usdx, false); + _checkIrInvariant(tokenList.usdx); - vm.prank(alice); - contracts.poolProxy.borrow(borrowAsset, borrowAmount, 2, 0, alice); - vm.stopPrank(); + _mintATokens(tokenList.usdx, coverageAdmin, deficit); + vm.startPrank(coverageAdmin); + IERC20(tokenList.usdx).approve(report.poolProxy, deficit); + contracts.poolProxy.eliminateReserveDeficit(tokenList.usdx, deficit); + _checkIrInvariant(tokenList.usdx); + } - vm.warp(block.timestamp + 30 days); + function _checkIrInvariant(address asset) internal { + DataTypes.ReserveDataLegacy memory reserveData = contracts.poolProxy.getReserveData(asset); + assertLt( + reserveData.currentLiquidityRate * IERC20(reserveData.aTokenAddress).totalSupply(), + reserveData.currentVariableBorrowRate * + IERC20(reserveData.variableDebtTokenAddress).totalSupply() + ); + } - stdstore - .target(IAaveOracle(report.aaveOracle).getSourceOfAsset(tokenList.wbtc)) - .sig('_latestAnswer()') - .checked_write( - _calcPrice(IAaveOracle(report.aaveOracle).getAssetPrice(tokenList.wbtc), 20_00) - ); + function _createReserveDeficit( + uint256 borrowAmount, + address borrowAsset, + bool mintBorrowableAssets + ) internal returns (uint256) { + borrowAmount = bound(borrowAmount, 1e18, type(uint120).max); + _mintATokens(tokenList.wbtc, alice, 1); + + if (mintBorrowableAssets) { + // setup available amount to borrow + _mintATokens(borrowAsset, carol, borrowAmount); + } + + _borrowArbitraryAmount(borrowAsset, alice, borrowAmount); deal(borrowAsset, bob, borrowAmount); vm.prank(bob); @@ -271,7 +256,14 @@ contract PoolDeficitTests is TestnetProcedures { assertGt(currentDeficit, 0); - return (borrowAsset, currentDeficit); + return currentDeficit; + } + + function _createReserveDeficit( + uint120 borrowAmount, + address borrowAsset + ) internal returns (uint256) { + return _createReserveDeficit(borrowAmount, borrowAsset, true); } function _filterAddresses(address user) internal view { @@ -289,4 +281,29 @@ contract PoolDeficitTests is TestnetProcedures { vm.assume(user != contracts.poolProxy.getReserveAToken(tokenList.wbtc)); vm.assume(user != contracts.poolProxy.getReserveAToken(tokenList.weth)); } + + // we reinvent these helpers on each contract and should move them somewhere common + function _mintATokens(address underlying, address receiver, uint256 amount) internal { + deal(underlying, receiver, amount); + vm.startPrank(receiver); + IERC20(underlying).approve(address(contracts.poolProxy), amount); + contracts.poolProxy.deposit(underlying, amount, receiver, 0); + vm.stopPrank(); + } + + // assumes that the caller has at least one unit of collateralAsset that is not the borrowAsset + function _borrowArbitraryAmount(address borrowAsset, address borrower, uint256 amount) internal { + address oracle = contracts.poolProxy.ADDRESSES_PROVIDER().getPriceOracle(); + // set the oracle price of the borrow asset to 0 + vm.mockCall( + oracle, + abi.encodeWithSelector(IPriceOracleGetter.getAssetPrice.selector, address(borrowAsset)), + abi.encode(0) + ); + // borrow the full emount of the asset + vm.prank(borrower); + contracts.poolProxy.borrow(borrowAsset, amount, 2, 0, borrower); + // revert the oracle price + vm.clearMockedCalls(); + } } From 002a2b13e2be076ac15b6e7d6675128394287e5d Mon Sep 17 00:00:00 2001 From: Lukas Date: Wed, 11 Dec 2024 10:51:59 +0100 Subject: [PATCH 70/72] Update src/contracts/interfaces/IPool.sol Co-authored-by: miguelmtz <36620902+miguelmtzinf@users.noreply.github.com> --- src/contracts/interfaces/IPool.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/contracts/interfaces/IPool.sol b/src/contracts/interfaces/IPool.sol index 58b7020b..b1998193 100644 --- a/src/contracts/interfaces/IPool.sol +++ b/src/contracts/interfaces/IPool.sol @@ -816,7 +816,7 @@ interface IPool { /** * @notice Returns the current deficit of a reserve. * @param asset The address of the underlying asset of the reserve - * @return The the current deficit + * @return The current deficit of the reserve */ function getReserveDeficit(address asset) external view returns (uint256); From 487f19a95f57dfb77b8168b637247d27a134e477 Mon Sep 17 00:00:00 2001 From: Lukas Date: Wed, 11 Dec 2024 13:14:33 +0100 Subject: [PATCH 71/72] chore: bump revisions fix typos (#41) * fix: remove gas diff - it's outdated and we now have it on every commit to main * fix: address miguels feedback * ci: bump workflows give permissions to write commit comments * fix: bump revisions --- .github/workflows/comment.yml | 1 + .github/workflows/test.yml | 8 +- docs/3.3/gas-diff.md | 1529 ----------------- .../instances/PoolConfiguratorInstance.sol | 2 +- src/contracts/instances/PoolInstance.sol | 2 +- src/contracts/interfaces/IPool.sol | 8 +- .../libraries/logic/LiquidationLogic.sol | 4 +- .../protocol/libraries/logic/ReserveLogic.sol | 5 - 8 files changed, 13 insertions(+), 1546 deletions(-) delete mode 100644 docs/3.3/gas-diff.md diff --git a/.github/workflows/comment.yml b/.github/workflows/comment.yml index 5efdc137..afebd710 100644 --- a/.github/workflows/comment.yml +++ b/.github/workflows/comment.yml @@ -12,6 +12,7 @@ permissions: checks: read statuses: read pull-requests: write + contents: write jobs: comment: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index bc7fc451..f0fd3d78 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -47,20 +47,20 @@ jobs: run: npm ci --prefer-offline --no-audit - name: Run Foundry setup - uses: bgd-labs/github-workflows/.github/actions/foundry-setup@d738561b5afce35ca3752b28236c9dd68a3fa822 + uses: bgd-labs/github-workflows/.github/actions/foundry-setup@4f16d15e380bbcf7e3933698c08b9fd34e967f78 - name: Run Forge tests - uses: bgd-labs/github-workflows/.github/actions/foundry-test@d738561b5afce35ca3752b28236c9dd68a3fa822 + uses: bgd-labs/github-workflows/.github/actions/foundry-test@4f16d15e380bbcf7e3933698c08b9fd34e967f78 - name: Run Gas report - uses: bgd-labs/github-workflows/.github/actions/foundry-gas-report@d738561b5afce35ca3752b28236c9dd68a3fa822 + uses: bgd-labs/github-workflows/.github/actions/foundry-gas-report@4f16d15e380bbcf7e3933698c08b9fd34e967f78 - name: Cleanup # This test will currently fail on coverage due to the gas limit beaing breached with optimizer disabled run: rm tests/deployments/DeploymentsGasLimits.t.sol - name: Run Lcov report - uses: bgd-labs/github-workflows/.github/actions/foundry-lcov-report@d738561b5afce35ca3752b28236c9dd68a3fa822 + uses: bgd-labs/github-workflows/.github/actions/foundry-lcov-report@4f16d15e380bbcf7e3933698c08b9fd34e967f78 - name: Save PR number if: github.event_name == 'pull_request' || github.event_name == 'pull_request_target' diff --git a/docs/3.3/gas-diff.md b/docs/3.3/gas-diff.md deleted file mode 100644 index 3eba6442..00000000 --- a/docs/3.3/gas-diff.md +++ /dev/null @@ -1,1529 +0,0 @@ -```diff -diff --git a/reports/gas.old b/reports/gas.new -index 6249f68..111aa38 100644 ---- a/reports/gas.old -+++ b/reports/gas.new -@@ -3,7 +3,7 @@ - | Deployment Cost | Deployment Size | | | | | - | 827595 | 3611 | | | | | - | Function Name | min | avg | median | max | # calls | --| balanceOf | 579 | 1100 | 579 | 2579 | 1775 | -+| balanceOf | 579 | 1102 | 579 | 2579 | 1775 | - | initialize | 157662 | 157662 | 157662 | 157662 | 30 | - - -@@ -30,26 +30,26 @@ - | balanceOf | 1442 | 1442 | 1442 | 1442 | 1 | - | canPause | 18899 | 18899 | 18899 | 18899 | 56 | - | claimRewardsToSelf | 32178 | 32178 | 32178 | 32178 | 1 | --| createStataTokens | 2513736 | 2513736 | 2513736 | 2513736 | 23 | -+| createStataTokens | 2436116 | 2436116 | 2436116 | 2436116 | 23 | - | decimals | 1404 | 1404 | 1404 | 1404 | 1 | --| deposit | 296168 | 296168 | 296168 | 296168 | 1 | --| depositATokens | 176709 | 179776 | 176721 | 218511 | 55 | --| emergencyTokenTransfer | 35389 | 153752 | 157301 | 174420 | 54 | -+| deposit | 287548 | 287548 | 287548 | 287548 | 1 | -+| depositATokens | 176775 | 179779 | 176787 | 218577 | 56 | -+| emergencyTokenTransfer | 35389 | 153894 | 157389 | 174508 | 55 | - | getReferenceAsset | 3277 | 3277 | 3277 | 3277 | 1 | - | getStataToken | 1358 | 1358 | 1358 | 1358 | 23 | - | maxRedeem | 8261 | 8261 | 8261 | 8261 | 2 | --| maxWithdraw | 10927 | 10927 | 10927 | 10927 | 1 | --| mint | 296262 | 296262 | 296262 | 296262 | 1 | -+| maxWithdraw | 10949 | 10949 | 10949 | 10949 | 1 | -+| mint | 287642 | 287642 | 287642 | 287642 | 1 | - | name | 10669 | 10669 | 10669 | 10669 | 1 | - | nonces | 10065 | 10065 | 10065 | 10065 | 3 | - | paused | 1255 | 5505 | 5505 | 9755 | 2 | - | permit | 31430 | 61234 | 63913 | 88360 | 3 | --| previewDeposit | 23248 | 23248 | 23248 | 23248 | 1 | --| redeem | 60981 | 60981 | 60981 | 60981 | 1 | -+| previewDeposit | 23270 | 23270 | 23270 | 23270 | 1 | -+| redeem | 61003 | 61003 | 61003 | 61003 | 1 | - | setPaused | 40089 | 42730 | 40089 | 63486 | 62 | - | symbol | 4181 | 4181 | 4181 | 4181 | 1 | - | transfer | 31688 | 31688 | 31688 | 31688 | 1 | --| withdraw | 63648 | 63648 | 63648 | 63648 | 1 | -+| withdraw | 63692 | 63692 | 63692 | 63692 | 1 | - - - | src/contracts/dependencies/weth/WETH9.sol:WETH9 contract | | | | | | -@@ -58,9 +58,9 @@ - | 535043 | 2354 | | | | | - | Function Name | min | avg | median | max | # calls | - | allowance | 800 | 1500 | 800 | 2800 | 20 | --| approve | 28992 | 45929 | 46464 | 46464 | 1763 | --| balanceOf | 538 | 948 | 538 | 2538 | 8921 | --| decimals | 2312 | 2312 | 2312 | 2312 | 687 | -+| approve | 28992 | 45952 | 46464 | 46464 | 2010 | -+| balanceOf | 538 | 965 | 538 | 2538 | 10527 | -+| decimals | 2312 | 2312 | 2312 | 2312 | 871 | - | symbol | 1209 | 2246 | 3209 | 3209 | 27 | - - -@@ -80,29 +80,29 @@ - | src/contracts/extensions/paraswap-adapters/ParaSwapLiquiditySwapAdapter.sol:ParaSwapLiquiditySwapAdapter contract | | | | | | - |-------------------------------------------------------------------------------------------------------------------|-----------------|--------|--------|--------|---------| - | Deployment Cost | Deployment Size | | | | | --| 2013105 | 9946 | | | | | -+| 1907377 | 9465 | | | | | - | Function Name | min | avg | median | max | # calls | - | owner | 384 | 384 | 384 | 384 | 2 | --| swapAndDeposit | 354784 | 445579 | 477520 | 504434 | 3 | -+| swapAndDeposit | 343811 | 435867 | 468438 | 495352 | 3 | - - - | src/contracts/extensions/paraswap-adapters/ParaSwapRepayAdapter.sol:ParaSwapRepayAdapter contract | | | | | | - |---------------------------------------------------------------------------------------------------|-----------------|--------|--------|--------|---------| - | Deployment Cost | Deployment Size | | | | | --| 2140443 | 10623 | | | | | -+| 2033146 | 10135 | | | | | - | Function Name | min | avg | median | max | # calls | - | owner | 406 | 406 | 406 | 406 | 2 | - | rescueTokens | 36115 | 36115 | 36115 | 36115 | 1 | --| swapAndRepay | 404190 | 512323 | 538923 | 567258 | 4 | -+| swapAndRepay | 376460 | 491714 | 520806 | 548783 | 4 | - - - | src/contracts/extensions/paraswap-adapters/ParaSwapWithdrawSwapAdapter.sol:ParaSwapWithdrawSwapAdapter contract | | | | | | - |-----------------------------------------------------------------------------------------------------------------|-----------------|--------|--------|--------|---------| - | Deployment Cost | Deployment Size | | | | | --| 1726578 | 8547 | | | | | -+| 1587776 | 7905 | | | | | - | Function Name | min | avg | median | max | # calls | - | owner | 406 | 406 | 406 | 406 | 2 | --| withdrawAndSwap | 354732 | 380661 | 373324 | 413928 | 3 | -+| withdrawAndSwap | 343759 | 371139 | 364527 | 405131 | 3 | - - - | src/contracts/extensions/static-a-token/StataTokenFactory.sol:StataTokenFactory contract | | | | | | -@@ -111,9 +111,9 @@ - | 0 | 0 | | | | | - | Function Name | min | avg | median | max | # calls | - | STATA_TOKEN_IMPL | 248 | 248 | 248 | 248 | 1 | --| createStataTokens | 2483966 | 2483966 | 2483966 | 2483966 | 23 | -+| createStataTokens | 2406346 | 2406346 | 2406346 | 2406346 | 23 | - | getStataToken | 569 | 569 | 569 | 569 | 23 | --| initialize | 24103 | 24103 | 24103 | 24103 | 655 | -+| initialize | 24103 | 24103 | 24103 | 24103 | 671 | - - - | src/contracts/extensions/static-a-token/StataTokenV2.sol:StataTokenV2 contract | | | | | | -@@ -130,24 +130,24 @@ - | canPause | 11610 | 11610 | 11610 | 11610 | 56 | - | claimRewardsToSelf | 3167 | 3167 | 3167 | 3167 | 1 | - | decimals | 618 | 618 | 618 | 618 | 1 | --| deposit | 267243 | 267243 | 267243 | 267243 | 1 | --| depositATokens | 157445 | 160480 | 157445 | 199187 | 55 | --| emergencyTokenTransfer | 6081 | 124656 | 128054 | 149925 | 54 | -+| deposit | 258623 | 258623 | 258623 | 258623 | 1 | -+| depositATokens | 157511 | 160492 | 157511 | 199253 | 56 | -+| emergencyTokenTransfer | 6081 | 124802 | 128142 | 150013 | 55 | - | getReferenceAsset | 2491 | 2491 | 2491 | 2491 | 1 | - | initialize | 25518 | 231417 | 232108 | 239108 | 70 | - | maxRedeem | 7472 | 7472 | 7472 | 7472 | 2 | --| maxWithdraw | 10138 | 10138 | 10138 | 10138 | 1 | --| mint | 267337 | 267337 | 267337 | 267337 | 1 | -+| maxWithdraw | 10160 | 10160 | 10160 | 10160 | 1 | -+| mint | 258717 | 258717 | 258717 | 258717 | 1 | - | name | 3377 | 3377 | 3377 | 3377 | 1 | - | nonces | 2776 | 2776 | 2776 | 2776 | 3 | - | paused | 469 | 1469 | 1469 | 2469 | 2 | - | permit | 776 | 30653 | 33460 | 57725 | 3 | --| previewDeposit | 15959 | 15959 | 15959 | 15959 | 1 | --| redeem | 31682 | 31682 | 31682 | 31682 | 1 | -+| previewDeposit | 15981 | 15981 | 15981 | 15981 | 1 | -+| redeem | 31704 | 31704 | 31704 | 31704 | 1 | - | setPaused | 11592 | 14234 | 11592 | 34996 | 62 | - | symbol | 3389 | 3389 | 3389 | 3389 | 1 | - | transfer | 2763 | 2763 | 2763 | 2763 | 1 | --| withdraw | 34349 | 34349 | 34349 | 34349 | 1 | -+| withdraw | 34393 | 34393 | 34393 | 34393 | 1 | - - - | src/contracts/extensions/v3-config-engine/AaveV3ConfigEngine.sol:AaveV3ConfigEngine contract | | | | | | -@@ -156,15 +156,15 @@ - | 0 | 0 | | | | | - | Function Name | min | avg | median | max | # calls | - | DEFAULT_INTEREST_RATE_STRATEGY | 270 | 270 | 270 | 270 | 5 | --| listAssets | 1804427 | 1804427 | 1804427 | 1804427 | 1 | --| listAssetsCustom | 1803763 | 5189401 | 5194695 | 5194695 | 649 | --| updateAssetsEMode | 190633 | 190633 | 190633 | 190633 | 1 | --| updateBorrowSide | 20061 | 76217 | 76217 | 132373 | 2 | -+| listAssets | 1792070 | 1792070 | 1792070 | 1792070 | 1 | -+| listAssetsCustom | 1791406 | 5156369 | 5161624 | 5161624 | 665 | -+| updateAssetsEMode | 179132 | 179132 | 179132 | 179132 | 1 | -+| updateBorrowSide | 20039 | 76074 | 76074 | 132110 | 2 | - | updateCaps | 59693 | 59693 | 59693 | 59693 | 1 | - | updateCollateralSide | 8750 | 30432 | 8874 | 62831 | 5 | --| updateEModeCategories | 10596 | 50460 | 28409 | 101350 | 5 | -+| updateEModeCategories | 10596 | 50688 | 28454 | 101899 | 5 | - | updatePriceFeeds | 39269 | 39269 | 39269 | 39269 | 1 | --| updateRateStrategies | 124920 | 124920 | 124920 | 124920 | 1 | -+| updateRateStrategies | 118868 | 118868 | 118868 | 118868 | 1 | - - - | src/contracts/helpers/AaveProtocolDataProvider.sol:AaveProtocolDataProvider contract | | | | | | -@@ -172,21 +172,21 @@ - | Deployment Cost | Deployment Size | | | | | - | 0 | 0 | | | | | - | Function Name | min | avg | median | max | # calls | --| getATokenTotalSupply | 12822 | 13973 | 12866 | 25922 | 2026 | --| getAllReservesTokens | 16144 | 28640 | 39644 | 39644 | 27 | --| getDebtCeiling | 3244 | 3244 | 3244 | 3244 | 4 | -+| getATokenTotalSupply | 6409 | 7551 | 6453 | 19531 | 2074 | -+| getAllReservesTokens | 16077 | 28573 | 39577 | 39577 | 27 | -+| getDebtCeiling | 3222 | 3222 | 3222 | 3222 | 4 | - | getDebtCeilingDecimals | 214 | 214 | 214 | 214 | 1 | - | getFlashLoanEnabled | 3217 | 4217 | 4217 | 5217 | 110 | --| getInterestRateStrategyAddress | 9534 | 21418 | 9534 | 43034 | 9 | --| getIsVirtualAccActive | 3245 | 3266 | 3267 | 3267 | 2096 | --| getLiquidationProtocolFee | 3266 | 9488 | 5266 | 16766 | 9 | --| getPaused | 3333 | 3409 | 3355 | 5355 | 2162 | --| getReserveCaps | 3267 | 8149 | 3267 | 16767 | 47 | --| getReserveConfigurationData | 3659 | 3830 | 3681 | 17181 | 2476 | --| getReserveTokensAddresses | 9510 | 15172 | 15554 | 43054 | 2739 | -+| getInterestRateStrategyAddress | 7745 | 17853 | 7745 | 37245 | 9 | -+| getIsVirtualAccActive | 3245 | 3266 | 3267 | 3267 | 2237 | -+| getLiquidationProtocolFee | 3244 | 9466 | 5244 | 16744 | 9 | -+| getPaused | 3311 | 3384 | 3333 | 5333 | 2303 | -+| getReserveCaps | 3245 | 8127 | 3245 | 16745 | 47 | -+| getReserveConfigurationData | 3637 | 3805 | 3659 | 17159 | 2621 | -+| getReserveTokensAddresses | 4808 | 5210 | 4874 | 20374 | 2902 | - | getSiloedBorrowing | 3270 | 3270 | 3270 | 3270 | 1 | --| getTotalDebt | 54903 | 54903 | 54903 | 54903 | 3 | --| getUserReserveData | 19863 | 28216 | 27941 | 46863 | 287 | -+| getTotalDebt | 32479 | 32479 | 32479 | 32479 | 3 | -+| getUserReserveData | 18096 | 24010 | 22556 | 41096 | 65 | - - - | src/contracts/helpers/L2Encoder.sol:L2Encoder contract | | | | | | -@@ -194,15 +194,15 @@ - | Deployment Cost | Deployment Size | | | | | - | 0 | 0 | | | | | - | Function Name | min | avg | median | max | # calls | --| encodeBorrowParams | 8851 | 8851 | 8851 | 8851 | 3 | --| encodeLiquidationCall | 23237 | 23237 | 23237 | 23237 | 1 | --| encodeRepayParams | 8734 | 8734 | 8734 | 8734 | 1 | --| encodeRepayWithATokensParams | 8761 | 8761 | 8761 | 8761 | 1 | --| encodeRepayWithPermitParams | 13218 | 13218 | 13218 | 13218 | 51 | --| encodeSetUserUseReserveAsCollateral | 8676 | 8676 | 8676 | 8676 | 1 | --| encodeSupplyParams | 40279 | 40279 | 40279 | 40279 | 7 | --| encodeSupplyWithPermitParams | 40633 | 40633 | 40633 | 40633 | 54 | --| encodeWithdrawParams | 8620 | 8653 | 8653 | 8687 | 2 | -+| encodeBorrowParams | 7084 | 7084 | 7084 | 7084 | 3 | -+| encodeLiquidationCall | 13703 | 13703 | 13703 | 13703 | 1 | -+| encodeRepayParams | 6967 | 6967 | 6967 | 6967 | 1 | -+| encodeRepayWithATokensParams | 6994 | 6994 | 6994 | 6994 | 1 | -+| encodeRepayWithPermitParams | 7451 | 7451 | 7451 | 7451 | 55 | -+| encodeSetUserUseReserveAsCollateral | 6909 | 6909 | 6909 | 6909 | 1 | -+| encodeSupplyParams | 32012 | 32012 | 32012 | 32012 | 7 | -+| encodeSupplyWithPermitParams | 32366 | 32366 | 32366 | 32366 | 54 | -+| encodeWithdrawParams | 6853 | 6886 | 6886 | 6920 | 2 | - - - | src/contracts/helpers/WrappedTokenGatewayV3.sol:WrappedTokenGatewayV3 contract | | | | | | -@@ -210,54 +210,54 @@ - | Deployment Cost | Deployment Size | | | | | - | 0 | 0 | | | | | - | Function Name | min | avg | median | max | # calls | --| borrowETH | 252616 | 252616 | 252616 | 252616 | 1 | --| depositETH | 239979 | 239979 | 239979 | 239979 | 8 | -+| borrowETH | 252242 | 252242 | 252242 | 252242 | 1 | -+| depositETH | 239627 | 239627 | 239627 | 239627 | 8 | - | emergencyEtherTransfer | 33792 | 33792 | 33792 | 33792 | 1 | - | emergencyTokenTransfer | 52863 | 52863 | 52863 | 52863 | 1 | - | getWETHAddress | 200 | 200 | 200 | 200 | 1 | - | owner | 373 | 373 | 373 | 373 | 2 | - | receive | 21206 | 21206 | 21206 | 21206 | 1 | --| repayETH | 180936 | 184941 | 182826 | 192647 | 5 | --| withdrawETH | 233365 | 237691 | 237691 | 242018 | 2 | --| withdrawETHWithPermit | 278174 | 281068 | 281068 | 283962 | 2 | -+| repayETH | 167702 | 171709 | 169592 | 179417 | 5 | -+| withdrawETH | 224876 | 228141 | 228141 | 231407 | 2 | -+| withdrawETHWithPermit | 267563 | 270457 | 270457 | 273351 | 2 | - - - | src/contracts/instances/ATokenInstance.sol:ATokenInstance contract | | | | | | - |--------------------------------------------------------------------|-----------------|--------|--------|--------|---------| - | Deployment Cost | Deployment Size | | | | | --| 2316688 | 11090 | | | | | -+| 2316755 | 11090 | | | | | - | Function Name | min | avg | median | max | # calls | - | DOMAIN_SEPARATOR | 455 | 2439 | 2455 | 3539 | 59 | - | POOL | 326 | 326 | 326 | 326 | 110 | --| RESERVE_TREASURY_ADDRESS | 419 | 796 | 419 | 2419 | 2583 | --| UNDERLYING_ASSET_ADDRESS | 441 | 530 | 441 | 2441 | 2190 | -+| RESERVE_TREASURY_ADDRESS | 419 | 984 | 419 | 2419 | 3118 | -+| UNDERLYING_ASSET_ADDRESS | 441 | 525 | 441 | 2441 | 2331 | - | allowance | 782 | 1551 | 782 | 2782 | 26 | --| approve | 24586 | 24586 | 24586 | 24586 | 677 | --| balanceOf | 2749 | 4649 | 4749 | 17749 | 1855 | --| burn | 904 | 42208 | 37139 | 63239 | 642 | --| decimals | 356 | 375 | 356 | 2356 | 2113 | -+| approve | 24586 | 24586 | 24586 | 24586 | 678 | -+| balanceOf | 2771 | 4533 | 4771 | 17771 | 3057 | -+| burn | 904 | 38540 | 37139 | 63239 | 1267 | -+| decimals | 356 | 370 | 356 | 2356 | 2823 | - | decreaseAllowance | 7705 | 7705 | 7705 | 7705 | 1 | --| getIncentivesController | 474 | 475 | 474 | 2474 | 2096 | -+| getIncentivesController | 474 | 475 | 474 | 2474 | 2237 | - | getPreviousIndex | 651 | 651 | 651 | 651 | 39 | - | getScaledUserBalanceAndSupply | 826 | 2730 | 2826 | 4826 | 21 | --| handleRepayment | 594 | 594 | 594 | 594 | 615 | -+| handleRepayment | 594 | 594 | 594 | 594 | 1089 | - | increaseAllowance | 7772 | 20597 | 24872 | 24872 | 4 | --| initialize | 146492 | 222080 | 231686 | 321621 | 11188 | --| mint | 932 | 62097 | 64402 | 72156 | 2844 | -+| initialize | 146492 | 222913 | 231686 | 321621 | 11377 | -+| mint | 932 | 60896 | 64402 | 72156 | 3841 | - | mintToTreasury | 442 | 43917 | 49192 | 66292 | 6 | --| name | 1004 | 1504 | 1319 | 3259 | 2262 | -+| name | 1004 | 1497 | 1319 | 3259 | 2403 | - | nonces | 652 | 2556 | 2652 | 2652 | 63 | - | permit | 1108 | 24836 | 9503 | 53488 | 180 | - | rescueTokens | 12022 | 24398 | 14240 | 46933 | 3 | --| scaledBalanceOf | 687 | 1945 | 2687 | 2687 | 3270 | -+| scaledBalanceOf | 687 | 1728 | 2687 | 2687 | 6322 | - | scaledTotalSupply | 373 | 2327 | 2373 | 2373 | 87 | - | setIncentivesController | 11924 | 14301 | 14301 | 16678 | 2 | --| symbol | 1069 | 1563 | 1619 | 3324 | 2244 | --| totalSupply | 407 | 3765 | 2407 | 10463 | 2986 | --| transfer | 576 | 105606 | 111152 | 140167 | 233 | --| transferFrom | 2998 | 100539 | 118585 | 142842 | 846 | --| transferOnLiquidation | 981 | 31261 | 37477 | 44277 | 440 | --| transferUnderlyingTo | 796 | 23309 | 16488 | 33627 | 902 | -+| symbol | 1069 | 1556 | 1619 | 3324 | 2385 | -+| totalSupply | 407 | 4193 | 2407 | 10485 | 3619 | -+| transfer | 576 | 104969 | 111196 | 140211 | 234 | -+| transferFrom | 2998 | 100740 | 118629 | 165386 | 847 | -+| transferOnLiquidation | 981 | 34292 | 37499 | 44299 | 885 | -+| transferUnderlyingTo | 796 | 23926 | 16488 | 33627 | 1487 | - - - | src/contracts/instances/L2PoolInstance.sol:L2PoolInstance contract | | | | | | -@@ -267,54 +267,56 @@ - | Function Name | min | avg | median | max | # calls | - | ADDRESSES_PROVIDER | 351 | 351 | 351 | 351 | 177 | - | FLASHLOAN_PREMIUM_TOTAL | 388 | 1388 | 1388 | 2388 | 126 | --| FLASHLOAN_PREMIUM_TO_PROTOCOL | 437 | 437 | 437 | 437 | 126 | --| borrow(address,uint256,uint256,uint16,address) | 197559 | 206366 | 203159 | 238218 | 61 | --| borrow(bytes32) | 203157 | 203157 | 203157 | 203157 | 3 | --| configureEModeCategory | 7099 | 11242 | 7099 | 49224 | 61 | -+| FLASHLOAN_PREMIUM_TO_PROTOCOL | 459 | 459 | 459 | 459 | 126 | -+| borrow(address,uint256,uint256,uint16,address) | 200006 | 206720 | 202806 | 237866 | 65 | -+| borrow(bytes32) | 202826 | 202826 | 202826 | 202826 | 3 | -+| configureEModeCategory | 6370 | 10639 | 6370 | 49773 | 61 | - | configureEModeCategoryBorrowableBitmap | 23963 | 23963 | 23963 | 23963 | 2 | --| configureEModeCategoryCollateralBitmap | 6843 | 6843 | 6843 | 6843 | 12 | --| dropReserve | 6304 | 7660 | 6304 | 82259 | 56 | -+| configureEModeCategoryCollateralBitmap | 6815 | 6815 | 6815 | 6815 | 12 | -+| dropReserve | 6326 | 7682 | 6326 | 82303 | 56 | - | getBorrowLogic | 281 | 281 | 281 | 281 | 1 | --| getBridgeLogic | 345 | 345 | 345 | 345 | 1 | --| getConfiguration | 723 | 733 | 723 | 2723 | 1462 | --| getEModeCategoryBorrowableBitmap | 2646 | 2646 | 2646 | 2646 | 2 | --| getEModeCategoryCollateralBitmap | 2656 | 2656 | 2656 | 2656 | 12 | --| getEModeLogic | 345 | 345 | 345 | 345 | 1 | -+| getBridgeLogic | 367 | 367 | 367 | 367 | 1 | -+| getConfiguration | 701 | 711 | 701 | 2701 | 1462 | -+| getEModeCategoryBorrowableBitmap | 2624 | 2624 | 2624 | 2624 | 2 | -+| getEModeCategoryCollateralBitmap | 2650 | 2650 | 2650 | 2650 | 12 | -+| getEModeLogic | 367 | 367 | 367 | 367 | 1 | - | getFlashLoanLogic | 347 | 347 | 347 | 347 | 1 | --| getLiquidationGracePeriod | 2634 | 2634 | 2634 | 2634 | 55 | --| getLiquidationLogic | 325 | 325 | 325 | 325 | 1 | --| getPoolLogic | 324 | 324 | 324 | 324 | 1 | --| getReserveData | 5204 | 10962 | 7204 | 29704 | 446 | --| getReserveNormalizedIncome | 823 | 828 | 823 | 1283 | 87 | --| getReserveNormalizedVariableDebt | 845 | 932 | 845 | 2845 | 59 | --| getReservesList | 11126 | 11126 | 11126 | 11126 | 57 | --| getSupplyLogic | 345 | 345 | 345 | 345 | 1 | --| getUserAccountData | 22290 | 22290 | 22290 | 22290 | 1 | --| getVirtualUnderlyingBalance | 724 | 724 | 724 | 724 | 4 | --| initReserve | 6628 | 95634 | 161459 | 167597 | 254 | --| initialize | 45443 | 45443 | 45443 | 45443 | 63 | --| liquidationCall | 375920 | 375920 | 375920 | 375920 | 1 | --| mintToTreasury | 77264 | 78657 | 78657 | 80050 | 2 | --| repay(address,uint256,uint256,address) | 164468 | 164468 | 164468 | 164468 | 2 | --| repay(bytes32) | 135484 | 135484 | 135484 | 135484 | 1 | --| repayWithATokens | 138509 | 138509 | 138509 | 138509 | 1 | --| repayWithPermit | 182831 | 197542 | 189266 | 209917 | 51 | -+| getLiquidationGracePeriod | 2656 | 2656 | 2656 | 2656 | 55 | -+| getLiquidationLogic | 303 | 303 | 303 | 303 | 1 | -+| getPoolLogic | 346 | 346 | 346 | 346 | 1 | -+| getReserveAToken | 632 | 684 | 632 | 2632 | 153 | -+| getReserveData | 3437 | 8197 | 3437 | 21437 | 297 | -+| getReserveNormalizedIncome | 845 | 850 | 845 | 1305 | 91 | -+| getReserveNormalizedVariableDebt | 867 | 947 | 867 | 2867 | 64 | -+| getReserveVariableDebtToken | 654 | 1987 | 2654 | 2654 | 6 | -+| getReservesList | 11148 | 11148 | 11148 | 11148 | 57 | -+| getSupplyLogic | 323 | 323 | 323 | 323 | 1 | -+| getUserAccountData | 22268 | 22268 | 22268 | 22268 | 1 | -+| getVirtualUnderlyingBalance | 746 | 746 | 746 | 746 | 4 | -+| initReserve | 6606 | 95612 | 161437 | 167575 | 254 | -+| initialize | 45421 | 45421 | 45421 | 45421 | 63 | -+| liquidationCall | 419695 | 419695 | 419695 | 419695 | 1 | -+| mintToTreasury | 77242 | 78635 | 78635 | 80028 | 2 | -+| repay(address,uint256,uint256,address) | 164134 | 164134 | 164134 | 164134 | 2 | -+| repay(bytes32) | 135150 | 135150 | 135150 | 135150 | 1 | -+| repayWithATokens | 138198 | 138198 | 138198 | 138198 | 1 | -+| repayWithPermit | 185346 | 196670 | 188981 | 209632 | 55 | - | rescueTokens | 48214 | 48214 | 48214 | 48214 | 55 | --| resetIsolationModeTotalDebt | 4353 | 4989 | 4353 | 15353 | 201 | -+| resetIsolationModeTotalDebt | 4265 | 4901 | 4265 | 15265 | 201 | - | setConfiguration | 2148 | 4296 | 2148 | 24303 | 1647 | --| setLiquidationGracePeriod | 6364 | 11408 | 10850 | 17012 | 165 | -+| setLiquidationGracePeriod | 6364 | 11374 | 10850 | 17012 | 165 | - | setReserveInterestRateStrategyAddress | 6384 | 7996 | 6493 | 15782 | 166 | - | setUserEMode | 22122 | 42635 | 41183 | 87512 | 7 | --| setUserUseReserveAsCollateral(address,bool) | 53575 | 69534 | 71588 | 102788 | 17 | --| setUserUseReserveAsCollateral(bytes32) | 73756 | 73756 | 73756 | 73756 | 1 | --| supply(address,uint256,address,uint16) | 157134 | 204985 | 208434 | 208434 | 79 | --| supply(bytes32) | 210512 | 210512 | 210512 | 210512 | 7 | --| supplyWithPermit | 259775 | 259775 | 259775 | 259775 | 54 | --| syncIndexesState | 7299 | 13932 | 7299 | 27199 | 144 | --| syncRatesState | 16005 | 16005 | 16005 | 16005 | 144 | -+| setUserUseReserveAsCollateral(address,bool) | 53530 | 69489 | 71543 | 102743 | 17 | -+| setUserUseReserveAsCollateral(bytes32) | 73691 | 73691 | 73691 | 73691 | 1 | -+| supply(address,uint256,address,uint16) | 156781 | 204798 | 208081 | 208081 | 83 | -+| supply(bytes32) | 210137 | 210137 | 210137 | 210137 | 7 | -+| supplyWithPermit | 259422 | 259422 | 259422 | 259422 | 54 | -+| syncIndexesState | 7182 | 13815 | 7182 | 27082 | 144 | -+| syncRatesState | 15726 | 15726 | 15726 | 15726 | 144 | - | updateBridgeProtocolFee | 6230 | 6230 | 6230 | 6230 | 55 | --| updateFlashloanPremiums | 1698 | 10043 | 6367 | 21598 | 181 | --| withdraw | 126426 | 128867 | 128867 | 131308 | 2 | -+| updateFlashloanPremiums | 1787 | 10132 | 6456 | 21687 | 181 | -+| withdraw | 126195 | 128635 | 128635 | 131076 | 2 | - - - | src/contracts/instances/PoolConfiguratorInstance.sol:PoolConfiguratorInstance contract | | | | | | -@@ -322,132 +324,135 @@ - | Deployment Cost | Deployment Size | | | | | - | 4332868 | 19812 | | | | | - | Function Name | min | avg | median | max | # calls | --| MAX_GRACE_PERIOD | 260 | 260 | 260 | 260 | 371 | --| configureReserveAsCollateral | 12220 | 17479 | 12264 | 99552 | 2437 | --| disableLiquidationGracePeriod | 17214 | 28272 | 17214 | 39535 | 109 | --| dropReserve | 14074 | 17810 | 14074 | 104832 | 60 | -+| MAX_GRACE_PERIOD | 260 | 260 | 260 | 260 | 379 | -+| configureReserveAsCollateral | 12198 | 17150 | 12264 | 87350 | 2489 | -+| disableLiquidationGracePeriod | 17214 | 28463 | 39513 | 39513 | 111 | -+| dropReserve | 14074 | 17811 | 14074 | 104832 | 60 | - | getConfiguratorLogic | 283 | 283 | 283 | 283 | 1 | --| getPendingLtv | 640 | 640 | 640 | 640 | 153 | --| initReserves | 17401 | 15903182 | 4382378 | 211119271 | 1086 | --| initialize | 72573 | 90420 | 90473 | 90473 | 683 | --| setAssetBorrowableInEMode | 46849 | 87525 | 87622 | 100849 | 395 | --| setAssetCollateralInEMode | 17472 | 75276 | 83781 | 83781 | 644 | --| setBorrowCap | 11170 | 11585 | 11214 | 44169 | 2012 | --| setBorrowableInIsolation | 10736 | 11044 | 10780 | 43726 | 1959 | --| setDebtCeiling | 17256 | 44193 | 41675 | 98789 | 2019 | --| setEModeCategory | 17779 | 75328 | 81448 | 81448 | 640 | --| setLiquidationProtocolFee | 11241 | 11425 | 11285 | 44240 | 1954 | --| setPoolPause(bool) | 17202 | 19129 | 17202 | 89863 | 113 | --| setPoolPause(bool,uint40) | 17314 | 60091 | 17314 | 107716 | 108 | --| setReserveActive | 14185 | 26524 | 14185 | 95296 | 66 | --| setReserveBorrowing | 10911 | 13520 | 10955 | 41764 | 2167 | --| setReserveFactor | 17301 | 42687 | 36685 | 124960 | 2004 | --| setReserveFlashLoaning | 10910 | 12662 | 10954 | 43918 | 2058 | --| setReserveFreeze | 20551 | 48154 | 52937 | 73139 | 169 | --| setReserveInterestRateData | 17558 | 20678 | 17558 | 106484 | 57 | --| setReserveInterestRateStrategyAddress | 17579 | 69521 | 17579 | 165156 | 99 | -+| getPendingLtv | 640 | 640 | 640 | 640 | 159 | -+| initReserves | 17401 | 15915557 | 4382636 | 211151370 | 1105 | -+| initialize | 72573 | 90421 | 90473 | 90473 | 699 | -+| setAssetBorrowableInEMode | 44971 | 81723 | 81811 | 94971 | 395 | -+| setAssetCollateralInEMode | 17472 | 69948 | 77936 | 77959 | 644 | -+| setBorrowCap | 11148 | 11576 | 11214 | 44169 | 2060 | -+| setBorrowableInIsolation | 10714 | 11037 | 10780 | 43726 | 2007 | -+| setDebtCeiling | 17256 | 33646 | 31495 | 86587 | 2067 | -+| setEModeCategory | 17779 | 75825 | 81997 | 81997 | 640 | -+| setLiquidationProtocolFee | 11219 | 11421 | 11285 | 44240 | 2002 | -+| setPoolPause(bool) | 17202 | 19127 | 17202 | 89796 | 113 | -+| setPoolPause(bool,uint40) | 17314 | 61612 | 17314 | 107583 | 108 | -+| setReserveActive | 14185 | 24676 | 14185 | 83094 | 66 | -+| setReserveBorrowing | 10889 | 13464 | 10955 | 41764 | 2215 | -+| setReserveFactor | 17301 | 42436 | 36422 | 124697 | 2052 | -+| setReserveFlashLoaning | 10888 | 12623 | 10954 | 43918 | 2106 | -+| setReserveFreeze | 20551 | 48461 | 52937 | 73139 | 173 | -+| setReserveInterestRateData | 17558 | 20465 | 17558 | 100432 | 57 | -+| setReserveInterestRateStrategyAddress | 17579 | 66821 | 17579 | 159082 | 99 | - | setReservePause(address,bool) | 17347 | 30385 | 43192 | 43192 | 111 | --| setReservePause(address,bool,uint40) | 14424 | 38915 | 47050 | 49360 | 658 | --| setSiloedBorrowing | 11281 | 11491 | 11325 | 94206 | 1949 | --| setSupplyCap | 11127 | 13126 | 11171 | 44126 | 2073 | -+| setReservePause(address,bool,uint40) | 14424 | 39163 | 47028 | 49338 | 668 | -+| setSiloedBorrowing | 11259 | 11455 | 11325 | 73782 | 1997 | -+| setSupplyCap | 11105 | 13097 | 11171 | 44126 | 2121 | - | setUnbackedMintCap | 44161 | 44161 | 44161 | 44161 | 7 | --| updateAToken | 14035 | 16293 | 14035 | 140527 | 56 | --| updateBridgeProtocolFee | 14102 | 49291 | 51998 | 51998 | 14 | --| updateFlashloanPremiumToProtocol | 10115 | 10509 | 10181 | 36981 | 738 | --| updateFlashloanPremiumTotal | 14052 | 30681 | 32046 | 36946 | 738 | --| updateVariableDebtToken | 14036 | 16184 | 14036 | 134376 | 56 | -+| updateAToken | 14035 | 15855 | 14035 | 115979 | 56 | -+| updateBridgeProtocolFee | 14102 | 49414 | 52131 | 52131 | 14 | -+| updateFlashloanPremiumToProtocol | 10137 | 10474 | 10137 | 36937 | 754 | -+| updateFlashloanPremiumTotal | 14052 | 30682 | 32002 | 36902 | 754 | -+| updateVariableDebtToken | 14036 | 15746 | 14036 | 109829 | 56 | - - - | src/contracts/instances/PoolInstance.sol:PoolInstance contract | | | | | | - |----------------------------------------------------------------|-----------------|--------|--------|--------|---------| - | Deployment Cost | Deployment Size | | | | | --| 4814942 | 22300 | | | | | -+| 4685220 | 21709 | | | | | - | Function Name | min | avg | median | max | # calls | --| ADDRESSES_PROVIDER | 284 | 284 | 284 | 284 | 2355 | --| BRIDGE_PROTOCOL_FEE | 349 | 2109 | 2349 | 2349 | 25 | --| FLASHLOAN_PREMIUM_TOTAL | 410 | 1413 | 2410 | 2410 | 1244 | --| FLASHLOAN_PREMIUM_TO_PROTOCOL | 459 | 460 | 459 | 2459 | 1241 | --| MAX_NUMBER_RESERVES | 286 | 286 | 286 | 286 | 111 | --| backUnbacked | 98313 | 114497 | 111899 | 132885 | 9 | --| borrow | 46604 | 212305 | 222258 | 261378 | 893 | --| configureEModeCategory | 7121 | 45502 | 49246 | 49246 | 628 | --| configureEModeCategoryBorrowableBitmap | 4041 | 23841 | 23941 | 23941 | 393 | --| configureEModeCategoryCollateralBitmap | 3976 | 6767 | 6776 | 6776 | 577 | --| deposit | 32702 | 202881 | 208433 | 208433 | 1117 | --| dropReserve | 6326 | 9907 | 6326 | 82325 | 61 | --| finalizeTransfer | 20725 | 50394 | 52834 | 87949 | 968 | --| flashLoan | 29684 | 96524 | 75354 | 322330 | 65 | --| flashLoanSimple | 23396 | 345141 | 191517 | 760848 | 11 | --| getBorrowLogic | 325 | 325 | 325 | 325 | 1 | --| getBridgeLogic | 345 | 345 | 345 | 345 | 1 | --| getConfiguration | 745 | 876 | 745 | 2745 | 27132 | --| getEModeCategoryBorrowableBitmap | 668 | 2591 | 2668 | 2668 | 418 | --| getEModeCategoryCollateralBitmap | 678 | 2591 | 2678 | 2678 | 602 | --| getEModeCategoryCollateralConfig | 885 | 1685 | 885 | 2885 | 110 | --| getEModeCategoryData | 8291 | 8291 | 8291 | 8291 | 3 | --| getEModeCategoryLabel | 1328 | 1642 | 1583 | 3328 | 25 | --| getEModeLogic | 278 | 278 | 278 | 278 | 1 | --| getFlashLoanLogic | 302 | 302 | 302 | 302 | 1 | --| getLiquidationGracePeriod | 2656 | 2656 | 2656 | 2656 | 418 | --| getLiquidationLogic | 347 | 347 | 347 | 347 | 1 | --| getPoolLogic | 279 | 279 | 279 | 279 | 1 | -+| ADDRESSES_PROVIDER | 351 | 351 | 351 | 351 | 3606 | -+| BRIDGE_PROTOCOL_FEE | 415 | 2175 | 2415 | 2415 | 25 | -+| FLASHLOAN_PREMIUM_TOTAL | 388 | 1391 | 2388 | 2388 | 1276 | -+| FLASHLOAN_PREMIUM_TO_PROTOCOL | 459 | 460 | 459 | 2459 | 1273 | -+| MAX_NUMBER_RESERVES | 308 | 308 | 308 | 308 | 110 | -+| backUnbacked | 97983 | 114167 | 111569 | 132555 | 9 | -+| borrow | 46465 | 217204 | 222151 | 265705 | 1474 | -+| configureEModeCategory | 6392 | 45939 | 49795 | 49795 | 628 | -+| configureEModeCategoryBorrowableBitmap | 4063 | 23863 | 23963 | 23963 | 393 | -+| configureEModeCategoryCollateralBitmap | 4015 | 6806 | 6815 | 6815 | 577 | -+| deposit | 32349 | 202489 | 208080 | 208080 | 1119 | -+| dropReserve | 6326 | 9908 | 6326 | 82325 | 61 | -+| eliminateReserveDeficit | 6328 | 58474 | 55368 | 120838 | 330 | -+| finalizeTransfer | 20747 | 50380 | 52856 | 95613 | 970 | -+| flashLoan | 29662 | 99175 | 81700 | 321999 | 65 | -+| flashLoanSimple | 23396 | 337294 | 191187 | 740396 | 11 | -+| getBorrowLogic | 303 | 303 | 303 | 303 | 1 | -+| getBridgeLogic | 279 | 279 | 279 | 279 | 1 | -+| getConfiguration | 723 | 851 | 723 | 2723 | 28123 | -+| getEModeCategoryBorrowableBitmap | 624 | 2557 | 2624 | 2624 | 418 | -+| getEModeCategoryCollateralBitmap | 650 | 2560 | 2650 | 2650 | 603 | -+| getEModeCategoryCollateralConfig | 952 | 1744 | 952 | 2952 | 111 | -+| getEModeCategoryData | 5914 | 5914 | 5914 | 5914 | 3 | -+| getEModeCategoryLabel | 1306 | 1620 | 1561 | 3306 | 25 | -+| getEModeLogic | 300 | 300 | 300 | 300 | 1 | -+| getFlashLoanLogic | 280 | 280 | 280 | 280 | 1 | -+| getLiquidationGracePeriod | 2656 | 2656 | 2656 | 2656 | 436 | -+| getLiquidationLogic | 303 | 303 | 303 | 303 | 1 | -+| getPoolLogic | 301 | 301 | 301 | 301 | 1 | -+| getReserveAToken | 676 | 730 | 676 | 2676 | 5036 | - | getReserveAddressById | 662 | 662 | 662 | 662 | 1 | --| getReserveData | 5248 | 10894 | 7248 | 29748 | 8983 | --| getReserveDataExtended | 3476 | 4142 | 3476 | 5476 | 6 | --| getReserveNormalizedIncome | 867 | 1883 | 867 | 5327 | 6560 | --| getReserveNormalizedVariableDebt | 889 | 1072 | 889 | 6475 | 1605 | -+| getReserveData | 3459 | 9202 | 3459 | 21459 | 4042 | -+| getReserveDeficit | 609 | 609 | 609 | 609 | 282 | -+| getReserveNormalizedIncome | 889 | 1680 | 889 | 5349 | 8792 | -+| getReserveNormalizedVariableDebt | 889 | 1041 | 889 | 6475 | 2526 | -+| getReserveVariableDebtToken | 676 | 709 | 676 | 2676 | 4117 | - | getReservesCount | 392 | 392 | 392 | 392 | 2 | --| getReservesList | 3170 | 11700 | 11170 | 99129 | 893 | --| getSupplyLogic | 281 | 281 | 281 | 281 | 1 | --| getUserAccountData | 12141 | 22006 | 22253 | 37375 | 556 | --| getUserConfiguration | 703 | 758 | 703 | 2703 | 399 | --| getUserEMode | 634 | 634 | 634 | 634 | 283 | --| getVirtualUnderlyingBalance | 657 | 1068 | 657 | 2657 | 811 | --| initReserve | 6564 | 177594 | 177419 | 207007 | 11154 | --| initialize | 45378 | 45472 | 45378 | 66895 | 624 | --| liquidationCall | 53082 | 238189 | 323142 | 382539 | 795 | --| mintToTreasury | 77264 | 78657 | 78657 | 80050 | 2 | --| mintUnbacked | 12183 | 118303 | 103419 | 165752 | 17 | --| repay | 33243 | 99380 | 95853 | 164534 | 21 | --| repayWithATokens | 128089 | 155007 | 155256 | 165893 | 57 | --| repayWithPermit | 126966 | 164667 | 154052 | 209744 | 150 | -+| getReservesList | 3103 | 11768 | 11103 | 95886 | 891 | -+| getSupplyLogic | 345 | 345 | 345 | 345 | 1 | -+| getUserAccountData | 12119 | 22726 | 19731 | 37353 | 1922 | -+| getUserConfiguration | 703 | 883 | 703 | 2703 | 177 | -+| getUserEMode | 656 | 656 | 656 | 656 | 863 | -+| getVirtualUnderlyingBalance | 657 | 1552 | 657 | 2657 | 373 | -+| initReserve | 6628 | 177661 | 177483 | 207071 | 11343 | -+| initialize | 45443 | 45535 | 45443 | 66960 | 640 | -+| liquidationCall | 73774 | 285332 | 325227 | 511750 | 1279 | -+| mintToTreasury | 77220 | 78613 | 78613 | 80006 | 2 | -+| mintUnbacked | 12183 | 117981 | 103045 | 165378 | 17 | -+| repay | 33126 | 104506 | 107475 | 164156 | 21 | -+| repayWithATokens | 134210 | 154481 | 154860 | 165518 | 57 | -+| repayWithPermit | 129325 | 160572 | 149170 | 209303 | 165 | - | rescueTokens | 48149 | 48149 | 48149 | 48149 | 55 | --| resetIsolationModeTotalDebt | 4265 | 4336 | 4265 | 15265 | 1860 | --| setConfiguration | 2170 | 10372 | 2325 | 24325 | 30463 | --| setLiquidationGracePeriod | 6386 | 12318 | 12534 | 17034 | 724 | --| setReserveInterestRateStrategyAddress | 6406 | 7868 | 6515 | 15804 | 210 | --| setUserEMode | 14165 | 47361 | 41117 | 94723 | 566 | --| setUserUseReserveAsCollateral | 53552 | 72100 | 71565 | 102765 | 25 | --| supply | 29399 | 195761 | 208456 | 216210 | 1471 | --| supplyWithPermit | 113713 | 195952 | 218122 | 257604 | 157 | --| syncIndexesState | 7211 | 13934 | 7211 | 62577 | 1850 | --| syncRatesState | 13459 | 15981 | 16005 | 22505 | 1850 | --| updateBridgeProtocolFee | 6185 | 9470 | 6185 | 23369 | 68 | --| updateFlashloanPremiums | 1720 | 11437 | 6389 | 21620 | 1293 | --| withdraw | 39154 | 127154 | 138193 | 177428 | 153 | -+| resetIsolationModeTotalDebt | 4287 | 4356 | 4287 | 15287 | 1908 | -+| setConfiguration | 2192 | 10347 | 2347 | 24347 | 31150 | -+| setLiquidationGracePeriod | 6364 | 12264 | 12512 | 17012 | 761 | -+| setReserveInterestRateStrategyAddress | 6384 | 7846 | 6493 | 15782 | 210 | -+| setUserEMode | 14143 | 47337 | 41095 | 94701 | 566 | -+| setUserUseReserveAsCollateral | 53574 | 72122 | 71587 | 102787 | 25 | -+| supply | 29282 | 191846 | 208081 | 215835 | 2462 | -+| supplyWithPermit | 113338 | 195577 | 217747 | 257229 | 157 | -+| syncIndexesState | 7160 | 13881 | 7160 | 62526 | 1898 | -+| syncRatesState | 13247 | 15769 | 15793 | 22293 | 1898 | -+| updateBridgeProtocolFee | 6252 | 9537 | 6252 | 23436 | 68 | -+| updateFlashloanPremiums | 1698 | 11421 | 6367 | 21598 | 1325 | -+| withdraw | 39214 | 127709 | 137875 | 177110 | 153 | - - - | src/contracts/instances/VariableDebtTokenInstance.sol:VariableDebtTokenInstance contract | | | | | | - |------------------------------------------------------------------------------------------|-----------------|--------|--------|--------|---------| - | Deployment Cost | Deployment Size | | | | | --| 1695548 | 8190 | | | | | -+| 1695615 | 8190 | | | | | - | Function Name | min | avg | median | max | # calls | --| UNDERLYING_ASSET_ADDRESS | 397 | 397 | 397 | 397 | 2092 | -+| UNDERLYING_ASSET_ADDRESS | 397 | 397 | 397 | 397 | 2233 | - | approveDelegation | 27009 | 27009 | 27009 | 27009 | 1 | --| balanceOf | 675 | 4919 | 4753 | 10336 | 1720 | -+| balanceOf | 675 | 4704 | 4753 | 10753 | 2664 | - | borrowAllowance | 828 | 828 | 828 | 828 | 5 | --| burn | 19171 | 26141 | 26171 | 26172 | 714 | --| decimals | 334 | 334 | 334 | 334 | 2092 | -+| burn | 19171 | 26135 | 26171 | 26172 | 1196 | -+| decimals | 334 | 334 | 334 | 334 | 3436 | - | delegationWithSig | 1043 | 28679 | 21652 | 55852 | 7 | --| getIncentivesController | 430 | 430 | 430 | 430 | 2092 | --| initialize | 123595 | 202347 | 209016 | 299178 | 11188 | --| mint | 26353 | 62484 | 62553 | 72340 | 885 | --| name | 1004 | 1444 | 1319 | 3259 | 2182 | -+| getIncentivesController | 430 | 430 | 430 | 430 | 2233 | -+| initialize | 123595 | 203557 | 209016 | 299178 | 11377 | -+| mint | 26353 | 62511 | 62553 | 72340 | 1470 | -+| name | 1004 | 1440 | 1259 | 3259 | 2323 | - | nonces | 574 | 574 | 574 | 574 | 1 | --| scaledBalanceOf | 687 | 1869 | 2687 | 2687 | 1563 | --| scaledTotalSupply | 417 | 1962 | 2417 | 2417 | 9807 | --| symbol | 1025 | 1455 | 1280 | 3280 | 2175 | --| totalSupply | 4052 | 7563 | 6466 | 19052 | 15 | -+| scaledBalanceOf | 687 | 1748 | 2687 | 2687 | 2767 | -+| scaledTotalSupply | 417 | 2084 | 2417 | 2417 | 12394 | -+| symbol | 1025 | 1463 | 1340 | 3280 | 2316 | -+| totalSupply | 4052 | 8364 | 8466 | 19052 | 15 | - - - | src/contracts/misc/AaveOracle.sol:AaveOracle contract | | | | | | -@@ -457,10 +462,10 @@ - | Function Name | min | avg | median | max | # calls | - | BASE_CURRENCY | 292 | 292 | 292 | 292 | 3 | - | BASE_CURRENCY_UNIT | 261 | 261 | 261 | 261 | 1 | --| getAssetPrice | 0 | 4948 | 7865 | 7865 | 6615 | -+| getAssetPrice | 0 | 4223 | 1365 | 7865 | 14146 | - | getAssetsPrices | 2286 | 3392 | 2286 | 5605 | 3 | - | getFallbackOracle | 364 | 1030 | 364 | 2364 | 3 | --| getSourceOfAsset | 550 | 837 | 550 | 2550 | 327 | -+| getSourceOfAsset | 550 | 703 | 550 | 2550 | 613 | - | setAssetSources | 37323 | 52868 | 61918 | 62158 | 9 | - | setFallbackOracle | 59524 | 59524 | 59524 | 59524 | 4 | - -@@ -470,20 +475,20 @@ - | Deployment Cost | Deployment Size | | | | | - | 920973 | 4323 | | | | | - | Function Name | min | avg | median | max | # calls | --| ADDRESSES_PROVIDER | 228 | 228 | 228 | 228 | 203 | --| MAX_BORROW_RATE | 239 | 239 | 239 | 239 | 1064 | --| MAX_OPTIMAL_POINT | 261 | 261 | 261 | 261 | 1376 | --| MIN_OPTIMAL_POINT | 260 | 260 | 260 | 260 | 1373 | --| calculateInterestRates | 0 | 3982 | 4251 | 5973 | 7502 | --| getBaseVariableBorrowRate | 744 | 874 | 744 | 2744 | 646 | --| getInterestRateData | 1788 | 1788 | 1788 | 1788 | 51 | --| getInterestRateDataBps | 983 | 983 | 983 | 983 | 51 | --| getMaxVariableBorrowRate | 968 | 968 | 968 | 968 | 337 | --| getOptimalUsageRatio | 734 | 738 | 734 | 2734 | 490 | --| getVariableRateSlope1 | 774 | 774 | 774 | 774 | 496 | --| getVariableRateSlope2 | 795 | 795 | 795 | 795 | 340 | --| setInterestRateParams(address,(uint16,uint32,uint32,uint32)) | 28281 | 29703 | 29064 | 36794 | 561 | --| setInterestRateParams(address,bytes) | 28626 | 33049 | 29847 | 37145 | 1278 | -+| ADDRESSES_PROVIDER | 228 | 228 | 228 | 228 | 214 | -+| MAX_BORROW_RATE | 239 | 239 | 239 | 239 | 1111 | -+| MAX_OPTIMAL_POINT | 261 | 261 | 261 | 261 | 1421 | -+| MIN_OPTIMAL_POINT | 260 | 260 | 260 | 260 | 1418 | -+| calculateInterestRates | 0 | 4131 | 4251 | 5973 | 10093 | -+| getBaseVariableBorrowRate | 744 | 868 | 744 | 2744 | 673 | -+| getInterestRateData | 1788 | 1788 | 1788 | 1788 | 53 | -+| getInterestRateDataBps | 983 | 983 | 983 | 983 | 53 | -+| getMaxVariableBorrowRate | 968 | 968 | 968 | 968 | 350 | -+| getOptimalUsageRatio | 734 | 737 | 734 | 2734 | 505 | -+| getVariableRateSlope1 | 774 | 774 | 774 | 774 | 514 | -+| getVariableRateSlope2 | 795 | 795 | 795 | 795 | 351 | -+| setInterestRateParams(address,(uint16,uint32,uint32,uint32)) | 28269 | 29733 | 29064 | 36794 | 572 | -+| setInterestRateParams(address,bytes) | 28590 | 33098 | 29847 | 37133 | 1312 | - - - | src/contracts/misc/PriceOracleSentinel.sol:PriceOracleSentinel contract | | | | | | -@@ -505,26 +510,26 @@ - | Deployment Cost | Deployment Size | | | | | - | 454308 | 2052 | | | | | - | Function Name | min | avg | median | max | # calls | --| ADDRESSES_PROVIDER | 890 | 4035 | 5390 | 5457 | 2530 | --| BRIDGE_PROTOCOL_FEE | 955 | 5237 | 7455 | 7455 | 23 | -+| ADDRESSES_PROVIDER | 957 | 3096 | 957 | 5457 | 3781 | -+| BRIDGE_PROTOCOL_FEE | 1021 | 5303 | 7521 | 7521 | 23 | - | DOMAIN_SEPARATOR | 1061 | 3198 | 3061 | 7561 | 59 | --| EMISSION_MANAGER | 932 | 932 | 932 | 932 | 682 | --| FLASHLOAN_PREMIUM_TOTAL | 994 | 2025 | 2994 | 7516 | 1368 | --| FLASHLOAN_PREMIUM_TO_PROTOCOL | 1043 | 1067 | 1065 | 7565 | 1365 | --| MAX_GRACE_PERIOD | 5366 | 5366 | 5366 | 5366 | 371 | --| MAX_NUMBER_RESERVES | 892 | 892 | 892 | 892 | 109 | -+| EMISSION_MANAGER | 932 | 932 | 932 | 932 | 698 | -+| FLASHLOAN_PREMIUM_TOTAL | 994 | 2005 | 2994 | 7494 | 1400 | -+| FLASHLOAN_PREMIUM_TO_PROTOCOL | 1065 | 1069 | 1065 | 7565 | 1397 | -+| MAX_GRACE_PERIOD | 5366 | 5366 | 5366 | 5366 | 379 | -+| MAX_NUMBER_RESERVES | 914 | 914 | 914 | 914 | 108 | - | POOL | 932 | 2077 | 932 | 5432 | 110 | --| RESERVE_TREASURY_ADDRESS | 1025 | 1404 | 1025 | 7525 | 2584 | -+| RESERVE_TREASURY_ADDRESS | 1025 | 1592 | 1025 | 7525 | 3119 | - | REVISION | 866 | 866 | 866 | 866 | 8 | --| UNDERLYING_ASSET_ADDRESS | 1003 | 1071 | 1047 | 3047 | 4282 | -+| UNDERLYING_ASSET_ADDRESS | 1003 | 1068 | 1047 | 3047 | 4564 | - | admin | 21388 | 21388 | 21388 | 21388 | 8 | - | allowance | 1394 | 2682 | 1394 | 7894 | 26 | --| approve | 51270 | 51329 | 51306 | 51642 | 677 | -+| approve | 51270 | 51329 | 51306 | 51642 | 678 | - | approveDelegation | 53750 | 53750 | 53750 | 53750 | 1 | --| backUnbacked | 125167 | 140822 | 138777 | 159775 | 9 | --| balanceOf | 1284 | 5615 | 5362 | 22858 | 3575 | --| borrow(address,uint256,uint256,uint16,address) | 73940 | 236432 | 249629 | 288773 | 953 | --| borrow(bytes32) | 229503 | 229503 | 229503 | 229503 | 3 | -+| backUnbacked | 124837 | 140492 | 138447 | 159445 | 9 | -+| balanceOf | 1284 | 5367 | 5362 | 22880 | 5721 | -+| borrow(address,uint256,uint256,uint16,address) | 73801 | 240657 | 249254 | 293064 | 1538 | -+| borrow(bytes32) | 229172 | 229172 | 229172 | 229172 | 3 | - | borrowAllowance | 1440 | 1440 | 1440 | 1440 | 5 | - | burn | 28118 | 40728 | 28448 | 65620 | 3 | - | claimAllRewards | 119485 | 119485 | 119485 | 119485 | 1 | -@@ -533,133 +538,136 @@ - | claimRewards | 28652 | 77697 | 84102 | 113933 | 4 | - | claimRewardsOnBehalf | 116497 | 116497 | 116497 | 116497 | 1 | - | claimRewardsToSelf | 113252 | 113252 | 113252 | 113252 | 1 | --| configureEModeCategory | 34247 | 34258 | 34258 | 34269 | 110 | --| configureReserveAsCollateral | 44058 | 64901 | 57731 | 126489 | 489 | --| decimals | 940 | 962 | 962 | 7462 | 4205 | -+| configureEModeCategory | 33518 | 33529 | 33529 | 33540 | 110 | -+| configureReserveAsCollateral | 44058 | 63584 | 57709 | 114287 | 493 | -+| decimals | 940 | 957 | 940 | 7462 | 6259 | - | decreaseAllowance | 34413 | 34413 | 34413 | 34413 | 1 | - | delegationWithSig | 29247 | 56385 | 45247 | 84283 | 7 | --| deposit | 173106 | 223009 | 226046 | 235646 | 937 | --| disableLiquidationGracePeriod | 43552 | 54782 | 43768 | 66073 | 109 | --| dropReserve | 32618 | 37201 | 32640 | 105096 | 172 | --| flashLoan | 59228 | 179747 | 149955 | 374161 | 65 | --| flashLoanSimple | 50902 | 313230 | 179210 | 646184 | 11 | -+| deposit | 172753 | 222603 | 225693 | 235293 | 939 | -+| disableLiquidationGracePeriod | 43552 | 54981 | 66051 | 66051 | 111 | -+| dropReserve | 32640 | 37208 | 32640 | 105096 | 172 | -+| eliminateReserveDeficit | 33037 | 84429 | 82057 | 147715 | 330 | -+| flashLoan | 59206 | 185569 | 169698 | 374139 | 65 | -+| flashLoanSimple | 50902 | 306036 | 178880 | 625732 | 11 | - | getAllUserRewards | 9209 | 9209 | 9209 | 9209 | 1 | - | getAssetDecimals | 1265 | 1265 | 1265 | 1265 | 2 | --| getAssetIndex | 3081 | 10042 | 9589 | 16507 | 2079 | --| getBorrowLogic | 5387 | 5409 | 5409 | 5431 | 2 | --| getBridgeLogic | 5451 | 5451 | 5451 | 5451 | 2 | -+| getAssetIndex | 3081 | 10058 | 9589 | 16507 | 2069 | -+| getBorrowLogic | 5387 | 5398 | 5398 | 5409 | 2 | -+| getBridgeLogic | 5385 | 5429 | 5429 | 5473 | 2 | - | getClaimer | 1234 | 7617 | 7734 | 7734 | 112 | --| getConfiguration | 1332 | 1670 | 1354 | 7854 | 28594 | -+| getConfiguration | 1310 | 1639 | 1332 | 7832 | 29585 | - | getConfiguratorLogic | 5389 | 5389 | 5389 | 5389 | 1 | - | getDistributionEnd | 1401 | 1401 | 1401 | 1401 | 1 | --| getEModeCategoryBorrowableBitmap | 1277 | 7422 | 7777 | 7777 | 420 | --| getEModeCategoryCollateralBitmap | 1287 | 7511 | 7787 | 7787 | 614 | --| getEModeCategoryCollateralConfig | 1500 | 2340 | 1500 | 8000 | 110 | --| getEModeCategoryData | 13430 | 13430 | 13430 | 13430 | 3 | --| getEModeCategoryLabel | 1940 | 2257 | 2198 | 3940 | 25 | --| getEModeLogic | 5384 | 5417 | 5417 | 5451 | 2 | --| getFlashLoanLogic | 5408 | 5430 | 5430 | 5453 | 2 | --| getIncentivesController | 1036 | 1061 | 1080 | 7580 | 4190 | --| getLiquidationGracePeriod | 29175 | 29194 | 29197 | 29197 | 473 | --| getLiquidationLogic | 5431 | 5442 | 5442 | 5453 | 2 | --| getPendingLtv | 1249 | 1249 | 1249 | 1249 | 153 | --| getPoolLogic | 5385 | 5407 | 5407 | 5430 | 2 | -+| getEModeCategoryBorrowableBitmap | 1233 | 7387 | 7733 | 7733 | 420 | -+| getEModeCategoryCollateralBitmap | 1259 | 7473 | 7759 | 7759 | 615 | -+| getEModeCategoryCollateralConfig | 1567 | 2400 | 1567 | 8067 | 111 | -+| getEModeCategoryData | 11053 | 11053 | 11053 | 11053 | 3 | -+| getEModeCategoryLabel | 1918 | 2235 | 2176 | 3918 | 25 | -+| getEModeLogic | 5406 | 5439 | 5439 | 5473 | 2 | -+| getFlashLoanLogic | 5386 | 5419 | 5419 | 5453 | 2 | -+| getIncentivesController | 1036 | 1060 | 1080 | 7580 | 4472 | -+| getLiquidationGracePeriod | 29197 | 29197 | 29197 | 29197 | 491 | -+| getLiquidationLogic | 5409 | 5409 | 5409 | 5409 | 2 | -+| getPendingLtv | 1249 | 1249 | 1249 | 1249 | 159 | -+| getPoolLogic | 5407 | 5429 | 5429 | 5452 | 2 | - | getPreviousIndex | 1260 | 1260 | 1260 | 1260 | 39 | -+| getReserveAToken | 1241 | 1380 | 1285 | 7785 | 5189 | - | getReserveAddressById | 1271 | 1271 | 1271 | 1271 | 1 | --| getReserveData | 5891 | 11728 | 7935 | 34935 | 9429 | --| getReserveDataExtended | 4175 | 4841 | 4175 | 6175 | 6 | --| getReserveNormalizedIncome | 0 | 3429 | 1476 | 10436 | 6703 | --| getReserveNormalizedVariableDebt | 1454 | 1681 | 1498 | 11584 | 1664 | -+| getReserveData | 4124 | 10068 | 4146 | 26646 | 4339 | -+| getReserveDeficit | 1218 | 1218 | 1218 | 1218 | 282 | -+| getReserveNormalizedIncome | 0 | 2996 | 1498 | 10458 | 8939 | -+| getReserveNormalizedVariableDebt | 1476 | 1652 | 1498 | 11584 | 2590 | -+| getReserveVariableDebtToken | 1263 | 1334 | 1285 | 7785 | 4123 | - | getReservesCount | 998 | 998 | 998 | 998 | 2 | --| getReservesList | 3794 | 13871 | 11794 | 100510 | 950 | -+| getReservesList | 3727 | 13936 | 11727 | 97241 | 948 | - | getRewardOracle | 1258 | 1258 | 1258 | 1258 | 1 | - | getRewardsByAsset | 2383 | 9751 | 10883 | 10883 | 613 | - | getRewardsData | 1600 | 1600 | 1600 | 1600 | 3 | - | getRewardsList | 1723 | 1723 | 1723 | 1723 | 30 | - | getScaledUserBalanceAndSupply | 1438 | 5057 | 3438 | 9938 | 21 | --| getSupplyLogic | 5387 | 5419 | 5419 | 5451 | 2 | -+| getSupplyLogic | 5429 | 5440 | 5440 | 5451 | 2 | - | getTransferStrategy | 1257 | 1257 | 1257 | 1257 | 1 | --| getUserAccountData | 12774 | 22639 | 22886 | 38008 | 557 | -+| getUserAccountData | 12752 | 23358 | 20364 | 37986 | 1923 | - | getUserAccruedRewards | 2253 | 2253 | 2253 | 2253 | 1 | - | getUserAssetIndex | 1623 | 1623 | 1623 | 1623 | 1 | --| getUserConfiguration | 1312 | 1367 | 1312 | 3312 | 399 | --| getUserEMode | 1243 | 1243 | 1243 | 1243 | 283 | --| getUserRewards | 7423 | 8657 | 8711 | 17498 | 66 | --| getVirtualUnderlyingBalance | 1266 | 1676 | 1266 | 3266 | 815 | -+| getUserConfiguration | 1312 | 1492 | 1312 | 3312 | 177 | -+| getUserEMode | 1265 | 1265 | 1265 | 1265 | 863 | -+| getUserRewards | 7423 | 8651 | 8711 | 17498 | 66 | -+| getVirtualUnderlyingBalance | 1266 | 2152 | 1266 | 3266 | 377 | - | increaseAllowance | 34480 | 47305 | 51580 | 51580 | 4 | --| initReserve | 33274 | 33306 | 33306 | 33338 | 220 | --| initReserves | 45683 | 33142016 | 1586149 | 213411849 | 436 | --| liquidationCall(address,address,address,uint256,bool) | 80670 | 265778 | 350729 | 410462 | 795 | --| liquidationCall(bytes32,bytes32) | 402793 | 402793 | 402793 | 402793 | 1 | -+| initReserve | 33316 | 33327 | 33327 | 33338 | 220 | -+| initReserves | 45683 | 33465441 | 1586662 | 212323201 | 439 | -+| liquidationCall(address,address,address,uint256,bool) | 101362 | 309730 | 352739 | 520473 | 1279 | -+| liquidationCall(bytes32,bytes32) | 432168 | 432168 | 432168 | 432168 | 1 | - | mint | 28146 | 73470 | 91246 | 91726 | 7 | --| mintToTreasury(address[]) | 99291 | 100871 | 100871 | 102451 | 4 | -+| mintToTreasury(address[]) | 99247 | 100838 | 100838 | 102429 | 4 | - | mintToTreasury(uint256,uint256) | 26979 | 59928 | 59928 | 92877 | 2 | --| mintUnbacked | 39385 | 145515 | 130632 | 192965 | 17 | --| name | 1613 | 2101 | 1931 | 8371 | 4446 | -+| mintUnbacked | 39385 | 145194 | 130258 | 192591 | 17 | -+| name | 1613 | 2095 | 1931 | 8371 | 4728 | - | nonces | 1183 | 3134 | 3261 | 3261 | 64 | - | permit | 29288 | 46358 | 37821 | 81919 | 8 | --| repay(address,uint256,uint256,address) | 60445 | 129255 | 167596 | 186974 | 13 | --| repay(bytes32) | 157189 | 157189 | 157189 | 157189 | 1 | --| repayWithATokens(address,uint256,uint256) | 154919 | 181702 | 182098 | 193095 | 57 | --| repayWithATokens(bytes32) | 160214 | 160214 | 160214 | 160214 | 1 | --| repayWithPermit(address,uint256,uint256,address,uint256,uint8,bytes32,bytes32) | 155535 | 184979 | 182716 | 218483 | 150 | --| repayWithPermit(bytes32,bytes32,bytes32) | 190349 | 205075 | 196796 | 217554 | 51 | --| rescueTokens | 39090 | 69890 | 70416 | 70481 | 113 | --| resetIsolationModeTotalDebt | 32573 | 32781 | 32661 | 41891 | 112 | --| scaledBalanceOf | 1296 | 3893 | 3296 | 7796 | 4833 | --| scaledTotalSupply | 979 | 5054 | 7523 | 7523 | 9894 | --| setAssetBorrowableInEMode | 97349 | 114455 | 114449 | 127676 | 394 | --| setAssetCollateralInEMode | 44072 | 102126 | 110608 | 110608 | 642 | -+| repay(address,uint256,uint256,address) | 60328 | 129005 | 167218 | 186596 | 13 | -+| repay(bytes32) | 156855 | 156855 | 156855 | 156855 | 1 | -+| repayWithATokens(address,uint256,uint256) | 161043 | 181176 | 181714 | 192720 | 57 | -+| repayWithATokens(bytes32) | 159903 | 159903 | 159903 | 159903 | 1 | -+| repayWithPermit(address,uint256,uint256,address,uint256,uint8,bytes32,bytes32) | 157882 | 180298 | 172938 | 218102 | 165 | -+| repayWithPermit(bytes32,bytes32,bytes32) | 188729 | 203492 | 196487 | 217222 | 55 | -+| rescueTokens | 39090 | 69891 | 70416 | 70481 | 113 | -+| resetIsolationModeTotalDebt | 32573 | 32748 | 32595 | 41825 | 112 | -+| scaledBalanceOf | 1296 | 3503 | 3296 | 7796 | 9089 | -+| scaledTotalSupply | 979 | 5545 | 7523 | 7523 | 12481 | -+| setAssetBorrowableInEMode | 91538 | 108644 | 108638 | 121798 | 394 | -+| setAssetCollateralInEMode | 44072 | 96796 | 104763 | 104786 | 642 | - | setBorrowCap | 43734 | 47605 | 43734 | 70862 | 66 | --| setBorrowableInIsolation | 67604 | 70018 | 70407 | 70407 | 13 | --| setConfiguration | 32766 | 32777 | 32777 | 32788 | 110 | --| setDebtCeiling | 43713 | 60872 | 43713 | 125470 | 73 | --| setEModeCategory | 44817 | 102639 | 108823 | 108835 | 638 | -+| setBorrowableInIsolation | 67604 | 70015 | 70407 | 70407 | 13 | -+| setConfiguration | 32766 | 32788 | 32788 | 32810 | 110 | -+| setDebtCeiling | 43713 | 58531 | 43713 | 113268 | 73 | -+| setEModeCategory | 44817 | 103136 | 109372 | 109384 | 638 | - | setIncentivesController | 38478 | 40847 | 40847 | 43216 | 2 | --| setLiquidationGracePeriod | 32833 | 37963 | 37353 | 43763 | 330 | -+| setLiquidationGracePeriod | 32833 | 37944 | 37331 | 43741 | 330 | - | setLiquidationProtocolFee | 43966 | 60573 | 69843 | 70933 | 8 | --| setPoolPause(bool) | 43516 | 45449 | 43528 | 116161 | 113 | --| setPoolPause(bool,uint40) | 43759 | 86554 | 43831 | 134169 | 108 | --| setReserveActive | 40882 | 53217 | 40882 | 121965 | 66 | -+| setPoolPause(bool) | 43516 | 45446 | 43516 | 116094 | 113 | -+| setPoolPause(bool,uint40) | 43771 | 88078 | 43831 | 134036 | 108 | -+| setReserveActive | 40882 | 51369 | 40882 | 109763 | 66 | - | setReserveBorrowing | 43825 | 62281 | 68433 | 68436 | 220 | --| setReserveFactor | 43758 | 45657 | 43758 | 151653 | 57 | -+| setReserveFactor | 43758 | 45652 | 43758 | 151390 | 57 | - | setReserveFlashLoaning | 68432 | 68452 | 68435 | 70587 | 111 | --| setReserveFreeze | 47008 | 73282 | 74806 | 99820 | 169 | --| setReserveInterestRateData | 44316 | 46059 | 44544 | 133943 | 56 | --| setReserveInterestRateStrategyAddress(address,address) | 32829 | 34615 | 33178 | 42713 | 332 | --| setReserveInterestRateStrategyAddress(address,address,bytes) | 44459 | 96824 | 44459 | 192989 | 99 | --| setReservePause(address,bool) | 43816 | 57036 | 69873 | 69873 | 111 | --| setReservePause(address,bool,uint40) | 41264 | 65735 | 73877 | 76187 | 658 | --| setSiloedBorrowing | 105040 | 114886 | 118732 | 120887 | 3 | --| setSupplyCap | 43691 | 58619 | 70807 | 70843 | 126 | -+| setReserveFreeze | 47008 | 73569 | 74806 | 99820 | 173 | -+| setReserveInterestRateData | 44328 | 45932 | 44544 | 127891 | 56 | -+| setReserveInterestRateStrategyAddress(address,address) | 32829 | 34606 | 33178 | 42691 | 332 | -+| setReserveInterestRateStrategyAddress(address,address,bytes) | 44459 | 94125 | 44459 | 186915 | 99 | -+| setReservePause(address,bool) | 43816 | 57031 | 69873 | 69873 | 111 | -+| setReservePause(address,bool,uint40) | 41264 | 65987 | 73855 | 76165 | 668 | -+| setSiloedBorrowing | 82616 | 93795 | 98308 | 100463 | 3 | -+| setSupplyCap | 43691 | 58620 | 70807 | 70843 | 126 | - | setUnbackedMintCap | 70854 | 70854 | 70854 | 70854 | 7 | --| setUserEMode | 40463 | 73473 | 67427 | 121033 | 573 | --| setUserUseReserveAsCollateral(address,bool) | 80249 | 96257 | 93457 | 129473 | 42 | --| setUserUseReserveAsCollateral(bytes32) | 95254 | 95254 | 95254 | 95254 | 1 | -+| setUserEMode | 40441 | 73483 | 67405 | 121011 | 573 | -+| setUserUseReserveAsCollateral(address,bool) | 80227 | 96252 | 93456 | 129472 | 42 | -+| setUserUseReserveAsCollateral(bytes32) | 95189 | 95189 | 95189 | 95189 | 1 | - | setValue | 31565 | 31581 | 31589 | 31589 | 3 | --| supply(address,uint256,address,uint16) | 56589 | 218981 | 226189 | 243423 | 1550 | --| supply(bytes32) | 236846 | 236846 | 236846 | 236846 | 7 | --| supplyWithPermit(address,uint256,address,uint16,uint256,uint8,bytes32,bytes32) | 142270 | 216334 | 241875 | 266413 | 157 | --| supplyWithPermit(bytes32,bytes32,bytes32) | 262466 | 262515 | 262478 | 262646 | 54 | --| symbol | 1634 | 2185 | 1996 | 8436 | 4421 | -+| supply(address,uint256,address,uint16) | 56472 | 214437 | 225814 | 243048 | 2545 | -+| supply(bytes32) | 236471 | 236471 | 236471 | 236471 | 7 | -+| supplyWithPermit(address,uint256,address,uint16,uint256,uint8,bytes32,bytes32) | 141895 | 216010 | 241512 | 266038 | 157 | -+| supplyWithPermit(bytes32,bytes32,bytes32) | 262101 | 262171 | 262161 | 262293 | 54 | -+| symbol | 1634 | 2182 | 2193 | 8436 | 4703 | - | text | 1778 | 1778 | 1778 | 1778 | 8 | --| totalSupply | 1013 | 5916 | 3013 | 15569 | 2997 | --| transfer | 27651 | 140023 | 149272 | 166887 | 71 | --| transferFrom | 138593 | 138713 | 138713 | 138833 | 2 | -+| totalSupply | 1013 | 6801 | 3013 | 15591 | 3630 | -+| transfer | 27651 | 138144 | 149316 | 166931 | 71 | -+| transferFrom | 138637 | 138757 | 138757 | 138877 | 2 | - | transferOnLiquidation | 28049 | 28049 | 28049 | 28049 | 1 | - | transferUnderlyingTo | 27493 | 27493 | 27493 | 27493 | 1 | --| updateAToken | 41743 | 43670 | 41743 | 149706 | 56 | --| updateBridgeProtocolFee | 32511 | 37397 | 32556 | 78320 | 124 | --| updateFlashloanPremiumToProtocol | 40424 | 40827 | 40424 | 63303 | 57 | --| updateFlashloanPremiumTotal | 40378 | 40781 | 40378 | 63268 | 57 | --| updateFlashloanPremiums | 32836 | 32847 | 32847 | 32858 | 110 | --| updateVariableDebtToken | 41598 | 43419 | 41598 | 143589 | 56 | -+| updateAToken | 41743 | 43232 | 41743 | 125158 | 56 | -+| updateBridgeProtocolFee | 32556 | 37441 | 32578 | 78453 | 124 | -+| updateFlashloanPremiumToProtocol | 40424 | 40826 | 40424 | 63259 | 57 | -+| updateFlashloanPremiumTotal | 40378 | 40781 | 40378 | 63224 | 57 | -+| updateFlashloanPremiums | 32836 | 32880 | 32880 | 32925 | 110 | -+| updateVariableDebtToken | 41598 | 42980 | 41598 | 119042 | 56 | - | upgradeTo | 26845 | 28735 | 28735 | 30625 | 2 | - | upgradeToAndCall | 28747 | 152620 | 187393 | 187393 | 8 | - | value | 923 | 923 | 923 | 923 | 11 | - | values | 1203 | 1203 | 1203 | 1203 | 16 | --| withdraw(address,uint256,address) | 66258 | 134574 | 141787 | 204532 | 23 | --| withdraw(bytes32) | 138601 | 145682 | 145682 | 152763 | 2 | -+| withdraw(address,uint256,address) | 66318 | 134324 | 141469 | 204214 | 23 | -+| withdraw(bytes32) | 138369 | 145450 | 145450 | 152532 | 2 | - - - | src/contracts/mocks/flashloan/MockFlashLoanReceiver.sol:MockFlashLoanReceiver contract | | | | | | -@@ -683,9 +691,9 @@ - | src/contracts/mocks/helpers/MockPool.sol:MockPoolInherited contract | | | | | | - |---------------------------------------------------------------------|-----------------|-------|--------|-------|---------| - | Deployment Cost | Deployment Size | | | | | --| 4878289 | 22516 | | | | | -+| 4748324 | 21925 | | | | | - | Function Name | min | avg | median | max | # calls | --| initialize | 28391 | 28391 | 28391 | 28391 | 2 | -+| initialize | 28478 | 28478 | 28478 | 28478 | 2 | - - - | src/contracts/mocks/oracle/CLAggregators/MockAggregator.sol:MockAggregator contract | | | | | | -@@ -693,10 +701,10 @@ - | Deployment Cost | Deployment Size | | | | | - | 108467 | 310 | | | | | - | Function Name | min | avg | median | max | # calls | --| _latestAnswer | 315 | 315 | 315 | 315 | 908 | -+| _latestAnswer | 315 | 315 | 315 | 315 | 2052 | - | decimals | 143 | 143 | 143 | 143 | 83 | - | description | 168 | 168 | 168 | 168 | 83 | --| latestAnswer | 279 | 1638 | 2279 | 2279 | 8342 | -+| latestAnswer | 279 | 1341 | 2279 | 2279 | 15698 | - | name | 168 | 168 | 168 | 168 | 83 | - - -@@ -715,7 +723,7 @@ - | 273603 | 1358 | | | | | - | Function Name | min | avg | median | max | # calls | - | latestRoundData | 724 | 1527 | 729 | 4729 | 10 | --| setAnswer | 26203 | 27465 | 26203 | 46115 | 72 | -+| setAnswer | 26203 | 27414 | 26203 | 46115 | 75 | - - - | src/contracts/mocks/swap/MockParaSwapAugustus.sol:MockParaSwapAugustus contract | | | | | | -@@ -749,17 +757,17 @@ - | src/contracts/mocks/testnet-helpers/TestnetERC20.sol:TestnetERC20 contract | | | | | | - |----------------------------------------------------------------------------|-----------------|-------|--------|-------|---------| - | Deployment Cost | Deployment Size | | | | | --| 1032293 | 5652 | | | | | -+| 1032245 | 5652 | | | | | - | Function Name | min | avg | median | max | # calls | - | DOMAIN_SEPARATOR | 2339 | 2339 | 2339 | 2339 | 55 | - | allowance | 833 | 1944 | 2833 | 2833 | 9 | --| approve | 26300 | 46290 | 46584 | 46584 | 5444 | --| balanceOf | 648 | 1079 | 648 | 2648 | 11009 | --| decimals | 311 | 1487 | 2311 | 2311 | 18442 | --| mint | 36475 | 60304 | 53587 | 70795 | 3951 | --| name | 3236 | 3236 | 3236 | 3236 | 412 | -+| approve | 26300 | 46244 | 46584 | 46584 | 5840 | -+| balanceOf | 648 | 1071 | 648 | 2648 | 16219 | -+| decimals | 311 | 1468 | 2311 | 2311 | 19433 | -+| mint | 36475 | 60296 | 53587 | 70795 | 3981 | -+| name | 3236 | 3236 | 3236 | 3236 | 431 | - | nonces | 2601 | 2601 | 2601 | 2601 | 55 | --| permit | 76469 | 76508 | 76493 | 76661 | 102 | -+| permit | 76457 | 76510 | 76493 | 76661 | 107 | - | symbol | 1323 | 2323 | 2323 | 3323 | 56 | - | totalSupply | 348 | 748 | 348 | 2348 | 2490 | - | transfer | 46925 | 51017 | 51701 | 51701 | 7 | -@@ -782,10 +790,10 @@ - | Deployment Cost | Deployment Size | | | | | - | 117447 | 326 | | | | | - | Function Name | min | avg | median | max | # calls | --| HALF_PERCENTAGE_FACTOR | 146 | 146 | 146 | 146 | 104 | --| PERCENTAGE_FACTOR | 223 | 223 | 223 | 223 | 157 | -+| HALF_PERCENTAGE_FACTOR | 146 | 146 | 146 | 146 | 94 | -+| PERCENTAGE_FACTOR | 223 | 223 | 223 | 223 | 148 | - | percentDiv | 316 | 424 | 428 | 428 | 58 | --| percentMul | 333 | 420 | 431 | 431 | 58 | -+| percentMul | 333 | 407 | 431 | 431 | 58 | - - - | src/contracts/mocks/tests/WadRayMathWrapper.sol:WadRayMathWrapper contract | | | | | | -@@ -796,20 +804,20 @@ - | HALF_RAY | 246 | 246 | 246 | 246 | 1 | - | HALF_WAD | 223 | 223 | 223 | 223 | 92 | - | RAY | 224 | 224 | 224 | 224 | 1 | --| WAD | 179 | 179 | 179 | 179 | 136 | --| WAD_RAY_RATIO | 268 | 268 | 268 | 268 | 379 | -+| WAD | 179 | 179 | 179 | 179 | 139 | -+| WAD_RAY_RATIO | 268 | 268 | 268 | 268 | 375 | - | rayDiv | 494 | 494 | 494 | 494 | 4 | - | rayMul | 497 | 497 | 497 | 497 | 3 | - | rayToWad | 384 | 387 | 384 | 398 | 113 | --| wadDiv | 426 | 517 | 538 | 538 | 59 | --| wadMul | 333 | 402 | 431 | 431 | 61 | --| wadToRay | 280 | 352 | 357 | 357 | 107 | -+| wadDiv | 426 | 519 | 538 | 538 | 59 | -+| wadMul | 333 | 406 | 431 | 431 | 61 | -+| wadToRay | 280 | 349 | 357 | 357 | 103 | - - - | src/contracts/mocks/tokens/MockATokenRepayment.sol:MockATokenRepayment contract | | | | | | - |---------------------------------------------------------------------------------|-----------------|-------|--------|-------|---------| - | Deployment Cost | Deployment Size | | | | | --| 2334681 | 11175 | | | | | -+| 2334748 | 11175 | | | | | - | Function Name | min | avg | median | max | # calls | - | RESERVE_TREASURY_ADDRESS | 419 | 419 | 419 | 419 | 1 | - | getIncentivesController | 474 | 474 | 474 | 474 | 1 | -@@ -821,7 +829,7 @@ - | src/contracts/mocks/tokens/MockDebtTokens.sol:MockVariableDebtToken contract | | | | | | - |------------------------------------------------------------------------------|-----------------|-------|--------|-------|---------| - | Deployment Cost | Deployment Size | | | | | --| 1695959 | 8194 | | | | | -+| 1696026 | 8194 | | | | | - | Function Name | min | avg | median | max | # calls | - | getIncentivesController | 430 | 430 | 430 | 430 | 1 | - | initialize | 56093 | 56093 | 56093 | 56093 | 1 | -@@ -832,7 +840,7 @@ - | src/contracts/mocks/tokens/MockScaledToken.sol:MockScaledToken contract | | | | | | - |-------------------------------------------------------------------------|-----------------|-------|--------|-------|---------| - | Deployment Cost | Deployment Size | | | | | --| 1004529 | 4790 | | | | | -+| 1004596 | 4790 | | | | | - | Function Name | min | avg | median | max | # calls | - | balanceOf | 584 | 584 | 584 | 584 | 4 | - | setStorage | 67846 | 67846 | 67846 | 67846 | 1 | -@@ -888,23 +896,23 @@ - | Deployment Cost | Deployment Size | | | | | - | 847989 | 4139 | | | | | - | Function Name | min | avg | median | max | # calls | --| DEFAULT_ADMIN_ROLE | 282 | 282 | 282 | 282 | 1382 | -+| DEFAULT_ADMIN_ROLE | 282 | 282 | 282 | 282 | 1414 | - | FLASH_BORROWER_ROLE | 315 | 315 | 315 | 315 | 20 | --| POOL_ADMIN_ROLE | 292 | 292 | 292 | 292 | 681 | -+| POOL_ADMIN_ROLE | 292 | 292 | 292 | 292 | 697 | - | addAssetListingAdmin | 50955 | 50955 | 50955 | 50955 | 3 | - | addBridge | 51021 | 51021 | 51021 | 51021 | 14 | - | addEmergencyAdmin | 50956 | 50956 | 50956 | 50956 | 3 | - | addFlashBorrower | 50977 | 52114 | 50977 | 55528 | 4 | --| addPoolAdmin | 50988 | 50999 | 51000 | 51000 | 668 | -+| addPoolAdmin | 50988 | 50999 | 51000 | 51000 | 684 | - | addRiskAdmin | 51021 | 51021 | 51021 | 51021 | 14 | - | grantRole | 51474 | 52044 | 51474 | 56036 | 8 | - | hasRole | 737 | 2526 | 2737 | 2737 | 19 | --| isAssetListingAdmin | 809 | 2089 | 2809 | 2809 | 1807 | -+| isAssetListingAdmin | 809 | 2085 | 2809 | 2809 | 1842 | - | isBridge | 2786 | 2786 | 2786 | 2786 | 26 | - | isEmergencyAdmin | 742 | 2737 | 2742 | 2742 | 948 | - | isFlashBorrower | 2828 | 2828 | 2828 | 2828 | 66 | --| isPoolAdmin | 752 | 1249 | 752 | 2752 | 28889 | --| isRiskAdmin | 742 | 1123 | 742 | 2742 | 23250 | -+| isPoolAdmin | 752 | 1242 | 752 | 2752 | 29456 | -+| isRiskAdmin | 742 | 1117 | 742 | 2742 | 23738 | - | removeAssetListingAdmin | 29047 | 29047 | 29047 | 29047 | 2 | - | removeBridge | 29016 | 29016 | 29016 | 29016 | 1 | - | removeEmergencyAdmin | 28992 | 28992 | 28992 | 28992 | 1 | -@@ -919,24 +927,24 @@ - | Deployment Cost | Deployment Size | | | | | - | 1571699 | 8177 | | | | | - | Function Name | min | avg | median | max | # calls | --| getACLAdmin | 477 | 681 | 477 | 2477 | 763 | --| getACLManager | 531 | 968 | 531 | 2531 | 27795 | --| getAddress | 543 | 1045 | 543 | 2543 | 10118 | -+| getACLAdmin | 477 | 679 | 477 | 2477 | 780 | -+| getACLManager | 531 | 962 | 531 | 2531 | 28362 | -+| getAddress | 543 | 1182 | 543 | 2543 | 1035 | - | getMarketId | 1346 | 1346 | 1346 | 1346 | 6 | --| getPool | 466 | 776 | 466 | 2466 | 14575 | --| getPoolConfigurator | 509 | 725 | 509 | 2509 | 67952 | --| getPoolDataProvider | 486 | 1203 | 486 | 2486 | 2089 | --| getPriceOracle | 574 | 2254 | 2574 | 2574 | 4344 | --| getPriceOracleSentinel | 487 | 2467 | 2487 | 2487 | 1788 | --| owner | 363 | 363 | 363 | 363 | 686 | -+| getPool | 466 | 777 | 466 | 2466 | 14817 | -+| getPoolConfigurator | 509 | 723 | 509 | 2509 | 69291 | -+| getPoolDataProvider | 486 | 1201 | 486 | 2486 | 2137 | -+| getPriceOracle | 574 | 1904 | 2574 | 2574 | 8259 | -+| getPriceOracleSentinel | 487 | 2475 | 2487 | 2487 | 2857 | -+| owner | 363 | 363 | 363 | 363 | 702 | - | setACLAdmin | 24013 | 45794 | 47617 | 47617 | 24 | - | setACLManager | 24056 | 37484 | 39110 | 47660 | 4 | --| setAddress | 24622 | 35608 | 31536 | 48636 | 5 | -+| setAddress | 24622 | 48054 | 48360 | 48636 | 280 | - | setAddressAsProxy | 24328 | 224316 | 57038 | 507830 | 5 | - | setMarketId | 24420 | 28552 | 28552 | 32685 | 2 | --| setPoolConfiguratorImpl | 24012 | 287005 | 295057 | 533894 | 4 | -+| setPoolConfiguratorImpl | 24012 | 287022 | 295092 | 533894 | 4 | - | setPoolDataProvider | 24101 | 37529 | 39155 | 47705 | 4 | --| setPoolImpl | 24057 | 273450 | 281500 | 506744 | 4 | -+| setPoolImpl | 24057 | 273500 | 281568 | 506809 | 4 | - | setPriceOracle | 24080 | 37508 | 39134 | 47684 | 4 | - | setPriceOracleSentinel | 24123 | 40943 | 47727 | 47727 | 6 | - -@@ -949,7 +957,7 @@ - | getAddressesProviderAddressById | 519 | 519 | 519 | 519 | 4 | - | getAddressesProviderIdByAddress | 556 | 1222 | 556 | 2556 | 6 | - | getAddressesProvidersList | 671 | 3400 | 3288 | 5014 | 5 | --| owner | 329 | 2323 | 2329 | 2329 | 683 | -+| owner | 329 | 2323 | 2329 | 2329 | 699 | - | registerAddressesProvider | 24438 | 104006 | 119920 | 119920 | 6 | - | unregisterAddressesProvider | 26441 | 39021 | 39997 | 49652 | 4 | - -@@ -959,7 +967,7 @@ - | Deployment Cost | Deployment Size | | | | | - | 833790 | 3948 | | | | | - | Function Name | min | avg | median | max | # calls | --| configureAssets | 284134 | 284424 | 284194 | 289908 | 518 | -+| configureAssets | 284134 | 284422 | 284194 | 289908 | 518 | - | getEmissionAdmin | 547 | 547 | 547 | 547 | 6 | - | getRewardsController | 385 | 1385 | 1385 | 2385 | 2 | - | owner | 384 | 384 | 384 | 384 | 2 | -@@ -977,17 +985,17 @@ - | Deployment Cost | Deployment Size | | | | | - | 3131951 | 14452 | | | | | - | Function Name | min | avg | median | max | # calls | --| EMISSION_MANAGER | 326 | 326 | 326 | 326 | 685 | -+| EMISSION_MANAGER | 326 | 326 | 326 | 326 | 701 | - | claimAllRewards | 92263 | 92263 | 92263 | 92263 | 1 | - | claimAllRewardsOnBehalf | 94562 | 94562 | 94562 | 94562 | 1 | - | claimAllRewardsToSelf | 92062 | 92062 | 92062 | 92062 | 1 | --| claimRewards | 952 | 72531 | 84890 | 97899 | 155 | -+| claimRewards | 952 | 71217 | 84899 | 97899 | 135 | - | claimRewardsOnBehalf | 88363 | 88363 | 88363 | 88363 | 1 | - | claimRewardsToSelf | 85866 | 85866 | 85866 | 85866 | 1 | - | configureAssets | 246530 | 246750 | 246530 | 252244 | 518 | - | getAllUserRewards | 8567 | 8567 | 8567 | 8567 | 1 | - | getAssetDecimals | 656 | 656 | 656 | 656 | 2 | --| getAssetIndex | 2466 | 7696 | 8974 | 11392 | 2079 | -+| getAssetIndex | 2466 | 7708 | 8974 | 11392 | 2069 | - | getClaimer | 625 | 2589 | 2625 | 2625 | 112 | - | getDistributionEnd | 789 | 789 | 789 | 789 | 1 | - | getEmissionManager | 258 | 258 | 258 | 258 | 5 | -@@ -998,9 +1006,9 @@ - | getTransferStrategy | 648 | 648 | 648 | 648 | 1 | - | getUserAccruedRewards | 1641 | 1641 | 1641 | 1641 | 1 | - | getUserAssetIndex | 1005 | 1005 | 1005 | 1005 | 1 | --| getUserRewards | 6793 | 7959 | 8081 | 12368 | 66 | --| handleAction | 728 | 2287 | 2728 | 38069 | 8227 | --| initialize | 26065 | 45245 | 45250 | 53154 | 683 | -+| getUserRewards | 6793 | 7953 | 8081 | 12368 | 66 | -+| handleAction | 728 | 2270 | 2728 | 38069 | 11810 | -+| initialize | 26065 | 45245 | 45250 | 53154 | 699 | - | setClaimer | 24279 | 24279 | 24279 | 24279 | 59 | - | setDistributionEnd | 8884 | 8884 | 8884 | 8884 | 2 | - | setEmissionPerSecond | 24303 | 24303 | 24303 | 24303 | 2 | -@@ -1036,7 +1044,7 @@ - | Deployment Cost | Deployment Size | | | | | - | 0 | 0 | | | | | - | Function Name | min | avg | median | max | # calls | --| initialize | 90680 | 90680 | 90680 | 90680 | 708 | -+| initialize | 90680 | 90680 | 90680 | 90680 | 724 | - - - | src/contracts/treasury/RevenueSplitter.sol:RevenueSplitter contract | | | | | | -@@ -1049,23 +1057,23 @@ - | SPLIT_PERCENTAGE_RECIPIENT_A | 170 | 170 | 170 | 170 | 491 | - | receive | 0 | 0 | 0 | 0 | 56 | - | splitNativeRevenue | 23633 | 90996 | 92645 | 92645 | 57 | --| splitRevenue | 24246 | 129585 | 135765 | 135765 | 112 | -+| splitRevenue | 24246 | 128965 | 135765 | 135765 | 112 | - - - | src/deployments/projects/aave-v3-batched/batches/AaveV3GettersBatchOne.sol:AaveV3GettersBatchOne contract | | | | | | - |-----------------------------------------------------------------------------------------------------------|-----------------|-----|--------|-----|---------| - | Deployment Cost | Deployment Size | | | | | --| 5027098 | 32657 | | | | | -+| 5076368 | 33025 | | | | | - | Function Name | min | avg | median | max | # calls | --| getGettersReportOne | 968 | 968 | 968 | 968 | 705 | -+| getGettersReportOne | 968 | 968 | 968 | 968 | 721 | - - - | src/deployments/projects/aave-v3-batched/batches/AaveV3GettersBatchTwo.sol:AaveV3GettersBatchTwo contract | | | | | | - |-----------------------------------------------------------------------------------------------------------|-----------------|-----|--------|-----|---------| - | Deployment Cost | Deployment Size | | | | | --| 1506020 | 11284 | | | | | -+| 1403193 | 10809 | | | | | - | Function Name | min | avg | median | max | # calls | --| getGettersReportTwo | 533 | 533 | 533 | 533 | 679 | -+| getGettersReportTwo | 533 | 533 | 533 | 533 | 695 | - - - | src/deployments/projects/aave-v3-batched/batches/AaveV3HelpersBatchOne.sol:AaveV3HelpersBatchOne contract | | | | | | -@@ -1073,21 +1081,21 @@ - | Deployment Cost | Deployment Size | | | | | - | 7236222 | 34331 | | | | | - | Function Name | min | avg | median | max | # calls | --| getConfigEngineReport | 1693 | 1693 | 1693 | 1693 | 653 | -+| getConfigEngineReport | 1693 | 1693 | 1693 | 1693 | 669 | - - - | src/deployments/projects/aave-v3-batched/batches/AaveV3HelpersBatchTwo.sol:AaveV3HelpersBatchTwo contract | | | | | | - |-----------------------------------------------------------------------------------------------------------|-----------------|-----|--------|-----|---------| - | Deployment Cost | Deployment Size | | | | | --| 7474689 | 32895 | | | | | -+| 7364790 | 32366 | | | | | - | Function Name | min | avg | median | max | # calls | --| staticATokenReport | 968 | 968 | 968 | 968 | 653 | -+| staticATokenReport | 968 | 968 | 968 | 968 | 669 | - - - | src/deployments/projects/aave-v3-batched/batches/AaveV3L2PoolBatch.sol:AaveV3L2PoolBatch contract | | | | | | - |---------------------------------------------------------------------------------------------------|-----------------|-----|--------|-----|---------| - | Deployment Cost | Deployment Size | | | | | --| 9598548 | 43985 | | | | | -+| 9468557 | 43394 | | | | | - | Function Name | min | avg | median | max | # calls | - | getPoolReport | 533 | 533 | 533 | 533 | 76 | - -@@ -1097,13 +1105,13 @@ - | Deployment Cost | Deployment Size | | | | | - | 1046333 | 6958 | | | | | - | Function Name | min | avg | median | max | # calls | --| getMiscReport | 533 | 533 | 533 | 533 | 705 | -+| getMiscReport | 533 | 533 | 533 | 533 | 721 | - - - | src/deployments/projects/aave-v3-batched/batches/AaveV3ParaswapBatch.sol:AaveV3ParaswapBatch contract | | | | | | - |-------------------------------------------------------------------------------------------------------|-----------------|-----|--------|-----|---------| - | Deployment Cost | Deployment Size | | | | | --| 6402821 | 33403 | | | | | -+| 6050676 | 31792 | | | | | - | Function Name | min | avg | median | max | # calls | - | getParaswapReport | 968 | 968 | 968 | 968 | 34 | - -@@ -1113,15 +1121,15 @@ - | Deployment Cost | Deployment Size | | | | | - | 7501711 | 40894 | | | | | - | Function Name | min | avg | median | max | # calls | --| getPeripheryReport | 1512 | 3509 | 3512 | 5512 | 705 | -+| getPeripheryReport | 1512 | 3509 | 3512 | 5512 | 721 | - - - | src/deployments/projects/aave-v3-batched/batches/AaveV3PoolBatch.sol:AaveV3PoolBatch contract | | | | | | - |-----------------------------------------------------------------------------------------------|-----------------|-----|--------|-----|---------| - | Deployment Cost | Deployment Size | | | | | --| 9328324 | 42738 | | | | | -+| 9198474 | 42147 | | | | | - | Function Name | min | avg | median | max | # calls | --| getPoolReport | 533 | 533 | 533 | 533 | 629 | -+| getPoolReport | 533 | 533 | 533 | 533 | 645 | - - - | src/deployments/projects/aave-v3-batched/batches/AaveV3SetupBatch.sol:AaveV3SetupBatch contract | | | | | | -@@ -1129,17 +1137,17 @@ - | Deployment Cost | Deployment Size | | | | | - | 5190443 | 28372 | | | | | - | Function Name | min | avg | median | max | # calls | --| getInitialReport | 619 | 619 | 619 | 619 | 705 | --| setMarketReport | 632452 | 635166 | 632452 | 773432 | 653 | --| setupAaveV3Market | 2168961 | 2661798 | 2661889 | 2687948 | 681 | -+| getInitialReport | 619 | 619 | 619 | 619 | 721 | -+| setMarketReport | 632452 | 635101 | 632452 | 773432 | 669 | -+| setupAaveV3Market | 2168938 | 2661797 | 2661866 | 2688148 | 697 | - - - | src/deployments/projects/aave-v3-batched/batches/AaveV3TokensBatch.sol:AaveV3TokensBatch contract | | | | | | - |---------------------------------------------------------------------------------------------------|-----------------|-----|--------|-----|---------| - | Deployment Cost | Deployment Size | | | | | --| 4228121 | 20353 | | | | | -+| 4228255 | 20353 | | | | | - | Function Name | min | avg | median | max | # calls | --| getTokensReport | 533 | 533 | 533 | 533 | 679 | -+| getTokensReport | 533 | 533 | 533 | 533 | 695 | - - - | tests/extensions/static-a-token/ERC20AaveLMUpgradable.t.sol:MockERC20AaveLMUpgradeable contract | | | | | | -@@ -1147,20 +1155,20 @@ - | Deployment Cost | Deployment Size | | | | | - | 1871016 | 8613 | | | | | - | Function Name | min | avg | median | max | # calls | --| claimRewards | 58219 | 96127 | 58645 | 173391 | 55 | --| claimRewardsOnBehalf | 34383 | 88909 | 59174 | 177643 | 165 | --| claimRewardsToSelf | 57729 | 108168 | 58155 | 172901 | 55 | --| collectAndUpdateRewards | 48341 | 85724 | 57313 | 130455 | 56 | --| getClaimableRewards | 6163 | 6511 | 6580 | 26280 | 726 | -+| claimRewards | 58219 | 106593 | 58645 | 173391 | 55 | -+| claimRewardsOnBehalf | 34383 | 77121 | 59165 | 177643 | 165 | -+| claimRewardsToSelf | 57729 | 91435 | 58146 | 172901 | 55 | -+| collectAndUpdateRewards | 48341 | 86973 | 57313 | 130455 | 56 | -+| getClaimableRewards | 6163 | 6508 | 6580 | 26280 | 718 | - | getReferenceAsset | 2495 | 2495 | 2495 | 2495 | 1 | --| getTotalClaimableRewards | 10950 | 11550 | 11367 | 24654 | 56 | --| getUnclaimedRewards | 818 | 818 | 818 | 818 | 226 | -+| getTotalClaimableRewards | 10950 | 11543 | 11367 | 24654 | 56 | -+| getUnclaimedRewards | 818 | 818 | 818 | 818 | 218 | - | isRegisteredRewardToken | 575 | 1241 | 575 | 2575 | 3 | --| mint | 53655 | 96993 | 97646 | 100854 | 526 | -+| mint | 53655 | 97053 | 97646 | 100854 | 524 | - | mockInit | 79952 | 79952 | 79952 | 79952 | 16 | - | refreshRewardTokens | 116549 | 116557 | 116557 | 116975 | 498 | - | rewardTokens | 1012 | 1012 | 1012 | 1012 | 1 | --| transfer | 60144 | 76481 | 73061 | 103101 | 110 | -+| transfer | 60126 | 77064 | 73023 | 103110 | 110 | - - - | tests/extensions/static-a-token/ERC20AaveLMUpgradable.t.sol:MockScaledTestnetERC20 contract | | | | | | -@@ -1169,38 +1177,38 @@ - | 1058431 | 5780 | | | | | - | Function Name | min | avg | median | max | # calls | - | decimals | 2333 | 2333 | 2333 | 2333 | 498 | --| getScaledUserBalanceAndSupply | 735 | 2754 | 2735 | 4735 | 207 | --| mint | 51332 | 67662 | 68648 | 68648 | 526 | --| scaledTotalSupply | 394 | 1831 | 2394 | 2394 | 2576 | --| transfer | 29803 | 45994 | 46975 | 46975 | 526 | -+| getScaledUserBalanceAndSupply | 735 | 2756 | 2735 | 4735 | 187 | -+| mint | 51332 | 67722 | 68648 | 68648 | 524 | -+| scaledTotalSupply | 394 | 1835 | 2394 | 2394 | 2566 | -+| transfer | 29803 | 46055 | 46975 | 46975 | 524 | - - - | tests/extensions/static-a-token/ERC4626StataTokenUpgradeable.t.sol:MockERC4626StataTokenUpgradeable contract | | | | | | - |--------------------------------------------------------------------------------------------------------------|-----------------|--------|--------|--------|---------| - | Deployment Cost | Deployment Size | | | | | --| 2145705 | 10019 | | | | | -+| 2145772 | 10019 | | | | | - | Function Name | min | avg | median | max | # calls | --| approve | 26451 | 45885 | 46405 | 46495 | 110 | -+| approve | 26451 | 45698 | 46393 | 46495 | 110 | - | balanceOf | 607 | 607 | 607 | 607 | 551 | --| convertToAssets | 2937 | 2937 | 2937 | 2937 | 55 | --| convertToShares | 15938 | 15938 | 15938 | 15938 | 55 | -+| convertToAssets | 2959 | 2959 | 2959 | 2959 | 55 | -+| convertToShares | 15960 | 15960 | 15960 | 15960 | 55 | - | decimals | 540 | 540 | 540 | 540 | 55 | --| depositATokens | 51658 | 192672 | 206714 | 206822 | 606 | --| depositWithPermit | 68043 | 234965 | 243428 | 332863 | 275 | -+| depositATokens | 51680 | 192734 | 206780 | 206888 | 606 | -+| depositWithPermit | 68065 | 234851 | 243518 | 332532 | 275 | - | latestAnswer | 19765 | 19765 | 19765 | 19765 | 56 | --| maxDeposit | 28852 | 41793 | 42490 | 42490 | 58 | --| maxMint | 9466 | 9466 | 9466 | 9466 | 1 | --| maxRedeem | 2593 | 5823 | 7434 | 7444 | 165 | --| mint | 74355 | 193537 | 193542 | 312717 | 110 | -+| maxDeposit | 23063 | 36025 | 36723 | 36723 | 58 | -+| maxMint | 7677 | 7677 | 7677 | 7677 | 1 | -+| maxRedeem | 2571 | 5816 | 7434 | 7444 | 165 | -+| mint | 66100 | 185119 | 185098 | 304097 | 110 | - | mockInit | 134255 | 134255 | 134255 | 134255 | 28 | --| previewDeposit | 2981 | 11647 | 15981 | 15981 | 165 | --| previewMint | 2977 | 2977 | 2977 | 2977 | 55 | --| previewRedeem | 2913 | 2913 | 2913 | 2913 | 110 | --| previewWithdraw | 2959 | 2959 | 2959 | 2959 | 55 | --| redeem | 174631 | 174853 | 174883 | 174979 | 55 | --| redeemATokens | 40731 | 121302 | 161131 | 162073 | 165 | --| totalAssets | 2930 | 3193 | 2930 | 17930 | 57 | --| withdraw | 51143 | 114477 | 114439 | 177723 | 110 | -+| previewDeposit | 3003 | 11669 | 16003 | 16003 | 165 | -+| previewMint | 2999 | 2999 | 2999 | 2999 | 55 | -+| previewRedeem | 2935 | 2935 | 2935 | 2935 | 110 | -+| previewWithdraw | 2981 | 2981 | 2981 | 2981 | 55 | -+| redeem | 174347 | 174562 | 174647 | 174683 | 55 | -+| redeemATokens | 40753 | 121354 | 161233 | 162139 | 165 | -+| totalAssets | 2952 | 3215 | 2952 | 17952 | 57 | -+| withdraw | 51165 | 114345 | 114313 | 177449 | 110 | - - - | tests/extensions/v3-config-engine/mocks/AaveV3MockAssetEModeUpdate.sol:AaveV3MockAssetEModeUpdate contract | | | | | | -@@ -1208,7 +1216,7 @@ - | Deployment Cost | Deployment Size | | | | | - | 795244 | 3745 | | | | | - | Function Name | min | avg | median | max | # calls | --| execute | 217757 | 217757 | 217757 | 217757 | 1 | -+| execute | 206256 | 206256 | 206256 | 206256 | 1 | - - - | tests/extensions/v3-config-engine/mocks/AaveV3MockBorrowUpdate.sol:AaveV3MockBorrowUpdate contract | | | | | | -@@ -1216,7 +1224,7 @@ - | Deployment Cost | Deployment Size | | | | | - | 768952 | 3555 | | | | | - | Function Name | min | avg | median | max | # calls | --| execute | 159137 | 159137 | 159137 | 159137 | 1 | -+| execute | 158874 | 158874 | 158874 | 158874 | 1 | - - - | tests/extensions/v3-config-engine/mocks/AaveV3MockBorrowUpdateNoChange.sol:AaveV3MockBorrowUpdateNoChange contract | | | | | | -@@ -1224,7 +1232,7 @@ - | Deployment Cost | Deployment Size | | | | | - | 775440 | 3585 | | | | | - | Function Name | min | avg | median | max | # calls | --| execute | 47048 | 47048 | 47048 | 47048 | 1 | -+| execute | 47026 | 47026 | 47026 | 47026 | 1 | - - - | tests/extensions/v3-config-engine/mocks/AaveV3MockCapUpdate.sol:AaveV3MockCapUpdate contract | | | | | | -@@ -1272,7 +1280,7 @@ - | Deployment Cost | Deployment Size | | | | | - | 737875 | 3329 | | | | | - | Function Name | min | avg | median | max | # calls | --| execute | 128344 | 128344 | 128344 | 128344 | 2 | -+| execute | 128893 | 128893 | 128893 | 128893 | 2 | - - - | tests/extensions/v3-config-engine/mocks/AaveV3MockEModeCategoryUpdate.sol:AaveV3MockEModeCategoryUpdateEdgeBonus contract | | | | | | -@@ -1280,7 +1288,7 @@ - | Deployment Cost | Deployment Size | | | | | - | 738487 | 3332 | | | | | - | Function Name | min | avg | median | max | # calls | --| execute | 55082 | 55082 | 55082 | 55082 | 1 | -+| execute | 55127 | 55127 | 55127 | 55127 | 1 | - - - | tests/extensions/v3-config-engine/mocks/AaveV3MockEModeCategoryUpdateNoChange.sol:AaveV3MockEModeCategoryUpdateNoChange contract | | | | | | -@@ -1296,7 +1304,7 @@ - | Deployment Cost | Deployment Size | | | | | - | 833716 | 3923 | | | | | - | Function Name | min | avg | median | max | # calls | --| execute | 1795274 | 1795274 | 1795274 | 1795274 | 1 | -+| execute | 1782917 | 1782917 | 1782917 | 1782917 | 1 | - | newListings | 2697 | 2697 | 2697 | 2697 | 4 | - - -@@ -1305,7 +1313,7 @@ - | Deployment Cost | Deployment Size | | | | | - | 897931 | 4363 | | | | | - | Function Name | min | avg | median | max | # calls | --| execute | 1795295 | 1795295 | 1795295 | 1795295 | 1 | -+| execute | 1782938 | 1782938 | 1782938 | 1782938 | 1 | - | newListingsCustom | 3170 | 3170 | 3170 | 3170 | 4 | - - -@@ -1322,31 +1330,31 @@ - | Deployment Cost | Deployment Size | | | | | - | 760739 | 3517 | | | | | - | Function Name | min | avg | median | max | # calls | --| execute | 151474 | 151474 | 151474 | 151474 | 1 | -+| execute | 145422 | 145422 | 145422 | 145422 | 1 | - | rateStrategiesUpdates | 1175 | 1175 | 1175 | 1175 | 4 | - - - | tests/harness/VariableDebtToken.sol:VariableDebtTokenHarness contract | | | | | | - |-----------------------------------------------------------------------|-----------------|--------|--------|--------|---------| - | Deployment Cost | Deployment Size | | | | | --| 1699482 | 8210 | | | | | -+| 1699549 | 8210 | | | | | - | Function Name | min | avg | median | max | # calls | - | DEBT_TOKEN_REVISION | 305 | 305 | 305 | 305 | 717 | - | POOL | 282 | 282 | 282 | 282 | 717 | - | UNDERLYING_ASSET_ADDRESS | 375 | 1201 | 375 | 2375 | 937 | - | allowance | 902 | 902 | 902 | 902 | 1 | - | approve | 22100 | 22100 | 22100 | 22100 | 1 | --| approveDelegation | 48605 | 48632 | 48629 | 48677 | 55 | --| burn | 52003 | 52032 | 52027 | 52075 | 110 | -+| approveDelegation | 48605 | 48634 | 48629 | 48677 | 55 | -+| burn | 52003 | 52030 | 52027 | 52075 | 110 | - | decimals | 334 | 334 | 334 | 334 | 717 | - | decreaseAllowance | 22121 | 22121 | 22121 | 22121 | 1 | - | getIncentivesController | 430 | 430 | 430 | 430 | 717 | - | increaseAllowance | 22121 | 22121 | 22121 | 22121 | 1 | --| initialize | 29537 | 150404 | 179132 | 247980 | 440 | --| mint | 86731 | 88007 | 86767 | 91790 | 220 | -+| initialize | 29623 | 151326 | 179120 | 247968 | 440 | -+| mint | 86731 | 88005 | 86767 | 91790 | 220 | - | name | 1004 | 1325 | 1259 | 1789 | 717 | - | scaledBalanceOf | 687 | 687 | 687 | 687 | 220 | --| symbol | 1025 | 1360 | 1280 | 1810 | 717 | -+| symbol | 1025 | 1362 | 1280 | 1810 | 717 | - | transfer | 22143 | 22143 | 22143 | 22143 | 1 | - | transferFrom | 22369 | 22369 | 22369 | 22369 | 1 | - -@@ -1356,9 +1364,9 @@ - | Deployment Cost | Deployment Size | | | | | - | 3356095 | 13616 | | | | | - | Function Name | min | avg | median | max | # calls | --| USDX_ADDRESS | 293 | 293 | 293 | 293 | 645 | --| WBTC_ADDRESS | 249 | 249 | 249 | 249 | 645 | --| execute | 5115928 | 5116789 | 5116858 | 5116858 | 648 | -+| USDX_ADDRESS | 293 | 293 | 293 | 293 | 661 | -+| WBTC_ADDRESS | 249 | 249 | 249 | 249 | 661 | -+| execute | 5081210 | 5083600 | 5083787 | 5083787 | 664 | - - - | tests/mocks/AugustusRegistryMock.sol:AugustusRegistryMock contract | | | | | | -@@ -1395,4 +1403,4 @@ - - - --Ran 60 test suites in 125.59s (1013.00s CPU time): 741 tests passed, 0 failed, 0 skipped (741 total tests) -+Ran 62 test suites in 118.40s (747.13s CPU time): 757 tests passed, 0 failed, 0 skipped (757 total tests) -``` diff --git a/src/contracts/instances/PoolConfiguratorInstance.sol b/src/contracts/instances/PoolConfiguratorInstance.sol index 8d2e4939..ca8e82b4 100644 --- a/src/contracts/instances/PoolConfiguratorInstance.sol +++ b/src/contracts/instances/PoolConfiguratorInstance.sol @@ -4,7 +4,7 @@ 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; + uint256 public constant CONFIGURATOR_REVISION = 5; /// @inheritdoc VersionedInitializable function getRevision() internal pure virtual override returns (uint256) { diff --git a/src/contracts/instances/PoolInstance.sol b/src/contracts/instances/PoolInstance.sol index 0414324d..c54c6e55 100644 --- a/src/contracts/instances/PoolInstance.sol +++ b/src/contracts/instances/PoolInstance.sol @@ -6,7 +6,7 @@ import {IPoolAddressesProvider} from '../interfaces/IPoolAddressesProvider.sol'; import {Errors} from '../protocol/libraries/helpers/Errors.sol'; contract PoolInstance is Pool { - uint256 public constant POOL_REVISION = 6; + uint256 public constant POOL_REVISION = 7; constructor(IPoolAddressesProvider provider) Pool(provider) {} diff --git a/src/contracts/interfaces/IPool.sol b/src/contracts/interfaces/IPool.sol index b1998193..d8277fa3 100644 --- a/src/contracts/interfaces/IPool.sol +++ b/src/contracts/interfaces/IPool.sol @@ -201,12 +201,12 @@ interface IPool { event MintedToTreasury(address indexed reserve, uint256 amountMinted); /** - * + * @dev Emitted when deficit is realized on a liquidation. * @param user The user address where the bad debt will be burned * @param debtAsset The address of the underlying borrowed asset to be burned - * @param amount The amount to burn + * @param amountCreated The amount of deficit created */ - event DeficitCreated(address indexed user, address indexed debtAsset, uint256 amount); + event DeficitCreated(address indexed user, address indexed debtAsset, uint256 amountCreated); /** * @notice Mints an `amount` of aTokens to the `onBehalfOf` @@ -804,7 +804,7 @@ interface IPool { function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; /** - * @notice It Covers the deficit of a specified reserve by burning: + * @notice It covers the deficit of a specified reserve by burning: * - the equivalent aToken `amount` for assets with virtual accounting enabled * - the equivalent `amount` of underlying for assets with virtual accounting disabled (e.g. GHO) * @dev The deficit of a reserve can occur due to situations where borrowed assets are not repaid, leading to bad debt. diff --git a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol index 183f6f1b..9809fca1 100644 --- a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -42,8 +42,8 @@ library LiquidationLogic { // See `IPool` for descriptions event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - event DeficitCreated(address indexed user, address indexed debtAsset, uint256 amount); - event DeficitCovered(address indexed reserve, address caller, uint256 amountDecreased); + event DeficitCreated(address indexed user, address indexed debtAsset, uint256 amountCreated); + event DeficitCovered(address indexed reserve, address caller, uint256 amountCovered); event LiquidationCall( address indexed collateralAsset, address indexed debtAsset, diff --git a/src/contracts/protocol/libraries/logic/ReserveLogic.sol b/src/contracts/protocol/libraries/logic/ReserveLogic.sol index 758f5c79..c86aeb0e 100644 --- a/src/contracts/protocol/libraries/logic/ReserveLogic.sol +++ b/src/contracts/protocol/libraries/logic/ReserveLogic.sol @@ -12,8 +12,6 @@ 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'; -import {IAToken} from '../../../interfaces/IAToken.sol'; -import {UserConfiguration} from '../configuration/UserConfiguration.sol'; /** * @title ReserveLogic library @@ -27,7 +25,6 @@ library ReserveLogic { using GPv2SafeERC20 for IERC20; using ReserveLogic for DataTypes.ReserveData; using ReserveConfiguration for DataTypes.ReserveConfigurationMap; - using UserConfiguration for DataTypes.UserConfigurationMap; // See `IPool` for descriptions event ReserveDataUpdated( @@ -39,8 +36,6 @@ library ReserveLogic { uint256 variableBorrowIndex ); - event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); - /** * @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 From 385287d9c095a096fcca43804d96bf199d40a7a5 Mon Sep 17 00:00:00 2001 From: Lukas Date: Wed, 11 Dec 2024 16:19:57 +0100 Subject: [PATCH 72/72] Apply suggestions from code review typo fixes Co-authored-by: miguelmtz <36620902+miguelmtzinf@users.noreply.github.com> --- src/contracts/interfaces/IPool.sol | 2 +- src/contracts/protocol/libraries/logic/LiquidationLogic.sol | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/contracts/interfaces/IPool.sol b/src/contracts/interfaces/IPool.sol index d8277fa3..12bc6460 100644 --- a/src/contracts/interfaces/IPool.sol +++ b/src/contracts/interfaces/IPool.sol @@ -808,7 +808,7 @@ interface IPool { * - the equivalent aToken `amount` for assets with virtual accounting enabled * - the equivalent `amount` of underlying for assets with virtual accounting disabled (e.g. GHO) * @dev The deficit of a reserve can occur due to situations where borrowed assets are not repaid, leading to bad debt. - * @param asset The address of the underlying asset to cover the dificit. + * @param asset The address of the underlying asset to cover the deficit. * @param amount The amount to be covered, in aToken or underlying on non-virtual accounted assets */ function eliminateReserveDeficit(address asset, uint256 amount) external; diff --git a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol index 9809fca1..569ca31c 100644 --- a/src/contracts/protocol/libraries/logic/LiquidationLogic.sol +++ b/src/contracts/protocol/libraries/logic/LiquidationLogic.sol @@ -152,7 +152,7 @@ library LiquidationLogic { IAToken(reserveCache.aTokenAddress).handleRepayment( msg.sender, // In the context of GHO it's only relevant that the address has no debt. - // Passing the pool is fitting as it's handeling the repayment on behalf of the protocol. + // Passing the pool is fitting as it's handling the repayment on behalf of the protocol. address(this), balanceWriteOff ); @@ -404,7 +404,7 @@ library LiquidationLogic { // burn bad debt if necessary // Each additional debt asset already adds around ~75k gas to the liquidation. - // To keep the liquidation gas under control, 0 usd collateral positions are not touched, as there is no immediate benefit in burning or transfering to treasury. + // To keep the liquidation gas under control, 0 usd collateral positions are not touched, as there is no immediate benefit in burning or transferring to treasury. if (hasNoCollateralLeft && userConfig.isBorrowingAny()) { _burnBadDebt(reservesData, reservesList, userConfig, params.reservesCount, params.user); }

nO*^gAWs27l1 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 z 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%0A~#jCq&r>~^wT$~&U|31t16WLuu8<_6mSzf%u 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 xS*9Cs_EJJM-LU?#w(> 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