diff --git a/.assets/010633e355dbf154c1151f809618bd82bf6c78f6.svg b/.assets/010633e355dbf154c1151f809618bd82bf6c78f6.svg
new file mode 100644
index 000000000..988e727ad
--- /dev/null
+++ b/.assets/010633e355dbf154c1151f809618bd82bf6c78f6.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/.assets/223a1aac9347ec68266ca4077ea5d03b73ca9e05.svg b/.assets/223a1aac9347ec68266ca4077ea5d03b73ca9e05.svg
new file mode 100644
index 000000000..ce9a14432
--- /dev/null
+++ b/.assets/223a1aac9347ec68266ca4077ea5d03b73ca9e05.svg
@@ -0,0 +1 @@
+ Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%uOptimal 80%uOptimal 80%
\ No newline at end of file
diff --git a/.assets/4048416bedf0808a47706e49a9f98ee64701623a.svg b/.assets/4048416bedf0808a47706e49a9f98ee64701623a.svg
new file mode 100644
index 000000000..6fedc0f3b
--- /dev/null
+++ b/.assets/4048416bedf0808a47706e49a9f98ee64701623a.svg
@@ -0,0 +1 @@
+ Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%20%40%60%80%uOptimal 90%uOptimal 90%
\ No newline at end of file
diff --git a/.assets/81174f6db1d6055f4be1846c1155b509e25ef500.svg b/.assets/81174f6db1d6055f4be1846c1155b509e25ef500.svg
new file mode 100644
index 000000000..988e727ad
--- /dev/null
+++ b/.assets/81174f6db1d6055f4be1846c1155b509e25ef500.svg
@@ -0,0 +1 @@
+ Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%uOptimal 80%uOptimal 80%
\ No newline at end of file
diff --git a/.assets/859e8f346e62fa5dc8eed4d223ca2a8d1c9fc80c.svg b/.assets/859e8f346e62fa5dc8eed4d223ca2a8d1c9fc80c.svg
new file mode 100644
index 000000000..44fc6cdb4
--- /dev/null
+++ b/.assets/859e8f346e62fa5dc8eed4d223ca2a8d1c9fc80c.svg
@@ -0,0 +1 @@
+ Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%100%200%300%uOptimal 45%uOptimal 45%
\ No newline at end of file
diff --git a/.assets/ab240e54d4468f7b1cd32614f764cbef5a270f32.svg b/.assets/ab240e54d4468f7b1cd32614f764cbef5a270f32.svg
new file mode 100644
index 000000000..3c2d9f74f
--- /dev/null
+++ b/.assets/ab240e54d4468f7b1cd32614f764cbef5a270f32.svg
@@ -0,0 +1 @@
+ Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%150%uOptimal 70%uOptimal 70%
\ No newline at end of file
diff --git a/.assets/e8e7b9196f167723da0b9cc203b01762e5360791.svg b/.assets/e8e7b9196f167723da0b9cc203b01762e5360791.svg
new file mode 100644
index 000000000..ce9a14432
--- /dev/null
+++ b/.assets/e8e7b9196f167723da0b9cc203b01762e5360791.svg
@@ -0,0 +1 @@
+ Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%uOptimal 80%uOptimal 80%
\ No newline at end of file
diff --git a/diffs/AaveV2Ethereum_InterimAAMPLDistribution_20240409_before_AaveV2Ethereum_InterimAAMPLDistribution_20240409_after.md b/diffs/AaveV2Ethereum_InterimAAMPLDistribution_20240409_before_AaveV2Ethereum_InterimAAMPLDistribution_20240409_after.md
new file mode 100644
index 000000000..c15d3e2bc
--- /dev/null
+++ b/diffs/AaveV2Ethereum_InterimAAMPLDistribution_20240409_before_AaveV2Ethereum_InterimAAMPLDistribution_20240409_after.md
@@ -0,0 +1,5 @@
+## Raw diff
+
+```json
+{}
+```
\ No newline at end of file
diff --git a/diffs/AaveV2Ethereum_MerklTest_20240409_before_AaveV2Ethereum_MerklTest_20240409_after.md b/diffs/AaveV2Ethereum_MerklTest_20240409_before_AaveV2Ethereum_MerklTest_20240409_after.md
new file mode 100644
index 000000000..c15d3e2bc
--- /dev/null
+++ b/diffs/AaveV2Ethereum_MerklTest_20240409_before_AaveV2Ethereum_MerklTest_20240409_after.md
@@ -0,0 +1,5 @@
+## Raw diff
+
+```json
+{}
+```
\ No newline at end of file
diff --git a/diffs/AaveV3Arbitrum_WeETHArbitrumOnboarding_20240409_before_AaveV3Arbitrum_WeETHArbitrumOnboarding_20240409_after.md b/diffs/AaveV3Arbitrum_WeETHArbitrumOnboarding_20240409_before_AaveV3Arbitrum_WeETHArbitrumOnboarding_20240409_after.md
new file mode 100644
index 000000000..d91ecb2dd
--- /dev/null
+++ b/diffs/AaveV3Arbitrum_WeETHArbitrumOnboarding_20240409_before_AaveV3Arbitrum_WeETHArbitrumOnboarding_20240409_after.md
@@ -0,0 +1,139 @@
+## Reserve changes
+
+### Reserves added
+
+#### weETH ([0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe](https://arbiscan.io/address/0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe))
+
+| description | value |
+| --- | --- |
+| decimals | 18 |
+| isActive | true |
+| isFrozen | false |
+| supplyCap | 1,000 weETH |
+| borrowCap | 100 weETH |
+| debtCeiling | 0 $ |
+| isSiloed | false |
+| isFlashloanable | true |
+| eModeCategory | 2 |
+| oracle | [0x517276B5972C4Db7E88B9F76Ee500E888a2D73C3](https://arbiscan.io/address/0x517276B5972C4Db7E88B9F76Ee500E888a2D73C3) |
+| oracleDecimals | 8 |
+| oracleDescription | Capped weETH / eETH(ETH) / USD |
+| oracleLatestAnswer | 3342.70251943 |
+| usageAsCollateralEnabled | true |
+| ltv | 72.5 % |
+| liquidationThreshold | 75 % |
+| liquidationBonus | 7.5 % |
+| liquidationProtocolFee | 10 % |
+| reserveFactor | 15 % |
+| aToken | [0x8437d7C167dFB82ED4Cb79CD44B7a32A1dd95c77](https://arbiscan.io/address/0x8437d7C167dFB82ED4Cb79CD44B7a32A1dd95c77) |
+| aTokenImpl | [0x1Be1798b70aEe431c2986f7ff48d9D1fa350786a](https://arbiscan.io/address/0x1Be1798b70aEe431c2986f7ff48d9D1fa350786a) |
+| variableDebtToken | [0x3ca5FA07689F266e907439aFd1fBB59c44fe12f6](https://arbiscan.io/address/0x3ca5FA07689F266e907439aFd1fBB59c44fe12f6) |
+| variableDebtTokenImpl | [0x5E76E98E0963EcDC6A065d1435F84065b7523f39](https://arbiscan.io/address/0x5E76E98E0963EcDC6A065d1435F84065b7523f39) |
+| stableDebtToken | [0x40B4BAEcc69B882e8804f9286b12228C27F8c9BF](https://arbiscan.io/address/0x40B4BAEcc69B882e8804f9286b12228C27F8c9BF) |
+| stableDebtTokenImpl | [0x0c2C95b24529664fE55D4437D7A31175CFE6c4f7](https://arbiscan.io/address/0x0c2C95b24529664fE55D4437D7A31175CFE6c4f7) |
+| borrowingEnabled | true |
+| stableBorrowRateEnabled | false |
+| isBorrowableInIsolation | false |
+| interestRateStrategy | [0x0fc12Ad84210695dE8C0D5D8B6f720C37cEaB02f](https://arbiscan.io/address/0x0fc12Ad84210695dE8C0D5D8B6f720C37cEaB02f) |
+| liquidityIndex | 1 |
+| variableBorrowIndex | 1 |
+| aTokenName | Aave Arbitrum weETH |
+| aTokenSymbol | aArbweETH |
+| currentLiquidityRate | 0 % |
+| currentVariableBorrowRate | 0 % |
+| isPaused | false |
+| stableDebtTokenName | Aave Arbitrum Stable Debt weETH |
+| stableDebtTokenSymbol | stableDebtArbweETH |
+| variableDebtTokenName | Aave Arbitrum Variable Debt weETH |
+| variableDebtTokenSymbol | variableDebtArbweETH |
+| optimalUsageRatio | 45 % |
+| maxExcessStableToTotalDebtRatio | 80 % |
+| maxExcessUsageRatio | 55 % |
+| optimalStableToTotalDebtRatio | 20 % |
+| baseVariableBorrowRate | 0 % |
+| variableRateSlope1 | 7 % |
+| variableRateSlope2 | 300 % |
+| baseStableBorrowRate | 9 % |
+| stableRateSlope1 | 7 % |
+| stableRateSlope2 | 300 % |
+| interestRate | ![ir](/.assets/859e8f346e62fa5dc8eed4d223ca2a8d1c9fc80c.svg) |
+| eMode.label | ETH correlated |
+| eMode.ltv | 93 % |
+| eMode.liquidationThreshold | 95 % |
+| eMode.liquidationBonus | 1 % |
+| eMode.priceSource | 0x0000000000000000000000000000000000000000 |
+
+
+## Raw diff
+
+```json
+{
+ "reserves": {
+ "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe": {
+ "from": null,
+ "to": {
+ "aToken": "0x8437d7C167dFB82ED4Cb79CD44B7a32A1dd95c77",
+ "aTokenImpl": "0x1Be1798b70aEe431c2986f7ff48d9D1fa350786a",
+ "aTokenName": "Aave Arbitrum weETH",
+ "aTokenSymbol": "aArbweETH",
+ "borrowCap": 100,
+ "borrowingEnabled": true,
+ "currentLiquidityRate": 0,
+ "currentVariableBorrowRate": 0,
+ "debtCeiling": 0,
+ "decimals": 18,
+ "eModeCategory": 2,
+ "interestRateStrategy": "0x0fc12Ad84210695dE8C0D5D8B6f720C37cEaB02f",
+ "isActive": true,
+ "isBorrowableInIsolation": false,
+ "isFlashloanable": true,
+ "isFrozen": false,
+ "isPaused": false,
+ "isSiloed": false,
+ "liquidationBonus": 10750,
+ "liquidationProtocolFee": 1000,
+ "liquidationThreshold": 7500,
+ "liquidityIndex": "1000000000000000000000000000",
+ "ltv": 7250,
+ "oracle": "0x517276B5972C4Db7E88B9F76Ee500E888a2D73C3",
+ "oracleDecimals": 8,
+ "oracleDescription": "Capped weETH / eETH(ETH) / USD",
+ "oracleLatestAnswer": 334270251943,
+ "reserveFactor": 1500,
+ "stableBorrowRateEnabled": false,
+ "stableDebtToken": "0x40B4BAEcc69B882e8804f9286b12228C27F8c9BF",
+ "stableDebtTokenImpl": "0x0c2C95b24529664fE55D4437D7A31175CFE6c4f7",
+ "stableDebtTokenName": "Aave Arbitrum Stable Debt weETH",
+ "stableDebtTokenSymbol": "stableDebtArbweETH",
+ "supplyCap": 1000,
+ "symbol": "weETH",
+ "underlying": "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe",
+ "usageAsCollateralEnabled": true,
+ "variableBorrowIndex": "1000000000000000000000000000",
+ "variableDebtToken": "0x3ca5FA07689F266e907439aFd1fBB59c44fe12f6",
+ "variableDebtTokenImpl": "0x5E76E98E0963EcDC6A065d1435F84065b7523f39",
+ "variableDebtTokenName": "Aave Arbitrum Variable Debt weETH",
+ "variableDebtTokenSymbol": "variableDebtArbweETH"
+ }
+ }
+ },
+ "strategies": {
+ "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe": {
+ "from": null,
+ "to": {
+ "address": "0x0fc12Ad84210695dE8C0D5D8B6f720C37cEaB02f",
+ "baseStableBorrowRate": "90000000000000000000000000",
+ "baseVariableBorrowRate": 0,
+ "maxExcessStableToTotalDebtRatio": "800000000000000000000000000",
+ "maxExcessUsageRatio": "550000000000000000000000000",
+ "optimalStableToTotalDebtRatio": "200000000000000000000000000",
+ "optimalUsageRatio": "450000000000000000000000000",
+ "stableRateSlope1": "70000000000000000000000000",
+ "stableRateSlope2": "3000000000000000000000000000",
+ "variableRateSlope1": "70000000000000000000000000",
+ "variableRateSlope2": "3000000000000000000000000000"
+ }
+ }
+ }
+}
+```
\ No newline at end of file
diff --git a/src/20240409_AaveV2Ethereum_InterimAAMPLDistribution/AaveV2Ethereum_InterimAAMPLDistribution_20240409.sol b/src/20240409_AaveV2Ethereum_InterimAAMPLDistribution/AaveV2Ethereum_InterimAAMPLDistribution_20240409.sol
new file mode 100644
index 000000000..747a19cbf
--- /dev/null
+++ b/src/20240409_AaveV2Ethereum_InterimAAMPLDistribution/AaveV2Ethereum_InterimAAMPLDistribution_20240409.sol
@@ -0,0 +1,83 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.17;
+
+import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol';
+import {AaveV2Ethereum, AaveV2EthereumAssets} from 'aave-address-book/AaveV2Ethereum.sol';
+import {IProposalGenericExecutor} from 'aave-helpers/interfaces/IProposalGenericExecutor.sol';
+
+interface IDistributionCreator {
+ struct CampaignParameters {
+ // POPULATED ONCE CREATED
+
+ // ID of the campaign. This can be left as a null bytes32 when creating campaigns
+ // on Merkl.
+ bytes32 campaignId;
+ // CHOSEN BY CAMPAIGN CREATOR
+
+ // Address of the campaign creator, if marked as address(0), it will be overriden with the
+ // address of the `msg.sender` creating the campaign
+ address creator;
+ // Address of the token used as a reward
+ address rewardToken;
+ // Amount of `rewardToken` to distribute across all the epochs
+ // Amount distributed per epoch is `amount/numEpoch`
+ uint256 amount;
+ // Type of campaign
+ uint32 campaignType;
+ // Timestamp at which the campaign should start
+ uint32 startTimestamp;
+ // Duration of the campaign in seconds. Has to be a multiple of EPOCH = 3600
+ uint32 duration;
+ // Extra data to pass to specify the campaign
+ bytes campaignData;
+ }
+
+ function campaign(bytes32 id) external view returns (CampaignParameters memory);
+
+ function acceptConditions() external;
+
+ function createCampaign(CampaignParameters memory newCampaign) external returns (bytes32);
+}
+
+/**
+ * @title Interim aAMPL distribution
+ * @author BGD Labs
+ * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0xb7226dd6441b67225924082215f7a512bfd98252897ee43a879084e07ab53607
+ * - Discussion: https://governance.aave.com/t/arfc-aampl-interim-distribution/17184
+ */
+contract AaveV2Ethereum_InterimAAMPLDistribution_20240409 is IProposalGenericExecutor {
+ IDistributionCreator public constant DISTRIBUTION_CREATOR =
+ IDistributionCreator(0x8BB4C975Ff3c250e0ceEA271728547f3802B36Fd);
+ address public constant REWARD_TOKEN = AaveV2EthereumAssets.USDC_UNDERLYING;
+ uint256 public constant REWARD_AMOUNT_PLUS_FEES = 298_543_522_440;
+ string public constant FILE_URL =
+ 'https://angle-blog.infura-ipfs.io/ipfs/Qmb9uJbEdppQsL8W4aVKxREoHo42iXtcp4CV1FLE5tY8Rt';
+
+ function execute() external {
+ // 1. send funds to executor
+ // 0.5% fee for angle merkle distributor
+ AaveV2Ethereum.COLLECTOR.transfer(
+ AaveV2EthereumAssets.USDC_A_TOKEN,
+ address(this),
+ REWARD_AMOUNT_PLUS_FEES + 1 // account for imprecision on transfer
+ );
+ AaveV2Ethereum.POOL.withdraw(REWARD_TOKEN, REWARD_AMOUNT_PLUS_FEES, address(this));
+ // 2. approve to merkl
+ IERC20(REWARD_TOKEN).approve(address(DISTRIBUTION_CREATOR), REWARD_AMOUNT_PLUS_FEES);
+ // 3. accept tos
+ DISTRIBUTION_CREATOR.acceptConditions();
+ // 4.create campaign
+ IDistributionCreator.CampaignParameters memory newCampaign = IDistributionCreator
+ .CampaignParameters({
+ campaignId: '',
+ creator: address(0),
+ rewardToken: REWARD_TOKEN,
+ amount: REWARD_AMOUNT_PLUS_FEES,
+ campaignType: 4,
+ startTimestamp: uint32(block.timestamp + 2 hours),
+ duration: 1 hours,
+ campaignData: abi.encode(FILE_URL, string(''), bytes('0x'))
+ });
+ DISTRIBUTION_CREATOR.createCampaign(newCampaign);
+ }
+}
diff --git a/src/20240409_AaveV2Ethereum_InterimAAMPLDistribution/AaveV2Ethereum_InterimAAMPLDistribution_20240409.t.sol b/src/20240409_AaveV2Ethereum_InterimAAMPLDistribution/AaveV2Ethereum_InterimAAMPLDistribution_20240409.t.sol
new file mode 100644
index 000000000..9e3c4d815
--- /dev/null
+++ b/src/20240409_AaveV2Ethereum_InterimAAMPLDistribution/AaveV2Ethereum_InterimAAMPLDistribution_20240409.t.sol
@@ -0,0 +1,50 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {AaveV2Ethereum, AaveV2EthereumAssets} from 'aave-address-book/AaveV2Ethereum.sol';
+import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol';
+
+import 'forge-std/Test.sol';
+import {ProtocolV2TestBase, ReserveConfig} from 'aave-helpers/ProtocolV2TestBase.sol';
+import {AaveV2Ethereum_InterimAAMPLDistribution_20240409, IDistributionCreator} from './AaveV2Ethereum_InterimAAMPLDistribution_20240409.sol';
+
+/**
+ * @dev Test for AaveV2Ethereum_InterimAAMPLDistribution_20240409
+ * command: make test-contract filter=AaveV2Ethereum_InterimAAMPLDistribution_20240409
+ */
+contract AaveV2Ethereum_InterimAAMPLDistribution_20240409_Test is ProtocolV2TestBase {
+ AaveV2Ethereum_InterimAAMPLDistribution_20240409 internal proposal;
+
+ function setUp() public {
+ vm.createSelectFork(vm.rpcUrl('mainnet'), 19627195);
+ proposal = new AaveV2Ethereum_InterimAAMPLDistribution_20240409();
+ }
+
+ /**
+ * @dev executes the generic test suite including e2e and config snapshots
+ */
+ function test_defaultProposalExecution() public {
+ defaultTest(
+ 'AaveV2Ethereum_InterimAAMPLDistribution_20240409',
+ AaveV2Ethereum.POOL,
+ address(proposal)
+ );
+ }
+
+ function test_dataCorrectness() public {
+ executePayload(vm, address(proposal));
+
+ IDistributionCreator.CampaignParameters memory campaign = proposal
+ .DISTRIBUTION_CREATOR()
+ .campaign(bytes32(0xf202b6960fcee67260b0d7251d8eabba7b65d7a092357b57092d7e2f4a556f76));
+
+ assertEq(campaign.creator, GovernanceV3Ethereum.EXECUTOR_LVL_1);
+ assertEq(campaign.rewardToken, AaveV2EthereumAssets.USDC_UNDERLYING);
+ assertLe(campaign.amount, 300_000e6);
+ assertEq(campaign.campaignType, 4);
+ assertGt(campaign.startTimestamp, block.timestamp);
+ assertEq(campaign.duration, 3600);
+ (string memory url, , ) = abi.decode(campaign.campaignData, (string, string, bytes));
+ assertEq(url, proposal.FILE_URL());
+ }
+}
diff --git a/src/20240409_AaveV2Ethereum_InterimAAMPLDistribution/InterimAAMPLDistribution.md b/src/20240409_AaveV2Ethereum_InterimAAMPLDistribution/InterimAAMPLDistribution.md
new file mode 100644
index 000000000..024e2f675
--- /dev/null
+++ b/src/20240409_AaveV2Ethereum_InterimAAMPLDistribution/InterimAAMPLDistribution.md
@@ -0,0 +1,56 @@
+---
+title: "Interim aAMPL distribution"
+author: "BGD Labs"
+discussions: "https://governance.aave.com/t/arfc-aampl-interim-distribution/17184"
+snapshot: "https://snapshot.org/#/aave.eth/proposal/0xb7226dd6441b67225924082215f7a512bfd98252897ee43a879084e07ab53607"
+---
+
+## Simple Summary
+
+Distribute 300.000 USDC to users affected by aAMPL problem.
+
+## Motivation
+
+On December 2023, a problem was detected on the AMPL custom reserve on Aave v2 Ethereum, causing an unexpected inflation of AMPL-related balances and supply, not following the intended design by the Ampleforth team.
+
+While further analysis is performed for the most reasonable strategy on giving withdrawal liquidity for aAMPL supplies, an interim distribution of 300’000 USD value is proposed as lower threshold, to allow aAMPL suppliers to proceed partially with their withdrawals.
+
+With [aip 72](https://vote.onaave.com/proposal/?proposalId=72&ipfsHash=0xaa46d2cf629d68cc84bcc83156b2fd8e54819c5e848c229c7e62d1f6212886cc) having passed the governance process, aAMPL transfers are no longer permitted, which allows to snapshot the current aAMPL balances to perform a fair distribution between affected users.
+
+This distribution have been defined the following way, with the help of @ChaosLabs and the Ampleforth team (for ubaAMPL holders):
+
+- From each address holding aAMPL, a percentage over the total aAMPL supply has been calculated, to understand how is the proportion of each address.
+- Using the previously calculated percentages, they have been applied over the total 300'000 USDC distribution: for example, for an address holding 5% of the total aAMPL, the claim has been calculated as 5% of 300'000; 15'000 USDC.
+- For the holders of aAMPL through [Unbuttoned aAMPL (ubaAMPL)](https://etherscan.io/token/0xf03387d8d0ff326ab586a58e0ab4121d106147df#balances), the proportion over the total supply of ubaAMPL has been used to calculate the claims on aAMPL. For example, if an address held 20% of the total ubaAMPL supply, and ubaAMPL itself would be 20% of the aAMPL supply, the claims of that address would be the 4% of the total aAMPL. We appreciate the Ampleforth team providing us these "internal" holdings of ubaAMPL, given their knowledge of the system.
+- Only claims over value of 30 USDC have been included, given that gas-wise, would not be profitable to claim lower amounts. However, those values lower than 30 USDC will be naturally taken into account for the final follow-up distribution.
+- Once again, _this is an interim distribution, that will be follow up by another with more a precise numbers and bigger in size_.
+- For the sake of reducing complexity, the Aave governance proposal will release the whole 300'000 USDC, and the Ampleforth team can just transfer to the Aave Collector the 40% of that amount, removing any dependency for users to claim as soon as possible.
+- It is possible to check each address claims [HERE](https://github.com/bgd-labs/aave-proposals-v3/blob/8d5b3e902adf7c5c246e752b5d6b6e0e5d9831b7/src/20240409_AaveV2Ethereum_InterimAAMPLDistribution/distribution.pdf).
+
+## Specification
+
+The distribution will be done via the [Merkl](https://app.merkl.xyz/) platform by Angle Labs, specialized on these operations and used before in other Aave DAO proposals, like the Merit program.
+
+Users with a balance below 30$ will be excluded from this initial distribution as the gas-cost for claiming would not offset set amount claimed.
+
+Therefore the proposal will perform the following steps upon execution:
+
+- withdraw USDC from the collector (298.5k including a 0.5% fee for angle labs)
+- approve the full amount to [0x8BB4C975Ff3c250e0ceEA271728547f3802B36Fd](https://etherscan.io/address/0x8BB4C975Ff3c250e0ceEA271728547f3802B36Fd) which is the distribution creator by Angle Labs
+- sign the tos of https://app.merkl.xyz/ via a onchain transaction, a requirement on the Merkl platform
+- create a campaign to distribute funds to the affected users
+
+2 hours after proposal execution, users will be able to claim the USDC on https://app.merkl.xyz/
+
+## References
+
+- Implementation: [AaveV2Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/2244338d3cb5b0482ff3499bf8f95c0762cc004c/src/20240409_AaveV2Ethereum_InterimAAMPLDistribution/AaveV2Ethereum_InterimAAMPLDistribution_20240409.sol)
+- Tests: [AaveV2Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/2244338d3cb5b0482ff3499bf8f95c0762cc004c/src/20240409_AaveV2Ethereum_InterimAAMPLDistribution/AaveV2Ethereum_InterimAAMPLDistribution_20240409.t.sol)
+- [Snapshot](https://snapshot.org/#/aave.eth/proposal/0xb7226dd6441b67225924082215f7a512bfd98252897ee43a879084e07ab53607)
+- [Discussion](https://governance.aave.com/t/arfc-aampl-interim-distribution/17184)
+- [Distribution:IPFS](https://angle-blog.infura-ipfs.io/ipfs/Qmb9uJbEdppQsL8W4aVKxREoHo42iXtcp4CV1FLE5tY8Rt)
+- [Distribution:formatted](https://github.com/bgd-labs/aave-proposals-v3/blob/2244338d3cb5b0482ff3499bf8f95c0762cc004c/src/20240409_AaveV2Ethereum_InterimAAMPLDistribution/distribution.pdf)
+
+## Copyright
+
+Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/).
diff --git a/src/20240409_AaveV2Ethereum_InterimAAMPLDistribution/InterimAAMPLDistribution_20240409.s.sol b/src/20240409_AaveV2Ethereum_InterimAAMPLDistribution/InterimAAMPLDistribution_20240409.s.sol
new file mode 100644
index 000000000..12b271afe
--- /dev/null
+++ b/src/20240409_AaveV2Ethereum_InterimAAMPLDistribution/InterimAAMPLDistribution_20240409.s.sol
@@ -0,0 +1,60 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol';
+import {AaveV2Ethereum, AaveV2EthereumAssets} from 'aave-address-book/AaveV2Ethereum.sol';
+import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/GovV3Helpers.sol';
+import {EthereumScript} from 'aave-helpers/ScriptUtils.sol';
+import {AaveV2Ethereum_InterimAAMPLDistribution_20240409} from './AaveV2Ethereum_InterimAAMPLDistribution_20240409.sol';
+
+/**
+ * @dev Deploy Ethereum
+ * deploy-command: make deploy-ledger contract=src/20240409_AaveV2Ethereum_InterimAAMPLDistribution/InterimAAMPLDistribution_20240409.s.sol:DeployEthereum chain=mainnet
+ * verify-command: npx catapulta-verify -b broadcast/InterimAAMPLDistribution_20240409.s.sol/1/run-latest.json
+ */
+contract DeployEthereum is EthereumScript {
+ function run() external broadcast {
+ // deploy payloads
+ address payload0 = GovV3Helpers.deployDeterministic(
+ type(AaveV2Ethereum_InterimAAMPLDistribution_20240409).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/20240409_AaveV2Ethereum_InterimAAMPLDistribution/InterimAAMPLDistribution_20240409.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[](1);
+ actionsEthereum[0] = GovV3Helpers.buildAction(
+ type(AaveV2Ethereum_InterimAAMPLDistribution_20240409).creationCode
+ );
+ payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum);
+
+ // create proposal
+ vm.startBroadcast();
+ GovV3Helpers.createProposal(
+ vm,
+ payloads,
+ GovV3Helpers.ipfsHashFile(
+ vm,
+ 'src/20240409_AaveV2Ethereum_InterimAAMPLDistribution/InterimAAMPLDistribution.md'
+ )
+ );
+ }
+}
diff --git a/src/20240409_AaveV2Ethereum_InterimAAMPLDistribution/config.ts b/src/20240409_AaveV2Ethereum_InterimAAMPLDistribution/config.ts
new file mode 100644
index 000000000..202adf67a
--- /dev/null
+++ b/src/20240409_AaveV2Ethereum_InterimAAMPLDistribution/config.ts
@@ -0,0 +1,15 @@
+import {ConfigFile} from '../../generator/types';
+export const config: ConfigFile = {
+ rootOptions: {
+ configFile: 'src/20240409_AaveV2Ethereum_MerklTest/config.ts',
+ pools: ['AaveV2Ethereum'],
+ title: 'Interim aAMPL distribution',
+ shortName: 'InterimAAMPLDistribution',
+ date: '20240409',
+ author: 'BGD Labs',
+ discussion: 'https://governance.aave.com/t/arfc-aampl-interim-distribution/17184',
+ snapshot:
+ 'https://snapshot.org/#/aave.eth/proposal/0xb7226dd6441b67225924082215f7a512bfd98252897ee43a879084e07ab53607',
+ },
+ poolOptions: {AaveV2Ethereum: {configs: {OTHERS: {}}, cache: {blockNumber: 19627195}}},
+};
diff --git a/src/20240409_AaveV2Ethereum_InterimAAMPLDistribution/distribution.pdf b/src/20240409_AaveV2Ethereum_InterimAAMPLDistribution/distribution.pdf
new file mode 100644
index 000000000..c9afd59ae
Binary files /dev/null and b/src/20240409_AaveV2Ethereum_InterimAAMPLDistribution/distribution.pdf differ
diff --git a/src/20240409_AaveV2Ethereum_InterimAAMPLDistribution/process.js b/src/20240409_AaveV2Ethereum_InterimAAMPLDistribution/process.js
new file mode 100644
index 000000000..3a4eff270
--- /dev/null
+++ b/src/20240409_AaveV2Ethereum_InterimAAMPLDistribution/process.js
@@ -0,0 +1,21 @@
+import { AaveV2Ethereum } from "@bgd-labs/aave-address-book";
+import chaos from "./chaos.json" assert { type: "json" };
+
+const processedUsers = chaos
+ .filter((f) => Math.floor(f.USDC_Per_User) !== 0)
+ .reduce((acc, f) => {
+ acc[f.Wallet] = { aAmplCompensation: Math.floor(f.USDC_Per_User) };
+ return acc;
+ }, {});
+
+const totalAmount = chaos.reduce((acc, i) => {
+ return acc + Math.floor(i.USDC_Per_User);
+}, 0);
+
+const angleJSON = {
+ rewardToken: AaveV2Ethereum.ASSETS.USDC.UNDERLYING,
+ rewards: processedUsers,
+};
+
+// console.log(totalAmount);
+console.log(JSON.stringify(angleJSON, null, 2));
diff --git a/src/20240409_AaveV3Arbitrum_WeETHArbitrumOnboarding/AaveV3Arbitrum_WeETHArbitrumOnboarding_20240409.sol b/src/20240409_AaveV3Arbitrum_WeETHArbitrumOnboarding/AaveV3Arbitrum_WeETHArbitrumOnboarding_20240409.sol
new file mode 100644
index 000000000..87e8314cc
--- /dev/null
+++ b/src/20240409_AaveV3Arbitrum_WeETHArbitrumOnboarding/AaveV3Arbitrum_WeETHArbitrumOnboarding_20240409.sol
@@ -0,0 +1,64 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {AaveV3Arbitrum, AaveV3ArbitrumEModes} from 'aave-address-book/AaveV3Arbitrum.sol';
+import {AaveV3PayloadArbitrum} from 'aave-helpers/v3-config-engine/AaveV3PayloadArbitrum.sol';
+import {EngineFlags} from 'aave-helpers/v3-config-engine/EngineFlags.sol';
+import {IAaveV3ConfigEngine} from 'aave-helpers/v3-config-engine/IAaveV3ConfigEngine.sol';
+import {IV3RateStrategyFactory} from 'aave-helpers/v3-config-engine/IV3RateStrategyFactory.sol';
+import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol';
+import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol';
+/**
+ * @title weETH Arbitrum onboarding
+ * @author @mzeller - ACI
+ * - Snapshot: direct-to-aip
+ * - Discussion: https://governance.aave.com/t/arfc-onboard-weeth-to-aave-v3-on-ethereum/16758/11
+ */
+contract AaveV3Arbitrum_WeETHArbitrumOnboarding_20240409 is AaveV3PayloadArbitrum {
+ using SafeERC20 for IERC20;
+
+ address public constant weETH = 0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe;
+ uint256 public constant weETH_SEED_AMOUNT = 0.01e18;
+
+ function _postExecute() internal override {
+ IERC20(weETH).forceApprove(address(AaveV3Arbitrum.POOL), weETH_SEED_AMOUNT);
+ AaveV3Arbitrum.POOL.supply(weETH, weETH_SEED_AMOUNT, address(AaveV3Arbitrum.COLLECTOR), 0);
+ }
+
+ function newListings() public pure override returns (IAaveV3ConfigEngine.Listing[] memory) {
+ IAaveV3ConfigEngine.Listing[] memory listings = new IAaveV3ConfigEngine.Listing[](1);
+
+ listings[0] = IAaveV3ConfigEngine.Listing({
+ asset: weETH,
+ assetSymbol: 'weETH',
+ priceFeed: 0x517276B5972C4Db7E88B9F76Ee500E888a2D73C3,
+ eModeCategory: AaveV3ArbitrumEModes.ETH_CORRELATED,
+ enabledToBorrow: EngineFlags.ENABLED,
+ stableRateModeEnabled: EngineFlags.DISABLED,
+ borrowableInIsolation: EngineFlags.DISABLED,
+ withSiloedBorrowing: EngineFlags.DISABLED,
+ flashloanable: EngineFlags.ENABLED,
+ ltv: 72_50,
+ liqThreshold: 75_00,
+ liqBonus: 7_50,
+ reserveFactor: 15_00,
+ supplyCap: 1_000,
+ borrowCap: 100,
+ debtCeiling: 0,
+ liqProtocolFee: 10_00,
+ rateStrategyParams: IV3RateStrategyFactory.RateStrategyParams({
+ optimalUsageRatio: _bpsToRay(45_00),
+ baseVariableBorrowRate: _bpsToRay(0),
+ variableRateSlope1: _bpsToRay(7_00),
+ variableRateSlope2: _bpsToRay(300_00),
+ stableRateSlope1: _bpsToRay(7_00),
+ stableRateSlope2: _bpsToRay(300_00),
+ baseStableRateOffset: _bpsToRay(2_00),
+ stableRateExcessOffset: _bpsToRay(20_00),
+ optimalStableToTotalDebtRatio: _bpsToRay(20_00)
+ })
+ });
+
+ return listings;
+ }
+}
diff --git a/src/20240409_AaveV3Arbitrum_WeETHArbitrumOnboarding/AaveV3Arbitrum_WeETHArbitrumOnboarding_20240409.t.sol b/src/20240409_AaveV3Arbitrum_WeETHArbitrumOnboarding/AaveV3Arbitrum_WeETHArbitrumOnboarding_20240409.t.sol
new file mode 100644
index 000000000..dcc6ca8ef
--- /dev/null
+++ b/src/20240409_AaveV3Arbitrum_WeETHArbitrumOnboarding/AaveV3Arbitrum_WeETHArbitrumOnboarding_20240409.t.sol
@@ -0,0 +1,42 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {GovV3Helpers} from 'aave-helpers/GovV3Helpers.sol';
+import {AaveV3Arbitrum} from 'aave-address-book/AaveV3Arbitrum.sol';
+import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol';
+
+import 'forge-std/Test.sol';
+import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/ProtocolV3TestBase.sol';
+import {AaveV3Arbitrum_WeETHArbitrumOnboarding_20240409} from './AaveV3Arbitrum_WeETHArbitrumOnboarding_20240409.sol';
+
+/**
+ * @dev Test for AaveV3Arbitrum_WeETHArbitrumOnboarding_20240409
+ * command: make test-contract filter=AaveV3Arbitrum_WeETHArbitrumOnboarding_20240409
+ */
+contract AaveV3Arbitrum_WeETHArbitrumOnboarding_20240409_Test is ProtocolV3TestBase {
+ AaveV3Arbitrum_WeETHArbitrumOnboarding_20240409 internal proposal;
+
+ function setUp() public {
+ vm.createSelectFork(vm.rpcUrl('arbitrum'), 200346777);
+ proposal = new AaveV3Arbitrum_WeETHArbitrumOnboarding_20240409();
+ }
+
+ /**
+ * @dev executes the generic test suite including e2e and config snapshots
+ */
+ function test_defaultProposalExecution() public {
+ defaultTest(
+ 'AaveV3Arbitrum_WeETHArbitrumOnboarding_20240409',
+ AaveV3Arbitrum.POOL,
+ address(proposal)
+ );
+ }
+
+ function test_collectorHasweETHFunds() public {
+ GovV3Helpers.executePayload(vm, address(proposal));
+ (address aTokenAddress, , ) = AaveV3Arbitrum
+ .AAVE_PROTOCOL_DATA_PROVIDER
+ .getReserveTokensAddresses(proposal.weETH());
+ assertGe(IERC20(aTokenAddress).balanceOf(address(AaveV3Arbitrum.COLLECTOR)), 10 ** 16);
+ }
+}
diff --git a/src/20240409_AaveV3Arbitrum_WeETHArbitrumOnboarding/WeETHArbitrumOnboarding.md b/src/20240409_AaveV3Arbitrum_WeETHArbitrumOnboarding/WeETHArbitrumOnboarding.md
new file mode 100644
index 000000000..ee84fa402
--- /dev/null
+++ b/src/20240409_AaveV3Arbitrum_WeETHArbitrumOnboarding/WeETHArbitrumOnboarding.md
@@ -0,0 +1,58 @@
+---
+title: "weETH Arbitrum onboarding"
+author: "@mzeller - ACI"
+discussions: "https://governance.aave.com/t/arfc-onboard-weeth-to-aave-v3-on-ethereum/16758/11"
+---
+
+## Simple Summary
+
+This AIP seeks to add Ether.fi Liquid Restaking Token weETH to Aave V3 Arbitrum.
+
+## Motivation
+
+eETH is an LRT that allows users to stake their ETH, accrue staking rewards, and receive additional rewards through native restaking on EigenLayer.
+
+Ether.fi has also launched eETH on Arbitrum, allowing users on the L2 to get exposure to the LRT yield and points. As weETH has already been approved for onboarding to Aave v3 Ethereum by the DAO, this proposal aims to extend the onboarding of weETH to Aave v3 Arbitrum.
+
+## Specification
+
+The table below illustrates the configured risk parameters for **weETH**
+
+| Parameter | Value |
+| ---------------------------------- | -------------------------------------------------------------------------------------------------------------------: |
+| Isolation Mode | true |
+| Borrowable | ENABLED |
+| Collateral Enabled | true |
+| Supply Cap (weETH) | 1,000 |
+| Borrow Cap (weETH) | 100 |
+| Debt Ceiling | USD 0 |
+| LTV | 72.5 % |
+| LT | 75 % |
+| 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 % |
+| Stable Borrowing | DISABLED |
+| Stable Slope1 | 7 % |
+| Stable Slope2 | 300 % |
+| Base Stable Rate Offset | 2 % |
+| Stable Rate Excess Offset | 20 % |
+| Optimal Stable To Total Debt Ratio | 20 % |
+| Flashloanable | ENABLED |
+| Siloed Borrowing | DISABLED |
+| Borrowable in Isolation | DISABLED |
+| Oracle | [0x517276B5972C4Db7E88B9F76Ee500E888a2D73C3](https://arbiscan.io/address/0x517276B5972C4Db7E88B9F76Ee500E888a2D73C3) |
+
+## References
+
+- Implementation: [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/cb2ebc8db9790d41bb20243fe74e084cf8d14e9f/src/20240409_AaveV3Arbitrum_WeETHArbitrumOnboarding/AaveV3Arbitrum_WeETHArbitrumOnboarding_20240409.sol)
+- Tests: [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/cb2ebc8db9790d41bb20243fe74e084cf8d14e9f/src/20240409_AaveV3Arbitrum_WeETHArbitrumOnboarding/AaveV3Arbitrum_WeETHArbitrumOnboarding_20240409.t.sol)
+- [Snapshot](direct-to-aip)
+- [Discussion](https://governance.aave.com/t/arfc-onboard-weeth-to-aave-v3-on-ethereum/16758/11)
+
+## Copyright
+
+Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/).
diff --git a/src/20240409_AaveV3Arbitrum_WeETHArbitrumOnboarding/WeETHArbitrumOnboarding_20240409.s.sol b/src/20240409_AaveV3Arbitrum_WeETHArbitrumOnboarding/WeETHArbitrumOnboarding_20240409.s.sol
new file mode 100644
index 000000000..fc6ae5e9f
--- /dev/null
+++ b/src/20240409_AaveV3Arbitrum_WeETHArbitrumOnboarding/WeETHArbitrumOnboarding_20240409.s.sol
@@ -0,0 +1,58 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/GovV3Helpers.sol';
+import {EthereumScript, ArbitrumScript} from 'aave-helpers/ScriptUtils.sol';
+import {AaveV3Arbitrum_WeETHArbitrumOnboarding_20240409} from './AaveV3Arbitrum_WeETHArbitrumOnboarding_20240409.sol';
+
+/**
+ * @dev Deploy Arbitrum
+ * deploy-command: make deploy-ledger contract=src/20240409_AaveV3Arbitrum_WeETHArbitrumOnboarding/WeETHArbitrumOnboarding_20240409.s.sol:DeployArbitrum chain=arbitrum
+ * verify-command: npx catapulta-verify -b broadcast/WeETHArbitrumOnboarding_20240409.s.sol/42161/run-latest.json
+ */
+contract DeployArbitrum is ArbitrumScript {
+ function run() external broadcast {
+ // deploy payloads
+ address payload0 = GovV3Helpers.deployDeterministic(
+ type(AaveV3Arbitrum_WeETHArbitrumOnboarding_20240409).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/20240409_AaveV3Arbitrum_WeETHArbitrumOnboarding/WeETHArbitrumOnboarding_20240409.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 actionsArbitrum = new IPayloadsControllerCore.ExecutionAction[](1);
+ actionsArbitrum[0] = GovV3Helpers.buildAction(
+ type(AaveV3Arbitrum_WeETHArbitrumOnboarding_20240409).creationCode
+ );
+ payloads[0] = GovV3Helpers.buildArbitrumPayload(vm, actionsArbitrum);
+
+ // create proposal
+ vm.startBroadcast();
+ GovV3Helpers.createProposal(
+ vm,
+ payloads,
+ GovV3Helpers.ipfsHashFile(
+ vm,
+ 'src/20240409_AaveV3Arbitrum_WeETHArbitrumOnboarding/WeETHArbitrumOnboarding.md'
+ )
+ );
+ }
+}
diff --git a/src/20240409_AaveV3Arbitrum_WeETHArbitrumOnboarding/config.ts b/src/20240409_AaveV3Arbitrum_WeETHArbitrumOnboarding/config.ts
new file mode 100644
index 000000000..5df64f148
--- /dev/null
+++ b/src/20240409_AaveV3Arbitrum_WeETHArbitrumOnboarding/config.ts
@@ -0,0 +1,52 @@
+import {ConfigFile} from '../../generator/types';
+export const config: ConfigFile = {
+ rootOptions: {
+ pools: ['AaveV3Arbitrum'],
+ title: 'weETH Arbitrum onboarding',
+ shortName: 'WeETHArbitrumOnboarding',
+ date: '20240409',
+ author: '@mzeller - ACI',
+ discussion: 'https://governance.aave.com/t/arfc-onboard-weeth-to-aave-v3-on-ethereum/16758/11',
+ snapshot: 'direct-to-aip',
+ },
+ poolOptions: {
+ AaveV3Arbitrum: {
+ configs: {
+ ASSET_LISTING: [
+ {
+ assetSymbol: 'weETH',
+ decimals: 18,
+ priceFeed: '0x517276B5972C4Db7E88B9F76Ee500E888a2D73C3',
+ ltv: '72.5',
+ liqThreshold: '75',
+ liqBonus: '7.5',
+ debtCeiling: '0',
+ liqProtocolFee: '10',
+ enabledToBorrow: 'ENABLED',
+ flashloanable: 'ENABLED',
+ stableRateModeEnabled: 'DISABLED',
+ borrowableInIsolation: 'DISABLED',
+ withSiloedBorrowing: 'DISABLED',
+ reserveFactor: '15',
+ supplyCap: '1000',
+ borrowCap: '100',
+ rateStrategyParams: {
+ optimalUtilizationRate: '45',
+ baseVariableBorrowRate: '0',
+ variableRateSlope1: '7',
+ variableRateSlope2: '300',
+ stableRateSlope1: '7',
+ stableRateSlope2: '300',
+ baseStableRateOffset: '2',
+ stableRateExcessOffset: '20',
+ optimalStableToTotalDebtRatio: '20',
+ },
+ eModeCategory: 'AaveV3ArbitrumEModes.ETH_CORRELATED',
+ asset: '0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe',
+ },
+ ],
+ },
+ cache: {blockNumber: 199243484},
+ },
+ },
+};