diff --git a/diffs/AaveV3Arbitrum_OnboardEzETHToArbitrumAndBaseInstances_20241221_before_AaveV3Arbitrum_OnboardEzETHToArbitrumAndBaseInstances_20241221_after.md b/diffs/AaveV3Arbitrum_OnboardEzETHToArbitrumAndBaseInstances_20241221_before_AaveV3Arbitrum_OnboardEzETHToArbitrumAndBaseInstances_20241221_after.md new file mode 100644 index 000000000..ca012223a --- /dev/null +++ b/diffs/AaveV3Arbitrum_OnboardEzETHToArbitrumAndBaseInstances_20241221_before_AaveV3Arbitrum_OnboardEzETHToArbitrumAndBaseInstances_20241221_after.md @@ -0,0 +1,172 @@ +## Reserve changes + +### Reserves added + +#### ezETH ([0x2416092f143378750bb29b79eD961ab195CcEea5](https://arbiscan.io/address/0x2416092f143378750bb29b79eD961ab195CcEea5)) + +| description | value | +| --- | --- | +| decimals | 18 | +| isActive | true | +| isFrozen | false | +| supplyCap | 1,750 ezETH | +| borrowCap | 1 ezETH | +| debtCeiling | 0 $ [0] | +| isSiloed | false | +| isFlashloanable | true | +| oracle | [0x8Ed37B72300683c0482A595bfa80fFb793874b15](https://arbiscan.io/address/0x8Ed37B72300683c0482A595bfa80fFb793874b15) | +| oracleDecimals | 8 | +| oracleDescription | Capped ezETH / ETH / USD | +| oracleLatestAnswer | 3787.98660028 | +| usageAsCollateralEnabled | true | +| ltv | 0.05 % [5] | +| liquidationThreshold | 0.1 % [10] | +| liquidationBonus | 7.5 % | +| liquidationProtocolFee | 10 % [1000] | +| reserveFactor | 15 % [1500] | +| aToken | [0xEA1132120ddcDDA2F119e99Fa7A27a0d036F7Ac9](https://arbiscan.io/address/0xEA1132120ddcDDA2F119e99Fa7A27a0d036F7Ac9) | +| aTokenImpl | [0x1Be1798b70aEe431c2986f7ff48d9D1fa350786a](https://arbiscan.io/address/0x1Be1798b70aEe431c2986f7ff48d9D1fa350786a) | +| variableDebtToken | [0x1fFD28689DA7d0148ff0fCB669e9f9f0Fc13a219](https://arbiscan.io/address/0x1fFD28689DA7d0148ff0fCB669e9f9f0Fc13a219) | +| variableDebtTokenImpl | [0x5E76E98E0963EcDC6A065d1435F84065b7523f39](https://arbiscan.io/address/0x5E76E98E0963EcDC6A065d1435F84065b7523f39) | +| borrowingEnabled | false | +| isBorrowableInIsolation | false | +| interestRateStrategy | [0x429F16dBA3B9e1900087Cbaa7b50D38Bc60fB73F](https://arbiscan.io/address/0x429F16dBA3B9e1900087Cbaa7b50D38Bc60fB73F) | +| aTokenName | Aave Arbitrum ezETH | +| aTokenSymbol | aArbezETH | +| aTokenUnderlyingBalance | 0.03 ezETH [30000000000000000] | +| id | 17 | +| isPaused | false | +| variableDebtTokenName | Aave Arbitrum Variable Debt ezETH | +| variableDebtTokenSymbol | variableDebtArbezETH | +| virtualAccountingActive | true | +| virtualBalance | 0.03 ezETH [30000000000000000] | +| optimalUsageRatio | 45 % | +| maxVariableBorrowRate | 307 % | +| baseVariableBorrowRate | 0 % | +| variableRateSlope1 | 7 % | +| variableRateSlope2 | 300 % | +| interestRate | ![ir](https://dash.onaave.com/api/static?variableRateSlope1=70000000000000000000000000&variableRateSlope2=3000000000000000000000000000&optimalUsageRatio=450000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=3070000000000000000000000000) | + + +## Emodes changed + +### EMode: Stablecoins(id: 1) + + + +### EMode: ETH correlated(id: 2) + + + +### EMode: ezETH wstETH(id: 3) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label | - | ezETH wstETH | +| eMode.ltv | - | 93 % | +| eMode.liquidationThreshold | - | 95 % | +| eMode.liquidationBonus | - | 1 % | +| eMode.borrowableBitmap | - | wstETH | +| eMode.collateralBitmap | - | ezETH | + + +### EMode: ezETH Stablecoins(id: 4) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label | - | ezETH Stablecoins | +| eMode.ltv | - | 72 % | +| eMode.liquidationThreshold | - | 75 % | +| eMode.liquidationBonus | - | 7.5 % | +| eMode.borrowableBitmap | - | USDT, USDC | +| eMode.collateralBitmap | - | ezETH | + + +## Raw diff + +```json +{ + "eModes": { + "3": { + "from": null, + "to": { + "borrowableBitmap": "256", + "collateralBitmap": "131072", + "eModeCategory": 3, + "label": "ezETH wstETH", + "liquidationBonus": 10100, + "liquidationThreshold": 9500, + "ltv": 9300 + } + }, + "4": { + "from": null, + "to": { + "borrowableBitmap": "4128", + "collateralBitmap": "131072", + "eModeCategory": 4, + "label": "ezETH Stablecoins", + "liquidationBonus": 10750, + "liquidationThreshold": 7500, + "ltv": 7200 + } + } + }, + "reserves": { + "0x2416092f143378750bb29b79eD961ab195CcEea5": { + "from": null, + "to": { + "aToken": "0xEA1132120ddcDDA2F119e99Fa7A27a0d036F7Ac9", + "aTokenImpl": "0x1Be1798b70aEe431c2986f7ff48d9D1fa350786a", + "aTokenName": "Aave Arbitrum ezETH", + "aTokenSymbol": "aArbezETH", + "aTokenUnderlyingBalance": "30000000000000000", + "borrowCap": 1, + "borrowingEnabled": false, + "debtCeiling": 0, + "decimals": 18, + "id": 17, + "interestRateStrategy": "0x429F16dBA3B9e1900087Cbaa7b50D38Bc60fB73F", + "isActive": true, + "isBorrowableInIsolation": false, + "isFlashloanable": true, + "isFrozen": false, + "isPaused": false, + "isSiloed": false, + "liquidationBonus": 10750, + "liquidationProtocolFee": 1000, + "liquidationThreshold": 10, + "ltv": 5, + "oracle": "0x8Ed37B72300683c0482A595bfa80fFb793874b15", + "oracleDecimals": 8, + "oracleDescription": "Capped ezETH / ETH / USD", + "oracleLatestAnswer": "378798660028", + "reserveFactor": 1500, + "supplyCap": 1750, + "symbol": "ezETH", + "underlying": "0x2416092f143378750bb29b79eD961ab195CcEea5", + "usageAsCollateralEnabled": true, + "variableDebtToken": "0x1fFD28689DA7d0148ff0fCB669e9f9f0Fc13a219", + "variableDebtTokenImpl": "0x5E76E98E0963EcDC6A065d1435F84065b7523f39", + "variableDebtTokenName": "Aave Arbitrum Variable Debt ezETH", + "variableDebtTokenSymbol": "variableDebtArbezETH", + "virtualAccountingActive": true, + "virtualBalance": "30000000000000000" + } + } + }, + "strategies": { + "0x2416092f143378750bb29b79eD961ab195CcEea5": { + "from": null, + "to": { + "address": "0x429F16dBA3B9e1900087Cbaa7b50D38Bc60fB73F", + "baseVariableBorrowRate": "0", + "maxVariableBorrowRate": "3070000000000000000000000000", + "optimalUsageRatio": "450000000000000000000000000", + "variableRateSlope1": "70000000000000000000000000", + "variableRateSlope2": "3000000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Base_OnboardEzETHToArbitrumAndBaseInstances_20241221_before_AaveV3Base_OnboardEzETHToArbitrumAndBaseInstances_20241221_after.md b/diffs/AaveV3Base_OnboardEzETHToArbitrumAndBaseInstances_20241221_before_AaveV3Base_OnboardEzETHToArbitrumAndBaseInstances_20241221_after.md new file mode 100644 index 000000000..6513062b4 --- /dev/null +++ b/diffs/AaveV3Base_OnboardEzETHToArbitrumAndBaseInstances_20241221_before_AaveV3Base_OnboardEzETHToArbitrumAndBaseInstances_20241221_after.md @@ -0,0 +1,168 @@ +## Reserve changes + +### Reserves added + +#### ezETH ([0x2416092f143378750bb29b79eD961ab195CcEea5](https://basescan.org/address/0x2416092f143378750bb29b79eD961ab195CcEea5)) + +| description | value | +| --- | --- | +| decimals | 18 | +| isActive | true | +| isFrozen | false | +| supplyCap | 1,200 ezETH | +| borrowCap | 1 ezETH | +| debtCeiling | 0 $ [0] | +| isSiloed | false | +| isFlashloanable | true | +| oracle | [0x438e24f5FCDC1A66ecb25D19B5543e0Cb91A44D4](https://basescan.org/address/0x438e24f5FCDC1A66ecb25D19B5543e0Cb91A44D4) | +| oracleDecimals | 8 | +| oracleDescription | Capped ezETH / ETH / USD | +| oracleLatestAnswer | 3785.26748692 | +| usageAsCollateralEnabled | true | +| ltv | 0.05 % [5] | +| liquidationThreshold | 0.1 % [10] | +| liquidationBonus | 7.5 % | +| liquidationProtocolFee | 10 % [1000] | +| reserveFactor | 15 % [1500] | +| aToken | [0xDD5745756C2de109183c6B5bB886F9207bEF114D](https://basescan.org/address/0xDD5745756C2de109183c6B5bB886F9207bEF114D) | +| aTokenImpl | [0x98F409Fc4A42F34AE3c326c7f48ED01ae8cAeC69](https://basescan.org/address/0x98F409Fc4A42F34AE3c326c7f48ED01ae8cAeC69) | +| variableDebtToken | [0xbc4f5631f2843488792e4F1660d0A51Ba489bdBd](https://basescan.org/address/0xbc4f5631f2843488792e4F1660d0A51Ba489bdBd) | +| variableDebtTokenImpl | [0x2425A746911128c2eAA7bEBDc9Bc452eE52208a1](https://basescan.org/address/0x2425A746911128c2eAA7bEBDc9Bc452eE52208a1) | +| borrowingEnabled | false | +| isBorrowableInIsolation | false | +| interestRateStrategy | [0x86AB1C62A8bf868E1b3E1ab87d587Aba6fbCbDC5](https://basescan.org/address/0x86AB1C62A8bf868E1b3E1ab87d587Aba6fbCbDC5) | +| aTokenName | Aave Base ezETH | +| aTokenSymbol | aBasezETH | +| aTokenUnderlyingBalance | 0.03 ezETH [30000000000000000] | +| id | 7 | +| isPaused | false | +| variableDebtTokenName | Aave Base Variable Debt ezETH | +| variableDebtTokenSymbol | variableDebtBasezETH | +| virtualAccountingActive | true | +| virtualBalance | 0.03 ezETH [30000000000000000] | +| optimalUsageRatio | 45 % | +| maxVariableBorrowRate | 307 % | +| baseVariableBorrowRate | 0 % | +| variableRateSlope1 | 7 % | +| variableRateSlope2 | 300 % | +| interestRate | ![ir](https://dash.onaave.com/api/static?variableRateSlope1=70000000000000000000000000&variableRateSlope2=3000000000000000000000000000&optimalUsageRatio=450000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=3070000000000000000000000000) | + + +## Emodes changed + +### EMode: ETH correlated(id: 1) + + + +### EMode: ezETH wstETH(id: 2) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label | - | ezETH wstETH | +| eMode.ltv | - | 93 % | +| eMode.liquidationThreshold | - | 95 % | +| eMode.liquidationBonus | - | 1 % | +| eMode.borrowableBitmap | - | wstETH | +| eMode.collateralBitmap | - | ezETH | + + +### EMode: ezETH Stablecoins(id: 3) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label | - | ezETH Stablecoins | +| eMode.ltv | - | 72 % | +| eMode.liquidationThreshold | - | 75 % | +| eMode.liquidationBonus | - | 7.5 % | +| eMode.borrowableBitmap | - | USDC | +| eMode.collateralBitmap | - | ezETH | + + +## Raw diff + +```json +{ + "eModes": { + "2": { + "from": null, + "to": { + "borrowableBitmap": "8", + "collateralBitmap": "128", + "eModeCategory": 2, + "label": "ezETH wstETH", + "liquidationBonus": 10100, + "liquidationThreshold": 9500, + "ltv": 9300 + } + }, + "3": { + "from": null, + "to": { + "borrowableBitmap": "16", + "collateralBitmap": "128", + "eModeCategory": 3, + "label": "ezETH Stablecoins", + "liquidationBonus": 10750, + "liquidationThreshold": 7500, + "ltv": 7200 + } + } + }, + "reserves": { + "0x2416092f143378750bb29b79eD961ab195CcEea5": { + "from": null, + "to": { + "aToken": "0xDD5745756C2de109183c6B5bB886F9207bEF114D", + "aTokenImpl": "0x98F409Fc4A42F34AE3c326c7f48ED01ae8cAeC69", + "aTokenName": "Aave Base ezETH", + "aTokenSymbol": "aBasezETH", + "aTokenUnderlyingBalance": "30000000000000000", + "borrowCap": 1, + "borrowingEnabled": false, + "debtCeiling": 0, + "decimals": 18, + "id": 7, + "interestRateStrategy": "0x86AB1C62A8bf868E1b3E1ab87d587Aba6fbCbDC5", + "isActive": true, + "isBorrowableInIsolation": false, + "isFlashloanable": true, + "isFrozen": false, + "isPaused": false, + "isSiloed": false, + "liquidationBonus": 10750, + "liquidationProtocolFee": 1000, + "liquidationThreshold": 10, + "ltv": 5, + "oracle": "0x438e24f5FCDC1A66ecb25D19B5543e0Cb91A44D4", + "oracleDecimals": 8, + "oracleDescription": "Capped ezETH / ETH / USD", + "oracleLatestAnswer": "378526748692", + "reserveFactor": 1500, + "supplyCap": 1200, + "symbol": "ezETH", + "underlying": "0x2416092f143378750bb29b79eD961ab195CcEea5", + "usageAsCollateralEnabled": true, + "variableDebtToken": "0xbc4f5631f2843488792e4F1660d0A51Ba489bdBd", + "variableDebtTokenImpl": "0x2425A746911128c2eAA7bEBDc9Bc452eE52208a1", + "variableDebtTokenName": "Aave Base Variable Debt ezETH", + "variableDebtTokenSymbol": "variableDebtBasezETH", + "virtualAccountingActive": true, + "virtualBalance": "30000000000000000" + } + } + }, + "strategies": { + "0x2416092f143378750bb29b79eD961ab195CcEea5": { + "from": null, + "to": { + "address": "0x86AB1C62A8bf868E1b3E1ab87d587Aba6fbCbDC5", + "baseVariableBorrowRate": "0", + "maxVariableBorrowRate": "3070000000000000000000000000", + "optimalUsageRatio": "450000000000000000000000000", + "variableRateSlope1": "70000000000000000000000000", + "variableRateSlope2": "3000000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/AaveV3Arbitrum_OnboardEzETHToArbitrumAndBaseInstances_20241221.sol b/src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/AaveV3Arbitrum_OnboardEzETHToArbitrumAndBaseInstances_20241221.sol new file mode 100644 index 000000000..58feeff40 --- /dev/null +++ b/src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/AaveV3Arbitrum_OnboardEzETHToArbitrumAndBaseInstances_20241221.sol @@ -0,0 +1,133 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Arbitrum, AaveV3ArbitrumAssets, AaveV3ArbitrumEModes} from 'aave-address-book/AaveV3Arbitrum.sol'; +import {AaveV3PayloadArbitrum} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadArbitrum.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol'; +import {IEmissionManager} from 'aave-v3-origin/contracts/rewards/interfaces/IEmissionManager.sol'; +/** + * @title Onboard ezETH to Arbitrum and Base Instances + * @author Aave Chan Initiative + * - Snapshot: https://snapshot.box/#/s:aave.eth/proposal/0xf9fa710414237636cba11187111773fac04f74eb1a562d2b50fca86cb72a778e + * - Discussion: https://governance.aave.com/t/arfc-onboard-ezeth-to-arbitrum-and-base-instances/19622 + */ +contract AaveV3Arbitrum_OnboardEzETHToArbitrumAndBaseInstances_20241221 is AaveV3PayloadArbitrum { + using SafeERC20 for IERC20; + + address public constant ezETH = 0x2416092f143378750bb29b79eD961ab195CcEea5; + uint256 public constant ezETH_SEED_AMOUNT = 3e16; + address public constant ezETH_LM_ADMIN = 0xac140648435d03f784879cd789130F22Ef588Fcd; + + function _postExecute() internal override { + IERC20(ezETH).forceApprove(address(AaveV3Arbitrum.POOL), ezETH_SEED_AMOUNT); + AaveV3Arbitrum.POOL.supply(ezETH, ezETH_SEED_AMOUNT, address(AaveV3Arbitrum.COLLECTOR), 0); + + (address aezETH, , ) = AaveV3Arbitrum.AAVE_PROTOCOL_DATA_PROVIDER.getReserveTokensAddresses( + ezETH + ); + IEmissionManager(AaveV3Arbitrum.EMISSION_MANAGER).setEmissionAdmin(ezETH, ezETH_LM_ADMIN); + IEmissionManager(AaveV3Arbitrum.EMISSION_MANAGER).setEmissionAdmin(aezETH, ezETH_LM_ADMIN); + } + + function eModeCategoriesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.EModeCategoryUpdate[] memory) + { + IAaveV3ConfigEngine.EModeCategoryUpdate[] + memory eModeUpdates = new IAaveV3ConfigEngine.EModeCategoryUpdate[](2); + + eModeUpdates[0] = IAaveV3ConfigEngine.EModeCategoryUpdate({ + eModeCategory: 3, + ltv: 93_00, + liqThreshold: 95_00, + liqBonus: 1_00, + label: 'ezETH wstETH' + }); + + eModeUpdates[1] = IAaveV3ConfigEngine.EModeCategoryUpdate({ + eModeCategory: 4, + ltv: 72_00, + liqThreshold: 75_00, + liqBonus: 7_50, + label: 'ezETH Stablecoins' + }); + + return eModeUpdates; + } + function assetsEModeUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.AssetEModeUpdate[] memory) + { + IAaveV3ConfigEngine.AssetEModeUpdate[] + memory assetEModeUpdates = new IAaveV3ConfigEngine.AssetEModeUpdate[](5); + + assetEModeUpdates[0] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: ezETH, + eModeCategory: 3, + borrowable: EngineFlags.DISABLED, + collateral: EngineFlags.ENABLED + }); + assetEModeUpdates[1] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: ezETH, + eModeCategory: 4, + borrowable: EngineFlags.DISABLED, + collateral: EngineFlags.ENABLED + }); + assetEModeUpdates[2] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3ArbitrumAssets.wstETH_UNDERLYING, + eModeCategory: 3, + borrowable: EngineFlags.ENABLED, + collateral: EngineFlags.DISABLED + }); + assetEModeUpdates[3] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3ArbitrumAssets.USDT_UNDERLYING, + eModeCategory: 4, + borrowable: EngineFlags.ENABLED, + collateral: EngineFlags.DISABLED + }); + assetEModeUpdates[4] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3ArbitrumAssets.USDCn_UNDERLYING, + eModeCategory: 4, + borrowable: EngineFlags.ENABLED, + collateral: EngineFlags.DISABLED + }); + + return assetEModeUpdates; + } + function newListings() public pure override returns (IAaveV3ConfigEngine.Listing[] memory) { + IAaveV3ConfigEngine.Listing[] memory listings = new IAaveV3ConfigEngine.Listing[](1); + + listings[0] = IAaveV3ConfigEngine.Listing({ + asset: ezETH, + assetSymbol: 'ezETH', + priceFeed: 0x8Ed37B72300683c0482A595bfa80fFb793874b15, + enabledToBorrow: EngineFlags.DISABLED, + borrowableInIsolation: EngineFlags.DISABLED, + withSiloedBorrowing: EngineFlags.DISABLED, + flashloanable: EngineFlags.ENABLED, + ltv: 5, + liqThreshold: 10, + liqBonus: 7_50, + reserveFactor: 15_00, + supplyCap: 1_750, + borrowCap: 1, + debtCeiling: 0, + liqProtocolFee: 10_00, + rateStrategyParams: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: 45_00, + baseVariableBorrowRate: 0, + variableRateSlope1: 7_00, + variableRateSlope2: 300_00 + }) + }); + + return listings; + } +} diff --git a/src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/AaveV3Arbitrum_OnboardEzETHToArbitrumAndBaseInstances_20241221.t.sol b/src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/AaveV3Arbitrum_OnboardEzETHToArbitrumAndBaseInstances_20241221.t.sol new file mode 100644 index 000000000..366e59e33 --- /dev/null +++ b/src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/AaveV3Arbitrum_OnboardEzETHToArbitrumAndBaseInstances_20241221.t.sol @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3Arbitrum} from 'aave-address-book/AaveV3Arbitrum.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {IEmissionManager} from 'aave-v3-origin/contracts/rewards/interfaces/IEmissionManager.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Arbitrum_OnboardEzETHToArbitrumAndBaseInstances_20241221} from './AaveV3Arbitrum_OnboardEzETHToArbitrumAndBaseInstances_20241221.sol'; + +/** + * @dev Test for AaveV3Arbitrum_OnboardEzETHToArbitrumAndBaseInstances_20241221 + * command: FOUNDRY_PROFILE=arbitrum forge test --match-path=src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/AaveV3Arbitrum_OnboardEzETHToArbitrumAndBaseInstances_20241221.t.sol -vv + */ +contract AaveV3Arbitrum_OnboardEzETHToArbitrumAndBaseInstances_20241221_Test is ProtocolV3TestBase { + AaveV3Arbitrum_OnboardEzETHToArbitrumAndBaseInstances_20241221 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('arbitrum'), 292661143); + proposal = new AaveV3Arbitrum_OnboardEzETHToArbitrumAndBaseInstances_20241221(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Arbitrum_OnboardEzETHToArbitrumAndBaseInstances_20241221', + AaveV3Arbitrum.POOL, + address(proposal) + ); + } + + function test_collectorHasezETHFunds() public { + GovV3Helpers.executePayload(vm, address(proposal)); + (address aTokenAddress, , ) = AaveV3Arbitrum + .AAVE_PROTOCOL_DATA_PROVIDER + .getReserveTokensAddresses(proposal.ezETH()); + assertGe(IERC20(aTokenAddress).balanceOf(address(AaveV3Arbitrum.COLLECTOR)), 3 * 10 ** 16); + } + + function test_ezETHAdmin() public { + GovV3Helpers.executePayload(vm, address(proposal)); + (address aezETH, , ) = AaveV3Arbitrum.AAVE_PROTOCOL_DATA_PROVIDER.getReserveTokensAddresses( + proposal.ezETH() + ); + assertEq( + IEmissionManager(AaveV3Arbitrum.EMISSION_MANAGER).getEmissionAdmin(proposal.ezETH()), + proposal.ezETH_LM_ADMIN() + ); + assertEq( + IEmissionManager(AaveV3Arbitrum.EMISSION_MANAGER).getEmissionAdmin(aezETH), + proposal.ezETH_LM_ADMIN() + ); + } +} diff --git a/src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/AaveV3Base_OnboardEzETHToArbitrumAndBaseInstances_20241221.sol b/src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/AaveV3Base_OnboardEzETHToArbitrumAndBaseInstances_20241221.sol new file mode 100644 index 000000000..faf7314db --- /dev/null +++ b/src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/AaveV3Base_OnboardEzETHToArbitrumAndBaseInstances_20241221.sol @@ -0,0 +1,125 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Base, AaveV3BaseAssets, AaveV3BaseEModes} from 'aave-address-book/AaveV3Base.sol'; +import {AaveV3PayloadBase} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadBase.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol'; +import {IEmissionManager} from 'aave-v3-origin/contracts/rewards/interfaces/IEmissionManager.sol'; +/** + * @title Onboard ezETH to Arbitrum and Base Instances + * @author Aave Chan Initiative + * - Snapshot: https://snapshot.box/#/s:aave.eth/proposal/0xf9fa710414237636cba11187111773fac04f74eb1a562d2b50fca86cb72a778e + * - Discussion: https://governance.aave.com/t/arfc-onboard-ezeth-to-arbitrum-and-base-instances/19622 + */ +contract AaveV3Base_OnboardEzETHToArbitrumAndBaseInstances_20241221 is AaveV3PayloadBase { + using SafeERC20 for IERC20; + + address public constant ezETH = 0x2416092f143378750bb29b79eD961ab195CcEea5; + uint256 public constant ezETH_SEED_AMOUNT = 3e16; + address public constant ezETH_LM_ADMIN = 0xac140648435d03f784879cd789130F22Ef588Fcd; + + function _postExecute() internal override { + IERC20(ezETH).forceApprove(address(AaveV3Base.POOL), ezETH_SEED_AMOUNT); + AaveV3Base.POOL.supply(ezETH, ezETH_SEED_AMOUNT, address(AaveV3Base.COLLECTOR), 0); + + (address aezETH, , ) = AaveV3Base.AAVE_PROTOCOL_DATA_PROVIDER.getReserveTokensAddresses(ezETH); + IEmissionManager(AaveV3Base.EMISSION_MANAGER).setEmissionAdmin(ezETH, ezETH_LM_ADMIN); + IEmissionManager(AaveV3Base.EMISSION_MANAGER).setEmissionAdmin(aezETH, ezETH_LM_ADMIN); + } + + function eModeCategoriesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.EModeCategoryUpdate[] memory) + { + IAaveV3ConfigEngine.EModeCategoryUpdate[] + memory eModeUpdates = new IAaveV3ConfigEngine.EModeCategoryUpdate[](2); + + eModeUpdates[0] = IAaveV3ConfigEngine.EModeCategoryUpdate({ + eModeCategory: 2, + ltv: 93_00, + liqThreshold: 95_00, + liqBonus: 1_00, + label: 'ezETH wstETH' + }); + + eModeUpdates[1] = IAaveV3ConfigEngine.EModeCategoryUpdate({ + eModeCategory: 3, + ltv: 72_00, + liqThreshold: 75_00, + liqBonus: 7_50, + label: 'ezETH Stablecoins' + }); + + return eModeUpdates; + } + function assetsEModeUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.AssetEModeUpdate[] memory) + { + IAaveV3ConfigEngine.AssetEModeUpdate[] + memory assetEModeUpdates = new IAaveV3ConfigEngine.AssetEModeUpdate[](4); + + assetEModeUpdates[0] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3BaseAssets.wstETH_UNDERLYING, + eModeCategory: 2, + borrowable: EngineFlags.ENABLED, + collateral: EngineFlags.DISABLED + }); + assetEModeUpdates[1] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: ezETH, + eModeCategory: 3, + borrowable: EngineFlags.DISABLED, + collateral: EngineFlags.ENABLED + }); + assetEModeUpdates[2] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: ezETH, + eModeCategory: 2, + borrowable: EngineFlags.DISABLED, + collateral: EngineFlags.ENABLED + }); + assetEModeUpdates[3] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3BaseAssets.USDC_UNDERLYING, + eModeCategory: 3, + borrowable: EngineFlags.ENABLED, + collateral: EngineFlags.DISABLED + }); + + return assetEModeUpdates; + } + function newListings() public pure override returns (IAaveV3ConfigEngine.Listing[] memory) { + IAaveV3ConfigEngine.Listing[] memory listings = new IAaveV3ConfigEngine.Listing[](1); + + listings[0] = IAaveV3ConfigEngine.Listing({ + asset: ezETH, + assetSymbol: 'ezETH', + priceFeed: 0x438e24f5FCDC1A66ecb25D19B5543e0Cb91A44D4, + enabledToBorrow: EngineFlags.DISABLED, + borrowableInIsolation: EngineFlags.DISABLED, + withSiloedBorrowing: EngineFlags.DISABLED, + flashloanable: EngineFlags.ENABLED, + ltv: 5, + liqThreshold: 10, + liqBonus: 7_50, + reserveFactor: 15_00, + supplyCap: 1_200, + borrowCap: 1, + debtCeiling: 0, + liqProtocolFee: 10_00, + rateStrategyParams: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: 45_00, + baseVariableBorrowRate: 0, + variableRateSlope1: 7_00, + variableRateSlope2: 300_00 + }) + }); + + return listings; + } +} diff --git a/src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/AaveV3Base_OnboardEzETHToArbitrumAndBaseInstances_20241221.t.sol b/src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/AaveV3Base_OnboardEzETHToArbitrumAndBaseInstances_20241221.t.sol new file mode 100644 index 000000000..3dd1ef5a8 --- /dev/null +++ b/src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/AaveV3Base_OnboardEzETHToArbitrumAndBaseInstances_20241221.t.sol @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3Base} from 'aave-address-book/AaveV3Base.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {IEmissionManager} from 'aave-v3-origin/contracts/rewards/interfaces/IEmissionManager.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Base_OnboardEzETHToArbitrumAndBaseInstances_20241221} from './AaveV3Base_OnboardEzETHToArbitrumAndBaseInstances_20241221.sol'; + +/** + * @dev Test for AaveV3Base_OnboardEzETHToArbitrumAndBaseInstances_20241221 + * command: FOUNDRY_PROFILE=base forge test --match-path=src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/AaveV3Base_OnboardEzETHToArbitrumAndBaseInstances_20241221.t.sol -vv + */ +contract AaveV3Base_OnboardEzETHToArbitrumAndBaseInstances_20241221_Test is ProtocolV3TestBase { + AaveV3Base_OnboardEzETHToArbitrumAndBaseInstances_20241221 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('base'), 24698319); + proposal = new AaveV3Base_OnboardEzETHToArbitrumAndBaseInstances_20241221(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Base_OnboardEzETHToArbitrumAndBaseInstances_20241221', + AaveV3Base.POOL, + address(proposal) + ); + } + + function test_collectorHasezETHFunds() public { + GovV3Helpers.executePayload(vm, address(proposal)); + (address aTokenAddress, , ) = AaveV3Base.AAVE_PROTOCOL_DATA_PROVIDER.getReserveTokensAddresses( + proposal.ezETH() + ); + assertGe(IERC20(aTokenAddress).balanceOf(address(AaveV3Base.COLLECTOR)), 3 * 10 ** 16); + } + + function test_ezETHAdmin() public { + GovV3Helpers.executePayload(vm, address(proposal)); + (address aezETH, , ) = AaveV3Base.AAVE_PROTOCOL_DATA_PROVIDER.getReserveTokensAddresses( + proposal.ezETH() + ); + assertEq( + IEmissionManager(AaveV3Base.EMISSION_MANAGER).getEmissionAdmin(proposal.ezETH()), + proposal.ezETH_LM_ADMIN() + ); + assertEq( + IEmissionManager(AaveV3Base.EMISSION_MANAGER).getEmissionAdmin(aezETH), + proposal.ezETH_LM_ADMIN() + ); + } +} diff --git a/src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/OnboardEzETHToArbitrumAndBaseInstances.md b/src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/OnboardEzETHToArbitrumAndBaseInstances.md new file mode 100644 index 000000000..3104bca06 --- /dev/null +++ b/src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/OnboardEzETHToArbitrumAndBaseInstances.md @@ -0,0 +1,87 @@ +--- +title: "Onboard ezETH to Arbitrum and Base Instances" +author: "Aave Chan Initiative" +discussions: "https://governance.aave.com/t/arfc-onboard-ezeth-to-arbitrum-and-base-instances/19622" +snapshot: "https://snapshot.box/#/s:aave.eth/proposal/0xf9fa710414237636cba11187111773fac04f74eb1a562d2b50fca86cb72a778e" +--- + +## Simple Summary + +This is an AIP for adding borrow/lend support for Renzo Protocol and its Liquid Restaking Token (LRT) ezETH on AAVE V3 Base and Arbitrum. + +## Motivation + +As productive assets, staking tokens are high quality collateral to borrow against. ezETH is one of the largest liquid restaking tokens. With strong demand for ezETH on mainnet this proposal seeks to provide the opportunity for Aave users to make use of ezETH on leading Layer 2 networks: Base and Arbitrum. + +The onboarding of ezETH on these L2s will create increased ezETH demand and increased revenues for both Aave and Renzo Protocol, whilst also bolstering the liquidity and peg stability of ezETH. + +## Specification + +The table below illustrates the configured risk parameters for **ezETH** on Arbitrum and Base instances + +| Parameter | Value | +| --------------------------- | -----------------------------------------: | +| Isolation Mode | false | +| Borrowable | DISABLED | +| Collateral Enabled | true | +| Supply Cap (ezETH) Arbitrum | 1,750 | +| Supply Cap (ezETH) Base | 1,200 | +| Borrow Cap (ezETH) | 1 | +| Debt Ceiling | USD 0 | +| LTV | 0.05 % | +| LT | 0.10 % | +| Liquidation Bonus | 7.5 % | +| Liquidation Protocol Fee | 10 % | +| Reserve Factor | 15 % | +| Base Variable Borrow Rate | 0 % | +| Variable Slope 1 | 7 % | +| Variable Slope 2 | 300 % | +| Uoptimal | 45 % | +| Flashloanable | ENABLED | +| Siloed Borrowing | DISABLED | +| Borrowable in Isolation | DISABLED | +| Oracle (Arbitrum) | 0x8Ed37B72300683c0482A595bfa80fFb793874b15 | +| Oracle (Base) | 0x438e24f5FCDC1A66ecb25D19B5543e0Cb91A44D4 | + +The following CAPO and E-Mode parameters are applied to both instances + +### CAPO + +| **maxYearlyRatioGrowthPercent** | **ratioReferenceTime** | **MINIMUM_SNAPSHOT_DELAY** | +| ------------------------------- | ---------------------- | -------------------------- | +| 10.89% | monthly | 14 days | + +### E-mode: ezETH / wstETH + +| Parameter | Value | Value | +| --------------------- | ----- | ------ | +| Asset | ezETH | wstETH | +| Collateral | Yes | No | +| Borrowable | No | Yes | +| Max LTV | 93% | 93% | +| Liquidation Threshold | 95% | 95% | +| Liquidation Penalty | 1.00% | 1.00% | + +### E-mode: ezETH / stablecoin + +| Parameter | Value | Value | Value (only on Arbitrum) | +| --------------------- | ----- | ----- | ------------------------ | +| Asset | ezETH | USDC | USDT | +| Collateral | Yes | No | No | +| Borrowable | No | Yes | Yes | +| Max LTV | 72% | 72% | 72% | +| Liquidation Threshold | 75% | 75% | 75% | +| Liquidation Penalty | 7.50% | 7.50% | 7.50% | + +Additionaly [0xac140648435d03f784879cd789130F22Ef588Fcd](https://debank.com/profile/0xac140648435d03f784879cd789130F22Ef588Fcd) has been set as the emission admin for ezETH and the corresponding aToken on both instances. + +## References + +- Implementation: [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/AaveV3Arbitrum_OnboardEzETHToArbitrumAndBaseInstances_20241221.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/AaveV3Base_OnboardEzETHToArbitrumAndBaseInstances_20241221.sol) +- Tests: [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/AaveV3Arbitrum_OnboardEzETHToArbitrumAndBaseInstances_20241221.t.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/AaveV3Base_OnboardEzETHToArbitrumAndBaseInstances_20241221.t.sol) +- [Snapshot](https://snapshot.box/#/s:aave.eth/proposal/0xf9fa710414237636cba11187111773fac04f74eb1a562d2b50fca86cb72a778e) +- [Discussion](https://governance.aave.com/t/arfc-onboard-ezeth-to-arbitrum-and-base-instances/19622) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/OnboardEzETHToArbitrumAndBaseInstances_20241221.s.sol b/src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/OnboardEzETHToArbitrumAndBaseInstances_20241221.s.sol new file mode 100644 index 000000000..eca2931a7 --- /dev/null +++ b/src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/OnboardEzETHToArbitrumAndBaseInstances_20241221.s.sol @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript, ArbitrumScript, BaseScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Arbitrum_OnboardEzETHToArbitrumAndBaseInstances_20241221} from './AaveV3Arbitrum_OnboardEzETHToArbitrumAndBaseInstances_20241221.sol'; +import {AaveV3Base_OnboardEzETHToArbitrumAndBaseInstances_20241221} from './AaveV3Base_OnboardEzETHToArbitrumAndBaseInstances_20241221.sol'; + +/** + * @dev Deploy Arbitrum + * deploy-command: make deploy-ledger contract=src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/OnboardEzETHToArbitrumAndBaseInstances_20241221.s.sol:DeployArbitrum chain=arbitrum + * verify-command: FOUNDRY_PROFILE=arbitrum npx catapulta-verify -b broadcast/OnboardEzETHToArbitrumAndBaseInstances_20241221.s.sol/42161/run-latest.json + */ +contract DeployArbitrum is ArbitrumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Arbitrum_OnboardEzETHToArbitrumAndBaseInstances_20241221).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Base + * deploy-command: make deploy-ledger contract=src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/OnboardEzETHToArbitrumAndBaseInstances_20241221.s.sol:DeployBase chain=base + * verify-command: FOUNDRY_PROFILE=base npx catapulta-verify -b broadcast/OnboardEzETHToArbitrumAndBaseInstances_20241221.s.sol/8453/run-latest.json + */ +contract DeployBase is BaseScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Base_OnboardEzETHToArbitrumAndBaseInstances_20241221).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Create Proposal + * command: make deploy-ledger contract=src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/OnboardEzETHToArbitrumAndBaseInstances_20241221.s.sol:CreateProposal chain=mainnet + */ +contract CreateProposal is EthereumScript { + function run() external { + // create payloads + PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](2); + + // compose actions for validation + IPayloadsControllerCore.ExecutionAction[] + memory actionsArbitrum = new IPayloadsControllerCore.ExecutionAction[](1); + actionsArbitrum[0] = GovV3Helpers.buildAction( + type(AaveV3Arbitrum_OnboardEzETHToArbitrumAndBaseInstances_20241221).creationCode + ); + payloads[0] = GovV3Helpers.buildArbitrumPayload(vm, actionsArbitrum); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsBase = new IPayloadsControllerCore.ExecutionAction[](1); + actionsBase[0] = GovV3Helpers.buildAction( + type(AaveV3Base_OnboardEzETHToArbitrumAndBaseInstances_20241221).creationCode + ); + payloads[1] = GovV3Helpers.buildBasePayload(vm, actionsBase); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/OnboardEzETHToArbitrumAndBaseInstances.md' + ) + ); + } +} diff --git a/src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/config.ts b/src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/config.ts new file mode 100644 index 000000000..854abd168 --- /dev/null +++ b/src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/config.ts @@ -0,0 +1,108 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + configFile: 'src/20241221_Multi_OnboardEzETHToArbitrumAndBaseInstances/config.ts', + author: 'Aave Chan Initiative', + pools: ['AaveV3Arbitrum', 'AaveV3Base'], + title: 'Onboard ezETH to Arbitrum and Base Instances', + shortName: 'OnboardEzETHToArbitrumAndBaseInstances', + date: '20241221', + discussion: + 'https://governance.aave.com/t/arfc-onboard-ezeth-to-arbitrum-and-base-instances/19622', + snapshot: + 'https://snapshot.box/#/s:aave.eth/proposal/0xf9fa710414237636cba11187111773fac04f74eb1a562d2b50fca86cb72a778e', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Arbitrum: { + configs: { + EMODES_UPDATES: [ + {eModeCategory: 3, ltv: '93', liqThreshold: '95', liqBonus: '1', label: 'ezETH / wstETH'}, + ], + EMODES_ASSETS: [ + {asset: 'ezETH', eModeCategory: '3', collateral: 'ENABLED', borrowable: 'DISABLED'}, + { + asset: 'ezETH', + eModeCategory: 'AaveV3ArbitrumEModes.ETH_CORRELATED', + collateral: 'ENABLED', + borrowable: 'DISABLED', + }, + {asset: 'wstETH', eModeCategory: '3', collateral: 'DISABLED', borrowable: 'ENABLED'}, + ], + ASSET_LISTING: [ + { + assetSymbol: 'ezETH', + decimals: 18, + priceFeed: '0x8Ed37B72300683c0482A595bfa80fFb793874b15', + ltv: '72', + liqThreshold: '75', + liqBonus: '7.5', + debtCeiling: '0', + liqProtocolFee: '10', + enabledToBorrow: 'ENABLED', + flashloanable: 'ENABLED', + borrowableInIsolation: 'DISABLED', + withSiloedBorrowing: 'DISABLED', + reserveFactor: '15', + supplyCap: '1750', + borrowCap: '175', + rateStrategyParams: { + optimalUtilizationRate: '45', + baseVariableBorrowRate: '0', + variableRateSlope1: '7', + variableRateSlope2: '300', + }, + asset: '0x2416092f143378750bb29b79eD961ab195CcEea5', + admin: '0xac140648435d03f784879cd789130F22Ef588Fcd', + }, + ], + }, + cache: {blockNumber: 287111756}, + }, + AaveV3Base: { + configs: { + EMODES_UPDATES: [ + {eModeCategory: 2, ltv: '93', liqThreshold: '95', liqBonus: '1', label: 'ezETH / wstETH'}, + ], + EMODES_ASSETS: [ + {asset: 'wstETH', eModeCategory: '2', collateral: 'DISABLED', borrowable: 'ENABLED'}, + { + asset: 'ezETH', + eModeCategory: 'AaveV3BaseEModes.ETH_CORRELATED', + collateral: 'ENABLED', + borrowable: 'DISABLED', + }, + {asset: 'ezETH', eModeCategory: '2', collateral: 'ENABLED', borrowable: 'DISABLED'}, + ], + ASSET_LISTING: [ + { + assetSymbol: 'ezETH', + decimals: 18, + priceFeed: '0x438e24f5FCDC1A66ecb25D19B5543e0Cb91A44D4', + ltv: '72', + liqThreshold: '75', + liqBonus: '7.5', + debtCeiling: '0', + liqProtocolFee: '10', + enabledToBorrow: 'ENABLED', + flashloanable: 'ENABLED', + borrowableInIsolation: 'DISABLED', + withSiloedBorrowing: 'DISABLED', + reserveFactor: '15', + supplyCap: '1200', + borrowCap: '120', + rateStrategyParams: { + optimalUtilizationRate: '45', + baseVariableBorrowRate: '0', + variableRateSlope1: '7', + variableRateSlope2: '300', + }, + asset: '0x2416092f143378750bb29b79ed961ab195cceea5', + admin: '0xac140648435d03f784879cd789130F22Ef588Fcd', + }, + ], + }, + cache: {blockNumber: 24002429}, + }, + }, +};