diff --git a/diffs/AaveV3EthereumLido_WstETHReserveUpdate_20241203_before_AaveV3EthereumLido_WstETHReserveUpdate_20241203_after.md b/diffs/AaveV3EthereumLido_WstETHReserveUpdate_20241203_before_AaveV3EthereumLido_WstETHReserveUpdate_20241203_after.md new file mode 100644 index 000000000..b63bada9d --- /dev/null +++ b/diffs/AaveV3EthereumLido_WstETHReserveUpdate_20241203_before_AaveV3EthereumLido_WstETHReserveUpdate_20241203_after.md @@ -0,0 +1,35 @@ +## Reserve changes + +### Reserves altered + +#### wstETH ([0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0](https://etherscan.io/address/0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0)) + +| description | value before | value after | +| --- | --- | --- | +| optimalUsageRatio | 80 % | 90 % | +| maxVariableBorrowRate | 87.25 % | 86.75 % | +| variableRateSlope1 | 2.25 % | 1.75 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=22500000000000000000000000&variableRateSlope2=850000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=872500000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=17500000000000000000000000&variableRateSlope2=850000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=867500000000000000000000000) | + +## Raw diff + +```json +{ + "strategies": { + "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0": { + "maxVariableBorrowRate": { + "from": "872500000000000000000000000", + "to": "867500000000000000000000000" + }, + "optimalUsageRatio": { + "from": "800000000000000000000000000", + "to": "900000000000000000000000000" + }, + "variableRateSlope1": { + "from": "22500000000000000000000000", + "to": "17500000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Ethereum_WstETHReserveUpdate_20241203_before_AaveV3Ethereum_WstETHReserveUpdate_20241203_after.md b/diffs/AaveV3Ethereum_WstETHReserveUpdate_20241203_before_AaveV3Ethereum_WstETHReserveUpdate_20241203_after.md new file mode 100644 index 000000000..6b11c208f --- /dev/null +++ b/diffs/AaveV3Ethereum_WstETHReserveUpdate_20241203_before_AaveV3Ethereum_WstETHReserveUpdate_20241203_after.md @@ -0,0 +1,40 @@ +## Reserve changes + +### Reserves altered + +#### wstETH ([0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0](https://etherscan.io/address/0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0)) + +| description | value before | value after | +| --- | --- | --- | +| optimalUsageRatio | 45 % | 80 % | +| maxVariableBorrowRate | 82 % | 86.75 % | +| variableRateSlope1 | 2 % | 1.75 % | +| variableRateSlope2 | 80 % | 85 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=20000000000000000000000000&variableRateSlope2=800000000000000000000000000&optimalUsageRatio=450000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=820000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=17500000000000000000000000&variableRateSlope2=850000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=867500000000000000000000000) | + +## Raw diff + +```json +{ + "strategies": { + "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0": { + "maxVariableBorrowRate": { + "from": "820000000000000000000000000", + "to": "867500000000000000000000000" + }, + "optimalUsageRatio": { + "from": "450000000000000000000000000", + "to": "800000000000000000000000000" + }, + "variableRateSlope1": { + "from": "20000000000000000000000000", + "to": "17500000000000000000000000" + }, + "variableRateSlope2": { + "from": "800000000000000000000000000", + "to": "850000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/src/20241203_Multi_WstETHReserveUpdate/AaveV3EthereumLido_WstETHReserveUpdate_20241203.sol b/src/20241203_Multi_WstETHReserveUpdate/AaveV3EthereumLido_WstETHReserveUpdate_20241203.sol new file mode 100644 index 000000000..b5a2d55cb --- /dev/null +++ b/src/20241203_Multi_WstETHReserveUpdate/AaveV3EthereumLido_WstETHReserveUpdate_20241203.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumLidoAssets} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {AaveV3PayloadEthereumLido} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereumLido.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title wstETH Reserve Update + * @author ACI + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-prime-core-instance-wsteth-reserve-update/19973 + */ +contract AaveV3EthereumLido_WstETHReserveUpdate_20241203 is AaveV3PayloadEthereumLido { + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV3ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](1); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumLidoAssets.wstETH_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: 90_00, + baseVariableBorrowRate: 0, + variableRateSlope1: 1_75, + variableRateSlope2: 85_00 + }) + }); + + return rateStrategies; + } +} diff --git a/src/20241203_Multi_WstETHReserveUpdate/AaveV3EthereumLido_WstETHReserveUpdate_20241203.t.sol b/src/20241203_Multi_WstETHReserveUpdate/AaveV3EthereumLido_WstETHReserveUpdate_20241203.t.sol new file mode 100644 index 000000000..1a4f50983 --- /dev/null +++ b/src/20241203_Multi_WstETHReserveUpdate/AaveV3EthereumLido_WstETHReserveUpdate_20241203.t.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumLido} from 'aave-address-book/AaveV3EthereumLido.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3EthereumLido_WstETHReserveUpdate_20241203} from './AaveV3EthereumLido_WstETHReserveUpdate_20241203.sol'; + +/** + * @dev Test for AaveV3EthereumLido_WstETHReserveUpdate_20241203 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241203_Multi_WstETHReserveUpdate/AaveV3EthereumLido_WstETHReserveUpdate_20241203.t.sol -vv + */ +contract AaveV3EthereumLido_WstETHReserveUpdate_20241203_Test is ProtocolV3TestBase { + AaveV3EthereumLido_WstETHReserveUpdate_20241203 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21322524); + proposal = new AaveV3EthereumLido_WstETHReserveUpdate_20241203(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3EthereumLido_WstETHReserveUpdate_20241203', + AaveV3EthereumLido.POOL, + address(proposal) + ); + } +} diff --git a/src/20241203_Multi_WstETHReserveUpdate/AaveV3Ethereum_WstETHReserveUpdate_20241203.sol b/src/20241203_Multi_WstETHReserveUpdate/AaveV3Ethereum_WstETHReserveUpdate_20241203.sol new file mode 100644 index 000000000..bb0494603 --- /dev/null +++ b/src/20241203_Multi_WstETHReserveUpdate/AaveV3Ethereum_WstETHReserveUpdate_20241203.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV3PayloadEthereum} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereum.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title wstETH Reserve Update + * @author ACI + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-prime-core-instance-wsteth-reserve-update/19973 + */ +contract AaveV3Ethereum_WstETHReserveUpdate_20241203 is AaveV3PayloadEthereum { + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV3ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](1); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumAssets.wstETH_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: 80_00, + baseVariableBorrowRate: 0, + variableRateSlope1: 1_75, + variableRateSlope2: 85_00 + }) + }); + + return rateStrategies; + } +} diff --git a/src/20241203_Multi_WstETHReserveUpdate/AaveV3Ethereum_WstETHReserveUpdate_20241203.t.sol b/src/20241203_Multi_WstETHReserveUpdate/AaveV3Ethereum_WstETHReserveUpdate_20241203.t.sol new file mode 100644 index 000000000..6c2de8f31 --- /dev/null +++ b/src/20241203_Multi_WstETHReserveUpdate/AaveV3Ethereum_WstETHReserveUpdate_20241203.t.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Ethereum} from 'aave-address-book/AaveV3Ethereum.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Ethereum_WstETHReserveUpdate_20241203} from './AaveV3Ethereum_WstETHReserveUpdate_20241203.sol'; + +/** + * @dev Test for AaveV3Ethereum_WstETHReserveUpdate_20241203 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241203_Multi_WstETHReserveUpdate/AaveV3Ethereum_WstETHReserveUpdate_20241203.t.sol -vv + */ +contract AaveV3Ethereum_WstETHReserveUpdate_20241203_Test is ProtocolV3TestBase { + AaveV3Ethereum_WstETHReserveUpdate_20241203 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21322520); + proposal = new AaveV3Ethereum_WstETHReserveUpdate_20241203(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_WstETHReserveUpdate_20241203', + AaveV3Ethereum.POOL, + address(proposal) + ); + } +} diff --git a/src/20241203_Multi_WstETHReserveUpdate/WstETHReserveUpdate.md b/src/20241203_Multi_WstETHReserveUpdate/WstETHReserveUpdate.md new file mode 100644 index 000000000..21ca59e95 --- /dev/null +++ b/src/20241203_Multi_WstETHReserveUpdate/WstETHReserveUpdate.md @@ -0,0 +1,59 @@ +--- +title: "wstETH Reserve Update" +author: "ACI" +discussions: "https://governance.aave.com/t/arfc-prime-core-instance-wsteth-reserve-update/19973" +snapshot: Direct-to-AIP +--- + +## Simple Summary + +The publication using the Direct-to-AIP process, proposes increasing the capital efficiency of the wstETH Reserve on both Prime and Core instances of Aave v3. This is a Direct to AIP proposal. + +## Motivation + +### Prime Instance + +The addition of ezETH has resulted in over $620M in direct deposits and approximately $520M in wstETH debt. With yield from EIGEN decreasing and Renzo’s Season 3 rewards nearing expiration, this publication proposes amending the wstETH Reserve parameters to enhance capital efficiency and support user retention. + +We have engaged with several builders and investors with significant capital deployed on the Prime instance. Currently, leveraged ezETH/wstETH users are primarily sustained by Renzo’s Season 3 rewards, which are set to expire soon. While an additional $100M of USDS is expected in the coming days, this alone will not be sufficient to retain existing users. + +### Core Instance + +Based on strong demand for wstETH following the rsETH onboarding, this proposal, when implemented, will make a larger portion of wstETH liquidity available. + +Discussions with the Kelp team and various investors indicate significant demand wstETH deb by rsETH holders. To accelerate Aave’s growth, the Uoptimal on the wstETH Reserve is be adjusted higher to make available a greater portion of the wstETH liquidity. + +## Specification + +### Prime Instance + +**wstETH Reserve** + +| Parameter | Current Value | Proposed Value | +| --------- | ------------- | -------------- | +| Uoptimal | 80.00% | 90.00% | +| Base | 0.00% | 0.00% | +| Slope1 | 2.25% | 1.75% | +| Slope2 | 85.00% | 85.00% | + +### Core Instance + +**wstETH Reserve** + +| Parameter | Current Value | Proposed Value | +| --------- | ------------- | -------------- | +| Uoptimal | 45.00% | 80.00% | +| Base | 0.00% | 0.00% | +| Slope1 | 2.00% | 1.75% | +| Slope2 | 85.00% | 85.00% | + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241203_Multi_WstETHReserveUpdate/AaveV3Ethereum_WstETHReserveUpdate_20241203.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241203_Multi_WstETHReserveUpdate/AaveV3EthereumLido_WstETHReserveUpdate_20241203.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241203_Multi_WstETHReserveUpdate/AaveV3Ethereum_WstETHReserveUpdate_20241203.t.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241203_Multi_WstETHReserveUpdate/AaveV3EthereumLido_WstETHReserveUpdate_20241203.t.sol) +- Snapshot: Direct-to-AIP +- [Discussion](https://governance.aave.com/t/arfc-prime-core-instance-wsteth-reserve-update/19973) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241203_Multi_WstETHReserveUpdate/WstETHReserveUpdate_20241203.s.sol b/src/20241203_Multi_WstETHReserveUpdate/WstETHReserveUpdate_20241203.s.sol new file mode 100644 index 000000000..7ee7e3bc4 --- /dev/null +++ b/src/20241203_Multi_WstETHReserveUpdate/WstETHReserveUpdate_20241203.s.sol @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Ethereum_WstETHReserveUpdate_20241203} from './AaveV3Ethereum_WstETHReserveUpdate_20241203.sol'; +import {AaveV3EthereumLido_WstETHReserveUpdate_20241203} from './AaveV3EthereumLido_WstETHReserveUpdate_20241203.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241203_Multi_WstETHReserveUpdate/WstETHReserveUpdate_20241203.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/WstETHReserveUpdate_20241203.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_WstETHReserveUpdate_20241203).creationCode + ); + address payload1 = GovV3Helpers.deployDeterministic( + type(AaveV3EthereumLido_WstETHReserveUpdate_20241203).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](2); + actions[0] = GovV3Helpers.buildAction(payload0); + actions[1] = GovV3Helpers.buildAction(payload1); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Create Proposal + * command: make deploy-ledger contract=src/20241203_Multi_WstETHReserveUpdate/WstETHReserveUpdate_20241203.s.sol:CreateProposal chain=mainnet + */ +contract CreateProposal is EthereumScript { + function run() external { + // create payloads + PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](1); + + // compose actions for validation + IPayloadsControllerCore.ExecutionAction[] + memory actionsEthereum = new IPayloadsControllerCore.ExecutionAction[](2); + actionsEthereum[0] = GovV3Helpers.buildAction( + type(AaveV3Ethereum_WstETHReserveUpdate_20241203).creationCode + ); + actionsEthereum[1] = GovV3Helpers.buildAction( + type(AaveV3EthereumLido_WstETHReserveUpdate_20241203).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile(vm, 'src/20241203_Multi_WstETHReserveUpdate/WstETHReserveUpdate.md') + ); + } +} diff --git a/src/20241203_Multi_WstETHReserveUpdate/config.ts b/src/20241203_Multi_WstETHReserveUpdate/config.ts new file mode 100644 index 000000000..b3101e140 --- /dev/null +++ b/src/20241203_Multi_WstETHReserveUpdate/config.ts @@ -0,0 +1,48 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3Ethereum', 'AaveV3EthereumLido'], + title: 'wstETH Reserve Update', + shortName: 'WstETHReserveUpdate', + date: '20241203', + author: 'ACI', + discussion: + 'https://governance.aave.com/t/arfc-prime-core-instance-wsteth-reserve-update/19973', + snapshot: '', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Ethereum: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'wstETH', + params: { + optimalUtilizationRate: '80', + baseVariableBorrowRate: '0', + variableRateSlope1: '1.75', + variableRateSlope2: '85', + }, + }, + ], + }, + cache: {blockNumber: 21322520}, + }, + AaveV3EthereumLido: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'wstETH', + params: { + optimalUtilizationRate: '90', + baseVariableBorrowRate: '0', + variableRateSlope1: '1.75', + variableRateSlope2: '85', + }, + }, + ], + }, + cache: {blockNumber: 21322524}, + }, + }, +};