From b579c268e591657e9f833e8f6507253540e800a1 Mon Sep 17 00:00:00 2001 From: luigy-lemon Date: Tue, 12 Mar 2024 12:59:04 +0000 Subject: [PATCH 01/15] ALC funding with 500k GHO --- .../AaveLiquidityCommiteeFunding.md | 102 ++++++++++++++ ...aveLiquidityCommiteeFunding_20240306.s.sol | 58 ++++++++ ..._AaveLiquidityCommiteeFunding_20240306.sol | 97 +++++++++++++ ...aveLiquidityCommiteeFunding_20240306.t.sol | 133 ++++++++++++++++++ .../config.ts | 15 ++ 5 files changed, 405 insertions(+) create mode 100644 src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveLiquidityCommiteeFunding.md create mode 100644 src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveLiquidityCommiteeFunding_20240306.s.sol create mode 100644 src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306.sol create mode 100644 src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306.t.sol create mode 100644 src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/config.ts diff --git a/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveLiquidityCommiteeFunding.md b/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveLiquidityCommiteeFunding.md new file mode 100644 index 000000000..2d778a548 --- /dev/null +++ b/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveLiquidityCommiteeFunding.md @@ -0,0 +1,102 @@ +--- +title: "Aave Liquidity Commitee Funding" +author: "karpatkey_TokenLogic" +discussions: "https://governance.aave.com/t/arfc-aave-liquidity-committee-funding/16793" +--- + +# Summary + +This publication proposes funding the Aave Liquidity Committee with 500k GHO to continue supporting GHO's liquidity and DeFi integrations over the next 3 months. + +# Motivation + +Since its initial [funding in October 2023](https://governance-v2.aave.com/governance/proposal/343/), the Aave Liquidity Committee (previously GLC) has actively supported GHO liquidity across various DEXes by deploying and incentivising liquidity pools. + +As a result of these efforts: + +- Deeper on-chain liquidity +- Lower slippage, especially for GHO to USDC swaps + +In combination with other efforts like stkGHO, ALC's initiatives have played a critical role in supporting GHO's peg recovery. + +Throughout the period, the ALC leveraged on both Uniswap v3 and, more frequently, Maverick to tailor liquidity distribution at specific price ranges which helped absorb GHO downward market volatility. A list of active Boosted Positions can be found [here](https://app.mav.xyz/boosted-positions?chain=1). + +While some pools are incentivised by voting with pre-existing DAO holdings (e.g. vlAURA), others like Maverick's concentrated liquidity Boosted Positions require additional expenses. It is worth noting, the Aave DAO is expected to benefit from the next airdrop by Maverick. We expect Maverick, and potentially Merkle on Uniswap v3, to remain key tools for supporting tailored liquidity shaping efforts in provided peg resilience. + +Concentrated GHO liquidity was [recently introduced in Balancer](https://twitter.com/GyroStable/status/1757365157917815001) with the creation of several E-CLP pools. These pools are being jointly incentivised with use to the Aave DAO's vlAURA holding. When there is excess vlAURA votes, these votes have been delegated to Paladin in return for approximately 70% APR nominated in USDC. + +The following charts depict some of the impact these efforts had on GHO's ecosystem, highlights: + +- GHO/USDC Maverick pools captured most of the volume + - 0.2% bin width pool processed most of the volume during high volatility period + - 0.1% bin width pool is starting to replace the 0.2% bin width pool trading volume. This is due to incentive efforts shifting to Boosted Positions within the 0.1% bin width pool to create deeper liquidity and reducing price volatility +- GHO/USDC/USDT Balancer provides continuous yield source for LP + - Trading volumes and TVL on Balancer are expected to increase when the BPT is integrated by [other protocols](https://twitter.com/Matthew_Graham_/status/1762076544241955070) and leveraged farming is introduced +- Gyrsocope E-CLP pools on Balancer are starting to capture a larger share of the market volume in recent weeks + - As the peg improves, one pool will be retained and the dual token deposit requirement will help provide resilience for the peg + +The next chapter for GHO focuses on the following key areas: + +- 1.00:1.00 peg with USD +- Reducing price volatility +- Deeper liquidity to support DeFi integrations +- Grow non stable-coin-paired liquidity pools +- Targeted liquidity distributions to support Borrow Cap increases + +These efforts will need to scale to match GHO's expected growth profile. The primary liquidity pools are to remain stable coins, and we expect to introduce other asset pairs in the future, as well as participation in the launch of various projects like [Ethena](https://app.ethena.fi/liquidity) and [f(x) Protocol's launch](https://x.com/protocol_fx/status/1762822716854354015?s=20). + +Though there is inherent uncertainty in future stable coin rates, price volatility, and upcoming opportunities for new DeFi integrations, we believe a high-level budget will look like the following: + +| Objective | Category | Budget | +| ----------------- | -------------- | -------- | +| Liquidity | Peg Resilience | 360k GHO | +| DeFi Integrations | Create Utility | 140k GHO | +| Total | | 500k GHO | + +It is important to note that this estimation excludes efforts to drive GHO liquidity or integrations beyond Ethereum. + +# Performance Indicators + +The below details some high level GHO metrics we propose tracking: + +| Description | Optimal Value | +| ------------------------------ | ---------------------------------------------------------------------------------- | +| TVL DEX Liquidity Pools | 50M | +| TVL in Utility Liquidity Pools | 15M excl. stkGHO | +| DEX Liquidity Composition | < 50% GHO (< 33% for 3pools) | +| Swap Price Impact $5M Swap | < 0.10% (GHO to USDC) | +| Annualised Peg Volatility | < 5.00% | +| Price level for > 90% time | $0.995 using [Redstone Medium Price](https://app.redstone.finance/#/app/token/GHO) | + +Please note, each of the above targets has external dependencies beyond the control of the ALC. The above table serves as a North Star for the ALC to strive towards over the next 3 months on the assumption the Borrow Cap is continually increased beyond the current 35M Bucket Size. Having measurable targets provides a clear direction and goal to achieve. + +The [stkGHO implementation](https://app.aave.com/staking), [USDe integration](https://app.ethena.fi/liquidity) and coordinated efforts to attract users to acquire GHO are all great examples of how growth initiatives drive GHO utility, adoption and have a positive impact the spot price. + +Each of the above metrics, plus more, will be shown on the TokenLogic analytics dashboard. + +# Specification + +Swap the following assets for GHO: + +- Withdraw 250k Aave V2 USDT from the collector +- Withdraw 250k Aave V2 USDC from the collector +- Swap 250k USDT withdrawn above for GHO +- Swap 250k USDC withdrawn above for GHO + +Create an allowance of 500k GHO to ALC SAFE. + +ALC SAFE: `0x205e795336610f5131Be52F09218AF19f0f3eC60` + +# Disclosure + +TokenLogic and karpatkey receive no payment for this proposal. TokenLogic and karpatkey are both delegates within the Aave community. + +# Next Steps + +1. Gather feedback from the community. +1. If consensus is reached on this ARFC, escalate this proposal to the Snapshot stage. +1. If Snapshot outcome is YAE, escalate this proposal to AIP stage + +# Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). \ No newline at end of file diff --git a/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveLiquidityCommiteeFunding_20240306.s.sol b/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveLiquidityCommiteeFunding_20240306.s.sol new file mode 100644 index 000000000..c017ce4c9 --- /dev/null +++ b/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveLiquidityCommiteeFunding_20240306.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} from 'aave-helpers/ScriptUtils.sol'; +import {AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306} from './AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20240224_Multi_FundingUpdate/FundingUpdate_20240224.s.sol:DeployEthereum chain=mainnet + * verify-command: npx catapulta-verify -b broadcast/FundingUpdate_20240224.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306).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/20240224_Multi_FundingUpdate/FundingUpdate_20240224.s.sol:CreateProposal chain=mainnet + */ +contract CreateProposal is EthereumScript { + function run() external { + // create payloads + PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](2); + + // compose actions for validation + IPayloadsControllerCore.ExecutionAction[] + memory actionsEthereum = new IPayloadsControllerCore.ExecutionAction[](1); + actionsEthereum[0] = GovV3Helpers.buildAction( + type(AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/FundingUpdate.md' + ) + ); + } +} \ No newline at end of file diff --git a/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306.sol b/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306.sol new file mode 100644 index 000000000..3e0b627fa --- /dev/null +++ b/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306.sol @@ -0,0 +1,97 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {console2} from 'forge-std/Test.sol'; + +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol'; +import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {AaveV2Ethereum, AaveV2EthereumAssets} from 'aave-address-book/AaveV2Ethereum.sol'; +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveSwapper} from 'aave-helpers/swaps/AaveSwapper.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/interfaces/IProposalGenericExecutor.sol'; + +/** + * @title Funding Update + * @author karpatkey_TokenLogic + * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x4dd4dff7096bf7ab8c4c071975d40f4cf709c41b4b6b7c60777a6dd50d2ecd09 + * - Discussion: https://governance.aave.com/t/arfc-funding-update/16675 + */ +contract AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306 is IProposalGenericExecutor { + using SafeERC20 for IERC20; + + AaveSwapper public constant SWAPPER = AaveSwapper(MiscEthereum.AAVE_SWAPPER); + address public constant ALC_SAFE = 0x205e795336610f5131Be52F09218AF19f0f3eC60; + + address public constant MILKMAN = 0x11C76AD590ABDFFCD980afEC9ad951B160F02797; + address public constant PRICE_CHECKER = 0xe80a1C615F75AFF7Ed8F08c9F21f9d00982D666c; + + address public constant GHO_USD_FEED = 0x3f12643D3f6f874d39C2a4c9f2Cd6f2DbAC877FC; + + uint256 public constant USDC_V2_TO_SWAP = 250_000e6; + uint256 public constant USDT_V2_TO_SWAP = 250_000e6; + + uint256 public constant GHO_ALLOWANCE = 500_000 ether; + + function execute() external { + // Swap 250k USDC and USDT to GHO - Intent + _swap(); + + // Authorize ALC to transfer 500k GHO from the COLLECTOR + AaveV3Ethereum.COLLECTOR.approve(AaveV3EthereumAssets.GHO_UNDERLYING, ALC_SAFE, GHO_ALLOWANCE); + } + + function _swap() internal { + // Withdraw Aave V2 USDC & Transfer to SWAPPER & swap for GHO + + AaveV3Ethereum.COLLECTOR.transfer( + AaveV2EthereumAssets.USDC_A_TOKEN, + address(this), + USDC_V2_TO_SWAP + ); + + AaveV2Ethereum.POOL.withdraw( + AaveV2EthereumAssets.USDC_UNDERLYING, + type(uint256).max, + address(SWAPPER) + ); + + SWAPPER.swap( + MILKMAN, + PRICE_CHECKER, + AaveV3EthereumAssets.USDC_UNDERLYING, + AaveV3EthereumAssets.GHO_UNDERLYING, + AaveV3EthereumAssets.USDC_ORACLE, + GHO_USD_FEED, + address(AaveV3Ethereum.COLLECTOR), + USDC_V2_TO_SWAP, + 100 + ); + + // Withdraw Aave V2 USDT & Transfer to SWAPPER & swap for GHO + + AaveV3Ethereum.COLLECTOR.transfer( + AaveV2EthereumAssets.USDT_A_TOKEN, + address(this), + USDT_V2_TO_SWAP + ); + + AaveV2Ethereum.POOL.withdraw( + AaveV2EthereumAssets.USDT_UNDERLYING, + type(uint256).max, + address(SWAPPER) + ); + + SWAPPER.swap( + MILKMAN, + PRICE_CHECKER, + AaveV3EthereumAssets.USDT_UNDERLYING, + AaveV3EthereumAssets.GHO_UNDERLYING, + AaveV3EthereumAssets.USDT_ORACLE, + GHO_USD_FEED, + address(AaveV3Ethereum.COLLECTOR), + USDT_V2_TO_SWAP, + 100 + ); + } +} \ No newline at end of file diff --git a/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306.t.sol b/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306.t.sol new file mode 100644 index 000000000..1e746c09e --- /dev/null +++ b/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306.t.sol @@ -0,0 +1,133 @@ +// 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 {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/ProtocolV3TestBase.sol'; + +import {AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306} from './AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306.sol'; + +/** + * @dev Test for AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306 + * command: make test-contract filter=AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306 + */ +contract AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306_Test is ProtocolV3TestBase { + event SwapRequested( + address milkman, + address indexed fromToken, + address indexed toToken, + address fromOracle, + address toOracle, + uint256 amount, + address indexed recipient, + uint256 slippage + ); + + event Transfer(address indexed from, address indexed to, uint256 value); + + AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306 internal proposal; + + address swapper; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 19392386); + proposal = new AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306(); + swapper = address(proposal.SWAPPER()); + } + + function test_execution() public { + uint256 initialBalanceGHO = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + assertGe(initialBalanceGHO, 0, 'Collector has 0 GHO'); + + uint256 initialAllowanceGHO = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).allowance( + address(AaveV3Ethereum.COLLECTOR), + proposal.ALC_SAFE() + ); + assertEq(initialAllowanceGHO, 0); + + uint256 initialBalanceAUSDC = IERC20(AaveV2EthereumAssets.USDC_A_TOKEN).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + uint256 initialBalanceAUSDT = IERC20(AaveV2EthereumAssets.USDT_A_TOKEN).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + + assertGe(initialBalanceAUSDT, proposal.USDT_V2_TO_SWAP(), 'Not enough aUSDT to Withdraw'); + assertGe(initialBalanceAUSDC, proposal.USDC_V2_TO_SWAP(), 'Not enough aUSDC to Withdraw'); + + _expectEmits(); + + executePayload(vm, address(proposal)); + + assertEq( + IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).allowance( + address(AaveV3Ethereum.COLLECTOR), + proposal.ALC_SAFE() + ), + proposal.GHO_ALLOWANCE() + ); + + uint256 finalBalanceAUSDC = IERC20(AaveV2EthereumAssets.USDC_A_TOKEN).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + uint256 finalBalanceAUSDT = IERC20(AaveV2EthereumAssets.USDT_A_TOKEN).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + + assertGe( + finalBalanceAUSDC, + initialBalanceAUSDC - proposal.USDC_V2_TO_SWAP(), + 'Did not transfer withdrawn balance' + ); + + assertGe( + finalBalanceAUSDT, + initialBalanceAUSDT - proposal.USDT_V2_TO_SWAP(), + 'Did not transfer withdrawn balance' + ); + } + + function _expectEmits() internal { + vm.expectEmit(true, true, true, true, AaveV3EthereumAssets.USDC_UNDERLYING); + emit Transfer( + address(AaveV2EthereumAssets.USDC_A_TOKEN), + address(MiscEthereum.AAVE_SWAPPER), + proposal.USDC_V2_TO_SWAP() + ); + + vm.expectEmit(true, true, true, true, MiscEthereum.AAVE_SWAPPER); + emit SwapRequested( + proposal.MILKMAN(), + AaveV3EthereumAssets.USDC_UNDERLYING, + AaveV3EthereumAssets.GHO_UNDERLYING, + AaveV3EthereumAssets.USDC_ORACLE, + proposal.GHO_USD_FEED(), + proposal.USDC_V2_TO_SWAP(), + address(AaveV3Ethereum.COLLECTOR), + 100 + ); + + vm.expectEmit(true, true, true, true, AaveV3EthereumAssets.USDT_UNDERLYING); + emit Transfer( + address(AaveV2EthereumAssets.USDT_A_TOKEN), + address(MiscEthereum.AAVE_SWAPPER), + proposal.USDC_V2_TO_SWAP() + ); + + vm.expectEmit(true, true, true, true, MiscEthereum.AAVE_SWAPPER); + emit SwapRequested( + proposal.MILKMAN(), + AaveV3EthereumAssets.USDT_UNDERLYING, + AaveV3EthereumAssets.GHO_UNDERLYING, + AaveV3EthereumAssets.USDT_ORACLE, + proposal.GHO_USD_FEED(), + proposal.USDT_V2_TO_SWAP(), + address(AaveV3Ethereum.COLLECTOR), + 100 + ); + } +} \ No newline at end of file diff --git a/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/config.ts b/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/config.ts new file mode 100644 index 000000000..d1ccb25d8 --- /dev/null +++ b/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/config.ts @@ -0,0 +1,15 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3Ethereum'], + title: 'Aave Liquidity Commitee Funding', + shortName: 'ALCFunding', + date: '20240306', + author: 'karpatkey_TokenLogic', + discussion: 'https://governance.aave.com/t/arfc-aave-liquidity-committee-funding/16793', + snapshot: '', + }, + poolOptions: { + AaveV3Ethereum: {configs: {OTHERS: {}}, cache: {blockNumber: 19376619}}, + }, +}; \ No newline at end of file From fb272d7b8174809b2e6988fe46629aba2c4db87b Mon Sep 17 00:00:00 2001 From: luigy Date: Thu, 14 Mar 2024 09:41:33 +0000 Subject: [PATCH 02/15] basic fixes --- .../AaveLiquidityCommiteeFunding.md | 15 ++++++++------- .../AaveLiquidityCommiteeFunding_20240306.s.sol | 4 ++-- ...reum_AaveLiquidityCommiteeFunding_20240306.sol | 8 +++----- ...um_AaveLiquidityCommiteeFunding_20240306.t.sol | 4 ++-- 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveLiquidityCommiteeFunding.md b/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveLiquidityCommiteeFunding.md index 2d778a548..8b3ff00df 100644 --- a/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveLiquidityCommiteeFunding.md +++ b/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveLiquidityCommiteeFunding.md @@ -87,16 +87,17 @@ Create an allowance of 500k GHO to ALC SAFE. ALC SAFE: `0x205e795336610f5131Be52F09218AF19f0f3eC60` -# Disclosure +## References -TokenLogic and karpatkey receive no payment for this proposal. TokenLogic and karpatkey are both delegates within the Aave community. +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/1c642cb090ba92717b6e99442b6904b6945b6993/src/20240304_AaveV2Ethereum_EthereumV2ReserveFactorAdjustment/AaveV2Ethereum_EthereumV2ReserveFactorAdjustment_20240304.sol) +- Tests: [AaveV3Ethereum]() +- [Snapshot](https://snapshot.org/#/aave.eth/proposal/0xd6229e068e755336339bd8a314136e18ef00b22a95430476b6fa3665e9300548) +- [Discussion](https://governance.aave.com/t/arfc-aave-liquidity-committee-funding/16793) -# Next Steps +# Disclosure -1. Gather feedback from the community. -1. If consensus is reached on this ARFC, escalate this proposal to the Snapshot stage. -1. If Snapshot outcome is YAE, escalate this proposal to AIP stage +TokenLogic and karpatkey receive no payment for this proposal. TokenLogic and karpatkey are both delegates within the Aave community. # Copyright -Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). \ No newline at end of file +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveLiquidityCommiteeFunding_20240306.s.sol b/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveLiquidityCommiteeFunding_20240306.s.sol index c017ce4c9..5f70e7163 100644 --- a/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveLiquidityCommiteeFunding_20240306.s.sol +++ b/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveLiquidityCommiteeFunding_20240306.s.sol @@ -51,8 +51,8 @@ contract CreateProposal is EthereumScript { payloads, GovV3Helpers.ipfsHashFile( vm, - 'src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/FundingUpdate.md' + 'src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaaveLiquidityCommunityFunding.md' ) ); } -} \ No newline at end of file +} diff --git a/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306.sol b/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306.sol index 3e0b627fa..c2b92e1fc 100644 --- a/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306.sol +++ b/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306.sol @@ -1,8 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {console2} from 'forge-std/Test.sol'; - import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol'; import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; @@ -64,7 +62,7 @@ contract AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306 is IProposalGeneri AaveV3EthereumAssets.USDC_ORACLE, GHO_USD_FEED, address(AaveV3Ethereum.COLLECTOR), - USDC_V2_TO_SWAP, + IERC20(AaveV2EthereumAssets.USDC_UNDERLYING).balanceOf(address(SWAPPER)), 100 ); @@ -90,8 +88,8 @@ contract AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306 is IProposalGeneri AaveV3EthereumAssets.USDT_ORACLE, GHO_USD_FEED, address(AaveV3Ethereum.COLLECTOR), - USDT_V2_TO_SWAP, + IERC20(AaveV2EthereumAssets.USDT_UNDERLYING).balanceOf(address(SWAPPER)), 100 ); } -} \ No newline at end of file +} diff --git a/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306.t.sol b/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306.t.sol index 1e746c09e..9698b5d10 100644 --- a/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306.t.sol +++ b/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306.t.sol @@ -32,7 +32,7 @@ contract AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306_Test is ProtocolV3 address swapper; function setUp() public { - vm.createSelectFork(vm.rpcUrl('mainnet'), 19392386); + vm.createSelectFork(vm.rpcUrl('mainnet'), 19432086); proposal = new AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306(); swapper = address(proposal.SWAPPER()); } @@ -130,4 +130,4 @@ contract AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306_Test is ProtocolV3 100 ); } -} \ No newline at end of file +} From a2f028e56f81a6e4fe9afd6466eff37e7602f65d Mon Sep 17 00:00:00 2001 From: luigy Date: Thu, 14 Mar 2024 09:50:17 +0000 Subject: [PATCH 03/15] adjusting md file --- .../AaveLiquidityCommiteeFunding.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveLiquidityCommiteeFunding.md b/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveLiquidityCommiteeFunding.md index 8b3ff00df..0b2e4b708 100644 --- a/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveLiquidityCommiteeFunding.md +++ b/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveLiquidityCommiteeFunding.md @@ -89,8 +89,8 @@ ALC SAFE: `0x205e795336610f5131Be52F09218AF19f0f3eC60` ## References -- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/1c642cb090ba92717b6e99442b6904b6945b6993/src/20240304_AaveV2Ethereum_EthereumV2ReserveFactorAdjustment/AaveV2Ethereum_EthereumV2ReserveFactorAdjustment_20240304.sol) -- Tests: [AaveV3Ethereum]() +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/fb272d7b8174809b2e6988fe46629aba2c4db87b/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/fb272d7b8174809b2e6988fe46629aba2c4db87b/src/20240306_AaveV3Ethereum_AaveLiquidityCommiteeFunding/AaveV3Ethereum_AaveLiquidityCommiteeFunding_20240306.t.sol) - [Snapshot](https://snapshot.org/#/aave.eth/proposal/0xd6229e068e755336339bd8a314136e18ef00b22a95430476b6fa3665e9300548) - [Discussion](https://governance.aave.com/t/arfc-aave-liquidity-committee-funding/16793) From bfa3add3951e68a1d3a5e308b8b8e341a27a2199 Mon Sep 17 00:00:00 2001 From: luigy Date: Fri, 15 Mar 2024 15:31:35 +0000 Subject: [PATCH 04/15] init commit --- lib/aave-helpers | 2 +- .../ARBRemoveIsolation.md | 0 ...Arbitrum_ARBRemoveIsolation_20240315.s.sol | 0 ...V3Arbitrum_ARBRemoveIsolation_20240315.sol | 23 +++++++++++++++++++ ...Arbitrum_ARBRemoveIsolation_20240315.t.sol | 0 .../config.ts | 14 +++++++++++ 6 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/ARBRemoveIsolation.md create mode 100644 src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.s.sol create mode 100644 src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.sol create mode 100644 src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.t.sol create mode 100644 src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/config.ts diff --git a/lib/aave-helpers b/lib/aave-helpers index f429c55b9..1daafea0e 160000 --- a/lib/aave-helpers +++ b/lib/aave-helpers @@ -1 +1 @@ -Subproject commit f429c55b999c8cff5333e239cc5aec2c551e15fe +Subproject commit 1daafea0e7f7baafa82d2b386e284e3850abf048 diff --git a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/ARBRemoveIsolation.md b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/ARBRemoveIsolation.md new file mode 100644 index 000000000..e69de29bb diff --git a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.s.sol b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.s.sol new file mode 100644 index 000000000..e69de29bb diff --git a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.sol b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.sol new file mode 100644 index 000000000..9313bf6f1 --- /dev/null +++ b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {AaveV3Arbitrum, AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/interfaces/IProposalGenericExecutor.sol'; + +/** + * @title ARB Remove Isolation Mode + * @author karpatkey_TokenLogic_ACI + * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0xbc5471496bbc2beda343625cee22c34fc9672785112cc5d19a25ca87c5b422c3 + * - Discussion: https://governance.aave.com/t/arfc-remove-arb-from-isolation-mode-on-arbitrum-market/16703 + */ +contract AaveV3Arbitrum_ARBRemoveIsolation_20240315 is IProposalGenericExecutor { + function execute() external { + AaveV3Arbitrum.COLLECTOR.transfer( + AaveV3ArbitrumAssets.ARB_UNDERLYING, + SAFE, + IERC20(AaveV3ArbitrumAssets.ARB_UNDERLYING).balanceOf(address(AaveV3Arbitrum.COLLECTOR)) + ); + } +} diff --git a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.t.sol b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.t.sol new file mode 100644 index 000000000..e69de29bb diff --git a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/config.ts b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/config.ts new file mode 100644 index 000000000..48405f590 --- /dev/null +++ b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/config.ts @@ -0,0 +1,14 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3Arbitrum'], + title: 'Aave Protocol Embassy', + shortName: 'AaveProtocolEmbassy', + date: '20240220', + author: 'karpatkey_TokenLogic_ACI', + discussion: + 'https://governance.aave.com/t/arfc-establishing-the-aave-protocol-embassy-ape/16445', + snapshot: 'https://governance.aave.com/t/arfc-establishing-the-aave-protocol-embassy-ape/16445', + }, + poolOptions: {AaveV3Arbitrum: {configs: {OTHERS: {}}, cache: {blockNumber: 182860683}}}, +}; From 21c5f7b27c39cb6e6c9946201bfc3ba1c68fc3c0 Mon Sep 17 00:00:00 2001 From: luigy Date: Fri, 15 Mar 2024 16:35:38 +0000 Subject: [PATCH 05/15] debt ceiling 0 --- .../ARBRemoveIsolation.md | 39 +++++++++++++++ ...V3Arbitrum_ARBRemoveIsolation_20240315.sol | 7 +-- ...Arbitrum_ARBRemoveIsolation_20240315.t.sol | 48 +++++++++++++++++++ 3 files changed, 89 insertions(+), 5 deletions(-) diff --git a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/ARBRemoveIsolation.md b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/ARBRemoveIsolation.md index e69de29bb..00f777541 100644 --- a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/ARBRemoveIsolation.md +++ b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/ARBRemoveIsolation.md @@ -0,0 +1,39 @@ +--- +title: "Aave Protocol Embassy" +author: "karpatkey_TokenLogic_ACI" +discussions: "https://governance.aave.com/t/arfc-remove-arb-from-isolation-mode-on-arbitrum-market/16703" +snapshot: "https://snapshot.org/#/aave.eth/proposal/0xbc5471496bbc2beda343625cee22c34fc9672785112cc5d19a25ca87c5b422c3" +--- + +## Summary + +This publication proposes disabling Isolation Mode for ARB on Aave v3 Arbitrum. + +## Motivation + +Since the ARB airdrop, April 2023, the Arbitrum ecosystem has experienced exponential like growth and the ARB liquidity has improved significantly. + +With the support of the Risk Service providers, this proposal is to disable Isolation Mode and enable ARB to be used in combination with other assets as collateral. + +## Specification: + +Ticker: ARB +Contract Adress: 0x912CE59144191C1204E64559FE8253a0e49E6548 4 +Chainlink Oracle: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 2 + +Risk parameters can be proposed by Risk Service providers. + +## Disclaimer: + +TokenLogic and karpatkey receive no payment for this proposal. TokenLogic and karpatkey are both delegates within the Aave community. + +## References + +- Implementation: [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315) +- Tests: [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.sol) +- [Snapshot](https://snapshot.org/#/aave.eth/proposal/0xbc5471496bbc2beda343625cee22c34fc9672785112cc5d19a25ca87c5b422c3) +- [Discussion](https://governance.aave.com/t/arfc-remove-arb-from-isolation-mode-on-arbitrum-market/16703) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.sol b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.sol index 9313bf6f1..6980d293e 100644 --- a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.sol +++ b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.sol @@ -14,10 +14,7 @@ import {IProposalGenericExecutor} from 'aave-helpers/interfaces/IProposalGeneric */ contract AaveV3Arbitrum_ARBRemoveIsolation_20240315 is IProposalGenericExecutor { function execute() external { - AaveV3Arbitrum.COLLECTOR.transfer( - AaveV3ArbitrumAssets.ARB_UNDERLYING, - SAFE, - IERC20(AaveV3ArbitrumAssets.ARB_UNDERLYING).balanceOf(address(AaveV3Arbitrum.COLLECTOR)) - ); + // set debtCeiling to 0 exits isolation Mode + AaveV3Arbitrum.POOL_CONFIGURATOR.setDebtCeiling(AaveV3ArbitrumAssets.ARB_UNDERLYING, 0); } } diff --git a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.t.sol b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.t.sol index e69de29bb..9da440428 100644 --- a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.t.sol +++ b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.t.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import {AaveV3Arbitrum} from 'aave-address-book/AaveV3Arbitrum.sol'; + +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {AaveV3Arbitrum, AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/ProtocolV3TestBase.sol'; +import {DataTypes} from 'aave-v3-core/contracts/protocol/libraries/types/DataTypes.sol'; + +import {AaveV3Arbitrum_ARBRemoveIsolation_20240315} from './AaveV3Arbitrum_ARBRemoveIsolation_20240315.sol'; + +/** + * @dev Test for AaveV3Arbitrum_ARBRemoveIsolation_20240315 + * command: make test-contract filter=AaveV3Arbitrum_ARBRemoveIsolation_20240315 + */ +contract AaveV3Arbitrum_ARBRemoveIsolation_20240315_Test is ProtocolV3TestBase { + AaveV3Arbitrum_ARBRemoveIsolation_20240315 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('arbitrum'), 190684329); + proposal = new AaveV3Arbitrum_ARBRemoveIsolation_20240315(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + uint256 iCeiling = AaveV3Arbitrum.AAVE_PROTOCOL_DATA_PROVIDER.getDebtCeiling( + AaveV3ArbitrumAssets.ARB_UNDERLYING + ); + assertGt(iCeiling, 0, 'Ceiling already at 0'); + + executePayload(vm, address(proposal)); + + uint256 pCeiling = AaveV3Arbitrum.AAVE_PROTOCOL_DATA_PROVIDER.getDebtCeiling( + AaveV3ArbitrumAssets.ARB_UNDERLYING + ); + DataTypes.ReserveData memory data = AaveV3Arbitrum.POOL.getReserveData( + AaveV3ArbitrumAssets.ARB_UNDERLYING + ); + + assertEq(pCeiling, 0, 'Ceiling not updated to 0'); + assertEq(data.isolationModeTotalDebt, 0, 'IsolationMode total Debt not 0'); + //0x912CE59144191C1204E64559FE8253a0e49E6548 + } +} From 474cdbbed2bc18be56f38abffa08abaf16a2fae5 Mon Sep 17 00:00:00 2001 From: luigy Date: Sun, 17 Mar 2024 19:18:35 +0000 Subject: [PATCH 06/15] tests and script --- ...itrum_ARBRemoveIsolation_20240315_after.md | 25 ++++++++ .../ARBRemoveIsolation.md | 2 +- ...Arbitrum_ARBRemoveIsolation_20240315.s.sol | 58 +++++++++++++++++++ ...Arbitrum_ARBRemoveIsolation_20240315.t.sol | 28 ++++++--- 4 files changed, 103 insertions(+), 10 deletions(-) create mode 100644 diffs/AaveV3Arbitrum_ARBRemoveIsolation_20240315_before_AaveV3Arbitrum_ARBRemoveIsolation_20240315_after.md diff --git a/diffs/AaveV3Arbitrum_ARBRemoveIsolation_20240315_before_AaveV3Arbitrum_ARBRemoveIsolation_20240315_after.md b/diffs/AaveV3Arbitrum_ARBRemoveIsolation_20240315_before_AaveV3Arbitrum_ARBRemoveIsolation_20240315_after.md new file mode 100644 index 000000000..1b5e79571 --- /dev/null +++ b/diffs/AaveV3Arbitrum_ARBRemoveIsolation_20240315_before_AaveV3Arbitrum_ARBRemoveIsolation_20240315_after.md @@ -0,0 +1,25 @@ +## Reserve changes + +### Reserves altered + +#### ARB ([0x912CE59144191C1204E64559FE8253a0e49E6548](https://arbiscan.io/address/0x912CE59144191C1204E64559FE8253a0e49E6548)) + +| description | value before | value after | +| --- | --- | --- | +| debtCeiling | 14,000,000 $ | 0 $ | + + +## Raw diff + +```json +{ + "reserves": { + "0x912CE59144191C1204E64559FE8253a0e49E6548": { + "debtCeiling": { + "from": 1400000000, + "to": 0 + } + } + } +} +``` \ No newline at end of file diff --git a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/ARBRemoveIsolation.md b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/ARBRemoveIsolation.md index 00f777541..7fe2754f8 100644 --- a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/ARBRemoveIsolation.md +++ b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/ARBRemoveIsolation.md @@ -1,5 +1,5 @@ --- -title: "Aave Protocol Embassy" +title: "Remove ARB from Isolation Mode on Arbitrum" author: "karpatkey_TokenLogic_ACI" discussions: "https://governance.aave.com/t/arfc-remove-arb-from-isolation-mode-on-arbitrum-market/16703" snapshot: "https://snapshot.org/#/aave.eth/proposal/0xbc5471496bbc2beda343625cee22c34fc9672785112cc5d19a25ca87c5b422c3" diff --git a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.s.sol b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.s.sol index e69de29bb..9e204e556 100644 --- a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.s.sol +++ b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.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 {ArbitrumScript, EthereumScript} from 'aave-helpers/ScriptUtils.sol'; +import {AaveV3Arbitrum_ARBRemoveIsolation_20240315} from './AaveV3Arbitrum_ARBRemoveIsolation_20240315.sol'; + +/** + * @dev Deploy Arbitrum + * deploy-command: make deploy-ledger contract=src/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.s.sol:DeployArbitrum chain=arbitrum + * verify-command: npx catapulta-verify -b broadcast/AaveV3Arbitrum_ARBRemoveIsolation_20240315.s.sol/1/run-latest.json + */ +contract DeployArbitrum is ArbitrumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Arbitrum_ARBRemoveIsolation_20240315).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/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.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_ARBRemoveIsolation_20240315).creationCode + ); + payloads[0] = GovV3Helpers.buildArbitrumPayload(vm, actionsArbitrum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/ARBRemoveIsolation.md' + ) + ); + } +} diff --git a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.t.sol b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.t.sol index 9da440428..e6e432dce 100644 --- a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.t.sol +++ b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.t.sol @@ -3,12 +3,10 @@ pragma solidity ^0.8.0; import {AaveV3Arbitrum} from 'aave-address-book/AaveV3Arbitrum.sol'; - import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; import {AaveV3Arbitrum, AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol'; import {ProtocolV3TestBase} from 'aave-helpers/ProtocolV3TestBase.sol'; import {DataTypes} from 'aave-v3-core/contracts/protocol/libraries/types/DataTypes.sol'; - import {AaveV3Arbitrum_ARBRemoveIsolation_20240315} from './AaveV3Arbitrum_ARBRemoveIsolation_20240315.sol'; /** @@ -19,30 +17,42 @@ contract AaveV3Arbitrum_ARBRemoveIsolation_20240315_Test is ProtocolV3TestBase { AaveV3Arbitrum_ARBRemoveIsolation_20240315 internal proposal; function setUp() public { - vm.createSelectFork(vm.rpcUrl('arbitrum'), 190684329); + vm.createSelectFork(vm.rpcUrl('arbitrum')); proposal = new AaveV3Arbitrum_ARBRemoveIsolation_20240315(); } + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Arbitrum_ARBRemoveIsolation_20240315', + AaveV3Arbitrum.POOL, + address(proposal) + ); + } + /** * @dev executes the generic test suite including e2e and config snapshots */ - function test_defaultProposalExecution() public { - uint256 iCeiling = AaveV3Arbitrum.AAVE_PROTOCOL_DATA_PROVIDER.getDebtCeiling( + function test_removalFromIsolation() public { + uint iCeiling = AaveV3Arbitrum.AAVE_PROTOCOL_DATA_PROVIDER.getDebtCeiling( AaveV3ArbitrumAssets.ARB_UNDERLYING ); + DataTypes.ReserveData memory iData = AaveV3Arbitrum.POOL.getReserveData( + AaveV3ArbitrumAssets.ARB_UNDERLYING + ); + assertGt(iCeiling, 0, 'Ceiling already at 0'); + assertGt(iData.isolationModeTotalDebt, 0, 'IsolationMode total Debt not 0'); executePayload(vm, address(proposal)); - uint256 pCeiling = AaveV3Arbitrum.AAVE_PROTOCOL_DATA_PROVIDER.getDebtCeiling( + uint pCeiling = AaveV3Arbitrum.AAVE_PROTOCOL_DATA_PROVIDER.getDebtCeiling( AaveV3ArbitrumAssets.ARB_UNDERLYING ); - DataTypes.ReserveData memory data = AaveV3Arbitrum.POOL.getReserveData( + DataTypes.ReserveData memory pData = AaveV3Arbitrum.POOL.getReserveData( AaveV3ArbitrumAssets.ARB_UNDERLYING ); assertEq(pCeiling, 0, 'Ceiling not updated to 0'); - assertEq(data.isolationModeTotalDebt, 0, 'IsolationMode total Debt not 0'); - //0x912CE59144191C1204E64559FE8253a0e49E6548 + assertEq(pData.isolationModeTotalDebt, 0, 'IsolationMode total Debt not 0'); } } From a4c1ca13c083a3de70bfa271d7319ad357552bb8 Mon Sep 17 00:00:00 2001 From: luigy Date: Sun, 17 Mar 2024 19:28:03 +0000 Subject: [PATCH 07/15] update config and test block --- ...AaveV3Arbitrum_ARBRemoveIsolation_20240315.t.sol | 2 +- .../config.ts | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.t.sol b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.t.sol index e6e432dce..67792b8b6 100644 --- a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.t.sol +++ b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.t.sol @@ -17,7 +17,7 @@ contract AaveV3Arbitrum_ARBRemoveIsolation_20240315_Test is ProtocolV3TestBase { AaveV3Arbitrum_ARBRemoveIsolation_20240315 internal proposal; function setUp() public { - vm.createSelectFork(vm.rpcUrl('arbitrum')); + vm.createSelectFork(vm.rpcUrl('arbitrum'), 191404560); proposal = new AaveV3Arbitrum_ARBRemoveIsolation_20240315(); } diff --git a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/config.ts b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/config.ts index 48405f590..9b2082d62 100644 --- a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/config.ts +++ b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/config.ts @@ -2,13 +2,14 @@ import {ConfigFile} from '../../generator/types'; export const config: ConfigFile = { rootOptions: { pools: ['AaveV3Arbitrum'], - title: 'Aave Protocol Embassy', - shortName: 'AaveProtocolEmbassy', - date: '20240220', + title: 'Remove ARB from Isolation Mode on Arbitrum', + shortName: 'ARBRemoveIsolation', + date: '20240315', author: 'karpatkey_TokenLogic_ACI', discussion: - 'https://governance.aave.com/t/arfc-establishing-the-aave-protocol-embassy-ape/16445', - snapshot: 'https://governance.aave.com/t/arfc-establishing-the-aave-protocol-embassy-ape/16445', + 'https://governance.aave.com/t/arfc-remove-arb-from-isolation-mode-on-arbitrum-market/16703', + snapshot: + 'https://snapshot.org/#/aave.eth/proposal/0xbc5471496bbc2beda343625cee22c34fc9672785112cc5d19a25ca87c5b422c3', }, - poolOptions: {AaveV3Arbitrum: {configs: {OTHERS: {}}, cache: {blockNumber: 182860683}}}, + poolOptions: {AaveV3Arbitrum: {configs: {OTHERS: {}}, cache: {blockNumber: 191404560}}}, }; From 308ca145f16bf605286cb2bd7d211304a4f53bb2 Mon Sep 17 00:00:00 2001 From: efecarranza Date: Mon, 18 Mar 2024 08:48:33 -0400 Subject: [PATCH 08/15] chore: update links --- .../ARBRemoveIsolation.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/ARBRemoveIsolation.md b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/ARBRemoveIsolation.md index 7fe2754f8..afdbc75e3 100644 --- a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/ARBRemoveIsolation.md +++ b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/ARBRemoveIsolation.md @@ -18,8 +18,8 @@ With the support of the Risk Service providers, this proposal is to disable Isol ## Specification: Ticker: ARB -Contract Adress: 0x912CE59144191C1204E64559FE8253a0e49E6548 4 -Chainlink Oracle: 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6 2 +Contract Adress: [0x912CE59144191C1204E64559FE8253a0e49E6548](https://arbiscan.io/address/0x912CE59144191C1204E64559FE8253a0e49E6548) +Chainlink Oracle: [0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6](https://arbiscan.io/address/0x912CE59144191C1204E64559FE8253a0e49E6548) Risk parameters can be proposed by Risk Service providers. From 351b516ca4e8204862509ea4513117dc9df11b9b Mon Sep 17 00:00:00 2001 From: efecarranza Date: Thu, 21 Mar 2024 11:39:32 -0400 Subject: [PATCH 09/15] forge install: aave-helpers v2.3.0 --- .gitmodules | 3 +++ lib/aave-helpers | 1 + 2 files changed, 4 insertions(+) create mode 160000 lib/aave-helpers diff --git a/.gitmodules b/.gitmodules index e69de29bb..f7316a1d6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib/aave-helpers"] + path = lib/aave-helpers + url = https://github.com/bgd-labs/aave-helpers diff --git a/lib/aave-helpers b/lib/aave-helpers new file mode 160000 index 000000000..7b4decf9c --- /dev/null +++ b/lib/aave-helpers @@ -0,0 +1 @@ +Subproject commit 7b4decf9c3d89452b8b5f478eb0e5f799f695086 From 464e6156dcfafceb3beb4d795a99a41bcf79510d Mon Sep 17 00:00:00 2001 From: efecarranza Date: Thu, 21 Mar 2024 11:46:13 -0400 Subject: [PATCH 10/15] feat: PR updates with right links --- .../ARBRemoveIsolation.md | 4 ++-- .../AaveV3Arbitrum_ARBRemoveIsolation_20240315.sol | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/ARBRemoveIsolation.md b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/ARBRemoveIsolation.md index afdbc75e3..67c77be5f 100644 --- a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/ARBRemoveIsolation.md +++ b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/ARBRemoveIsolation.md @@ -18,8 +18,8 @@ With the support of the Risk Service providers, this proposal is to disable Isol ## Specification: Ticker: ARB -Contract Adress: [0x912CE59144191C1204E64559FE8253a0e49E6548](https://arbiscan.io/address/0x912CE59144191C1204E64559FE8253a0e49E6548) -Chainlink Oracle: [0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6](https://arbiscan.io/address/0x912CE59144191C1204E64559FE8253a0e49E6548) +Contract Address: [0x912CE59144191C1204E64559FE8253a0e49E6548](https://arbiscan.io/address/0x912CE59144191C1204E64559FE8253a0e49E6548) +Chainlink Oracle: [0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6](https://arbiscan.io/address/0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6) Risk parameters can be proposed by Risk Service providers. diff --git a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.sol b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.sol index 6980d293e..a7cb622ba 100644 --- a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.sol +++ b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.0; -import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; import {AaveV3Arbitrum, AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol'; import {IProposalGenericExecutor} from 'aave-helpers/interfaces/IProposalGenericExecutor.sol'; From 9f2721bf306902f0d0e21c78da877519f3114fd1 Mon Sep 17 00:00:00 2001 From: efecarranza Date: Mon, 25 Mar 2024 10:14:42 -0400 Subject: [PATCH 11/15] forge install: aave-helpers v2.3.0 --- .gitmodules | 3 +++ lib/aave-helpers | 1 + 2 files changed, 4 insertions(+) create mode 160000 lib/aave-helpers diff --git a/.gitmodules b/.gitmodules index e69de29bb..f7316a1d6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib/aave-helpers"] + path = lib/aave-helpers + url = https://github.com/bgd-labs/aave-helpers diff --git a/lib/aave-helpers b/lib/aave-helpers new file mode 160000 index 000000000..7b4decf9c --- /dev/null +++ b/lib/aave-helpers @@ -0,0 +1 @@ +Subproject commit 7b4decf9c3d89452b8b5f478eb0e5f799f695086 From 0ea18ab817700e8e9fdb025cc6edacdef345a9b4 Mon Sep 17 00:00:00 2001 From: efecarranza Date: Mon, 25 Mar 2024 10:37:43 -0400 Subject: [PATCH 12/15] chore: update block' --- .../AaveV3Arbitrum_ARBRemoveIsolation_20240315.t.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.t.sol b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.t.sol index 67792b8b6..c5a5b2ed3 100644 --- a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.t.sol +++ b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/AaveV3Arbitrum_ARBRemoveIsolation_20240315.t.sol @@ -17,7 +17,7 @@ contract AaveV3Arbitrum_ARBRemoveIsolation_20240315_Test is ProtocolV3TestBase { AaveV3Arbitrum_ARBRemoveIsolation_20240315 internal proposal; function setUp() public { - vm.createSelectFork(vm.rpcUrl('arbitrum'), 191404560); + vm.createSelectFork(vm.rpcUrl('arbitrum'), 194086877); proposal = new AaveV3Arbitrum_ARBRemoveIsolation_20240315(); } From 9b936a03fe1036ccf2dd1043d5ac3b37c531f72b Mon Sep 17 00:00:00 2001 From: efecarranza Date: Mon, 25 Mar 2024 10:39:26 -0400 Subject: [PATCH 13/15] forge install: aave-helpers ffdfec57ed1b7f90afbcdb108efc1141e91bc479 --- lib/aave-helpers | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/aave-helpers b/lib/aave-helpers index 7b4decf9c..ffdfec57e 160000 --- a/lib/aave-helpers +++ b/lib/aave-helpers @@ -1 +1 @@ -Subproject commit 7b4decf9c3d89452b8b5f478eb0e5f799f695086 +Subproject commit ffdfec57ed1b7f90afbcdb108efc1141e91bc479 From 593ef9b9ffa93a43ad4c25a0a3446f2e7ac4bca1 Mon Sep 17 00:00:00 2001 From: efecarranza Date: Mon, 25 Mar 2024 11:01:09 -0400 Subject: [PATCH 14/15] chore: run lint --- generator/cli.ts | 4 +- generator/features/assetListing.ts | 58 ++++++++++++------------ generator/features/borrowsUpdates.ts | 2 +- generator/features/capsUpdates.ts | 2 +- generator/features/collateralsUpdates.ts | 4 +- generator/features/eModesAssets.ts | 2 +- generator/features/eModesUpdates.ts | 4 +- generator/features/freeze.ts | 4 +- generator/features/priceFeedsUpdates.ts | 2 +- generator/features/rateUpdates.ts | 26 +++++------ generator/generator.ts | 4 +- generator/prompts/addressPrompt.spec.ts | 6 +-- generator/prompts/addressPrompt.ts | 4 +- generator/prompts/numberPrompt.ts | 2 +- generator/prompts/percentPrompt.ts | 4 +- generator/prompts/stringPrompt.ts | 4 +- generator/templates/aip.template.ts | 10 ++-- generator/templates/proposal.template.ts | 10 ++-- generator/templates/script.template.ts | 16 +++---- generator/utils/importsResolver.spec.ts | 14 +++--- 20 files changed, 91 insertions(+), 91 deletions(-) diff --git a/generator/cli.ts b/generator/cli.ts index dfa3d1491..3a4387e89 100644 --- a/generator/cli.ts +++ b/generator/cli.ts @@ -110,7 +110,7 @@ async function fetchPoolOptions(pool: PoolIdentifier) { pool, cfg: poolConfigs[pool]!.configs[feature], cache: poolConfigs[pool]!.cache, - }) + }), ); } } @@ -135,7 +135,7 @@ if (options.configFile) { pool, cfg: poolConfigs[pool]!.configs[feature], cache: poolConfigs[pool]!.cache, - }) + }), ); } } else { diff --git a/generator/features/assetListing.ts b/generator/features/assetListing.ts index 5ee59263e..a180f15aa 100644 --- a/generator/features/assetListing.ts +++ b/generator/features/assetListing.ts @@ -111,33 +111,33 @@ function generateAssetListingSol(cfg: Listing) { rateStrategyParams: IV3RateStrategyFactory.RateStrategyParams({ optimalUsageRatio: ${translateJsPercentToSol( cfg.rateStrategyParams.optimalUtilizationRate, - true + true, )}, baseVariableBorrowRate: ${translateJsPercentToSol( cfg.rateStrategyParams.baseVariableBorrowRate, - true + true, )}, variableRateSlope1: ${translateJsPercentToSol( cfg.rateStrategyParams.variableRateSlope1, - true + true, )}, variableRateSlope2: ${translateJsPercentToSol( cfg.rateStrategyParams.variableRateSlope2, - true + true, )}, stableRateSlope1: ${translateJsPercentToSol(cfg.rateStrategyParams.stableRateSlope1, true)}, stableRateSlope2: ${translateJsPercentToSol(cfg.rateStrategyParams.stableRateSlope2, true)}, baseStableRateOffset: ${translateJsPercentToSol( cfg.rateStrategyParams.baseStableRateOffset, - true + true, )}, stableRateExcessOffset: ${translateJsPercentToSol( cfg.rateStrategyParams.stableRateExcessOffset, - true + true, )}, optimalStableToTotalDebtRatio: ${translateJsPercentToSol( cfg.rateStrategyParams.optimalStableToTotalDebtRatio, - true + true, )} })`; } @@ -167,7 +167,7 @@ export const assetListing: FeatureModule = { execute: cfg.map( (cfg) => `IERC20(${cfg.assetSymbol}).forceApprove(address(${pool}.POOL), ${cfg.assetSymbol}_SEED_AMOUNT); - ${pool}.POOL.supply(${cfg.assetSymbol}, ${cfg.assetSymbol}_SEED_AMOUNT, address(${pool}.COLLECTOR), 0);` + ${pool}.POOL.supply(${cfg.assetSymbol}, ${cfg.assetSymbol}_SEED_AMOUNT, address(${pool}.COLLECTOR), 0);`, ), fn: [ `function newListings() public pure override returns (IAaveV3ConfigEngine.Listing[] memory) { @@ -179,7 +179,7 @@ export const assetListing: FeatureModule = { .map( (cfg, ix) => `listings[${ix}] = IAaveV3ConfigEngine.Listing({ ${generateAssetListingSol(cfg)} - });` + });`, ) .join('\n')} @@ -193,7 +193,7 @@ export const assetListing: FeatureModule = { ${TEST_EXECUTE_PROPOSAL} (address aTokenAddress, , ) = ${pool}.AAVE_PROTOCOL_DATA_PROVIDER.getReserveTokensAddresses(proposal.${cfg.assetSymbol}()); assertGe(IERC20(aTokenAddress).balanceOf(address(${pool}.COLLECTOR)), 10 ** ${cfg.decimals}); - }` + }`, ), }, aip: { @@ -205,50 +205,50 @@ export const assetListing: FeatureModule = { listingTemplate += `| Borrowable | ${cfg.enabledToBorrow} |\n`; listingTemplate += `| Collateral Enabled | ${!!cfg.liqThreshold} |\n`; listingTemplate += `| Supply Cap (${cfg.assetSymbol}) | ${transformNumberToHumanReadable( - cfg.supplyCap + cfg.supplyCap, )} |\n`; listingTemplate += `| Borrow Cap (${cfg.assetSymbol}) | ${transformNumberToHumanReadable( - cfg.borrowCap + cfg.borrowCap, )} |\n`; listingTemplate += `| Debt Ceiling | USD ${transformNumberToHumanReadable( - cfg.debtCeiling + cfg.debtCeiling, )} |\n`; listingTemplate += `| LTV | ${transformNumberToPercent(cfg.ltv)} |\n`; listingTemplate += `| LT | ${transformNumberToPercent(cfg.liqThreshold)} |\n`; listingTemplate += `| Liquidation Bonus | ${transformNumberToPercent(cfg.liqBonus)} |\n`; listingTemplate += `| Liquidation Protocol Fee | ${transformNumberToPercent( - cfg.liqProtocolFee + cfg.liqProtocolFee, )} |\n`; listingTemplate += `| Reserve Factor | ${transformNumberToPercent( - cfg.reserveFactor + cfg.reserveFactor, )} |\n`; listingTemplate += `| Base Variable Borrow Rate | ${transformNumberToPercent( - cfg.rateStrategyParams.baseVariableBorrowRate + cfg.rateStrategyParams.baseVariableBorrowRate, )} |\n`; listingTemplate += `| Variable Slope 1 | ${transformNumberToPercent( - cfg.rateStrategyParams.variableRateSlope1 + cfg.rateStrategyParams.variableRateSlope1, )} |\n`; listingTemplate += `| Variable Slope 2 | ${transformNumberToPercent( - cfg.rateStrategyParams.variableRateSlope2 + cfg.rateStrategyParams.variableRateSlope2, )} |\n`; listingTemplate += `| Uoptimal | ${transformNumberToPercent( - cfg.rateStrategyParams.optimalUtilizationRate + cfg.rateStrategyParams.optimalUtilizationRate, )} |\n`; listingTemplate += `| Stable Borrowing | ${cfg.stableRateModeEnabled} |\n`; listingTemplate += `| Stable Slope1 | ${transformNumberToPercent( - cfg.rateStrategyParams.stableRateSlope1 + cfg.rateStrategyParams.stableRateSlope1, )} |\n`; listingTemplate += `| Stable Slope2 | ${transformNumberToPercent( - cfg.rateStrategyParams.stableRateSlope2 + cfg.rateStrategyParams.stableRateSlope2, )} |\n`; listingTemplate += `| Base Stable Rate Offset | ${transformNumberToPercent( - cfg.rateStrategyParams.baseStableRateOffset! + cfg.rateStrategyParams.baseStableRateOffset!, )} |\n`; listingTemplate += `| Stable Rate Excess Offset | ${transformNumberToPercent( - cfg.rateStrategyParams.stableRateExcessOffset! + cfg.rateStrategyParams.stableRateExcessOffset!, )} |\n`; listingTemplate += `| Optimal Stable To Total Debt Ratio | ${transformNumberToPercent( - cfg.rateStrategyParams.optimalStableToTotalDebtRatio! + cfg.rateStrategyParams.optimalStableToTotalDebtRatio!, )} |\n`; listingTemplate += `| Flashloanable | ${cfg.flashloanable} |\n`; listingTemplate += `| Siloed Borrowing | ${cfg.withSiloedBorrowing} |\n`; @@ -280,13 +280,13 @@ export const assetListingCustom: FeatureModule = { constants: cfg.map( (cfg) => `address public constant ${cfg.base.assetSymbol} = ${translateJsAddressToSol( - cfg.base.asset - )};` + cfg.base.asset, + )};`, ), execute: cfg.map( (cfg) => `IERC20(${cfg.base.assetSymbol}).forceApprove(address(${pool}.POOL), 10 ** ${cfg.base.decimals}); - ${pool}.POOL.supply(${cfg.base.assetSymbol}, 10 ** ${cfg.base.decimals}, ${pool}.COLLECTOR, 0);` + ${pool}.POOL.supply(${cfg.base.assetSymbol}, 10 ** ${cfg.base.decimals}, ${pool}.COLLECTOR, 0);`, ), fn: [ `function newListingsCustom() public pure override returns (IAaveV3ConfigEngine.ListingWithCustomImpl[] memory) { @@ -305,7 +305,7 @@ export const assetListingCustom: FeatureModule = { sToken: ${translateJsAddressToSol(cfg.implementations.sToken)} }) }) - );` + );`, ) .join('\n')} @@ -319,7 +319,7 @@ export const assetListingCustom: FeatureModule = { ${TEST_EXECUTE_PROPOSAL} (address aTokenAddress, , ) = ${pool}.AAVE_PROTOCOL_DATA_PROVIDER.getReserveTokensAddresses(proposal.${cfg.base.assetSymbol}()); assertGte(IERC20(aTokenAddress).balanceOf(${pool}.COLLECTOR), 10 ** ${cfg.base.decimals}); - }` + }`, ), }, }; diff --git a/generator/features/borrowsUpdates.ts b/generator/features/borrowsUpdates.ts index 334d29a1e..7006bc503 100644 --- a/generator/features/borrowsUpdates.ts +++ b/generator/features/borrowsUpdates.ts @@ -76,7 +76,7 @@ export const borrowsUpdates: FeatureModule = { borrowableInIsolation: ${translateJsBoolToSol(cfg.borrowableInIsolation)}, withSiloedBorrowing: ${translateJsBoolToSol(cfg.withSiloedBorrowing)}, reserveFactor: ${translateJsPercentToSol(cfg.reserveFactor)} - });` + });`, ) .join('\n')} diff --git a/generator/features/capsUpdates.ts b/generator/features/capsUpdates.ts index 7d99d36a0..6df207f25 100644 --- a/generator/features/capsUpdates.ts +++ b/generator/features/capsUpdates.ts @@ -53,7 +53,7 @@ export const capsUpdates: FeatureModule = { asset: ${translateAssetToAssetLibUnderlying(cfg.asset, pool)}, supplyCap: ${translateJsNumberToSol(cfg.supplyCap)}, borrowCap: ${translateJsNumberToSol(cfg.borrowCap)} - });` + });`, ) .join('\n')} diff --git a/generator/features/collateralsUpdates.ts b/generator/features/collateralsUpdates.ts index ef4cee3d1..8b0eb28b2 100644 --- a/generator/features/collateralsUpdates.ts +++ b/generator/features/collateralsUpdates.ts @@ -10,7 +10,7 @@ import {percentPrompt, translateJsPercentToSol} from '../prompts/percentPrompt'; export async function fetchCollateralUpdate( pool: PoolIdentifier, - required?: boolean + required?: boolean, ): Promise { return { ltv: await percentPrompt({ @@ -74,7 +74,7 @@ export const collateralsUpdates: FeatureModule = { liqBonus: ${translateJsPercentToSol(cfg.liqBonus)}, debtCeiling: ${translateJsNumberToSol(cfg.debtCeiling)}, liqProtocolFee: ${translateJsPercentToSol(cfg.liqProtocolFee)} - });` + });`, ) .join('\n')} diff --git a/generator/features/eModesAssets.ts b/generator/features/eModesAssets.ts index 8b406697a..8f1800a60 100644 --- a/generator/features/eModesAssets.ts +++ b/generator/features/eModesAssets.ts @@ -50,7 +50,7 @@ export const eModeAssets: FeatureModule = { (cfg, ix) => `assetEModeUpdates[${ix}] = IAaveV3ConfigEngine.AssetEModeUpdate({ asset: ${translateAssetToAssetLibUnderlying(cfg.asset, pool)}, eModeCategory: ${cfg.eModeCategory} - });` + });`, ) .join('\n')} diff --git a/generator/features/eModesUpdates.ts b/generator/features/eModesUpdates.ts index cdb124c28..f20be3e2a 100644 --- a/generator/features/eModesUpdates.ts +++ b/generator/features/eModesUpdates.ts @@ -10,7 +10,7 @@ import {percentPrompt, translateJsPercentToSol} from '../prompts/percentPrompt'; async function fetchEmodeCategoryUpdate( eModeCategory: string | number, - required?: T + required?: T, ): Promise { return { eModeCategory, @@ -104,7 +104,7 @@ export const eModeUpdates: FeatureModule = { liqBonus: ${translateJsPercentToSol(cfg.liqBonus)}, priceSource: ${translateJsAddressToSol(cfg.priceSource)}, label: ${stringOrKeepCurrent(cfg.label)} - });` + });`, ) .join('\n')} diff --git a/generator/features/freeze.ts b/generator/features/freeze.ts index 9a85841bf..21b1e9ede 100644 --- a/generator/features/freeze.ts +++ b/generator/features/freeze.ts @@ -31,8 +31,8 @@ export const freezeUpdates: FeatureModule = { (cfg) => `${pool}.POOL_CONFIGURATOR.setReserveFreeze(${translateAssetToAssetLibUnderlying( cfg.asset, - pool - )}, ${cfg.shouldBeFrozen});` + pool, + )}, ${cfg.shouldBeFrozen});`, ), }, }; diff --git a/generator/features/priceFeedsUpdates.ts b/generator/features/priceFeedsUpdates.ts index b32344956..c7a55f03c 100644 --- a/generator/features/priceFeedsUpdates.ts +++ b/generator/features/priceFeedsUpdates.ts @@ -44,7 +44,7 @@ export const priceFeedsUpdates: FeatureModule = { (cfg, ix) => `priceFeedUpdates[${ix}] = IAaveV3ConfigEngine.PriceFeedUpdate({ asset: ${translateAssetToAssetLibUnderlying(cfg.asset, pool)}, priceFeed: ${translateJsAddressToSol(cfg.priceFeed)} - });` + });`, ) .join('\n')} diff --git a/generator/features/rateUpdates.ts b/generator/features/rateUpdates.ts index 1fa635aba..8cd6bca20 100644 --- a/generator/features/rateUpdates.ts +++ b/generator/features/rateUpdates.ts @@ -90,24 +90,24 @@ export const rateUpdatesV2: FeatureModule = { params: IV2RateStrategyFactory.RateStrategyParams({ optimalUtilizationRate: ${translateJsPercentToSol( cfg.params.optimalUtilizationRate, - true + true, )}, baseVariableBorrowRate: ${translateJsPercentToSol( cfg.params.baseVariableBorrowRate, - true + true, )}, variableRateSlope1: ${translateJsPercentToSol( cfg.params.variableRateSlope1, - true + true, )}, variableRateSlope2: ${translateJsPercentToSol( cfg.params.variableRateSlope2, - true + true, )}, stableRateSlope1: ${translateJsPercentToSol(cfg.params.stableRateSlope1, true)}, stableRateSlope2: ${translateJsPercentToSol(cfg.params.stableRateSlope2, true)} }) - });` + });`, ) .join('\n')} @@ -157,36 +157,36 @@ export const rateUpdatesV3: FeatureModule = { params: IV3RateStrategyFactory.RateStrategyParams({ optimalUsageRatio: ${translateJsPercentToSol( cfg.params.optimalUtilizationRate, - true + true, )}, baseVariableBorrowRate: ${translateJsPercentToSol( cfg.params.baseVariableBorrowRate, - true + true, )}, variableRateSlope1: ${translateJsPercentToSol( cfg.params.variableRateSlope1, - true + true, )}, variableRateSlope2: ${translateJsPercentToSol( cfg.params.variableRateSlope2, - true + true, )}, stableRateSlope1: ${translateJsPercentToSol(cfg.params.stableRateSlope1, true)}, stableRateSlope2: ${translateJsPercentToSol(cfg.params.stableRateSlope2, true)}, baseStableRateOffset: ${translateJsPercentToSol( cfg.params.baseStableRateOffset!, - true + true, )}, stableRateExcessOffset: ${translateJsPercentToSol( cfg.params.stableRateExcessOffset!, - true + true, )}, optimalStableToTotalDebtRatio: ${translateJsPercentToSol( cfg.params.optimalStableToTotalDebtRatio!, - true + true, )} }) - });` + });`, ) .join('\n')} diff --git a/generator/generator.ts b/generator/generator.ts index 3e17c2d65..6b3004ac0 100644 --- a/generator/generator.ts +++ b/generator/generator.ts @@ -36,7 +36,7 @@ export async function generateFiles(options: Options, poolConfigs: PoolConfigs): return acc; }, {}), } as ConfigFile)}`, - {...prettierTsCfg, filepath: 'foo.ts'} + {...prettierTsCfg, filepath: 'foo.ts'}, ); async function createPayloadAndTest(options: Options, pool: PoolIdentifier) { @@ -116,7 +116,7 @@ export async function writeFiles(options: Options, {jsonConfig, script, aip, pay await askBeforeWrite( options, path.join(baseFolder, `${generateContractName(options)}.s.sol`), - script + script, ); for (const {payload, test, contractName} of payloads) { diff --git a/generator/prompts/addressPrompt.spec.ts b/generator/prompts/addressPrompt.spec.ts index 55e1bcf02..a68860df7 100644 --- a/generator/prompts/addressPrompt.spec.ts +++ b/generator/prompts/addressPrompt.spec.ts @@ -15,12 +15,12 @@ describe('addresses', () => { events.keypress('enter'); await Promise.resolve(); expect(getScreen()).toMatchInlineSnapshot( - '"? Enter address?*\n> You must provide a valid value"' + '"? Enter address?*\n> You must provide a valid value"', ); events.type('XX0xXXae7ab96520de3a18e5e111b5eaab095312d7fe84'); expect(getScreen()).toMatchInlineSnapshot( - '"? Enter address?* 0xae7ab96520de3a18e5e111b5eaab095312d7fe84"' + '"? Enter address?* 0xae7ab96520de3a18e5e111b5eaab095312d7fe84"', ); events.keypress('enter'); @@ -47,7 +47,7 @@ describe('addresses', () => { it('translateJsAddressToSol: should properly translate values to addresses', () => { expect(translateJsAddressToSol('')).toBe('EngineFlags.KEEP_CURRENT_ADDRESS'); expect(translateJsAddressToSol('0xae7ab96520de3a18e5e111b5eaab095312d7fe84')).toBe( - '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84' + '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84', ); }); }); diff --git a/generator/prompts/addressPrompt.ts b/generator/prompts/addressPrompt.ts index 3ec771dc0..2f493190e 100644 --- a/generator/prompts/addressPrompt.ts +++ b/generator/prompts/addressPrompt.ts @@ -5,7 +5,7 @@ import {flagAsRequired} from '../common'; export async function addressPrompt( {message, required}: GenericPrompt, - opts? + opts?, ): Promise { const value = await advancedInput( { @@ -13,7 +13,7 @@ export async function addressPrompt( validate: (v) => (required ? isAddress(v) : isAddress(v) || v === ''), pattern: /^(0|0x|0x[A-Fa-f0-9]{0,40})?$/, }, - opts + opts, ); return value as Hex; } diff --git a/generator/prompts/numberPrompt.ts b/generator/prompts/numberPrompt.ts index ea0546502..1d2db60ac 100644 --- a/generator/prompts/numberPrompt.ts +++ b/generator/prompts/numberPrompt.ts @@ -24,7 +24,7 @@ export async function numberPrompt({message, required}: GenericPrompt, opts?) { pattern: /^[0-9]*$/, patternError: 'Only full numbers are allowed', }, - opts + opts, ); } diff --git a/generator/prompts/percentPrompt.ts b/generator/prompts/percentPrompt.ts index 9c0ba8cc9..f36665cf5 100644 --- a/generator/prompts/percentPrompt.ts +++ b/generator/prompts/percentPrompt.ts @@ -18,7 +18,7 @@ export function transformNumberToPercent(value: string) { export async function percentPrompt( {message, required}: GenericPrompt, - opts? + opts?, ): Promise { const value = await advancedInput( { @@ -31,7 +31,7 @@ export async function percentPrompt( pattern: /^[0-9]*\.?[0-9]*$/, patternError: 'Only decimal numbers are allowed (e.g. 1.1)', }, - opts + opts, ); return value; } diff --git a/generator/prompts/stringPrompt.ts b/generator/prompts/stringPrompt.ts index 8ccdbd430..52f525327 100644 --- a/generator/prompts/stringPrompt.ts +++ b/generator/prompts/stringPrompt.ts @@ -4,7 +4,7 @@ import {GenericPrompt} from './types'; export async function stringPrompt( {message, defaultValue, required}: GenericPrompt, - opts? + opts?, ) { return advancedInput( { @@ -12,7 +12,7 @@ export async function stringPrompt( default: defaultValue, validate: (v) => (required ? v.trim().length != 0 : true), }, - opts + opts, ); } diff --git a/generator/templates/aip.template.ts b/generator/templates/aip.template.ts index 1b1f86f5c..4a0596ce9 100644 --- a/generator/templates/aip.template.ts +++ b/generator/templates/aip.template.ts @@ -19,7 +19,7 @@ discussions: ${`"${options.discussion}"` || 'TODO'}${ ${Object.keys(configs) .map((pool) => { return configs[pool as keyof typeof configs]!.artifacts.filter( - (artifact) => artifact.aip?.specification + (artifact) => artifact.aip?.specification, ).map((artifact) => artifact.aip?.specification); }) .filter((a) => a) @@ -31,16 +31,16 @@ ${Object.keys(configs) .map( (pool) => `[${pool}](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/${generateFolderName( - options - )}/${generateContractName(options, pool)}.sol)` + options, + )}/${generateContractName(options, pool)}.sol)`, ) .join(', ')} - Tests: ${options.pools .map( (pool) => `[${pool}](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/${generateFolderName( - options - )}/${generateContractName(options, pool)}.t.sol)` + options, + )}/${generateContractName(options, pool)}.t.sol)`, ) .join(', ')} - [Snapshot](${options.snapshot || 'TODO'}) diff --git a/generator/templates/proposal.template.ts b/generator/templates/proposal.template.ts index 154b2a0a2..f0e9ee73b 100644 --- a/generator/templates/proposal.template.ts +++ b/generator/templates/proposal.template.ts @@ -6,7 +6,7 @@ import {prefixWithPragma} from '../utils/constants'; export const proposalTemplate = ( options: Options, poolConfig: PoolConfig, - pool: PoolIdentifier + pool: PoolIdentifier, ) => { const {title, author, snapshot, discussion} = options; const poolName = pool.match(/AaveV[2|3](.*)/)![1]; @@ -31,10 +31,10 @@ export const proposalTemplate = ( let optionalExecute = ''; const usesConfigEngine = Object.keys(poolConfig.configs).some( - (f) => ![FEATURE.OTHERS, FEATURE.FLASH_BORROWER, FEATURE.FREEZE].includes(f) + (f) => ![FEATURE.OTHERS, FEATURE.FLASH_BORROWER, FEATURE.FREEZE].includes(f), ); const isAssetListing = Object.keys(poolConfig.configs).some((f) => - [FEATURE.ASSET_LISTING, FEATURE.ASSET_LISTING_CUSTOM].includes(f) + [FEATURE.ASSET_LISTING, FEATURE.ASSET_LISTING_CUSTOM].includes(f), ); if (innerExecute) { if (usesConfigEngine) { @@ -55,8 +55,8 @@ export const proposalTemplate = ( * - Discussion: ${discussion || 'TODO'} */ contract ${contractName} is ${ - usesConfigEngine ? `Aave${version}Payload${poolName}` : 'IProposalGenericExecutor' - } { + usesConfigEngine ? `Aave${version}Payload${poolName}` : 'IProposalGenericExecutor' + } { ${isAssetListing ? 'using SafeERC20 for IERC20;' : ''} ${constants} diff --git a/generator/templates/script.template.ts b/generator/templates/script.template.ts index cfef79cde..486577a16 100644 --- a/generator/templates/script.template.ts +++ b/generator/templates/script.template.ts @@ -41,11 +41,11 @@ export function generateScript(options: Options) { return `/** * @dev Deploy ${chain} * deploy-command: make deploy-ledger contract=src/${folderName}/${fileName}.s.sol:Deploy${chain} chain=${getChainAlias( - chain - )} + chain, + )} * verify-command: npx catapulta-verify -b broadcast/${fileName}.s.sol/${ - CHAIN_TO_CHAIN_ID[chain] - }/run-latest.json + CHAIN_TO_CHAIN_ID[chain] + }/run-latest.json */ contract Deploy${chain} is ${chain}Script { function run() external broadcast { @@ -53,7 +53,7 @@ export function generateScript(options: Options) { ${poolsToChainsMap[chain] .map( ({contractName, pool}, ix) => - `address payload${ix} = GovV3Helpers.deployDeterministic(type(${contractName}).creationCode);` + `address payload${ix} = GovV3Helpers.deployDeterministic(type(${contractName}).creationCode);`, ) .join('\n')} @@ -63,7 +63,7 @@ export function generateScript(options: Options) { }); ${poolsToChainsMap[chain] .map( - ({contractName, pool}, ix) => `actions[${ix}] = GovV3Helpers.buildAction(payload${ix});` + ({contractName, pool}, ix) => `actions[${ix}] = GovV3Helpers.buildAction(payload${ix});`, ) .join('\n')} @@ -106,8 +106,8 @@ contract CreateProposal is EthereumScript { // create proposal vm.startBroadcast(); GovV3Helpers.createProposal(vm, payloads, GovV3Helpers.ipfsHashFile(vm, 'src/${folderName}/${ - options.shortName - }.md')); + options.shortName + }.md')); } }`; return prefixWithPragma(prefixWithImports(template)); diff --git a/generator/utils/importsResolver.spec.ts b/generator/utils/importsResolver.spec.ts index e1072c3dd..5e0648cfb 100644 --- a/generator/utils/importsResolver.spec.ts +++ b/generator/utils/importsResolver.spec.ts @@ -5,40 +5,40 @@ import {prefixWithImports} from './importsResolver'; describe('prefixWithImports', () => { it('should resolve IProposalGenericExecutor', () => { expect(prefixWithImports(`is IProposalGenericExecutor {`)).toContain( - `import {IProposalGenericExecutor} from 'aave-helpers/interfaces/IProposalGenericExecutor.sol';` + `import {IProposalGenericExecutor} from 'aave-helpers/interfaces/IProposalGenericExecutor.sol';`, ); }); it('should resolve Engine imports', () => { expect(prefixWithImports(`GovV3Helpers.createPayload`)).toContain( - `import {GovV3Helpers} from 'aave-helpers/GovV3Helpers.sol';` + `import {GovV3Helpers} from 'aave-helpers/GovV3Helpers.sol';`, ); }); it('should detect v3 Engine imports', () => { expect(prefixWithImports(`EngineFlags.KEEP_CURRENT`)).toContain( - `import {EngineFlags} from 'aave-helpers/v3-config-engine/EngineFlags.sol';` + `import {EngineFlags} from 'aave-helpers/v3-config-engine/EngineFlags.sol';`, ); expect(prefixWithImports('IAaveV3ConfigEngine.CapsUpdate')).toContain( - `import {IAaveV3ConfigEngine} from 'aave-helpers/v3-config-engine/IAaveV3ConfigEngine.sol';` + `import {IAaveV3ConfigEngine} from 'aave-helpers/v3-config-engine/IAaveV3ConfigEngine.sol';`, ); }); it('should detect v2 Engine imports', () => { const result = prefixWithImports('IAaveV2ConfigEngine.RateStrategyUpdate'); expect(result).toContain( - `import {IAaveV2ConfigEngine} from 'aave-helpers/v2-config-engine/IAaveV2ConfigEngine.sol';` + `import {IAaveV2ConfigEngine} from 'aave-helpers/v2-config-engine/IAaveV2ConfigEngine.sol';`, ); }); it('should detect addressbook imports', () => { expect(prefixWithImports('AaveV2Ethereum.POOL AaveV2EthereumAssets.DAI')).toContain( - `import {AaveV2Ethereum,AaveV2EthereumAssets} from 'aave-address-book/AaveV2Ethereum.sol';` + `import {AaveV2Ethereum,AaveV2EthereumAssets} from 'aave-address-book/AaveV2Ethereum.sol';`, ); expect(prefixWithImports('AaveV3Avalanche.POOL')).toContain( - `import {AaveV3Avalanche} from 'aave-address-book/AaveV3Avalanche.sol';` + `import {AaveV3Avalanche} from 'aave-address-book/AaveV3Avalanche.sol';`, ); }); }); From ebd713cde13693e7b82193c2c303762532010e48 Mon Sep 17 00:00:00 2001 From: luigy-lemon Date: Mon, 25 Mar 2024 17:17:50 +0000 Subject: [PATCH 15/15] fix: clarify Specification of proposal --- .../ARBRemoveIsolation.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/ARBRemoveIsolation.md b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/ARBRemoveIsolation.md index 67c77be5f..60a718615 100644 --- a/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/ARBRemoveIsolation.md +++ b/src/20240315_AaveV3Arbitrum_ARBRemoveIsolation/ARBRemoveIsolation.md @@ -19,9 +19,14 @@ With the support of the Risk Service providers, this proposal is to disable Isol Ticker: ARB Contract Address: [0x912CE59144191C1204E64559FE8253a0e49E6548](https://arbiscan.io/address/0x912CE59144191C1204E64559FE8253a0e49E6548) -Chainlink Oracle: [0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6](https://arbiscan.io/address/0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6) -Risk parameters can be proposed by Risk Service providers. +The following parameters are to be updated as follows in Arbitrum market: + +| Asset | Debt Ceiling | +| ----- | ------------ | +| ARB | 0 | + +The executor will call the ArbitrumV3 configurator and use the "setDebtCeiling" method. ## Disclaimer: