forked from bgd-labs/aave-proposals-v3
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'bgd-labs:main' into main
- Loading branch information
Showing
22 changed files
with
715 additions
and
0 deletions.
There are no files selected for viewing
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions
5
...ution_20240409_before_AaveV2Ethereum_InterimAAMPLDistribution_20240409_after.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
## Raw diff | ||
|
||
```json | ||
{} | ||
``` |
5 changes: 5 additions & 0 deletions
5
...V2Ethereum_MerklTest_20240409_before_AaveV2Ethereum_MerklTest_20240409_after.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
## Raw diff | ||
|
||
```json | ||
{} | ||
``` |
139 changes: 139 additions & 0 deletions
139
...arding_20240409_before_AaveV3Arbitrum_WeETHArbitrumOnboarding_20240409_after.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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" | ||
} | ||
} | ||
} | ||
} | ||
``` |
83 changes: 83 additions & 0 deletions
83
...eV2Ethereum_InterimAAMPLDistribution/AaveV2Ethereum_InterimAAMPLDistribution_20240409.sol
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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); | ||
} | ||
} |
50 changes: 50 additions & 0 deletions
50
...2Ethereum_InterimAAMPLDistribution/AaveV2Ethereum_InterimAAMPLDistribution_20240409.t.sol
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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()); | ||
} | ||
} |
56 changes: 56 additions & 0 deletions
56
src/20240409_AaveV2Ethereum_InterimAAMPLDistribution/InterimAAMPLDistribution.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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/). |
Oops, something went wrong.