From 5ad1d7f8b6810d084d6c09cafbf03083dd9fb17f Mon Sep 17 00:00:00 2001 From: MartinGbz Date: Wed, 13 Nov 2024 16:17:14 +0700 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Onboard=20sUSDe=20on=20Lido=20insta?= =?UTF-8?q?nce=20and=20Enable=20sUSDe=20E-mode=20on=20Mainnet=20and=20Lido?= =?UTF-8?q?=20instances=20(#522)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🎉 first generation * 🐛 fix emode configurations * ♻️ change emode name * ✨ update md file * 🐛 fix compilation errors * ✅ ran AaveV3Ethereum Tests * 🔧 update seed amount * fix: RF & UOpt can't be 0 * fix: forum link Co-authored-by: Harsh Pandey * fix: forum link Co-authored-by: Harsh Pandey * fix: forum link Co-authored-by: Harsh Pandey * fix: forum link Co-authored-by: Harsh Pandey * fix: emode label Co-authored-by: Harsh Pandey * fix: emode label Co-authored-by: Harsh Pandey * fix: update reserve factor with generic value Co-authored-by: Harsh Pandey * fix: snapshot link Co-authored-by: Harsh Pandey * fix: summary Co-authored-by: Harsh Pandey * fix: motivation Co-authored-by: Harsh Pandey * ♻️ fix emode label on Mainnet pool contract * ♻️ set borrow cap of 1000 * ♻️ set generic params on rates * 🐛 update diff file 1 * ✅ add new test * fix: space issue in md file Co-authored-by: Ian Flexa <85500650+ianflexa@users.noreply.github.com> * ✨ remove sUSDe from isolation * 🐛 add collateral update debt ceiling to 0 * fix: remove borrow update * ✅ tests passed * 🐛 fix emode category from 2 to 4 * ✅ update diff * 🐛 match specs with payload * fix: borrow rate in md Co-authored-by: Harsh Pandey * fix: slop 1 in md Co-authored-by: Harsh Pandey * fix: slope 2 in md Co-authored-by: Harsh Pandey * 🎨 lint md --------- Co-authored-by: Rozengarden Co-authored-by: Harsh Pandey Co-authored-by: Ian Flexa <85500650+ianflexa@users.noreply.github.com> --- ...3MainnetAndLidoInstances_20241108_after.md | 152 ++++++++++++++++++ ...3MainnetAndLidoInstances_20241108_after.md | 57 +++++++ ...AaveV3MainnetAndLidoInstances_20241108.sol | 120 ++++++++++++++ ...veV3MainnetAndLidoInstances_20241108.t.sol | 64 ++++++++ ...AaveV3MainnetAndLidoInstances_20241108.sol | 86 ++++++++++ ...veV3MainnetAndLidoInstances_20241108.t.sol | 35 ++++ ...uidEModeOnAaveV3MainnetAndLidoInstances.md | 72 +++++++++ ...veV3MainnetAndLidoInstances_20241108.s.sol | 74 +++++++++ .../config.ts | 109 +++++++++++++ 9 files changed, 769 insertions(+) create mode 100644 diffs/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_before_AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_after.md create mode 100644 diffs/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_before_AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_after.md create mode 100644 src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol create mode 100644 src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol create mode 100644 src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol create mode 100644 src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol create mode 100644 src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances.md create mode 100644 src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.s.sol create mode 100644 src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/config.ts diff --git a/diffs/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_before_AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_after.md b/diffs/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_before_AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_after.md new file mode 100644 index 000000000..5979e8c64 --- /dev/null +++ b/diffs/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_before_AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_after.md @@ -0,0 +1,152 @@ +## Reserve changes + +### Reserves added + +#### sUSDe ([0x9D39A5DE30e57443BfF2A8307A4256c8797A3497](https://etherscan.io/address/0x9D39A5DE30e57443BfF2A8307A4256c8797A3497)) + +| description | value | +| --- | --- | +| decimals | 18 | +| isActive | true | +| isFrozen | false | +| supplyCap | 20,000,000 sUSDe | +| borrowCap | 1,000 sUSDe | +| debtCeiling | 0 $ [0] | +| isSiloed | false | +| isFlashloanable | true | +| oracle | [0xb37aE8aBa6C0C1Bf2c509fc06E11aa4AF29B665A](https://etherscan.io/address/0xb37aE8aBa6C0C1Bf2c509fc06E11aa4AF29B665A) | +| oracleDecimals | 8 | +| oracleDescription | Capped sUSDe / USDe / USD | +| oracleLatestAnswer | 1.11869905 | +| usageAsCollateralEnabled | true | +| ltv | 0.05 % [5] | +| liquidationThreshold | 0.1 % [10] | +| liquidationBonus | 7.5 % | +| liquidationProtocolFee | 10 % [1000] | +| reserveFactor | 10 % [1000] | +| aToken | [0xc2015641564a5914A17CB9A92eC8d8feCfa8f2D0](https://etherscan.io/address/0xc2015641564a5914A17CB9A92eC8d8feCfa8f2D0) | +| aTokenImpl | [0x7F8Fc14D462bdF93c681c1f2Fd615389bF969Fb2](https://etherscan.io/address/0x7F8Fc14D462bdF93c681c1f2Fd615389bF969Fb2) | +| variableDebtToken | [0x2ABbAab3EF4e4A899d39e7EC996b5715E76b399a](https://etherscan.io/address/0x2ABbAab3EF4e4A899d39e7EC996b5715E76b399a) | +| variableDebtTokenImpl | [0x3E59212c34588a63350142EFad594a20C88C2CEd](https://etherscan.io/address/0x3E59212c34588a63350142EFad594a20C88C2CEd) | +| borrowingEnabled | false | +| isBorrowableInIsolation | false | +| interestRateStrategy | [0x8958b1C39269167527821f8c276Ef7504883f2fa](https://etherscan.io/address/0x8958b1C39269167527821f8c276Ef7504883f2fa) | +| aTokenName | Aave Ethereum Lido sUSDe | +| aTokenSymbol | aEthLidosUSDe | +| aTokenUnderlyingBalance | 100 sUSDe [100000000000000000000] | +| id | 5 | +| isPaused | false | +| variableDebtTokenName | Aave Ethereum Lido Variable Debt sUSDe | +| variableDebtTokenSymbol | variableDebtEthLidosUSDe | +| virtualAccountingActive | true | +| virtualBalance | 100 sUSDe [100000000000000000000] | +| optimalUsageRatio | 1 % | +| maxVariableBorrowRate | 3.15 % | +| baseVariableBorrowRate | 0.05 % | +| variableRateSlope1 | 0.1 % | +| variableRateSlope2 | 3 % | +| interestRate | ![ir](https://dash.onaave.com/api/static?variableRateSlope1=1000000000000000000000000&variableRateSlope2=30000000000000000000000000&optimalUsageRatio=10000000000000000000000000&baseVariableBorrowRate=500000000000000000000000&maxVariableBorrowRate=31500000000000000000000000) | + + +## Emodes changed + +### EMode: ETH correlated(id: 1) + + + +### EMode: LRT Stablecoins main(id: 2) + + + +### EMode: LRT wstETH main(id: 3) + + + +### EMode: sUSDe Stablecoins(id: 4) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label | - | sUSDe Stablecoins | +| eMode.ltv | - | 90 % | +| eMode.liquidationThreshold | - | 92 % | +| eMode.liquidationBonus | - | 3 % | +| eMode.borrowableBitmap | - | USDS, USDC | +| eMode.collateralBitmap | - | sUSDe | + + +## Raw diff + +```json +{ + "eModes": { + "4": { + "from": null, + "to": { + "borrowableBitmap": 12, + "collateralBitmap": 32, + "eModeCategory": 4, + "label": "sUSDe Stablecoins", + "liquidationBonus": 10300, + "liquidationThreshold": 9200, + "ltv": 9000 + } + } + }, + "reserves": { + "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497": { + "from": null, + "to": { + "aToken": "0xc2015641564a5914A17CB9A92eC8d8feCfa8f2D0", + "aTokenImpl": "0x7F8Fc14D462bdF93c681c1f2Fd615389bF969Fb2", + "aTokenName": "Aave Ethereum Lido sUSDe", + "aTokenSymbol": "aEthLidosUSDe", + "aTokenUnderlyingBalance": "100000000000000000000", + "borrowCap": 1000, + "borrowingEnabled": false, + "debtCeiling": 0, + "decimals": 18, + "id": 5, + "interestRateStrategy": "0x8958b1C39269167527821f8c276Ef7504883f2fa", + "isActive": true, + "isBorrowableInIsolation": false, + "isFlashloanable": true, + "isFrozen": false, + "isPaused": false, + "isSiloed": false, + "liquidationBonus": 10750, + "liquidationProtocolFee": 1000, + "liquidationThreshold": 10, + "ltv": 5, + "oracle": "0xb37aE8aBa6C0C1Bf2c509fc06E11aa4AF29B665A", + "oracleDecimals": 8, + "oracleDescription": "Capped sUSDe / USDe / USD", + "oracleLatestAnswer": 111869905, + "reserveFactor": 1000, + "supplyCap": 20000000, + "symbol": "sUSDe", + "underlying": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "usageAsCollateralEnabled": true, + "variableDebtToken": "0x2ABbAab3EF4e4A899d39e7EC996b5715E76b399a", + "variableDebtTokenImpl": "0x3E59212c34588a63350142EFad594a20C88C2CEd", + "variableDebtTokenName": "Aave Ethereum Lido Variable Debt sUSDe", + "variableDebtTokenSymbol": "variableDebtEthLidosUSDe", + "virtualAccountingActive": true, + "virtualBalance": "100000000000000000000" + } + } + }, + "strategies": { + "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497": { + "from": null, + "to": { + "address": "0x8958b1C39269167527821f8c276Ef7504883f2fa", + "baseVariableBorrowRate": "500000000000000000000000", + "maxVariableBorrowRate": "31500000000000000000000000", + "optimalUsageRatio": "10000000000000000000000000", + "variableRateSlope1": "1000000000000000000000000", + "variableRateSlope2": "30000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_before_AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_after.md b/diffs/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_before_AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_after.md new file mode 100644 index 000000000..afe196a77 --- /dev/null +++ b/diffs/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_before_AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_after.md @@ -0,0 +1,57 @@ +## Reserve changes + +### Reserves altered + +#### sUSDe ([0x9D39A5DE30e57443BfF2A8307A4256c8797A3497](https://etherscan.io/address/0x9D39A5DE30e57443BfF2A8307A4256c8797A3497)) + +| description | value before | value after | +| --- | --- | --- | +| debtCeiling | 40,000,000 $ [4000000000] | 0 $ [0] | + + +## Emodes changed + +### EMode: ETH correlated(id: 1) + + + +### EMode: sUSDe Stablecoins(id: 2) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label | - | sUSDe Stablecoins | +| eMode.ltv | - | 90 % | +| eMode.liquidationThreshold | - | 92 % | +| eMode.liquidationBonus | - | 3 % | +| eMode.borrowableBitmap | - | USDC, USDS | +| eMode.collateralBitmap | - | sUSDe | + + +## Raw diff + +```json +{ + "eModes": { + "2": { + "from": null, + "to": { + "borrowableBitmap": 34359738376, + "collateralBitmap": 4294967296, + "eModeCategory": 2, + "label": "sUSDe Stablecoins", + "liquidationBonus": 10300, + "liquidationThreshold": 9200, + "ltv": 9000 + } + } + }, + "reserves": { + "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497": { + "debtCeiling": { + "from": 4000000000, + "to": 0 + } + } + } +} +``` \ No newline at end of file diff --git a/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol new file mode 100644 index 000000000..923b799b9 --- /dev/null +++ b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol @@ -0,0 +1,120 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumLido, AaveV3EthereumLidoAssets, AaveV3EthereumLidoEModes} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {AaveV3PayloadEthereumLido} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereumLido.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 and Enable sUSDe liquid E-Mode on Aave v3 Mainnet and Lido Instances + * @author ACI + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-enable-susde-liquid-e-mode-on-aave-v3-mainnet-and-lido-instance/19703 + */ +contract AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108 is + AaveV3PayloadEthereumLido +{ + using SafeERC20 for IERC20; + + address public constant sUSDe = 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497; + uint256 public constant sUSDe_SEED_AMOUNT = 100 * 1e18; + address public constant sUSDe_ADMIN = 0xac140648435d03f784879cd789130F22Ef588Fcd; + + function _postExecute() internal override { + IERC20(sUSDe).forceApprove(address(AaveV3EthereumLido.POOL), sUSDe_SEED_AMOUNT); + AaveV3EthereumLido.POOL.supply( + sUSDe, + sUSDe_SEED_AMOUNT, + address(AaveV3EthereumLido.COLLECTOR), + 0 + ); + + (address asUSDe, , ) = AaveV3EthereumLido.AAVE_PROTOCOL_DATA_PROVIDER.getReserveTokensAddresses( + sUSDe + ); + IEmissionManager(AaveV3EthereumLido.EMISSION_MANAGER).setEmissionAdmin(sUSDe, sUSDe_ADMIN); + IEmissionManager(AaveV3EthereumLido.EMISSION_MANAGER).setEmissionAdmin(asUSDe, sUSDe_ADMIN); + } + + function eModeCategoriesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.EModeCategoryUpdate[] memory) + { + IAaveV3ConfigEngine.EModeCategoryUpdate[] + memory eModeUpdates = new IAaveV3ConfigEngine.EModeCategoryUpdate[](1); + + eModeUpdates[0] = IAaveV3ConfigEngine.EModeCategoryUpdate({ + eModeCategory: 4, + ltv: 90_00, + liqThreshold: 92_00, + liqBonus: 3_00, + label: 'sUSDe Stablecoins' + }); + + return eModeUpdates; + } + function assetsEModeUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.AssetEModeUpdate[] memory) + { + IAaveV3ConfigEngine.AssetEModeUpdate[] + memory assetEModeUpdates = new IAaveV3ConfigEngine.AssetEModeUpdate[](3); + + assetEModeUpdates[0] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: sUSDe, + eModeCategory: 4, + borrowable: EngineFlags.DISABLED, + collateral: EngineFlags.ENABLED + }); + assetEModeUpdates[1] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3EthereumLidoAssets.USDS_UNDERLYING, + eModeCategory: 4, + borrowable: EngineFlags.ENABLED, + collateral: EngineFlags.DISABLED + }); + assetEModeUpdates[2] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3EthereumLidoAssets.USDC_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: sUSDe, + assetSymbol: 'sUSDe', + priceFeed: 0xb37aE8aBa6C0C1Bf2c509fc06E11aa4AF29B665A, + enabledToBorrow: EngineFlags.DISABLED, + borrowableInIsolation: EngineFlags.DISABLED, + withSiloedBorrowing: EngineFlags.DISABLED, + flashloanable: EngineFlags.ENABLED, + ltv: 5, + liqThreshold: 10, + liqBonus: 7_50, + reserveFactor: 10_00, + supplyCap: 20_000_000, + borrowCap: 1000, + debtCeiling: 0, + liqProtocolFee: 10_00, + rateStrategyParams: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: 1_00, + baseVariableBorrowRate: 5, + variableRateSlope1: 10, + variableRateSlope2: 300 + }) + }); + + return listings; + } +} diff --git a/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol new file mode 100644 index 000000000..f40d0b820 --- /dev/null +++ b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3EthereumLido} from 'aave-address-book/AaveV3EthereumLido.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 {AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108} from './AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol'; + +/** + * @dev Test for AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol -vv + */ +contract AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_Test is + ProtocolV3TestBase +{ + AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108 + internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21171005); + proposal = new AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108', + AaveV3EthereumLido.POOL, + address(proposal) + ); + } + + function test_collectorHassUSDeFunds() public { + GovV3Helpers.executePayload(vm, address(proposal)); + (address aTokenAddress, , ) = AaveV3EthereumLido + .AAVE_PROTOCOL_DATA_PROVIDER + .getReserveTokensAddresses(proposal.sUSDe()); + assertGe( + IERC20(aTokenAddress).balanceOf(address(AaveV3EthereumLido.COLLECTOR)), + 100 * 10 ** 18 + ); + } + + function test_sUSDeAdmin() public { + GovV3Helpers.executePayload(vm, address(proposal)); + (address asUSDe, , ) = AaveV3EthereumLido.AAVE_PROTOCOL_DATA_PROVIDER.getReserveTokensAddresses( + proposal.sUSDe() + ); + assertEq( + IEmissionManager(AaveV3EthereumLido.EMISSION_MANAGER).getEmissionAdmin(proposal.sUSDe()), + proposal.sUSDe_ADMIN() + ); + assertEq( + IEmissionManager(AaveV3EthereumLido.EMISSION_MANAGER).getEmissionAdmin(asUSDe), + proposal.sUSDe_ADMIN() + ); + } +} diff --git a/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol new file mode 100644 index 000000000..5e9bce0c9 --- /dev/null +++ b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumAssets, AaveV3EthereumEModes} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV3PayloadEthereum} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereum.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'; +/** + * @title Onboard and Enable sUSDe liquid E-Mode on Aave v3 Mainnet and Lido Instances + * @author ACI + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-enable-susde-liquid-e-mode-on-aave-v3-mainnet-and-lido-instance/19703 + */ +contract AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108 is + AaveV3PayloadEthereum +{ + function eModeCategoriesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.EModeCategoryUpdate[] memory) + { + IAaveV3ConfigEngine.EModeCategoryUpdate[] + memory eModeUpdates = new IAaveV3ConfigEngine.EModeCategoryUpdate[](1); + + eModeUpdates[0] = IAaveV3ConfigEngine.EModeCategoryUpdate({ + eModeCategory: 2, + ltv: 90_00, + liqThreshold: 92_00, + liqBonus: 3_00, + label: 'sUSDe Stablecoins' + }); + + return eModeUpdates; + } + function assetsEModeUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.AssetEModeUpdate[] memory) + { + IAaveV3ConfigEngine.AssetEModeUpdate[] + memory assetEModeUpdates = new IAaveV3ConfigEngine.AssetEModeUpdate[](3); + + assetEModeUpdates[0] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3EthereumAssets.USDC_UNDERLYING, + eModeCategory: 2, + borrowable: EngineFlags.ENABLED, + collateral: EngineFlags.DISABLED + }); + assetEModeUpdates[1] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3EthereumAssets.sUSDe_UNDERLYING, + eModeCategory: 2, + borrowable: EngineFlags.DISABLED, + collateral: EngineFlags.ENABLED + }); + assetEModeUpdates[2] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3EthereumAssets.USDS_UNDERLYING, + eModeCategory: 2, + borrowable: EngineFlags.ENABLED, + collateral: EngineFlags.DISABLED + }); + + return assetEModeUpdates; + } + function collateralsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.CollateralUpdate[] memory) + { + IAaveV3ConfigEngine.CollateralUpdate[] + memory collateralUpdate = new IAaveV3ConfigEngine.CollateralUpdate[](1); + + collateralUpdate[0] = IAaveV3ConfigEngine.CollateralUpdate({ + asset: AaveV3EthereumAssets.sUSDe_UNDERLYING, + ltv: EngineFlags.KEEP_CURRENT, + liqThreshold: EngineFlags.KEEP_CURRENT, + liqBonus: EngineFlags.KEEP_CURRENT, + debtCeiling: 0, + liqProtocolFee: EngineFlags.KEEP_CURRENT + }); + + return collateralUpdate; + } +} diff --git a/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol new file mode 100644 index 000000000..e6c27b1bc --- /dev/null +++ b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Ethereum} from 'aave-address-book/AaveV3Ethereum.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108} from './AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol'; + +/** + * @dev Test for AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol -vv + */ +contract AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_Test is + ProtocolV3TestBase +{ + AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108 + internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21171005); + proposal = new AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108', + AaveV3Ethereum.POOL, + address(proposal) + ); + } +} diff --git a/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances.md b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances.md new file mode 100644 index 000000000..dfe559d33 --- /dev/null +++ b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances.md @@ -0,0 +1,72 @@ +--- +title: "Onboard and Enable sUSDe liquid E-Mode on Aave v3 Mainnet and Lido Instances" +author: "ACI" +discussions: "https://governance.aave.com/t/arfc-enable-susde-liquid-e-mode-on-aave-v3-mainnet-and-lido-instance/19703" +snapshot: "Direct-to-AIP" +--- + +## Simple Summary + +This proposal aims to enable sUSDe liquid E-Mode on Aave v3 Mainnet for the Main and Lido instances. By implementing this change, we seek to enhance capital efficiency for borrowers using sUSDe as collateral, particularly for borrowing other stablecoins. This is a Direct to AIP proposal. + +## Motivation + +The motivation behind this proposal stems from several key factors: + +- High Utilization: sUSDe has demonstrated significant usage as collateral for borrowing stablecoins on the platform. + Capital Efficiency: Enabling liquid E-Mode for sUSDe will allow borrowers to substantially improve their capital efficiency when using this asset as collateral. +- Controlled Growth: Liquid E-Mode provides a mechanism for more precise control over the growth and borrow demand in relation to the overall stablecoin liquidity within Aave v3 on Mainnet. +- Enhanced Borrowing Capacity: This change will enable users to borrow larger amounts of other stablecoins against their sUSDe collateral, potentially increasing platform utilization and revenue. + By implementing this proposal, we aim to optimize the use of sUSDe within the Aave ecosystem, attracting more liquidity for stablecoins. + +## Specification + +The table below illustrates the configured risk parameters for **sUSDe** on Aave V3 Lido Instance: + +| Parameter | Value | +| ------------------------- | -----------------------------------------: | +| Isolation Mode | false | +| Borrowable | DISABLED | +| Collateral Enabled | true | +| Supply Cap (sUSDe) | 20,000,000 | +| Borrow Cap (sUSDe) | 1000 | +| Debt Ceiling | USD 0 | +| LTV | 0.05 % | +| LT | 0.1 % | +| Liquidation Bonus | 7.5 % | +| Liquidation Protocol Fee | 10 % | +| Reserve Factor | 10 % | +| Base Variable Borrow Rate | 0.05 % | +| Variable Slope 1 | 0.1 % | +| Variable Slope 2 | 3 % | +| Uoptimal | 1 % | +| Flashloanable | ENABLED | +| Siloed Borrowing | DISABLED | +| Borrowable in Isolation | DISABLED | +| Oracle | 0xb37aE8aBa6C0C1Bf2c509fc06E11aa4AF29B665A | + +Additionaly [0xac140648435d03f784879cd789130F22Ef588Fcd](https://etherscan.io/address/0xac140648435d03f784879cd789130F22Ef588Fcd) has been set as the emission admin for sUSDe and the corresponding aToken. + +The table below illustrate the configured "sUSDe Stablecoins" Liquid E-mode + +| Parameter | Value | Value | Value | +| --------------------- | ----- | ----- | ----- | +| Asset | sUSDe | USDS | USDC | +| Collateral | Yes | No | No | +| Borrowable | No | Yes | Yes | +| Max LTV | 90% | - | - | +| Liquidation Threshold | 92% | - | - | +| Liquidation Bonus | 3.0% | - | - | + +Finally, sUSDe on Aave V3 Mainnet will be removed from Isolation Mode on Aave v3 instance. + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol) +- Snapshot: Direct-to-AIP +- [Discussion](https://governance.aave.com/t/arfc-enable-susde-liquid-e-mode-on-aave-v3-mainnet-and-lido-instance/19703) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.s.sol b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.s.sol new file mode 100644 index 000000000..8eadb7b56 --- /dev/null +++ b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.s.sol @@ -0,0 +1,74 @@ +// 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} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108} from './AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol'; +import {AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108} from './AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108) + .creationCode + ); + address payload1 = GovV3Helpers.deployDeterministic( + type( + AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108 + ).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](2); + actions[0] = GovV3Helpers.buildAction(payload0); + actions[1] = GovV3Helpers.buildAction(payload1); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Create Proposal + * command: make deploy-ledger contract=src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.s.sol:CreateProposal chain=mainnet + */ +contract CreateProposal is EthereumScript { + function run() external { + // create payloads + PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](1); + + // compose actions for validation + IPayloadsControllerCore.ExecutionAction[] + memory actionsEthereum = new IPayloadsControllerCore.ExecutionAction[](2); + actionsEthereum[0] = GovV3Helpers.buildAction( + type(AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108) + .creationCode + ); + actionsEthereum[1] = GovV3Helpers.buildAction( + type( + AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108 + ).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances.md' + ) + ); + } +} diff --git a/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/config.ts b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/config.ts new file mode 100644 index 000000000..debc03f14 --- /dev/null +++ b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/config.ts @@ -0,0 +1,109 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3Ethereum', 'AaveV3EthereumLido'], + title: 'Onboard and Enable sUSDe liquid E-Mode on Aave v3 Mainnet and Lido Instances', + shortName: 'OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances', + date: '20241108', + author: 'ACI', + discussion: + 'https://governance.aave.com/t/arfc-enable-susde-liquid-e-mode-on-aave-v3-mainnet-and-lido-instance/1970', + snapshot: 'Direct-to-AIP', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Ethereum: { + configs: { + EMODES_UPDATES: [ + {eModeCategory: 2, ltv: '90', liqThreshold: '92', liqBonus: '3', label: 'sUSDe'}, + ], + EMODES_ASSETS: [ + { + asset: 'USDC', + eModeCategory: 'AaveV3EthereumEModes.ETH_CORRELATED', + collateral: 'DISABLED', + borrowable: 'ENABLED', + }, + { + asset: 'sUSDe', + eModeCategory: 'AaveV3EthereumEModes.ETH_CORRELATED', + collateral: 'ENABLED', + borrowable: 'DISABLED', + }, + { + asset: 'USDS', + eModeCategory: 'AaveV3EthereumEModes.ETH_CORRELATED', + collateral: 'DISABLED', + borrowable: 'ENABLED', + }, + ], + BORROWS_UPDATE: [ + { + enabledToBorrow: 'KEEP_CURRENT', + flashloanable: 'KEEP_CURRENT', + borrowableInIsolation: 'DISABLED', + withSiloedBorrowing: 'KEEP_CURRENT', + reserveFactor: 'KEEP_CURRENT', + asset: 'sUSDe', + }, + ], + }, + cache: {blockNumber: 21142896}, + }, + AaveV3EthereumLido: { + configs: { + EMODES_UPDATES: [ + {eModeCategory: 2, ltv: '90', liqThreshold: '92', liqBonus: '3', label: 'sUSDe'}, + ], + EMODES_ASSETS: [ + { + asset: 'WETH', + eModeCategory: 'AaveV3EthereumLidoEModes.ETH_CORRELATED', + collateral: 'ENABLED', + borrowable: 'DISABLED', + }, + { + asset: 'USDS', + eModeCategory: 'AaveV3EthereumLidoEModes.ETH_CORRELATED', + collateral: 'DISABLED', + borrowable: 'ENABLED', + }, + { + asset: 'USDC', + eModeCategory: 'AaveV3EthereumLidoEModes.ETH_CORRELATED', + collateral: 'DISABLED', + borrowable: 'ENABLED', + }, + ], + ASSET_LISTING: [ + { + assetSymbol: 'sUSDe', + decimals: 18, + priceFeed: '0xb37aE8aBa6C0C1Bf2c509fc06E11aa4AF29B665A', + ltv: '0.05', + liqThreshold: '0.1', + liqBonus: '7.5', + debtCeiling: '0', + liqProtocolFee: '10', + enabledToBorrow: 'DISABLED', + flashloanable: 'ENABLED', + borrowableInIsolation: 'DISABLED', + withSiloedBorrowing: 'DISABLED', + reserveFactor: '10', + supplyCap: '20000000', + borrowCap: '0', + rateStrategyParams: { + optimalUtilizationRate: '1', + baseVariableBorrowRate: '0', + variableRateSlope1: '0', + variableRateSlope2: '0', + }, + asset: '0x9D39A5DE30e57443BfF2A8307A4256c8797A3497', + admin: '0xac140648435d03f784879cd789130F22Ef588Fcd', + }, + ], + }, + cache: {blockNumber: 21142900}, + }, + }, +};