From 6133c63c69341c4462fc0fc00874096752a01fcb Mon Sep 17 00:00:00 2001 From: Harsh Pandey Date: Fri, 1 Nov 2024 16:14:22 +0530 Subject: [PATCH 01/35] feat: activate generalized risk stewards (#413) * feat: generalized risk stewards * fix: build * chore: update libs * feat: dont revoke from caps stewards and add zksync payload * chore: remove zksync * feat: set gho as restricted * fix: test * feat: add etherfi * chore: update ether fi test block * chore: remove gho as restricted * chore: update libs * feat: add deployed contracts * fix: address * feat: add zksync steward * chore: update deploy script * chore: update writeup * Update src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2.md Co-authored-by: sendra * chore: update libs * fix: update to new stewards address * Update RiskStewardPhase2.md Co-authored-by: sendra --------- Co-authored-by: sendra --- ...bitrum_RiskStewardPhase2_20240805_after.md | 5 + ...lanche_RiskStewardPhase2_20240805_after.md | 5 + ...eV3BNB_RiskStewardPhase2_20240805_after.md | 5 + ...V3Base_RiskStewardPhase2_20240805_after.md | 5 + ...therFi_RiskStewardPhase2_20240805_after.md | 5 + ...umLido_RiskStewardPhase2_20240805_after.md | 5 + ...hereum_RiskStewardPhase2_20240805_after.md | 5 + ...Gnosis_RiskStewardPhase2_20240805_after.md | 5 + ...3Metis_RiskStewardPhase2_20240805_after.md | 5 + ...timism_RiskStewardPhase2_20240805_after.md | 5 + ...olygon_RiskStewardPhase2_20240805_after.md | 5 + ...Scroll_RiskStewardPhase2_20240805_after.md | 5 + ...ZkSync_RiskStewardPhase2_20240805_after.md | 5 + lib/aave-helpers | 2 +- ...eV3Arbitrum_RiskStewardPhase2_20240805.sol | 22 ++ ...3Arbitrum_RiskStewardPhase2_20240805.t.sol | 47 +++ ...V3Avalanche_RiskStewardPhase2_20240805.sol | 17 + ...Avalanche_RiskStewardPhase2_20240805.t.sol | 36 ++ .../AaveV3BNB_RiskStewardPhase2_20240805.sol | 17 + ...AaveV3BNB_RiskStewardPhase2_20240805.t.sol | 32 ++ .../AaveV3Base_RiskStewardPhase2_20240805.sol | 17 + ...aveV3Base_RiskStewardPhase2_20240805.t.sol | 32 ++ ...reumEtherFi_RiskStewardPhase2_20240805.sol | 17 + ...umEtherFi_RiskStewardPhase2_20240805.t.sol | 39 ++ ...thereumLido_RiskStewardPhase2_20240805.sol | 17 + ...ereumLido_RiskStewardPhase2_20240805.t.sol | 36 ++ ...eV3Ethereum_RiskStewardPhase2_20240805.sol | 22 ++ ...3Ethereum_RiskStewardPhase2_20240805.t.sol | 47 +++ ...aveV3Gnosis_RiskStewardPhase2_20240805.sol | 17 + ...eV3Gnosis_RiskStewardPhase2_20240805.t.sol | 32 ++ ...AaveV3Metis_RiskStewardPhase2_20240805.sol | 17 + ...veV3Metis_RiskStewardPhase2_20240805.t.sol | 32 ++ ...eV3Optimism_RiskStewardPhase2_20240805.sol | 17 + ...3Optimism_RiskStewardPhase2_20240805.t.sol | 36 ++ ...veV3Polygon_RiskStewardPhase2_20240805.sol | 17 + ...V3Polygon_RiskStewardPhase2_20240805.t.sol | 32 ++ ...aveV3Scroll_RiskStewardPhase2_20240805.sol | 17 + ...eV3Scroll_RiskStewardPhase2_20240805.t.sol | 32 ++ .../RiskStewardPhase2.md | 81 ++++ .../RiskStewardPhase2_20240805.s.sol | 351 ++++++++++++++++++ .../config.ts | 38 ++ .../interfaces/IRiskSteward.sol | 18 + ...aveV3ZkSync_RiskStewardPhase2_20240805.sol | 17 + ...eV3ZkSync_RiskStewardPhase2_20240805.t.sol | 39 ++ .../RiskStewardPhase2_20240805.s.sol | 37 ++ 45 files changed, 1294 insertions(+), 1 deletion(-) create mode 100644 diffs/AaveV3Arbitrum_RiskStewardPhase2_20240805_before_AaveV3Arbitrum_RiskStewardPhase2_20240805_after.md create mode 100644 diffs/AaveV3Avalanche_RiskStewardPhase2_20240805_before_AaveV3Avalanche_RiskStewardPhase2_20240805_after.md create mode 100644 diffs/AaveV3BNB_RiskStewardPhase2_20240805_before_AaveV3BNB_RiskStewardPhase2_20240805_after.md create mode 100644 diffs/AaveV3Base_RiskStewardPhase2_20240805_before_AaveV3Base_RiskStewardPhase2_20240805_after.md create mode 100644 diffs/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805_before_AaveV3EthereumEtherFi_RiskStewardPhase2_20240805_after.md create mode 100644 diffs/AaveV3EthereumLido_RiskStewardPhase2_20240805_before_AaveV3EthereumLido_RiskStewardPhase2_20240805_after.md create mode 100644 diffs/AaveV3Ethereum_RiskStewardPhase2_20240805_before_AaveV3Ethereum_RiskStewardPhase2_20240805_after.md create mode 100644 diffs/AaveV3Gnosis_RiskStewardPhase2_20240805_before_AaveV3Gnosis_RiskStewardPhase2_20240805_after.md create mode 100644 diffs/AaveV3Metis_RiskStewardPhase2_20240805_before_AaveV3Metis_RiskStewardPhase2_20240805_after.md create mode 100644 diffs/AaveV3Optimism_RiskStewardPhase2_20240805_before_AaveV3Optimism_RiskStewardPhase2_20240805_after.md create mode 100644 diffs/AaveV3Polygon_RiskStewardPhase2_20240805_before_AaveV3Polygon_RiskStewardPhase2_20240805_after.md create mode 100644 diffs/AaveV3Scroll_RiskStewardPhase2_20240805_before_AaveV3Scroll_RiskStewardPhase2_20240805_after.md create mode 100644 diffs/AaveV3ZkSync_RiskStewardPhase2_20240805_before_AaveV3ZkSync_RiskStewardPhase2_20240805_after.md create mode 100644 src/20240805_Multi_RiskStewardPhase2/AaveV3Arbitrum_RiskStewardPhase2_20240805.sol create mode 100644 src/20240805_Multi_RiskStewardPhase2/AaveV3Arbitrum_RiskStewardPhase2_20240805.t.sol create mode 100644 src/20240805_Multi_RiskStewardPhase2/AaveV3Avalanche_RiskStewardPhase2_20240805.sol create mode 100644 src/20240805_Multi_RiskStewardPhase2/AaveV3Avalanche_RiskStewardPhase2_20240805.t.sol create mode 100644 src/20240805_Multi_RiskStewardPhase2/AaveV3BNB_RiskStewardPhase2_20240805.sol create mode 100644 src/20240805_Multi_RiskStewardPhase2/AaveV3BNB_RiskStewardPhase2_20240805.t.sol create mode 100644 src/20240805_Multi_RiskStewardPhase2/AaveV3Base_RiskStewardPhase2_20240805.sol create mode 100644 src/20240805_Multi_RiskStewardPhase2/AaveV3Base_RiskStewardPhase2_20240805.t.sol create mode 100644 src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805.sol create mode 100644 src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805.t.sol create mode 100644 src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumLido_RiskStewardPhase2_20240805.sol create mode 100644 src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumLido_RiskStewardPhase2_20240805.t.sol create mode 100644 src/20240805_Multi_RiskStewardPhase2/AaveV3Ethereum_RiskStewardPhase2_20240805.sol create mode 100644 src/20240805_Multi_RiskStewardPhase2/AaveV3Ethereum_RiskStewardPhase2_20240805.t.sol create mode 100644 src/20240805_Multi_RiskStewardPhase2/AaveV3Gnosis_RiskStewardPhase2_20240805.sol create mode 100644 src/20240805_Multi_RiskStewardPhase2/AaveV3Gnosis_RiskStewardPhase2_20240805.t.sol create mode 100644 src/20240805_Multi_RiskStewardPhase2/AaveV3Metis_RiskStewardPhase2_20240805.sol create mode 100644 src/20240805_Multi_RiskStewardPhase2/AaveV3Metis_RiskStewardPhase2_20240805.t.sol create mode 100644 src/20240805_Multi_RiskStewardPhase2/AaveV3Optimism_RiskStewardPhase2_20240805.sol create mode 100644 src/20240805_Multi_RiskStewardPhase2/AaveV3Optimism_RiskStewardPhase2_20240805.t.sol create mode 100644 src/20240805_Multi_RiskStewardPhase2/AaveV3Polygon_RiskStewardPhase2_20240805.sol create mode 100644 src/20240805_Multi_RiskStewardPhase2/AaveV3Polygon_RiskStewardPhase2_20240805.t.sol create mode 100644 src/20240805_Multi_RiskStewardPhase2/AaveV3Scroll_RiskStewardPhase2_20240805.sol create mode 100644 src/20240805_Multi_RiskStewardPhase2/AaveV3Scroll_RiskStewardPhase2_20240805.t.sol create mode 100644 src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2.md create mode 100644 src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2_20240805.s.sol create mode 100644 src/20240805_Multi_RiskStewardPhase2/config.ts create mode 100644 src/20240805_Multi_RiskStewardPhase2/interfaces/IRiskSteward.sol create mode 100644 zksync/src/20240805_Multi_RiskStewardPhase2/AaveV3ZkSync_RiskStewardPhase2_20240805.sol create mode 100644 zksync/src/20240805_Multi_RiskStewardPhase2/AaveV3ZkSync_RiskStewardPhase2_20240805.t.sol create mode 100644 zksync/src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2_20240805.s.sol diff --git a/diffs/AaveV3Arbitrum_RiskStewardPhase2_20240805_before_AaveV3Arbitrum_RiskStewardPhase2_20240805_after.md b/diffs/AaveV3Arbitrum_RiskStewardPhase2_20240805_before_AaveV3Arbitrum_RiskStewardPhase2_20240805_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Arbitrum_RiskStewardPhase2_20240805_before_AaveV3Arbitrum_RiskStewardPhase2_20240805_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3Avalanche_RiskStewardPhase2_20240805_before_AaveV3Avalanche_RiskStewardPhase2_20240805_after.md b/diffs/AaveV3Avalanche_RiskStewardPhase2_20240805_before_AaveV3Avalanche_RiskStewardPhase2_20240805_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Avalanche_RiskStewardPhase2_20240805_before_AaveV3Avalanche_RiskStewardPhase2_20240805_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3BNB_RiskStewardPhase2_20240805_before_AaveV3BNB_RiskStewardPhase2_20240805_after.md b/diffs/AaveV3BNB_RiskStewardPhase2_20240805_before_AaveV3BNB_RiskStewardPhase2_20240805_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3BNB_RiskStewardPhase2_20240805_before_AaveV3BNB_RiskStewardPhase2_20240805_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3Base_RiskStewardPhase2_20240805_before_AaveV3Base_RiskStewardPhase2_20240805_after.md b/diffs/AaveV3Base_RiskStewardPhase2_20240805_before_AaveV3Base_RiskStewardPhase2_20240805_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Base_RiskStewardPhase2_20240805_before_AaveV3Base_RiskStewardPhase2_20240805_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805_before_AaveV3EthereumEtherFi_RiskStewardPhase2_20240805_after.md b/diffs/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805_before_AaveV3EthereumEtherFi_RiskStewardPhase2_20240805_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805_before_AaveV3EthereumEtherFi_RiskStewardPhase2_20240805_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3EthereumLido_RiskStewardPhase2_20240805_before_AaveV3EthereumLido_RiskStewardPhase2_20240805_after.md b/diffs/AaveV3EthereumLido_RiskStewardPhase2_20240805_before_AaveV3EthereumLido_RiskStewardPhase2_20240805_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3EthereumLido_RiskStewardPhase2_20240805_before_AaveV3EthereumLido_RiskStewardPhase2_20240805_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3Ethereum_RiskStewardPhase2_20240805_before_AaveV3Ethereum_RiskStewardPhase2_20240805_after.md b/diffs/AaveV3Ethereum_RiskStewardPhase2_20240805_before_AaveV3Ethereum_RiskStewardPhase2_20240805_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Ethereum_RiskStewardPhase2_20240805_before_AaveV3Ethereum_RiskStewardPhase2_20240805_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3Gnosis_RiskStewardPhase2_20240805_before_AaveV3Gnosis_RiskStewardPhase2_20240805_after.md b/diffs/AaveV3Gnosis_RiskStewardPhase2_20240805_before_AaveV3Gnosis_RiskStewardPhase2_20240805_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Gnosis_RiskStewardPhase2_20240805_before_AaveV3Gnosis_RiskStewardPhase2_20240805_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3Metis_RiskStewardPhase2_20240805_before_AaveV3Metis_RiskStewardPhase2_20240805_after.md b/diffs/AaveV3Metis_RiskStewardPhase2_20240805_before_AaveV3Metis_RiskStewardPhase2_20240805_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Metis_RiskStewardPhase2_20240805_before_AaveV3Metis_RiskStewardPhase2_20240805_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3Optimism_RiskStewardPhase2_20240805_before_AaveV3Optimism_RiskStewardPhase2_20240805_after.md b/diffs/AaveV3Optimism_RiskStewardPhase2_20240805_before_AaveV3Optimism_RiskStewardPhase2_20240805_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Optimism_RiskStewardPhase2_20240805_before_AaveV3Optimism_RiskStewardPhase2_20240805_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3Polygon_RiskStewardPhase2_20240805_before_AaveV3Polygon_RiskStewardPhase2_20240805_after.md b/diffs/AaveV3Polygon_RiskStewardPhase2_20240805_before_AaveV3Polygon_RiskStewardPhase2_20240805_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Polygon_RiskStewardPhase2_20240805_before_AaveV3Polygon_RiskStewardPhase2_20240805_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3Scroll_RiskStewardPhase2_20240805_before_AaveV3Scroll_RiskStewardPhase2_20240805_after.md b/diffs/AaveV3Scroll_RiskStewardPhase2_20240805_before_AaveV3Scroll_RiskStewardPhase2_20240805_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Scroll_RiskStewardPhase2_20240805_before_AaveV3Scroll_RiskStewardPhase2_20240805_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3ZkSync_RiskStewardPhase2_20240805_before_AaveV3ZkSync_RiskStewardPhase2_20240805_after.md b/diffs/AaveV3ZkSync_RiskStewardPhase2_20240805_before_AaveV3ZkSync_RiskStewardPhase2_20240805_after.md new file mode 100644 index 000000000..722a7620e --- /dev/null +++ b/diffs/AaveV3ZkSync_RiskStewardPhase2_20240805_before_AaveV3ZkSync_RiskStewardPhase2_20240805_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` diff --git a/lib/aave-helpers b/lib/aave-helpers index d378deda2..19d8ece8a 160000 --- a/lib/aave-helpers +++ b/lib/aave-helpers @@ -1 +1 @@ -Subproject commit d378deda2e0477900a84bffb1c2f45d199dc3138 +Subproject commit 19d8ece8a12d3d789ccb96fd184fef0a646b201c diff --git a/src/20240805_Multi_RiskStewardPhase2/AaveV3Arbitrum_RiskStewardPhase2_20240805.sol b/src/20240805_Multi_RiskStewardPhase2/AaveV3Arbitrum_RiskStewardPhase2_20240805.sol new file mode 100644 index 000000000..028526f90 --- /dev/null +++ b/src/20240805_Multi_RiskStewardPhase2/AaveV3Arbitrum_RiskStewardPhase2_20240805.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {IRiskSteward} from './interfaces/IRiskSteward.sol'; +import {AaveV3Arbitrum, AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol'; + +/** + * @title Risk Steward Phase 2 + * @author BGD Labs (@bgdlabs) + * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x4809f179e517e5745ec13eba8f40d98dab73ca65f8a141bd2f18cc16dcd0cc16 + * - Discussion: https://governance.aave.com/t/arfc-bgd-risk-steward-phase-2-risksteward/16204 + */ +contract AaveV3Arbitrum_RiskStewardPhase2_20240805 is IProposalGenericExecutor { + function execute() external { + AaveV3Arbitrum.ACL_MANAGER.addRiskAdmin(AaveV3Arbitrum.RISK_STEWARD); + IRiskSteward(AaveV3Arbitrum.RISK_STEWARD).setAddressRestricted( + AaveV3ArbitrumAssets.GHO_UNDERLYING, + true + ); + } +} diff --git a/src/20240805_Multi_RiskStewardPhase2/AaveV3Arbitrum_RiskStewardPhase2_20240805.t.sol b/src/20240805_Multi_RiskStewardPhase2/AaveV3Arbitrum_RiskStewardPhase2_20240805.t.sol new file mode 100644 index 000000000..a5dd11c92 --- /dev/null +++ b/src/20240805_Multi_RiskStewardPhase2/AaveV3Arbitrum_RiskStewardPhase2_20240805.t.sol @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Arbitrum, AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol'; +import {IRiskSteward} from './interfaces/IRiskSteward.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Arbitrum_RiskStewardPhase2_20240805} from './AaveV3Arbitrum_RiskStewardPhase2_20240805.sol'; + +/** + * @dev Test for AaveV3Arbitrum_RiskStewardPhase2_20240805 + * command: FOUNDRY_PROFILE=arbitrum forge test --match-path=src/20240805_Multi_RiskStewardPhase2/AaveV3Arbitrum_RiskStewardPhase2_20240805.t.sol -vv + */ +contract AaveV3Arbitrum_RiskStewardPhase2_20240805_Test is ProtocolV3TestBase { + AaveV3Arbitrum_RiskStewardPhase2_20240805 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('arbitrum'), 269547589); + proposal = new AaveV3Arbitrum_RiskStewardPhase2_20240805(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Arbitrum_RiskStewardPhase2_20240805', + AaveV3Arbitrum.POOL, + address(proposal) + ); + } + + function test_permissions() public { + assertFalse( + IRiskSteward(AaveV3Arbitrum.RISK_STEWARD).isAddressRestricted( + AaveV3ArbitrumAssets.GHO_UNDERLYING + ) + ); + executePayload(vm, address(proposal)); + + assertEq(AaveV3Arbitrum.ACL_MANAGER.isRiskAdmin(AaveV3Arbitrum.RISK_STEWARD), true); + assertTrue( + IRiskSteward(AaveV3Arbitrum.RISK_STEWARD).isAddressRestricted( + AaveV3ArbitrumAssets.GHO_UNDERLYING + ) + ); + } +} diff --git a/src/20240805_Multi_RiskStewardPhase2/AaveV3Avalanche_RiskStewardPhase2_20240805.sol b/src/20240805_Multi_RiskStewardPhase2/AaveV3Avalanche_RiskStewardPhase2_20240805.sol new file mode 100644 index 000000000..d62dfb092 --- /dev/null +++ b/src/20240805_Multi_RiskStewardPhase2/AaveV3Avalanche_RiskStewardPhase2_20240805.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {AaveV3Avalanche} from 'aave-address-book/AaveV3Avalanche.sol'; + +/** + * @title Risk Steward Phase 2 + * @author BGD Labs (@bgdlabs) + * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x4809f179e517e5745ec13eba8f40d98dab73ca65f8a141bd2f18cc16dcd0cc16 + * - Discussion: https://governance.aave.com/t/arfc-bgd-risk-steward-phase-2-risksteward/16204 + */ +contract AaveV3Avalanche_RiskStewardPhase2_20240805 is IProposalGenericExecutor { + function execute() external { + AaveV3Avalanche.ACL_MANAGER.addRiskAdmin(AaveV3Avalanche.RISK_STEWARD); + } +} diff --git a/src/20240805_Multi_RiskStewardPhase2/AaveV3Avalanche_RiskStewardPhase2_20240805.t.sol b/src/20240805_Multi_RiskStewardPhase2/AaveV3Avalanche_RiskStewardPhase2_20240805.t.sol new file mode 100644 index 000000000..73fb83851 --- /dev/null +++ b/src/20240805_Multi_RiskStewardPhase2/AaveV3Avalanche_RiskStewardPhase2_20240805.t.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Avalanche} from 'aave-address-book/AaveV3Avalanche.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Avalanche_RiskStewardPhase2_20240805} from './AaveV3Avalanche_RiskStewardPhase2_20240805.sol'; + +/** + * @dev Test for AaveV3Avalanche_RiskStewardPhase2_20240805 + * command: FOUNDRY_PROFILE=avalanche forge test --match-path=src/20240805_Multi_RiskStewardPhase2/AaveV3Avalanche_RiskStewardPhase2_20240805.t.sol -vv + */ +contract AaveV3Avalanche_RiskStewardPhase2_20240805_Test is ProtocolV3TestBase { + AaveV3Avalanche_RiskStewardPhase2_20240805 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('avalanche'), 52476941); + proposal = new AaveV3Avalanche_RiskStewardPhase2_20240805(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Avalanche_RiskStewardPhase2_20240805', + AaveV3Avalanche.POOL, + address(proposal) + ); + } + + function test_permissions() public { + executePayload(vm, address(proposal)); + + assertEq(AaveV3Avalanche.ACL_MANAGER.isRiskAdmin(AaveV3Avalanche.RISK_STEWARD), true); + } +} diff --git a/src/20240805_Multi_RiskStewardPhase2/AaveV3BNB_RiskStewardPhase2_20240805.sol b/src/20240805_Multi_RiskStewardPhase2/AaveV3BNB_RiskStewardPhase2_20240805.sol new file mode 100644 index 000000000..f71de6a1e --- /dev/null +++ b/src/20240805_Multi_RiskStewardPhase2/AaveV3BNB_RiskStewardPhase2_20240805.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {AaveV3BNB} from 'aave-address-book/AaveV3BNB.sol'; + +/** + * @title Risk Steward Phase 2 + * @author BGD Labs (@bgdlabs) + * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x4809f179e517e5745ec13eba8f40d98dab73ca65f8a141bd2f18cc16dcd0cc16 + * - Discussion: https://governance.aave.com/t/arfc-bgd-risk-steward-phase-2-risksteward/16204 + */ +contract AaveV3BNB_RiskStewardPhase2_20240805 is IProposalGenericExecutor { + function execute() external { + AaveV3BNB.ACL_MANAGER.addRiskAdmin(AaveV3BNB.RISK_STEWARD); + } +} diff --git a/src/20240805_Multi_RiskStewardPhase2/AaveV3BNB_RiskStewardPhase2_20240805.t.sol b/src/20240805_Multi_RiskStewardPhase2/AaveV3BNB_RiskStewardPhase2_20240805.t.sol new file mode 100644 index 000000000..b02710367 --- /dev/null +++ b/src/20240805_Multi_RiskStewardPhase2/AaveV3BNB_RiskStewardPhase2_20240805.t.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3BNB} from 'aave-address-book/AaveV3BNB.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3BNB_RiskStewardPhase2_20240805} from './AaveV3BNB_RiskStewardPhase2_20240805.sol'; + +/** + * @dev Test for AaveV3BNB_RiskStewardPhase2_20240805 + * command: FOUNDRY_PROFILE=bnb forge test --match-path=src/20240805_Multi_RiskStewardPhase2/AaveV3BNB_RiskStewardPhase2_20240805.t.sol -vv + */ +contract AaveV3BNB_RiskStewardPhase2_20240805_Test is ProtocolV3TestBase { + AaveV3BNB_RiskStewardPhase2_20240805 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('bnb'), 43597598); + proposal = new AaveV3BNB_RiskStewardPhase2_20240805(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest('AaveV3BNB_RiskStewardPhase2_20240805', AaveV3BNB.POOL, address(proposal)); + } + + function test_permissions() public { + executePayload(vm, address(proposal)); + + assertEq(AaveV3BNB.ACL_MANAGER.isRiskAdmin(AaveV3BNB.RISK_STEWARD), true); + } +} diff --git a/src/20240805_Multi_RiskStewardPhase2/AaveV3Base_RiskStewardPhase2_20240805.sol b/src/20240805_Multi_RiskStewardPhase2/AaveV3Base_RiskStewardPhase2_20240805.sol new file mode 100644 index 000000000..ff43bc191 --- /dev/null +++ b/src/20240805_Multi_RiskStewardPhase2/AaveV3Base_RiskStewardPhase2_20240805.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {AaveV3Base} from 'aave-address-book/AaveV3Base.sol'; + +/** + * @title Risk Steward Phase 2 + * @author BGD Labs (@bgdlabs) + * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x4809f179e517e5745ec13eba8f40d98dab73ca65f8a141bd2f18cc16dcd0cc16 + * - Discussion: https://governance.aave.com/t/arfc-bgd-risk-steward-phase-2-risksteward/16204 + */ +contract AaveV3Base_RiskStewardPhase2_20240805 is IProposalGenericExecutor { + function execute() external { + AaveV3Base.ACL_MANAGER.addRiskAdmin(AaveV3Base.RISK_STEWARD); + } +} diff --git a/src/20240805_Multi_RiskStewardPhase2/AaveV3Base_RiskStewardPhase2_20240805.t.sol b/src/20240805_Multi_RiskStewardPhase2/AaveV3Base_RiskStewardPhase2_20240805.t.sol new file mode 100644 index 000000000..f531905c8 --- /dev/null +++ b/src/20240805_Multi_RiskStewardPhase2/AaveV3Base_RiskStewardPhase2_20240805.t.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Base} from 'aave-address-book/AaveV3Base.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Base_RiskStewardPhase2_20240805} from './AaveV3Base_RiskStewardPhase2_20240805.sol'; + +/** + * @dev Test for AaveV3Base_RiskStewardPhase2_20240805 + * command: FOUNDRY_PROFILE=base forge test --match-path=src/20240805_Multi_RiskStewardPhase2/AaveV3Base_RiskStewardPhase2_20240805.t.sol -vv + */ +contract AaveV3Base_RiskStewardPhase2_20240805_Test is ProtocolV3TestBase { + AaveV3Base_RiskStewardPhase2_20240805 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('base'), 21791615); + proposal = new AaveV3Base_RiskStewardPhase2_20240805(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest('AaveV3Base_RiskStewardPhase2_20240805', AaveV3Base.POOL, address(proposal)); + } + + function test_permissions() public { + executePayload(vm, address(proposal)); + + assertEq(AaveV3Base.ACL_MANAGER.isRiskAdmin(AaveV3Base.RISK_STEWARD), true); + } +} diff --git a/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805.sol b/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805.sol new file mode 100644 index 000000000..7564d0af8 --- /dev/null +++ b/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {AaveV3EthereumEtherFi} from 'aave-address-book/AaveV3EthereumEtherFi.sol'; + +/** + * @title Risk Steward Phase 2 + * @author BGD Labs (@bgdlabs) + * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x4809f179e517e5745ec13eba8f40d98dab73ca65f8a141bd2f18cc16dcd0cc16 + * - Discussion: https://governance.aave.com/t/arfc-bgd-risk-steward-phase-2-risksteward/16204 + */ +contract AaveV3EthereumEtherFi_RiskStewardPhase2_20240805 is IProposalGenericExecutor { + function execute() external { + AaveV3EthereumEtherFi.ACL_MANAGER.addRiskAdmin(AaveV3EthereumEtherFi.RISK_STEWARD); + } +} diff --git a/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805.t.sol b/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805.t.sol new file mode 100644 index 000000000..31248f52e --- /dev/null +++ b/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805.t.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumEtherFi} from 'aave-address-book/AaveV3EthereumEtherFi.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3EthereumEtherFi_RiskStewardPhase2_20240805} from './AaveV3EthereumEtherFi_RiskStewardPhase2_20240805.sol'; + +/** + * @dev Test for AaveV3EthereumEtherFi_RiskStewardPhase2_20240805 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805.t.sol -vv + */ +contract AaveV3EthereumEtherFi_RiskStewardPhase2_20240805_Test is ProtocolV3TestBase { + AaveV3EthereumEtherFi_RiskStewardPhase2_20240805 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21085127); + proposal = new AaveV3EthereumEtherFi_RiskStewardPhase2_20240805(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3EthereumEtherFi_RiskStewardPhase2_20240805', + AaveV3EthereumEtherFi.POOL, + address(proposal) + ); + } + + function test_permissions() public { + executePayload(vm, address(proposal)); + + assertEq( + AaveV3EthereumEtherFi.ACL_MANAGER.isRiskAdmin(AaveV3EthereumEtherFi.RISK_STEWARD), + true + ); + } +} diff --git a/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumLido_RiskStewardPhase2_20240805.sol b/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumLido_RiskStewardPhase2_20240805.sol new file mode 100644 index 000000000..ff92721ee --- /dev/null +++ b/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumLido_RiskStewardPhase2_20240805.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {AaveV3EthereumLido} from 'aave-address-book/AaveV3EthereumLido.sol'; + +/** + * @title Risk Steward Phase 2 + * @author BGD Labs (@bgdlabs) + * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x4809f179e517e5745ec13eba8f40d98dab73ca65f8a141bd2f18cc16dcd0cc16 + * - Discussion: https://governance.aave.com/t/arfc-bgd-risk-steward-phase-2-risksteward/16204 + */ +contract AaveV3EthereumLido_RiskStewardPhase2_20240805 is IProposalGenericExecutor { + function execute() external { + AaveV3EthereumLido.ACL_MANAGER.addRiskAdmin(AaveV3EthereumLido.RISK_STEWARD); + } +} diff --git a/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumLido_RiskStewardPhase2_20240805.t.sol b/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumLido_RiskStewardPhase2_20240805.t.sol new file mode 100644 index 000000000..7ec8ed28c --- /dev/null +++ b/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumLido_RiskStewardPhase2_20240805.t.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumLido} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3EthereumLido_RiskStewardPhase2_20240805} from './AaveV3EthereumLido_RiskStewardPhase2_20240805.sol'; + +/** + * @dev Test for AaveV3EthereumLido_RiskStewardPhase2_20240805 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumLido_RiskStewardPhase2_20240805.t.sol -vv + */ +contract AaveV3EthereumLido_RiskStewardPhase2_20240805_Test is ProtocolV3TestBase { + AaveV3EthereumLido_RiskStewardPhase2_20240805 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21085127); + proposal = new AaveV3EthereumLido_RiskStewardPhase2_20240805(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3EthereumLido_RiskStewardPhase2_20240805', + AaveV3EthereumLido.POOL, + address(proposal) + ); + } + + function test_permissions() public { + executePayload(vm, address(proposal)); + + assertEq(AaveV3EthereumLido.ACL_MANAGER.isRiskAdmin(AaveV3EthereumLido.RISK_STEWARD), true); + } +} diff --git a/src/20240805_Multi_RiskStewardPhase2/AaveV3Ethereum_RiskStewardPhase2_20240805.sol b/src/20240805_Multi_RiskStewardPhase2/AaveV3Ethereum_RiskStewardPhase2_20240805.sol new file mode 100644 index 000000000..a6c939dcc --- /dev/null +++ b/src/20240805_Multi_RiskStewardPhase2/AaveV3Ethereum_RiskStewardPhase2_20240805.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {IRiskSteward} from './interfaces/IRiskSteward.sol'; + +/** + * @title Risk Steward Phase 2 + * @author BGD Labs (@bgdlabs) + * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x4809f179e517e5745ec13eba8f40d98dab73ca65f8a141bd2f18cc16dcd0cc16 + * - Discussion: https://governance.aave.com/t/arfc-bgd-risk-steward-phase-2-risksteward/16204 + */ +contract AaveV3Ethereum_RiskStewardPhase2_20240805 is IProposalGenericExecutor { + function execute() external { + AaveV3Ethereum.ACL_MANAGER.addRiskAdmin(AaveV3Ethereum.RISK_STEWARD); + IRiskSteward(AaveV3Ethereum.RISK_STEWARD).setAddressRestricted( + AaveV3EthereumAssets.GHO_UNDERLYING, + true + ); + } +} diff --git a/src/20240805_Multi_RiskStewardPhase2/AaveV3Ethereum_RiskStewardPhase2_20240805.t.sol b/src/20240805_Multi_RiskStewardPhase2/AaveV3Ethereum_RiskStewardPhase2_20240805.t.sol new file mode 100644 index 000000000..3e17eca53 --- /dev/null +++ b/src/20240805_Multi_RiskStewardPhase2/AaveV3Ethereum_RiskStewardPhase2_20240805.t.sol @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Ethereum_RiskStewardPhase2_20240805} from './AaveV3Ethereum_RiskStewardPhase2_20240805.sol'; +import {IRiskSteward} from './interfaces/IRiskSteward.sol'; + +/** + * @dev Test for AaveV3Ethereum_RiskStewardPhase2_20240805 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20240805_Multi_RiskStewardPhase2/AaveV3Ethereum_RiskStewardPhase2_20240805.t.sol -vv + */ +contract AaveV3Ethereum_RiskStewardPhase2_20240805_Test is ProtocolV3TestBase { + AaveV3Ethereum_RiskStewardPhase2_20240805 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21085127); + proposal = new AaveV3Ethereum_RiskStewardPhase2_20240805(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_RiskStewardPhase2_20240805', + AaveV3Ethereum.POOL, + address(proposal) + ); + } + + function test_permissions() public { + assertFalse( + IRiskSteward(AaveV3Ethereum.RISK_STEWARD).isAddressRestricted( + AaveV3EthereumAssets.GHO_UNDERLYING + ) + ); + executePayload(vm, address(proposal)); + + assertEq(AaveV3Ethereum.ACL_MANAGER.isRiskAdmin(AaveV3Ethereum.RISK_STEWARD), true); + assertTrue( + IRiskSteward(AaveV3Ethereum.RISK_STEWARD).isAddressRestricted( + AaveV3EthereumAssets.GHO_UNDERLYING + ) + ); + } +} diff --git a/src/20240805_Multi_RiskStewardPhase2/AaveV3Gnosis_RiskStewardPhase2_20240805.sol b/src/20240805_Multi_RiskStewardPhase2/AaveV3Gnosis_RiskStewardPhase2_20240805.sol new file mode 100644 index 000000000..bbbbb6e92 --- /dev/null +++ b/src/20240805_Multi_RiskStewardPhase2/AaveV3Gnosis_RiskStewardPhase2_20240805.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {AaveV3Gnosis} from 'aave-address-book/AaveV3Gnosis.sol'; + +/** + * @title Risk Steward Phase 2 + * @author BGD Labs (@bgdlabs) + * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x4809f179e517e5745ec13eba8f40d98dab73ca65f8a141bd2f18cc16dcd0cc16 + * - Discussion: https://governance.aave.com/t/arfc-bgd-risk-steward-phase-2-risksteward/16204 + */ +contract AaveV3Gnosis_RiskStewardPhase2_20240805 is IProposalGenericExecutor { + function execute() external { + AaveV3Gnosis.ACL_MANAGER.addRiskAdmin(AaveV3Gnosis.RISK_STEWARD); + } +} diff --git a/src/20240805_Multi_RiskStewardPhase2/AaveV3Gnosis_RiskStewardPhase2_20240805.t.sol b/src/20240805_Multi_RiskStewardPhase2/AaveV3Gnosis_RiskStewardPhase2_20240805.t.sol new file mode 100644 index 000000000..393e030be --- /dev/null +++ b/src/20240805_Multi_RiskStewardPhase2/AaveV3Gnosis_RiskStewardPhase2_20240805.t.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Gnosis} from 'aave-address-book/AaveV3Gnosis.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Gnosis_RiskStewardPhase2_20240805} from './AaveV3Gnosis_RiskStewardPhase2_20240805.sol'; + +/** + * @dev Test for AaveV3Gnosis_RiskStewardPhase2_20240805 + * command: FOUNDRY_PROFILE=gnosis forge test --match-path=src/20240805_Multi_RiskStewardPhase2/AaveV3Gnosis_RiskStewardPhase2_20240805.t.sol -vv + */ +contract AaveV3Gnosis_RiskStewardPhase2_20240805_Test is ProtocolV3TestBase { + AaveV3Gnosis_RiskStewardPhase2_20240805 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('gnosis'), 36783528); + proposal = new AaveV3Gnosis_RiskStewardPhase2_20240805(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest('AaveV3Gnosis_RiskStewardPhase2_20240805', AaveV3Gnosis.POOL, address(proposal)); + } + + function test_permissions() public { + executePayload(vm, address(proposal)); + + assertEq(AaveV3Gnosis.ACL_MANAGER.isRiskAdmin(AaveV3Gnosis.RISK_STEWARD), true); + } +} diff --git a/src/20240805_Multi_RiskStewardPhase2/AaveV3Metis_RiskStewardPhase2_20240805.sol b/src/20240805_Multi_RiskStewardPhase2/AaveV3Metis_RiskStewardPhase2_20240805.sol new file mode 100644 index 000000000..b27bb2568 --- /dev/null +++ b/src/20240805_Multi_RiskStewardPhase2/AaveV3Metis_RiskStewardPhase2_20240805.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {AaveV3Metis} from 'aave-address-book/AaveV3Metis.sol'; + +/** + * @title Risk Steward Phase 2 + * @author BGD Labs (@bgdlabs) + * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x4809f179e517e5745ec13eba8f40d98dab73ca65f8a141bd2f18cc16dcd0cc16 + * - Discussion: https://governance.aave.com/t/arfc-bgd-risk-steward-phase-2-risksteward/16204 + */ +contract AaveV3Metis_RiskStewardPhase2_20240805 is IProposalGenericExecutor { + function execute() external { + AaveV3Metis.ACL_MANAGER.addRiskAdmin(AaveV3Metis.RISK_STEWARD); + } +} diff --git a/src/20240805_Multi_RiskStewardPhase2/AaveV3Metis_RiskStewardPhase2_20240805.t.sol b/src/20240805_Multi_RiskStewardPhase2/AaveV3Metis_RiskStewardPhase2_20240805.t.sol new file mode 100644 index 000000000..fe1f617df --- /dev/null +++ b/src/20240805_Multi_RiskStewardPhase2/AaveV3Metis_RiskStewardPhase2_20240805.t.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Metis} from 'aave-address-book/AaveV3Metis.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Metis_RiskStewardPhase2_20240805} from './AaveV3Metis_RiskStewardPhase2_20240805.sol'; + +/** + * @dev Test for AaveV3Metis_RiskStewardPhase2_20240805 + * command: FOUNDRY_PROFILE=metis forge test --match-path=src/20240805_Multi_RiskStewardPhase2/AaveV3Metis_RiskStewardPhase2_20240805.t.sol -vv + */ +contract AaveV3Metis_RiskStewardPhase2_20240805_Test is ProtocolV3TestBase { + AaveV3Metis_RiskStewardPhase2_20240805 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('metis'), 18845256); + proposal = new AaveV3Metis_RiskStewardPhase2_20240805(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest('AaveV3Metis_RiskStewardPhase2_20240805', AaveV3Metis.POOL, address(proposal)); + } + + function test_permissions() public { + executePayload(vm, address(proposal)); + + assertEq(AaveV3Metis.ACL_MANAGER.isRiskAdmin(AaveV3Metis.RISK_STEWARD), true); + } +} diff --git a/src/20240805_Multi_RiskStewardPhase2/AaveV3Optimism_RiskStewardPhase2_20240805.sol b/src/20240805_Multi_RiskStewardPhase2/AaveV3Optimism_RiskStewardPhase2_20240805.sol new file mode 100644 index 000000000..c026210d6 --- /dev/null +++ b/src/20240805_Multi_RiskStewardPhase2/AaveV3Optimism_RiskStewardPhase2_20240805.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {AaveV3Optimism} from 'aave-address-book/AaveV3Optimism.sol'; + +/** + * @title Risk Steward Phase 2 + * @author BGD Labs (@bgdlabs) + * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x4809f179e517e5745ec13eba8f40d98dab73ca65f8a141bd2f18cc16dcd0cc16 + * - Discussion: https://governance.aave.com/t/arfc-bgd-risk-steward-phase-2-risksteward/16204 + */ +contract AaveV3Optimism_RiskStewardPhase2_20240805 is IProposalGenericExecutor { + function execute() external { + AaveV3Optimism.ACL_MANAGER.addRiskAdmin(AaveV3Optimism.RISK_STEWARD); + } +} diff --git a/src/20240805_Multi_RiskStewardPhase2/AaveV3Optimism_RiskStewardPhase2_20240805.t.sol b/src/20240805_Multi_RiskStewardPhase2/AaveV3Optimism_RiskStewardPhase2_20240805.t.sol new file mode 100644 index 000000000..ffcff7230 --- /dev/null +++ b/src/20240805_Multi_RiskStewardPhase2/AaveV3Optimism_RiskStewardPhase2_20240805.t.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Optimism} from 'aave-address-book/AaveV3Optimism.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Optimism_RiskStewardPhase2_20240805} from './AaveV3Optimism_RiskStewardPhase2_20240805.sol'; + +/** + * @dev Test for AaveV3Optimism_RiskStewardPhase2_20240805 + * command: FOUNDRY_PROFILE=optimism forge test --match-path=src/20240805_Multi_RiskStewardPhase2/AaveV3Optimism_RiskStewardPhase2_20240805.t.sol -vv + */ +contract AaveV3Optimism_RiskStewardPhase2_20240805_Test is ProtocolV3TestBase { + AaveV3Optimism_RiskStewardPhase2_20240805 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('optimism'), 127387217); + proposal = new AaveV3Optimism_RiskStewardPhase2_20240805(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Optimism_RiskStewardPhase2_20240805', + AaveV3Optimism.POOL, + address(proposal) + ); + } + + function test_permissions() public { + executePayload(vm, address(proposal)); + + assertEq(AaveV3Optimism.ACL_MANAGER.isRiskAdmin(AaveV3Optimism.RISK_STEWARD), true); + } +} diff --git a/src/20240805_Multi_RiskStewardPhase2/AaveV3Polygon_RiskStewardPhase2_20240805.sol b/src/20240805_Multi_RiskStewardPhase2/AaveV3Polygon_RiskStewardPhase2_20240805.sol new file mode 100644 index 000000000..7ea99e15f --- /dev/null +++ b/src/20240805_Multi_RiskStewardPhase2/AaveV3Polygon_RiskStewardPhase2_20240805.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {AaveV3Polygon} from 'aave-address-book/AaveV3Polygon.sol'; + +/** + * @title Risk Steward Phase 2 + * @author BGD Labs (@bgdlabs) + * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x4809f179e517e5745ec13eba8f40d98dab73ca65f8a141bd2f18cc16dcd0cc16 + * - Discussion: https://governance.aave.com/t/arfc-bgd-risk-steward-phase-2-risksteward/16204 + */ +contract AaveV3Polygon_RiskStewardPhase2_20240805 is IProposalGenericExecutor { + function execute() external { + AaveV3Polygon.ACL_MANAGER.addRiskAdmin(AaveV3Polygon.RISK_STEWARD); + } +} diff --git a/src/20240805_Multi_RiskStewardPhase2/AaveV3Polygon_RiskStewardPhase2_20240805.t.sol b/src/20240805_Multi_RiskStewardPhase2/AaveV3Polygon_RiskStewardPhase2_20240805.t.sol new file mode 100644 index 000000000..d9bd6e801 --- /dev/null +++ b/src/20240805_Multi_RiskStewardPhase2/AaveV3Polygon_RiskStewardPhase2_20240805.t.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Polygon} from 'aave-address-book/AaveV3Polygon.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Polygon_RiskStewardPhase2_20240805} from './AaveV3Polygon_RiskStewardPhase2_20240805.sol'; + +/** + * @dev Test for AaveV3Polygon_RiskStewardPhase2_20240805 + * command: FOUNDRY_PROFILE=polygon forge test --match-path=src/20240805_Multi_RiskStewardPhase2/AaveV3Polygon_RiskStewardPhase2_20240805.t.sol -vv + */ +contract AaveV3Polygon_RiskStewardPhase2_20240805_Test is ProtocolV3TestBase { + AaveV3Polygon_RiskStewardPhase2_20240805 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('polygon'), 63655296); + proposal = new AaveV3Polygon_RiskStewardPhase2_20240805(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest('AaveV3Polygon_RiskStewardPhase2_20240805', AaveV3Polygon.POOL, address(proposal)); + } + + function test_permissions() public { + executePayload(vm, address(proposal)); + + assertEq(AaveV3Polygon.ACL_MANAGER.isRiskAdmin(AaveV3Polygon.RISK_STEWARD), true); + } +} diff --git a/src/20240805_Multi_RiskStewardPhase2/AaveV3Scroll_RiskStewardPhase2_20240805.sol b/src/20240805_Multi_RiskStewardPhase2/AaveV3Scroll_RiskStewardPhase2_20240805.sol new file mode 100644 index 000000000..65095e5b6 --- /dev/null +++ b/src/20240805_Multi_RiskStewardPhase2/AaveV3Scroll_RiskStewardPhase2_20240805.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {AaveV3Scroll} from 'aave-address-book/AaveV3Scroll.sol'; + +/** + * @title Risk Steward Phase 2 + * @author BGD Labs (@bgdlabs) + * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x4809f179e517e5745ec13eba8f40d98dab73ca65f8a141bd2f18cc16dcd0cc16 + * - Discussion: https://governance.aave.com/t/arfc-bgd-risk-steward-phase-2-risksteward/16204 + */ +contract AaveV3Scroll_RiskStewardPhase2_20240805 is IProposalGenericExecutor { + function execute() external { + AaveV3Scroll.ACL_MANAGER.addRiskAdmin(AaveV3Scroll.RISK_STEWARD); + } +} diff --git a/src/20240805_Multi_RiskStewardPhase2/AaveV3Scroll_RiskStewardPhase2_20240805.t.sol b/src/20240805_Multi_RiskStewardPhase2/AaveV3Scroll_RiskStewardPhase2_20240805.t.sol new file mode 100644 index 000000000..73fd20f0c --- /dev/null +++ b/src/20240805_Multi_RiskStewardPhase2/AaveV3Scroll_RiskStewardPhase2_20240805.t.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Scroll} from 'aave-address-book/AaveV3Scroll.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Scroll_RiskStewardPhase2_20240805} from './AaveV3Scroll_RiskStewardPhase2_20240805.sol'; + +/** + * @dev Test for AaveV3Scroll_RiskStewardPhase2_20240805 + * command: FOUNDRY_PROFILE=scroll forge test --match-path=src/20240805_Multi_RiskStewardPhase2/AaveV3Scroll_RiskStewardPhase2_20240805.t.sol -vv + */ +contract AaveV3Scroll_RiskStewardPhase2_20240805_Test is ProtocolV3TestBase { + AaveV3Scroll_RiskStewardPhase2_20240805 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('scroll'), 10688886); + proposal = new AaveV3Scroll_RiskStewardPhase2_20240805(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest('AaveV3Scroll_RiskStewardPhase2_20240805', AaveV3Scroll.POOL, address(proposal)); + } + + function test_permissions() public { + executePayload(vm, address(proposal)); + + assertEq(AaveV3Scroll.ACL_MANAGER.isRiskAdmin(AaveV3Scroll.RISK_STEWARD), true); + } +} diff --git a/src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2.md b/src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2.md new file mode 100644 index 000000000..bf11b8390 --- /dev/null +++ b/src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2.md @@ -0,0 +1,81 @@ +--- +title: "Risk Steward Phase 2" +author: "BGD Labs (@bgdlabs)" +discussions: "https://governance.aave.com/t/arfc-bgd-risk-steward-phase-2-risksteward/16204" +snapshot: "https://snapshot.org/#/aave.eth/proposal/0x4809f179e517e5745ec13eba8f40d98dab73ca65f8a141bd2f18cc16dcd0cc16" +--- + +## Simple Summary + +Expanding from the scope of [CapsPlusRiskSteward](https://governance.aave.com/t/bgd-risk-steward-phase-1-capsplusrisksteward/12602), we now introduce the new generalized RiskSteward, allowing hardly constrained risk parameter updates by risk service providers and reducing governance overhead. + +## Motivation + +Aave's decentralized governance system, while robust, creates significant operational overhead and cost due to its comprehensive proposal process. This process includes pre-AIP procedures, payload creation, multiple reviews, voting, and on-chain verification. +While recent improvements have optimized some steps, further efficiency gains are possible, particularly in risk-related proposals. + +Rationale for reducing risk-related proposals: + +- Two expert, independent risk teams (ChaosLabs, LlamaRisk) are engaged with the DAO. +- Historical voting unanimity on non-controversial, incremental risk proposals. +- Technical feasibility of constraining updates using Aave v3 roles and specific validations. + +The success of the CapsPlusRiskStewards experiment demonstrates the viability of expanding this approach. As Aave expands to new networks, minimizing governance proposals becomes crucial to prevent voter fatigue. + +## Specification + +The new RiskSteward we propose follows the same design as the CapsPlusRiskSteward, an smart contract to which the Aave Governance gives `RISK_ADMIN` role over all v3 instances, controlled by a 2-of-2 multisig, and heavily constrained on what can do and how by its own logic. + +The 2-of-2 multisig controlling the RiskSteward will have Chaos and BGD Labs as signers, with the inclusion of BGD Labs as a matter of extra security procedure. + +`ACL_MANAGER.addRiskAdmin()` is called to add a the new risk steward. + +Additionally, params for GHO on Arbitrum and Ethereum cannot be changed by this RiskStewards, as the params will be updated by the GhoStewards instead, this is done by setting the GHO asset as restricted via the following method: `RISK_STEWARD.setAddressRestricted();` + +To give some extra buffer and protection, we will remove the `RISK_ADMIN` role from the old `CapsPlusRiskSteward` once risk providers have adapted to use the new Risk Stewards. + +Deployed Risk Steward Contracts: + +| Network Instance | Risk Steward Contract | +| ---------------- | -------------------------------------------------------------------------------------------------------------------------------- | +| Ethereum | [0x7C7143f4bE189928A6a98D8686c5e84c893c59c7](https://etherscan.io/address/0x7C7143f4bE189928A6a98D8686c5e84c893c59c7) | +| Ethereum Lido | [0x30adC2f98ff78fDde12F191Acb82699f640694FB](https://etherscan.io/address/0x30adC2f98ff78fDde12F191Acb82699f640694FB) | +| Ethereum EtherFi | [0xBF79d8339303148E345277a994Eb2cD5d82F0067](https://etherscan.io/address/0xBF79d8339303148E345277a994Eb2cD5d82F0067) | +| Arbitrum | [0x14568979093FFF97aeBD73F58051a4f0e297b1eB](https://arbiscan.io/address/0x14568979093FFF97aeBD73F58051a4f0e297b1eB) | +| Optimism | [0x928807b90a74210268b590d0159fcf1340ad76bd](https://optimistic.etherscan.io/address/0x928807b90a74210268b590d0159fcf1340ad76bd) | +| Polygon | [0x88dECc4bf07f5219ea7D1E32fe3762DA28ff7609](https://polygonscan.com/address/0x88dECc4bf07f5219ea7D1E32fe3762DA28ff7609) | +| Avalanche | [0xbf03aB677DEdA36E19D294d1735b93Dd9d1E0c05](https://snowscan.xyz/address/0xbf03aB677DEdA36E19D294d1735b93Dd9d1E0c05) | +| Scroll | [0x64093fe5f8Cf62aFb4377cf7EF4373537fe9155B](https://scrollscan.com/address/0x64093fe5f8Cf62aFb4377cf7EF4373537fe9155B) | +| Metis | [0x58226D26658F19724cB881E9F747EeDC846BB1c9](https://explorer.metis.io/address/0x58226D26658F19724cB881E9F747EeDC846BB1c9) | +| Base | [0xD3DE4b3571744EB77946d65aBF01408902E92c4E](https://basescan.org/address/0xD3DE4b3571744EB77946d65aBF01408902E92c4E) | +| BNB | [0xbe7998712402b6a63975515a532ce503437998b7](https://bscscan.com/address/0xbe7998712402b6a63975515a532ce503437998b7) | +| Gnosis | [0x677c9f358dA5DC83aF6760a839E4448D72840d04](https://gnosisscan.io/address/0x677c9f358dA5DC83aF6760a839E4448D72840d04) | +| ZkSync | [0x05c77Cf62346329a157d7A6F874464D049CECb26](https://era.zksync.network/address/0x05c77Cf62346329a157d7A6F874464D049CECb26) | + +The new risk stewards have been configured with the following risk params on all Aave instances: + +| Parameter | Percent change allowed | minimumDelay | +| ------------------------- | ----------------------- | ------------ | +| Supply and Borrow Caps | 100% (relative change) | 3 days | +| Debt Ceiling | 20% (relative change) | 3 days | +| LST Cap adapter params | 5% (relative change) | 3 days | +| Stable price cap | 0.5% (relative change) | 3 days | +| Base Variable Borrow Rate | 0.5% (absolute change) | 3 days | +| Slope 1 | 0.5% (absolute change) | 3 days | +| Slope 2 | 5% (absolute change) | 3 days | +| Optimal Point (Kink) | 3% (absolute change) | 3 days | +| Loan to Value (LTV) | 0.25% (absolute change) | 3 days | +| Liquidation Threshold | 0.25% (absolute change) | 3 days | +| Liquidation Bonus | 0.5% (absolute change) | 3 days | + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Ethereum_RiskStewardPhase2_20240805.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumLido_RiskStewardPhase2_20240805.sol), [AaveV3EthereumEtherFi](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Polygon_RiskStewardPhase2_20240805.sol), [AaveV3Avalanche](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Avalanche_RiskStewardPhase2_20240805.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Optimism_RiskStewardPhase2_20240805.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Arbitrum_RiskStewardPhase2_20240805.sol), [AaveV3Metis](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Metis_RiskStewardPhase2_20240805.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Base_RiskStewardPhase2_20240805.sol), [AaveV3Gnosis](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Gnosis_RiskStewardPhase2_20240805.sol), [AaveV3Scroll](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Scroll_RiskStewardPhase2_20240805.sol), [AaveV3BNB](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3BNB_RiskStewardPhase2_20240805.sol), [AaveV3ZkSync](https://github.com/bgd-labs/aave-proposals-v3/blob/main/zksync/src/20240805_Multi_RiskStewardPhase2/AaveV3ZkSync_RiskStewardPhase2_20240805.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Ethereum_RiskStewardPhase2_20240805.t.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumLido_RiskStewardPhase2_20240805.t.sol), [AaveV3EthereumEtherFi](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805.t.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Polygon_RiskStewardPhase2_20240805.t.sol), [AaveV3Avalanche](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Avalanche_RiskStewardPhase2_20240805.t.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Optimism_RiskStewardPhase2_20240805.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Arbitrum_RiskStewardPhase2_20240805.t.sol), [AaveV3Metis](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Metis_RiskStewardPhase2_20240805.t.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Base_RiskStewardPhase2_20240805.t.sol), [AaveV3Gnosis](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Gnosis_RiskStewardPhase2_20240805.t.sol), [AaveV3Scroll](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Scroll_RiskStewardPhase2_20240805.t.sol), [AaveV3BNB](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3BNB_RiskStewardPhase2_20240805.t.sol), [AaveV3ZkSync](https://github.com/bgd-labs/aave-proposals-v3/blob/main/zksync/src/20240805_Multi_RiskStewardPhase2/AaveV3ZkSync_RiskStewardPhase2_20240805.t.sol) +- [Discussion](https://governance.aave.com/t/arfc-bgd-risk-steward-phase-2-risksteward/16204) +- [Snapshot](https://snapshot.org/#/aave.eth/proposal/0x4809f179e517e5745ec13eba8f40d98dab73ca65f8a141bd2f18cc16dcd0cc16) +- Github Repo: [Aave V3 Risk Stewards](https://github.com/aave-dao/aave-v3-risk-stewards) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2_20240805.s.sol b/src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2_20240805.s.sol new file mode 100644 index 000000000..dd8445b9c --- /dev/null +++ b/src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2_20240805.s.sol @@ -0,0 +1,351 @@ +// 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 {GovernanceV3ZkSync} from 'aave-address-book/GovernanceV3ZkSync.sol'; +import {EthereumScript, PolygonScript, AvalancheScript, OptimismScript, ArbitrumScript, MetisScript, BaseScript, GnosisScript, ScrollScript, BNBScript, ChainIds} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Ethereum_RiskStewardPhase2_20240805} from './AaveV3Ethereum_RiskStewardPhase2_20240805.sol'; +import {AaveV3EthereumLido_RiskStewardPhase2_20240805} from './AaveV3EthereumLido_RiskStewardPhase2_20240805.sol'; +import {AaveV3EthereumEtherFi_RiskStewardPhase2_20240805} from './AaveV3EthereumEtherFi_RiskStewardPhase2_20240805.sol'; +import {AaveV3Polygon_RiskStewardPhase2_20240805} from './AaveV3Polygon_RiskStewardPhase2_20240805.sol'; +import {AaveV3Avalanche_RiskStewardPhase2_20240805} from './AaveV3Avalanche_RiskStewardPhase2_20240805.sol'; +import {AaveV3Optimism_RiskStewardPhase2_20240805} from './AaveV3Optimism_RiskStewardPhase2_20240805.sol'; +import {AaveV3Arbitrum_RiskStewardPhase2_20240805} from './AaveV3Arbitrum_RiskStewardPhase2_20240805.sol'; +import {AaveV3Metis_RiskStewardPhase2_20240805} from './AaveV3Metis_RiskStewardPhase2_20240805.sol'; +import {AaveV3Base_RiskStewardPhase2_20240805} from './AaveV3Base_RiskStewardPhase2_20240805.sol'; +import {AaveV3Gnosis_RiskStewardPhase2_20240805} from './AaveV3Gnosis_RiskStewardPhase2_20240805.sol'; +import {AaveV3Scroll_RiskStewardPhase2_20240805} from './AaveV3Scroll_RiskStewardPhase2_20240805.sol'; +import {AaveV3BNB_RiskStewardPhase2_20240805} from './AaveV3BNB_RiskStewardPhase2_20240805.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2_20240805.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/RiskStewardPhase2_20240805.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_RiskStewardPhase2_20240805).creationCode + ); + address payload1 = GovV3Helpers.deployDeterministic( + type(AaveV3EthereumLido_RiskStewardPhase2_20240805).creationCode + ); + address payload2 = GovV3Helpers.deployDeterministic( + type(AaveV3EthereumEtherFi_RiskStewardPhase2_20240805).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](3); + actions[0] = GovV3Helpers.buildAction(payload0); + actions[1] = GovV3Helpers.buildAction(payload1); + actions[2] = GovV3Helpers.buildAction(payload2); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Polygon + * deploy-command: make deploy-ledger contract=src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2_20240805.s.sol:DeployPolygon chain=polygon + * verify-command: FOUNDRY_PROFILE=polygon npx catapulta-verify -b broadcast/RiskStewardPhase2_20240805.s.sol/137/run-latest.json + */ +contract DeployPolygon is PolygonScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Polygon_RiskStewardPhase2_20240805).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Avalanche + * deploy-command: make deploy-ledger contract=src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2_20240805.s.sol:DeployAvalanche chain=avalanche + * verify-command: FOUNDRY_PROFILE=avalanche npx catapulta-verify -b broadcast/RiskStewardPhase2_20240805.s.sol/43114/run-latest.json + */ +contract DeployAvalanche is AvalancheScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Avalanche_RiskStewardPhase2_20240805).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Optimism + * deploy-command: make deploy-ledger contract=src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2_20240805.s.sol:DeployOptimism chain=optimism + * verify-command: FOUNDRY_PROFILE=optimism npx catapulta-verify -b broadcast/RiskStewardPhase2_20240805.s.sol/10/run-latest.json + */ +contract DeployOptimism is OptimismScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Optimism_RiskStewardPhase2_20240805).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Arbitrum + * deploy-command: make deploy-ledger contract=src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2_20240805.s.sol:DeployArbitrum chain=arbitrum + * verify-command: FOUNDRY_PROFILE=arbitrum npx catapulta-verify -b broadcast/RiskStewardPhase2_20240805.s.sol/42161/run-latest.json + */ +contract DeployArbitrum is ArbitrumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Arbitrum_RiskStewardPhase2_20240805).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Metis + * deploy-command: make deploy-ledger contract=src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2_20240805.s.sol:DeployMetis chain=metis + * verify-command: FOUNDRY_PROFILE=metis npx catapulta-verify -b broadcast/RiskStewardPhase2_20240805.s.sol/1088/run-latest.json + */ +contract DeployMetis is MetisScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Metis_RiskStewardPhase2_20240805).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Base + * deploy-command: make deploy-ledger contract=src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2_20240805.s.sol:DeployBase chain=base + * verify-command: FOUNDRY_PROFILE=base npx catapulta-verify -b broadcast/RiskStewardPhase2_20240805.s.sol/8453/run-latest.json + */ +contract DeployBase is BaseScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Base_RiskStewardPhase2_20240805).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Gnosis + * deploy-command: make deploy-ledger contract=src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2_20240805.s.sol:DeployGnosis chain=gnosis + * verify-command: FOUNDRY_PROFILE=gnosis npx catapulta-verify -b broadcast/RiskStewardPhase2_20240805.s.sol/100/run-latest.json + */ +contract DeployGnosis is GnosisScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Gnosis_RiskStewardPhase2_20240805).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Scroll + * deploy-command: make deploy-ledger contract=src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2_20240805.s.sol:DeployScroll chain=scroll + * verify-command: FOUNDRY_PROFILE=scroll npx catapulta-verify -b broadcast/RiskStewardPhase2_20240805.s.sol/534352/run-latest.json + */ +contract DeployScroll is ScrollScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Scroll_RiskStewardPhase2_20240805).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy BNB + * deploy-command: make deploy-ledger contract=src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2_20240805.s.sol:DeployBNB chain=bnb + * verify-command: FOUNDRY_PROFILE=bnb npx catapulta-verify -b broadcast/RiskStewardPhase2_20240805.s.sol/56/run-latest.json + */ +contract DeployBNB is BNBScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3BNB_RiskStewardPhase2_20240805).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/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2_20240805.s.sol:CreateProposal chain=mainnet + */ +contract CreateProposal is EthereumScript { + function run() external { + // create payloads + PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](11); + + // compose actions for validation + IPayloadsControllerCore.ExecutionAction[] + memory actionsEthereum = new IPayloadsControllerCore.ExecutionAction[](3); + actionsEthereum[0] = GovV3Helpers.buildAction( + type(AaveV3Ethereum_RiskStewardPhase2_20240805).creationCode + ); + actionsEthereum[1] = GovV3Helpers.buildAction( + type(AaveV3EthereumLido_RiskStewardPhase2_20240805).creationCode + ); + actionsEthereum[2] = GovV3Helpers.buildAction( + type(AaveV3EthereumEtherFi_RiskStewardPhase2_20240805).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsPolygon = new IPayloadsControllerCore.ExecutionAction[](1); + actionsPolygon[0] = GovV3Helpers.buildAction( + type(AaveV3Polygon_RiskStewardPhase2_20240805).creationCode + ); + payloads[1] = GovV3Helpers.buildPolygonPayload(vm, actionsPolygon); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsAvalanche = new IPayloadsControllerCore.ExecutionAction[](1); + actionsAvalanche[0] = GovV3Helpers.buildAction( + type(AaveV3Avalanche_RiskStewardPhase2_20240805).creationCode + ); + payloads[2] = GovV3Helpers.buildAvalanchePayload(vm, actionsAvalanche); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsOptimism = new IPayloadsControllerCore.ExecutionAction[](1); + actionsOptimism[0] = GovV3Helpers.buildAction( + type(AaveV3Optimism_RiskStewardPhase2_20240805).creationCode + ); + payloads[3] = GovV3Helpers.buildOptimismPayload(vm, actionsOptimism); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsArbitrum = new IPayloadsControllerCore.ExecutionAction[](1); + actionsArbitrum[0] = GovV3Helpers.buildAction( + type(AaveV3Arbitrum_RiskStewardPhase2_20240805).creationCode + ); + payloads[4] = GovV3Helpers.buildArbitrumPayload(vm, actionsArbitrum); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsMetis = new IPayloadsControllerCore.ExecutionAction[](1); + actionsMetis[0] = GovV3Helpers.buildAction( + type(AaveV3Metis_RiskStewardPhase2_20240805).creationCode + ); + payloads[5] = GovV3Helpers.buildMetisPayload(vm, actionsMetis); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsBase = new IPayloadsControllerCore.ExecutionAction[](1); + actionsBase[0] = GovV3Helpers.buildAction( + type(AaveV3Base_RiskStewardPhase2_20240805).creationCode + ); + payloads[6] = GovV3Helpers.buildBasePayload(vm, actionsBase); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsGnosis = new IPayloadsControllerCore.ExecutionAction[](1); + actionsGnosis[0] = GovV3Helpers.buildAction( + type(AaveV3Gnosis_RiskStewardPhase2_20240805).creationCode + ); + payloads[7] = GovV3Helpers.buildGnosisPayload(vm, actionsGnosis); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsScroll = new IPayloadsControllerCore.ExecutionAction[](1); + actionsScroll[0] = GovV3Helpers.buildAction( + type(AaveV3Scroll_RiskStewardPhase2_20240805).creationCode + ); + payloads[8] = GovV3Helpers.buildScrollPayload(vm, actionsScroll); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsBNB = new IPayloadsControllerCore.ExecutionAction[](1); + actionsBNB[0] = GovV3Helpers.buildAction( + type(AaveV3BNB_RiskStewardPhase2_20240805).creationCode + ); + payloads[9] = GovV3Helpers.buildBNBPayload(vm, actionsBNB); + + payloads[10] = PayloadsControllerUtils.Payload({ + chain: ChainIds.ZKSYNC, + accessLevel: PayloadsControllerUtils.AccessControl.Level_1, + payloadsController: address(GovernanceV3ZkSync.PAYLOADS_CONTROLLER), + payloadId: 8 + }); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile(vm, 'src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2.md') + ); + } +} diff --git a/src/20240805_Multi_RiskStewardPhase2/config.ts b/src/20240805_Multi_RiskStewardPhase2/config.ts new file mode 100644 index 000000000..7ec3dba56 --- /dev/null +++ b/src/20240805_Multi_RiskStewardPhase2/config.ts @@ -0,0 +1,38 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: [ + 'AaveV3Ethereum', + 'AaveV3EthereumLido', + 'AaveV3Polygon', + 'AaveV3Avalanche', + 'AaveV3Optimism', + 'AaveV3Arbitrum', + 'AaveV3Metis', + 'AaveV3Base', + 'AaveV3Gnosis', + 'AaveV3Scroll', + 'AaveV3BNB', + ], + title: 'Risk Steward Phase 2', + shortName: 'RiskStewardPhase2', + date: '20240805', + author: 'BGD Labs (@bgdlabs)', + discussion: 'https://governance.aave.com/t/arfc-bgd-risk-steward-phase-2-risksteward/16204', + snapshot: 'Direct To AIP', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Ethereum: {configs: {OTHERS: {}}, cache: {blockNumber: 20460200}}, + AaveV3EthereumLido: {configs: {OTHERS: {}}, cache: {blockNumber: 20460202}}, + AaveV3Polygon: {configs: {OTHERS: {}}, cache: {blockNumber: 60210763}}, + AaveV3Avalanche: {configs: {OTHERS: {}}, cache: {blockNumber: 48863700}}, + AaveV3Optimism: {configs: {OTHERS: {}}, cache: {blockNumber: 123618024}}, + AaveV3Arbitrum: {configs: {OTHERS: {}}, cache: {blockNumber: 239583893}}, + AaveV3Metis: {configs: {OTHERS: {}}, cache: {blockNumber: 17959349}}, + AaveV3Base: {configs: {OTHERS: {}}, cache: {blockNumber: 18022742}}, + AaveV3Gnosis: {configs: {OTHERS: {}}, cache: {blockNumber: 35324260}}, + AaveV3Scroll: {configs: {OTHERS: {}}, cache: {blockNumber: 8079683}}, + AaveV3BNB: {configs: {OTHERS: {}}, cache: {blockNumber: 41088826}}, + }, +}; diff --git a/src/20240805_Multi_RiskStewardPhase2/interfaces/IRiskSteward.sol b/src/20240805_Multi_RiskStewardPhase2/interfaces/IRiskSteward.sol new file mode 100644 index 000000000..81cd11c61 --- /dev/null +++ b/src/20240805_Multi_RiskStewardPhase2/interfaces/IRiskSteward.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface IRiskSteward { + /** + * @notice method called by the owner to set an asset as restricted + * @param contractAddress address of the underlying asset + * @param isRestricted true if asset needs to be restricted, false otherwise + */ + function setAddressRestricted(address contractAddress, bool isRestricted) external; + + /** + * @notice method to check if an asset is restricted to be used by the risk stewards + * @param contractAddress address of the underlying asset + * @return bool if asset is restricted or not + */ + function isAddressRestricted(address contractAddress) external view returns (bool); +} diff --git a/zksync/src/20240805_Multi_RiskStewardPhase2/AaveV3ZkSync_RiskStewardPhase2_20240805.sol b/zksync/src/20240805_Multi_RiskStewardPhase2/AaveV3ZkSync_RiskStewardPhase2_20240805.sol new file mode 100644 index 000000000..9063153e2 --- /dev/null +++ b/zksync/src/20240805_Multi_RiskStewardPhase2/AaveV3ZkSync_RiskStewardPhase2_20240805.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {AaveV3ZkSync} from 'aave-address-book/AaveV3ZkSync.sol'; + +/** + * @title Risk Steward Phase 2 + * @author BGD Labs (@bgdlabs) + * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x4809f179e517e5745ec13eba8f40d98dab73ca65f8a141bd2f18cc16dcd0cc16 + * - Discussion: https://governance.aave.com/t/arfc-bgd-risk-steward-phase-2-risksteward/16204 + */ +contract AaveV3ZkSync_RiskStewardPhase2_20240805 is IProposalGenericExecutor { + function execute() external { + AaveV3ZkSync.ACL_MANAGER.addRiskAdmin(AaveV3ZkSync.RISK_STEWARD); + } +} diff --git a/zksync/src/20240805_Multi_RiskStewardPhase2/AaveV3ZkSync_RiskStewardPhase2_20240805.t.sol b/zksync/src/20240805_Multi_RiskStewardPhase2/AaveV3ZkSync_RiskStewardPhase2_20240805.t.sol new file mode 100644 index 000000000..464f599c4 --- /dev/null +++ b/zksync/src/20240805_Multi_RiskStewardPhase2/AaveV3ZkSync_RiskStewardPhase2_20240805.t.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3ZkSync} from 'aave-address-book/AaveV3ZkSync.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/zksync/src/ProtocolV3TestBase.sol'; +import {AaveV3ZkSync_RiskStewardPhase2_20240805} from './AaveV3ZkSync_RiskStewardPhase2_20240805.sol'; + +/** + * @dev Test for AaveV3ZkSync_RiskStewardPhase2_20240805 + * command: FOUNDRY_PROFILE=zksync forge test --zksync --match-path=zksync/src/20240805_Multi_RiskStewardPhase2/AaveV3ZkSync_RiskStewardPhase2_20240805.t.sol -vv + */ +contract AaveV3ZkSync_RiskStewardPhase2_20240805_Test is ProtocolV3TestBase { + AaveV3ZkSync_RiskStewardPhase2_20240805 internal proposal; + + function setUp() public override { + vm.createSelectFork(vm.rpcUrl('zksync'), 47823875); + proposal = new AaveV3ZkSync_RiskStewardPhase2_20240805(); + + super.setUp(); + } + + /** + * @dev executes the generic test suite like config snapshots, e2e tests are disabled due to pool not being activated + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3ZkSync_RiskStewardPhase2_20240805', + AaveV3ZkSync.POOL, + address(proposal), + false + ); + } + + function test_permissions() public { + executePayload(vm, address(proposal)); + + assertEq(AaveV3ZkSync.ACL_MANAGER.isRiskAdmin(AaveV3ZkSync.RISK_STEWARD), true); + } +} diff --git a/zksync/src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2_20240805.s.sol b/zksync/src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2_20240805.s.sol new file mode 100644 index 000000000..3def37a24 --- /dev/null +++ b/zksync/src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2_20240805.s.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore} from 'aave-helpers/src/GovV3Helpers.sol'; +import {ZkSyncScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3ZkSync_RiskStewardPhase2_20240805} from './AaveV3ZkSync_RiskStewardPhase2_20240805.sol'; + +// @dev wrapper factory contract for deploying the payload +contract Deploy_AaveV3ZkSync_RiskStewardPhase2_20240805 { + address public immutable PAYLOAD; + + constructor() { + PAYLOAD = GovV3Helpers.deployDeterministicZkSync( + type(AaveV3ZkSync_RiskStewardPhase2_20240805).creationCode + ); + } +} + +/** + * @dev Deploy ZkSync + * deploy-command: make deploy-ledger contract=zksync/src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2_20240805.s.sol:DeployZkSync chain=zksync + * verify-command: FOUNDRY_PROFILE=zksync npx catapulta-verify -b broadcast/RiskStewardPhase2_20240805.s.sol/324/run-latest.json + */ +contract DeployZkSync is ZkSyncScript { + function run() external broadcast { + // deploy payloads + address payload0 = new Deploy_AaveV3ZkSync_RiskStewardPhase2_20240805().PAYLOAD(); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} From 911acb263ec3e504b8c84830c1b7dc4c043ca077 Mon Sep 17 00:00:00 2001 From: Cache bot Date: Fri, 1 Nov 2024 10:44:51 +0000 Subject: [PATCH 02/35] fix(cache): automated cache update [skip ci] --- src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2.md b/src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2.md index bf11b8390..822770a5f 100644 --- a/src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2.md +++ b/src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2.md @@ -70,8 +70,8 @@ The new risk stewards have been configured with the following risk params on all ## References -- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Ethereum_RiskStewardPhase2_20240805.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumLido_RiskStewardPhase2_20240805.sol), [AaveV3EthereumEtherFi](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Polygon_RiskStewardPhase2_20240805.sol), [AaveV3Avalanche](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Avalanche_RiskStewardPhase2_20240805.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Optimism_RiskStewardPhase2_20240805.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Arbitrum_RiskStewardPhase2_20240805.sol), [AaveV3Metis](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Metis_RiskStewardPhase2_20240805.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Base_RiskStewardPhase2_20240805.sol), [AaveV3Gnosis](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Gnosis_RiskStewardPhase2_20240805.sol), [AaveV3Scroll](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Scroll_RiskStewardPhase2_20240805.sol), [AaveV3BNB](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3BNB_RiskStewardPhase2_20240805.sol), [AaveV3ZkSync](https://github.com/bgd-labs/aave-proposals-v3/blob/main/zksync/src/20240805_Multi_RiskStewardPhase2/AaveV3ZkSync_RiskStewardPhase2_20240805.sol) -- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Ethereum_RiskStewardPhase2_20240805.t.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumLido_RiskStewardPhase2_20240805.t.sol), [AaveV3EthereumEtherFi](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805.t.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Polygon_RiskStewardPhase2_20240805.t.sol), [AaveV3Avalanche](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Avalanche_RiskStewardPhase2_20240805.t.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Optimism_RiskStewardPhase2_20240805.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Arbitrum_RiskStewardPhase2_20240805.t.sol), [AaveV3Metis](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Metis_RiskStewardPhase2_20240805.t.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Base_RiskStewardPhase2_20240805.t.sol), [AaveV3Gnosis](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Gnosis_RiskStewardPhase2_20240805.t.sol), [AaveV3Scroll](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Scroll_RiskStewardPhase2_20240805.t.sol), [AaveV3BNB](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3BNB_RiskStewardPhase2_20240805.t.sol), [AaveV3ZkSync](https://github.com/bgd-labs/aave-proposals-v3/blob/main/zksync/src/20240805_Multi_RiskStewardPhase2/AaveV3ZkSync_RiskStewardPhase2_20240805.t.sol) +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Ethereum_RiskStewardPhase2_20240805.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumLido_RiskStewardPhase2_20240805.sol), [AaveV3EthereumEtherFi](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Polygon_RiskStewardPhase2_20240805.sol), [AaveV3Avalanche](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Avalanche_RiskStewardPhase2_20240805.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Optimism_RiskStewardPhase2_20240805.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Arbitrum_RiskStewardPhase2_20240805.sol), [AaveV3Metis](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Metis_RiskStewardPhase2_20240805.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Base_RiskStewardPhase2_20240805.sol), [AaveV3Gnosis](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Gnosis_RiskStewardPhase2_20240805.sol), [AaveV3Scroll](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Scroll_RiskStewardPhase2_20240805.sol), [AaveV3BNB](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3BNB_RiskStewardPhase2_20240805.sol), [AaveV3ZkSync](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/zksync/src/20240805_Multi_RiskStewardPhase2/AaveV3ZkSync_RiskStewardPhase2_20240805.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Ethereum_RiskStewardPhase2_20240805.t.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumLido_RiskStewardPhase2_20240805.t.sol), [AaveV3EthereumEtherFi](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805.t.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Polygon_RiskStewardPhase2_20240805.t.sol), [AaveV3Avalanche](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Avalanche_RiskStewardPhase2_20240805.t.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Optimism_RiskStewardPhase2_20240805.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Arbitrum_RiskStewardPhase2_20240805.t.sol), [AaveV3Metis](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Metis_RiskStewardPhase2_20240805.t.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Base_RiskStewardPhase2_20240805.t.sol), [AaveV3Gnosis](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Gnosis_RiskStewardPhase2_20240805.t.sol), [AaveV3Scroll](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Scroll_RiskStewardPhase2_20240805.t.sol), [AaveV3BNB](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3BNB_RiskStewardPhase2_20240805.t.sol), [AaveV3ZkSync](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/zksync/src/20240805_Multi_RiskStewardPhase2/AaveV3ZkSync_RiskStewardPhase2_20240805.t.sol) - [Discussion](https://governance.aave.com/t/arfc-bgd-risk-steward-phase-2-risksteward/16204) - [Snapshot](https://snapshot.org/#/aave.eth/proposal/0x4809f179e517e5745ec13eba8f40d98dab73ca65f8a141bd2f18cc16dcd0cc16) - Github Repo: [Aave V3 Risk Stewards](https://github.com/aave-dao/aave-v3-risk-stewards) From 9c7233fde23e9061245c09b6cc58365a32a7b19b Mon Sep 17 00:00:00 2001 From: Harsh Pandey Date: Wed, 6 Nov 2024 15:04:37 +0530 Subject: [PATCH 03/35] chore: update steward writeup (#515) * chore: update steward writeup * Update src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2.md Co-authored-by: Ernesto Boado --------- Co-authored-by: Ernesto Boado --- .../RiskStewardPhase2.md | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2.md b/src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2.md index 822770a5f..ae1a5ecc8 100644 --- a/src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2.md +++ b/src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2.md @@ -1,22 +1,26 @@ --- -title: "Risk Steward Phase 2" +title: "Aave Generalized Risk Stewards (AGRS) activation" author: "BGD Labs (@bgdlabs)" -discussions: "https://governance.aave.com/t/arfc-bgd-risk-steward-phase-2-risksteward/16204" +discussions: "https://governance.aave.com/t/arfc-aave-generalized-risk-stewards-agrs-activation/19178" snapshot: "https://snapshot.org/#/aave.eth/proposal/0x4809f179e517e5745ec13eba8f40d98dab73ca65f8a141bd2f18cc16dcd0cc16" --- ## Simple Summary -Expanding from the scope of [CapsPlusRiskSteward](https://governance.aave.com/t/bgd-risk-steward-phase-1-capsplusrisksteward/12602), we now introduce the new generalized RiskSteward, allowing hardly constrained risk parameter updates by risk service providers and reducing governance overhead. +Expanding from the scope of [CapsPlusRiskSteward](https://governance.aave.com/t/bgd-risk-steward-phase-1-capsplusrisksteward/12602), we now introduce the new Aave Generalized Risk Stewards (AGRS), allowing hardly constrained risk parameter updates by risk service providers and reducing governance overhead. + +Aave Generalized Risk Stewards (AGRS) include two instances: Manual AGRS and Automated AGRS. Manual AGRS is a continuation of the previous design, with the parameters recommendation risk provider, with constrained capacity to modify all types of risk parameters on Aave. Automated AGRS is a pilot version to automate interest rate updates of assets (starting with WETH on Aave v3 Lido Ethereum), based on the newly released risk infrastructure technology Edge, by Chaos Labs. + +This AIP activates the Manual AGRS and the Automated AGRS will be activated at a later stage. ## Motivation Aave's decentralized governance system, while robust, creates significant operational overhead and cost due to its comprehensive proposal process. This process includes pre-AIP procedures, payload creation, multiple reviews, voting, and on-chain verification. While recent improvements have optimized some steps, further efficiency gains are possible, particularly in risk-related proposals. -Rationale for reducing risk-related proposals: +The rationale for reducing risk-related proposals: -- Two expert, independent risk teams (ChaosLabs, LlamaRisk) are engaged with the DAO. +- Two experts, and independent risk teams (ChaosLabs, LlamaRisk) are engaged with the DAO. - Historical voting unanimity on non-controversial, incremental risk proposals. - Technical feasibility of constraining updates using Aave v3 roles and specific validations. @@ -24,19 +28,19 @@ The success of the CapsPlusRiskStewards experiment demonstrates the viability of ## Specification -The new RiskSteward we propose follows the same design as the CapsPlusRiskSteward, an smart contract to which the Aave Governance gives `RISK_ADMIN` role over all v3 instances, controlled by a 2-of-2 multisig, and heavily constrained on what can do and how by its own logic. +The new Manual AGRS we propose follows the same design as the CapsPlusRiskSteward, a smart contract to which the Aave Governance gives `RISK_ADMIN` role over all v3 instances, controlled by a 2-of-2 multisig, and heavily constrained on what can do and how by its own logic. -The 2-of-2 multisig controlling the RiskSteward will have Chaos and BGD Labs as signers, with the inclusion of BGD Labs as a matter of extra security procedure. +The 2-of-2 multisig controlling the Manual AGRS will have Chaos and BGD Labs as signers, temporarily including BGD Labs as a matter of extra security procedure. -`ACL_MANAGER.addRiskAdmin()` is called to add a the new risk steward. +`ACL_MANAGER.addRiskAdmin()` is called to add the new Manual AGRS. -Additionally, params for GHO on Arbitrum and Ethereum cannot be changed by this RiskStewards, as the params will be updated by the GhoStewards instead, this is done by setting the GHO asset as restricted via the following method: `RISK_STEWARD.setAddressRestricted();` +Additionally, params for GHO on Arbitrum and Ethereum cannot be changed by this Manual AGRS, as the params will be updated by the GhoStewards instead, this is done by setting the GHO asset as restricted via the following method: `RISK_STEWARD.setAddressRestricted();` To give some extra buffer and protection, we will remove the `RISK_ADMIN` role from the old `CapsPlusRiskSteward` once risk providers have adapted to use the new Risk Stewards. -Deployed Risk Steward Contracts: +Deployed AGRS Contracts: -| Network Instance | Risk Steward Contract | +| Network Instance | Manual AGRS Contract | | ---------------- | -------------------------------------------------------------------------------------------------------------------------------- | | Ethereum | [0x7C7143f4bE189928A6a98D8686c5e84c893c59c7](https://etherscan.io/address/0x7C7143f4bE189928A6a98D8686c5e84c893c59c7) | | Ethereum Lido | [0x30adC2f98ff78fDde12F191Acb82699f640694FB](https://etherscan.io/address/0x30adC2f98ff78fDde12F191Acb82699f640694FB) | @@ -70,9 +74,9 @@ The new risk stewards have been configured with the following risk params on all ## References -- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Ethereum_RiskStewardPhase2_20240805.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumLido_RiskStewardPhase2_20240805.sol), [AaveV3EthereumEtherFi](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Polygon_RiskStewardPhase2_20240805.sol), [AaveV3Avalanche](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Avalanche_RiskStewardPhase2_20240805.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Optimism_RiskStewardPhase2_20240805.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Arbitrum_RiskStewardPhase2_20240805.sol), [AaveV3Metis](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Metis_RiskStewardPhase2_20240805.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Base_RiskStewardPhase2_20240805.sol), [AaveV3Gnosis](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Gnosis_RiskStewardPhase2_20240805.sol), [AaveV3Scroll](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Scroll_RiskStewardPhase2_20240805.sol), [AaveV3BNB](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3BNB_RiskStewardPhase2_20240805.sol), [AaveV3ZkSync](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/zksync/src/20240805_Multi_RiskStewardPhase2/AaveV3ZkSync_RiskStewardPhase2_20240805.sol) -- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Ethereum_RiskStewardPhase2_20240805.t.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumLido_RiskStewardPhase2_20240805.t.sol), [AaveV3EthereumEtherFi](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805.t.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Polygon_RiskStewardPhase2_20240805.t.sol), [AaveV3Avalanche](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Avalanche_RiskStewardPhase2_20240805.t.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Optimism_RiskStewardPhase2_20240805.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Arbitrum_RiskStewardPhase2_20240805.t.sol), [AaveV3Metis](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Metis_RiskStewardPhase2_20240805.t.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Base_RiskStewardPhase2_20240805.t.sol), [AaveV3Gnosis](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Gnosis_RiskStewardPhase2_20240805.t.sol), [AaveV3Scroll](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Scroll_RiskStewardPhase2_20240805.t.sol), [AaveV3BNB](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3BNB_RiskStewardPhase2_20240805.t.sol), [AaveV3ZkSync](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/zksync/src/20240805_Multi_RiskStewardPhase2/AaveV3ZkSync_RiskStewardPhase2_20240805.t.sol) -- [Discussion](https://governance.aave.com/t/arfc-bgd-risk-steward-phase-2-risksteward/16204) +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Ethereum_RiskStewardPhase2_20240805.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumLido_RiskStewardPhase2_20240805.sol), [AaveV3EthereumEtherFi](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Polygon_RiskStewardPhase2_20240805.sol), [AaveV3Avalanche](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Avalanche_RiskStewardPhase2_20240805.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Optimism_RiskStewardPhase2_20240805.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Arbitrum_RiskStewardPhase2_20240805.sol), [AaveV3Metis](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Metis_RiskStewardPhase2_20240805.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Base_RiskStewardPhase2_20240805.sol), [AaveV3Gnosis](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Gnosis_RiskStewardPhase2_20240805.sol), [AaveV3Scroll](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Scroll_RiskStewardPhase2_20240805.sol), [AaveV3BNB](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3BNB_RiskStewardPhase2_20240805.sol), [AaveV3ZkSync](https://github.com/bgd-labs/aave-proposals-v3/blob/main/zksync/src/20240805_Multi_RiskStewardPhase2/AaveV3ZkSync_RiskStewardPhase2_20240805.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Ethereum_RiskStewardPhase2_20240805.t.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumLido_RiskStewardPhase2_20240805.t.sol), [AaveV3EthereumEtherFi](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805.t.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Polygon_RiskStewardPhase2_20240805.t.sol), [AaveV3Avalanche](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Avalanche_RiskStewardPhase2_20240805.t.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Optimism_RiskStewardPhase2_20240805.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Arbitrum_RiskStewardPhase2_20240805.t.sol), [AaveV3Metis](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Metis_RiskStewardPhase2_20240805.t.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Base_RiskStewardPhase2_20240805.t.sol), [AaveV3Gnosis](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Gnosis_RiskStewardPhase2_20240805.t.sol), [AaveV3Scroll](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Scroll_RiskStewardPhase2_20240805.t.sol), [AaveV3BNB](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3BNB_RiskStewardPhase2_20240805.t.sol), [AaveV3ZkSync](https://github.com/bgd-labs/aave-proposals-v3/blob/main/zksync/src/20240805_Multi_RiskStewardPhase2/AaveV3ZkSync_RiskStewardPhase2_20240805.t.sol) +- [Discussion](https://governance.aave.com/t/arfc-aave-generalized-risk-stewards-agrs-activation/19178) - [Snapshot](https://snapshot.org/#/aave.eth/proposal/0x4809f179e517e5745ec13eba8f40d98dab73ca65f8a141bd2f18cc16dcd0cc16) - Github Repo: [Aave V3 Risk Stewards](https://github.com/aave-dao/aave-v3-risk-stewards) From 90866bfaa336c1787ea2a3039403ee4968a70159 Mon Sep 17 00:00:00 2001 From: Cache bot Date: Wed, 6 Nov 2024 09:35:06 +0000 Subject: [PATCH 04/35] fix(cache): automated cache update [skip ci] --- src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2.md b/src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2.md index ae1a5ecc8..b55a13143 100644 --- a/src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2.md +++ b/src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2.md @@ -74,8 +74,8 @@ The new risk stewards have been configured with the following risk params on all ## References -- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Ethereum_RiskStewardPhase2_20240805.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumLido_RiskStewardPhase2_20240805.sol), [AaveV3EthereumEtherFi](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Polygon_RiskStewardPhase2_20240805.sol), [AaveV3Avalanche](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Avalanche_RiskStewardPhase2_20240805.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Optimism_RiskStewardPhase2_20240805.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Arbitrum_RiskStewardPhase2_20240805.sol), [AaveV3Metis](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Metis_RiskStewardPhase2_20240805.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Base_RiskStewardPhase2_20240805.sol), [AaveV3Gnosis](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Gnosis_RiskStewardPhase2_20240805.sol), [AaveV3Scroll](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Scroll_RiskStewardPhase2_20240805.sol), [AaveV3BNB](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3BNB_RiskStewardPhase2_20240805.sol), [AaveV3ZkSync](https://github.com/bgd-labs/aave-proposals-v3/blob/main/zksync/src/20240805_Multi_RiskStewardPhase2/AaveV3ZkSync_RiskStewardPhase2_20240805.sol) -- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Ethereum_RiskStewardPhase2_20240805.t.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumLido_RiskStewardPhase2_20240805.t.sol), [AaveV3EthereumEtherFi](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805.t.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Polygon_RiskStewardPhase2_20240805.t.sol), [AaveV3Avalanche](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Avalanche_RiskStewardPhase2_20240805.t.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Optimism_RiskStewardPhase2_20240805.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Arbitrum_RiskStewardPhase2_20240805.t.sol), [AaveV3Metis](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Metis_RiskStewardPhase2_20240805.t.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Base_RiskStewardPhase2_20240805.t.sol), [AaveV3Gnosis](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Gnosis_RiskStewardPhase2_20240805.t.sol), [AaveV3Scroll](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3Scroll_RiskStewardPhase2_20240805.t.sol), [AaveV3BNB](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240805_Multi_RiskStewardPhase2/AaveV3BNB_RiskStewardPhase2_20240805.t.sol), [AaveV3ZkSync](https://github.com/bgd-labs/aave-proposals-v3/blob/main/zksync/src/20240805_Multi_RiskStewardPhase2/AaveV3ZkSync_RiskStewardPhase2_20240805.t.sol) +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Ethereum_RiskStewardPhase2_20240805.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumLido_RiskStewardPhase2_20240805.sol), [AaveV3EthereumEtherFi](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Polygon_RiskStewardPhase2_20240805.sol), [AaveV3Avalanche](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Avalanche_RiskStewardPhase2_20240805.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Optimism_RiskStewardPhase2_20240805.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Arbitrum_RiskStewardPhase2_20240805.sol), [AaveV3Metis](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Metis_RiskStewardPhase2_20240805.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Base_RiskStewardPhase2_20240805.sol), [AaveV3Gnosis](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Gnosis_RiskStewardPhase2_20240805.sol), [AaveV3Scroll](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Scroll_RiskStewardPhase2_20240805.sol), [AaveV3BNB](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3BNB_RiskStewardPhase2_20240805.sol), [AaveV3ZkSync](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/zksync/src/20240805_Multi_RiskStewardPhase2/AaveV3ZkSync_RiskStewardPhase2_20240805.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Ethereum_RiskStewardPhase2_20240805.t.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumLido_RiskStewardPhase2_20240805.t.sol), [AaveV3EthereumEtherFi](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805.t.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Polygon_RiskStewardPhase2_20240805.t.sol), [AaveV3Avalanche](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Avalanche_RiskStewardPhase2_20240805.t.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Optimism_RiskStewardPhase2_20240805.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Arbitrum_RiskStewardPhase2_20240805.t.sol), [AaveV3Metis](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Metis_RiskStewardPhase2_20240805.t.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Base_RiskStewardPhase2_20240805.t.sol), [AaveV3Gnosis](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Gnosis_RiskStewardPhase2_20240805.t.sol), [AaveV3Scroll](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Scroll_RiskStewardPhase2_20240805.t.sol), [AaveV3BNB](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3BNB_RiskStewardPhase2_20240805.t.sol), [AaveV3ZkSync](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/zksync/src/20240805_Multi_RiskStewardPhase2/AaveV3ZkSync_RiskStewardPhase2_20240805.t.sol) - [Discussion](https://governance.aave.com/t/arfc-aave-generalized-risk-stewards-agrs-activation/19178) - [Snapshot](https://snapshot.org/#/aave.eth/proposal/0x4809f179e517e5745ec13eba8f40d98dab73ca65f8a141bd2f18cc16dcd0cc16) - Github Repo: [Aave V3 Risk Stewards](https://github.com/aave-dao/aave-v3-risk-stewards) From c016f11d2d921748459bb0aaca37f462b2639e1a Mon Sep 17 00:00:00 2001 From: miguelmtz <36620902+miguelmtzinf@users.noreply.github.com> Date: Thu, 7 Nov 2024 11:27:06 +0100 Subject: [PATCH 05/35] GHO CCIP 1.5 Maintenance Upgrade (#512) * Add proposal for Gho Incident Report 20231113 (#1) * chore: add payload and deploy script for update of GHO variable debt token * forge install: gho-core * chore: add gho-core to dependency * test: Add tests for update of gho variable token * test: Add tests for update of gho variable token * fix: add modifier in method of interface * fix: remove gho dependency from repo and fix test * fix: Remove unnecesary dependency * fix: Add latest details --------- Co-authored-by: miguelmtzinf * fix: Make new impl constant (#3) * fix: Amend AIP text (#4) * fix: Make new impl constant * fix: Fix AIP text * test: Tweak default tests with borrow cap update (#5) * fix: lint issue (#6) * test: Add diffs from test running (#7) * fix: Add payload address (#8) * fix: Fix payload address in script (#9) * fix: Remove unneeded diff file (#10) * feat: install aave-ccip at latest commit on aave/ccip#18 * chore: upd remappings, lib/aave-helpers, .assets * new: add proposal for eth & arb * fix: arb test supply locked invariant * fix: rename, add discussion link * upd: aave-ccip module * feat: add proxy pool deployments * feat: add e2e tests * chore: fix license, explicit senders for expectEmit * ci: override rpc url in secrets * test: proxy pool can off ramp * chore: reorder deps * nit: utilize existing ierc20 import, style guide, use arb assets for gho addy * feat: add rate limit, use gho fascilitator for tests * feat: set in bound rate limit as well * chore: cleanup * test: check proxy initialized version * chore: inBetween => inFlight" * chore: test name consistency * test: dynamically fetch dest gas amt * test: execMsg post migration using legacy off ramp * test: ccip steward can disable rate limit * chore: cleanup * doc: add comment for fetching all offramps, use RISK_COUNCIL for clarity * test: ownership transfer after migration * chore: rm _readRiskAdmin, fix config * fix: ci test setup to stay compatible with bdg upstream * feat: rm aave-ccip dep * rft: use deployed token pools * tmp: fix ci for aave org, to rm for bdg * fix: ci to bdg setup * fix: update rate limit * test: fuzz amounts * chore: snapshot docs * chore: const cap rate * chore: fix type * fix: Fix rate limit config constants * fix: tests, impl correct solc * fix: tests * Update src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.sol Co-authored-by: Harsh Pandey * Update src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.sol Co-authored-by: Harsh Pandey * doc: reference token pool contracts * doc: upgrade spec * doc: formatting * Update src/20241021_Multi_GHOCCIP150Upgrade/GHOCCIP150Upgrade.md Co-authored-by: miguelmtz <36620902+miguelmtzinf@users.noreply.github.com> * Update src/20241021_Multi_GHOCCIP150Upgrade/GHOCCIP150Upgrade.md Co-authored-by: miguelmtz <36620902+miguelmtzinf@users.noreply.github.com> * test: Refresh block number with ghostewards aip executed * fix: Remove unneeded script --------- Co-authored-by: Parth Patel Co-authored-by: DhairyaSethi <55102840+DhairyaSethi@users.noreply.github.com> Co-authored-by: Harsh Pandey --- ...a040db3fc4a88618783a9156e7fb51928e1ede.svg | 1 + ...dc42930b2b94af37ef869d012c4734aedb52e6.svg | 1 + ...fe490affc1bc77fe6675127b18e9aeeb4b1404.svg | 1 + ...cfb1e84443509c42e21db9e4320c00e1db6098.svg | 1 + ...99e5ae4f4fd5b0d2565edd912a160acb2d0b78.svg | 1 + ...e6ba583d4d35e38cb678120492b2b4d52d19ea.svg | 1 + ...a0fb636d34a35d35ce67919bc0d7d2e36d3839.svg | 1 + ...1fbd79406b4b3a8c64ec79ef429f7c422d0387.svg | 1 + ...9d5ba5e949c7896bc79e7fdd98872cb43375b0.svg | 1 + ...a3707c0ded91bbfde8953567853db55452a227.svg | 1 + ...d5ff798c0771402486c6f1ca63f2a1868d80d9.svg | 1 + ...20a9e881eaa3f3def4916e47e0c330b34ab151.svg | 1 + ...bd5b9335471c83b44949206c9b2186657b836f.svg | 1 + ...455cedf818a43aba043e71714721fd1e844501.svg | 1 + ...c797fb2b1f421fa40a6d9a0028d1f78db71dc0.svg | 1 + ...e454df22dbd82f0c1929bc14104d54c7081a49.svg | 1 + ...a25c38caec024924773d1a5c7c63ab45c4eecf.svg | 1 + ...c705464b3515a654de9893168a1b1321feccb4.svg | 1 + ...784d12784a084406c3794fbe177e93da4c3479.svg | 1 + ...faa118ed690be4e95fae01b8535036cda67e3d.svg | 1 + ...a0275265838d424840d721917e0a4e3a5d8044.svg | 1 + ...33ca939f6fc30c2fd799aaa6f59b0521c19e9f.svg | 1 + ...29e34ea67f12eea11bf5403763207eeab38cff.svg | 1 + ...77de9f9a155f6a0e47e0443845a3c9de5f6b84.svg | 1 + ...b223a18f5aad36d9f6087d1d468b4dd5ba56a1.svg | 1 + ...d51b9f960b17304a3bdcaf8922d3ae84b3c30f.svg | 1 + ...edb30554ccb68f317b952113777790df5ca547.svg | 1 + ...c7eef36a7e70a1f1b35633097516fe5e21508b.svg | 1 + ...2b4dc8236ac87f8058f121d86de1d99e029c5c.svg | 1 + ...6ebf3fa05cf980f374598b56757dbc5cae3662.svg | 1 + ...79e1c7a3e943262824d4f683059c85d91a233d.svg | 1 + ...bitrum_GHOCCIP150Upgrade_20241021_after.md | 7 + ...hereum_GHOCCIP150Upgrade_20241021_after.md | 7 + ...eV3Arbitrum_GHOCCIP150Upgrade_20241021.sol | 51 + ...3Arbitrum_GHOCCIP150Upgrade_20241021.t.sol | 493 ++++++++++ ...AaveV3E2E_GHOCCIP150Upgrade_20241021.t.sol | 873 ++++++++++++++++++ ...eV3Ethereum_GHOCCIP150Upgrade_20241021.sol | 51 + ...3Ethereum_GHOCCIP150Upgrade_20241021.t.sol | 501 ++++++++++ .../GHOCCIP150Upgrade.md | 35 + .../GHOCCIP150Upgrade_20241021.s.sol | 87 ++ .../config.ts | 17 + .../utils/CCIPUtils.sol | 161 ++++ src/interfaces/ccip/IEVM2EVMOffRamp.sol | 17 +- src/interfaces/ccip/IEVM2EVMOnRamp.sol | 71 ++ src/interfaces/ccip/IInternal.sol | 5 + src/interfaces/ccip/IProxyPool.sol | 33 + src/interfaces/ccip/IRateLimiter.sol | 19 + src/interfaces/ccip/IRouter.sol | 41 +- src/interfaces/ccip/ITokenAdminRegistry.sol | 13 + src/interfaces/ccip/ITypeAndVersion.sol | 6 + .../ccip/IUpgradeableBurnMintTokenPool.sol | 93 ++ .../ccip/IUpgradeableLockReleaseTokenPool.sol | 133 ++- 52 files changed, 2703 insertions(+), 42 deletions(-) create mode 100644 .assets/02a040db3fc4a88618783a9156e7fb51928e1ede.svg create mode 100644 .assets/03dc42930b2b94af37ef869d012c4734aedb52e6.svg create mode 100644 .assets/0afe490affc1bc77fe6675127b18e9aeeb4b1404.svg create mode 100644 .assets/0fcfb1e84443509c42e21db9e4320c00e1db6098.svg create mode 100644 .assets/1899e5ae4f4fd5b0d2565edd912a160acb2d0b78.svg create mode 100644 .assets/18e6ba583d4d35e38cb678120492b2b4d52d19ea.svg create mode 100644 .assets/1aa0fb636d34a35d35ce67919bc0d7d2e36d3839.svg create mode 100644 .assets/1c1fbd79406b4b3a8c64ec79ef429f7c422d0387.svg create mode 100644 .assets/2e9d5ba5e949c7896bc79e7fdd98872cb43375b0.svg create mode 100644 .assets/39a3707c0ded91bbfde8953567853db55452a227.svg create mode 100644 .assets/39d5ff798c0771402486c6f1ca63f2a1868d80d9.svg create mode 100644 .assets/4820a9e881eaa3f3def4916e47e0c330b34ab151.svg create mode 100644 .assets/5dbd5b9335471c83b44949206c9b2186657b836f.svg create mode 100644 .assets/5f455cedf818a43aba043e71714721fd1e844501.svg create mode 100644 .assets/7bc797fb2b1f421fa40a6d9a0028d1f78db71dc0.svg create mode 100644 .assets/7ee454df22dbd82f0c1929bc14104d54c7081a49.svg create mode 100644 .assets/8aa25c38caec024924773d1a5c7c63ab45c4eecf.svg create mode 100644 .assets/8fc705464b3515a654de9893168a1b1321feccb4.svg create mode 100644 .assets/9c784d12784a084406c3794fbe177e93da4c3479.svg create mode 100644 .assets/a4faa118ed690be4e95fae01b8535036cda67e3d.svg create mode 100644 .assets/a9a0275265838d424840d721917e0a4e3a5d8044.svg create mode 100644 .assets/ac33ca939f6fc30c2fd799aaa6f59b0521c19e9f.svg create mode 100644 .assets/c229e34ea67f12eea11bf5403763207eeab38cff.svg create mode 100644 .assets/c277de9f9a155f6a0e47e0443845a3c9de5f6b84.svg create mode 100644 .assets/ceb223a18f5aad36d9f6087d1d468b4dd5ba56a1.svg create mode 100644 .assets/d8d51b9f960b17304a3bdcaf8922d3ae84b3c30f.svg create mode 100644 .assets/dcedb30554ccb68f317b952113777790df5ca547.svg create mode 100644 .assets/e6c7eef36a7e70a1f1b35633097516fe5e21508b.svg create mode 100644 .assets/ec2b4dc8236ac87f8058f121d86de1d99e029c5c.svg create mode 100644 .assets/fb6ebf3fa05cf980f374598b56757dbc5cae3662.svg create mode 100644 .assets/fe79e1c7a3e943262824d4f683059c85d91a233d.svg create mode 100644 diffs/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021_before_AaveV3Arbitrum_GHOCCIP150Upgrade_20241021_after.md create mode 100644 diffs/AaveV3Ethereum_GHOCCIP150Upgrade_20241021_before_AaveV3Ethereum_GHOCCIP150Upgrade_20241021_after.md create mode 100644 src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.sol create mode 100644 src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.t.sol create mode 100644 src/20241021_Multi_GHOCCIP150Upgrade/AaveV3E2E_GHOCCIP150Upgrade_20241021.t.sol create mode 100644 src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.sol create mode 100644 src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.t.sol create mode 100644 src/20241021_Multi_GHOCCIP150Upgrade/GHOCCIP150Upgrade.md create mode 100644 src/20241021_Multi_GHOCCIP150Upgrade/GHOCCIP150Upgrade_20241021.s.sol create mode 100644 src/20241021_Multi_GHOCCIP150Upgrade/config.ts create mode 100644 src/20241021_Multi_GHOCCIP150Upgrade/utils/CCIPUtils.sol create mode 100644 src/interfaces/ccip/IEVM2EVMOnRamp.sol create mode 100644 src/interfaces/ccip/IProxyPool.sol create mode 100644 src/interfaces/ccip/IRateLimiter.sol create mode 100644 src/interfaces/ccip/ITokenAdminRegistry.sol create mode 100644 src/interfaces/ccip/ITypeAndVersion.sol create mode 100644 src/interfaces/ccip/IUpgradeableBurnMintTokenPool.sol diff --git a/.assets/02a040db3fc4a88618783a9156e7fb51928e1ede.svg b/.assets/02a040db3fc4a88618783a9156e7fb51928e1ede.svg new file mode 100644 index 000000000..db81caacb --- /dev/null +++ b/.assets/02a040db3fc4a88618783a9156e7fb51928e1ede.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%20%40%60%80%Optimal utilization 90%Optimal utilization 90% \ No newline at end of file diff --git a/.assets/03dc42930b2b94af37ef869d012c4734aedb52e6.svg b/.assets/03dc42930b2b94af37ef869d012c4734aedb52e6.svg new file mode 100644 index 000000000..95de9c4ed --- /dev/null +++ b/.assets/03dc42930b2b94af37ef869d012c4734aedb52e6.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%100%200%300%Optimal utilization 30%Optimal utilization 30% \ No newline at end of file diff --git a/.assets/0afe490affc1bc77fe6675127b18e9aeeb4b1404.svg b/.assets/0afe490affc1bc77fe6675127b18e9aeeb4b1404.svg new file mode 100644 index 000000000..85a5bf372 --- /dev/null +++ b/.assets/0afe490affc1bc77fe6675127b18e9aeeb4b1404.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%20%40%60%80%Optimal utilization 90%Optimal utilization 90% \ No newline at end of file diff --git a/.assets/0fcfb1e84443509c42e21db9e4320c00e1db6098.svg b/.assets/0fcfb1e84443509c42e21db9e4320c00e1db6098.svg new file mode 100644 index 000000000..5283877c6 --- /dev/null +++ b/.assets/0fcfb1e84443509c42e21db9e4320c00e1db6098.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 80%Optimal utilization 80% \ No newline at end of file diff --git a/.assets/1899e5ae4f4fd5b0d2565edd912a160acb2d0b78.svg b/.assets/1899e5ae4f4fd5b0d2565edd912a160acb2d0b78.svg new file mode 100644 index 000000000..de0657eb7 --- /dev/null +++ b/.assets/1899e5ae4f4fd5b0d2565edd912a160acb2d0b78.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%20%40%60%80%Optimal utilization 80%Optimal utilization 80% \ No newline at end of file diff --git a/.assets/18e6ba583d4d35e38cb678120492b2b4d52d19ea.svg b/.assets/18e6ba583d4d35e38cb678120492b2b4d52d19ea.svg new file mode 100644 index 000000000..db81caacb --- /dev/null +++ b/.assets/18e6ba583d4d35e38cb678120492b2b4d52d19ea.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%20%40%60%80%Optimal utilization 90%Optimal utilization 90% \ No newline at end of file diff --git a/.assets/1aa0fb636d34a35d35ce67919bc0d7d2e36d3839.svg b/.assets/1aa0fb636d34a35d35ce67919bc0d7d2e36d3839.svg new file mode 100644 index 000000000..f05c3fb39 --- /dev/null +++ b/.assets/1aa0fb636d34a35d35ce67919bc0d7d2e36d3839.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 90%Optimal utilization 90% \ No newline at end of file diff --git a/.assets/1c1fbd79406b4b3a8c64ec79ef429f7c422d0387.svg b/.assets/1c1fbd79406b4b3a8c64ec79ef429f7c422d0387.svg new file mode 100644 index 000000000..d003381d1 --- /dev/null +++ b/.assets/1c1fbd79406b4b3a8c64ec79ef429f7c422d0387.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%Optimal utilization 90%Optimal utilization 90% \ No newline at end of file diff --git a/.assets/2e9d5ba5e949c7896bc79e7fdd98872cb43375b0.svg b/.assets/2e9d5ba5e949c7896bc79e7fdd98872cb43375b0.svg new file mode 100644 index 000000000..c752baefc --- /dev/null +++ b/.assets/2e9d5ba5e949c7896bc79e7fdd98872cb43375b0.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%2%4%Optimal utilization 99%Optimal utilization 99% \ No newline at end of file diff --git a/.assets/39a3707c0ded91bbfde8953567853db55452a227.svg b/.assets/39a3707c0ded91bbfde8953567853db55452a227.svg new file mode 100644 index 000000000..01584d9c0 --- /dev/null +++ b/.assets/39a3707c0ded91bbfde8953567853db55452a227.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 80%Optimal utilization 80% \ No newline at end of file diff --git a/.assets/39d5ff798c0771402486c6f1ca63f2a1868d80d9.svg b/.assets/39d5ff798c0771402486c6f1ca63f2a1868d80d9.svg new file mode 100644 index 000000000..df2260094 --- /dev/null +++ b/.assets/39d5ff798c0771402486c6f1ca63f2a1868d80d9.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%100%200%300%Optimal utilization 45%Optimal utilization 45% \ No newline at end of file diff --git a/.assets/4820a9e881eaa3f3def4916e47e0c330b34ab151.svg b/.assets/4820a9e881eaa3f3def4916e47e0c330b34ab151.svg new file mode 100644 index 000000000..403a5e0f3 --- /dev/null +++ b/.assets/4820a9e881eaa3f3def4916e47e0c330b34ab151.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 80%Optimal utilization 80% \ No newline at end of file diff --git a/.assets/5dbd5b9335471c83b44949206c9b2186657b836f.svg b/.assets/5dbd5b9335471c83b44949206c9b2186657b836f.svg new file mode 100644 index 000000000..d348fb2d6 --- /dev/null +++ b/.assets/5dbd5b9335471c83b44949206c9b2186657b836f.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 80%Optimal utilization 80% \ No newline at end of file diff --git a/.assets/5f455cedf818a43aba043e71714721fd1e844501.svg b/.assets/5f455cedf818a43aba043e71714721fd1e844501.svg new file mode 100644 index 000000000..5dff1554b --- /dev/null +++ b/.assets/5f455cedf818a43aba043e71714721fd1e844501.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%100%200%300%Optimal utilization 45%Optimal utilization 45% \ No newline at end of file diff --git a/.assets/7bc797fb2b1f421fa40a6d9a0028d1f78db71dc0.svg b/.assets/7bc797fb2b1f421fa40a6d9a0028d1f78db71dc0.svg new file mode 100644 index 000000000..e673fbc39 --- /dev/null +++ b/.assets/7bc797fb2b1f421fa40a6d9a0028d1f78db71dc0.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%20%40%60%80%Optimal utilization 92%Optimal utilization 92% \ No newline at end of file diff --git a/.assets/7ee454df22dbd82f0c1929bc14104d54c7081a49.svg b/.assets/7ee454df22dbd82f0c1929bc14104d54c7081a49.svg new file mode 100644 index 000000000..3c15ce1a6 --- /dev/null +++ b/.assets/7ee454df22dbd82f0c1929bc14104d54c7081a49.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%100%200%300%Optimal utilization 45%Optimal utilization 45% \ No newline at end of file diff --git a/.assets/8aa25c38caec024924773d1a5c7c63ab45c4eecf.svg b/.assets/8aa25c38caec024924773d1a5c7c63ab45c4eecf.svg new file mode 100644 index 000000000..5283877c6 --- /dev/null +++ b/.assets/8aa25c38caec024924773d1a5c7c63ab45c4eecf.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 80%Optimal utilization 80% \ No newline at end of file diff --git a/.assets/8fc705464b3515a654de9893168a1b1321feccb4.svg b/.assets/8fc705464b3515a654de9893168a1b1321feccb4.svg new file mode 100644 index 000000000..5212f2d4a --- /dev/null +++ b/.assets/8fc705464b3515a654de9893168a1b1321feccb4.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 45%Optimal utilization 45% \ No newline at end of file diff --git a/.assets/9c784d12784a084406c3794fbe177e93da4c3479.svg b/.assets/9c784d12784a084406c3794fbe177e93da4c3479.svg new file mode 100644 index 000000000..081891402 --- /dev/null +++ b/.assets/9c784d12784a084406c3794fbe177e93da4c3479.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%20%40%60%80%Optimal utilization 90%Optimal utilization 90% \ No newline at end of file diff --git a/.assets/a4faa118ed690be4e95fae01b8535036cda67e3d.svg b/.assets/a4faa118ed690be4e95fae01b8535036cda67e3d.svg new file mode 100644 index 000000000..93fde991f --- /dev/null +++ b/.assets/a4faa118ed690be4e95fae01b8535036cda67e3d.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%150%200%Optimal utilization 80%Optimal utilization 80% \ No newline at end of file diff --git a/.assets/a9a0275265838d424840d721917e0a4e3a5d8044.svg b/.assets/a9a0275265838d424840d721917e0a4e3a5d8044.svg new file mode 100644 index 000000000..6af590b85 --- /dev/null +++ b/.assets/a9a0275265838d424840d721917e0a4e3a5d8044.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 90%Optimal utilization 90% \ No newline at end of file diff --git a/.assets/ac33ca939f6fc30c2fd799aaa6f59b0521c19e9f.svg b/.assets/ac33ca939f6fc30c2fd799aaa6f59b0521c19e9f.svg new file mode 100644 index 000000000..3c15ce1a6 --- /dev/null +++ b/.assets/ac33ca939f6fc30c2fd799aaa6f59b0521c19e9f.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%100%200%300%Optimal utilization 45%Optimal utilization 45% \ No newline at end of file diff --git a/.assets/c229e34ea67f12eea11bf5403763207eeab38cff.svg b/.assets/c229e34ea67f12eea11bf5403763207eeab38cff.svg new file mode 100644 index 000000000..771e3e22e --- /dev/null +++ b/.assets/c229e34ea67f12eea11bf5403763207eeab38cff.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%20%40%60%80%Optimal utilization 90%Optimal utilization 90% \ No newline at end of file diff --git a/.assets/c277de9f9a155f6a0e47e0443845a3c9de5f6b84.svg b/.assets/c277de9f9a155f6a0e47e0443845a3c9de5f6b84.svg new file mode 100644 index 000000000..5212f2d4a --- /dev/null +++ b/.assets/c277de9f9a155f6a0e47e0443845a3c9de5f6b84.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 45%Optimal utilization 45% \ No newline at end of file diff --git a/.assets/ceb223a18f5aad36d9f6087d1d468b4dd5ba56a1.svg b/.assets/ceb223a18f5aad36d9f6087d1d468b4dd5ba56a1.svg new file mode 100644 index 000000000..95de9c4ed --- /dev/null +++ b/.assets/ceb223a18f5aad36d9f6087d1d468b4dd5ba56a1.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%100%200%300%Optimal utilization 30%Optimal utilization 30% \ No newline at end of file diff --git a/.assets/d8d51b9f960b17304a3bdcaf8922d3ae84b3c30f.svg b/.assets/d8d51b9f960b17304a3bdcaf8922d3ae84b3c30f.svg new file mode 100644 index 000000000..ad84fcb3b --- /dev/null +++ b/.assets/d8d51b9f960b17304a3bdcaf8922d3ae84b3c30f.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 80%Optimal utilization 80% \ No newline at end of file diff --git a/.assets/dcedb30554ccb68f317b952113777790df5ca547.svg b/.assets/dcedb30554ccb68f317b952113777790df5ca547.svg new file mode 100644 index 000000000..b5810667c --- /dev/null +++ b/.assets/dcedb30554ccb68f317b952113777790df5ca547.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%20%40%60%80%Optimal utilization 92%Optimal utilization 92% \ No newline at end of file diff --git a/.assets/e6c7eef36a7e70a1f1b35633097516fe5e21508b.svg b/.assets/e6c7eef36a7e70a1f1b35633097516fe5e21508b.svg new file mode 100644 index 000000000..6af590b85 --- /dev/null +++ b/.assets/e6c7eef36a7e70a1f1b35633097516fe5e21508b.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 90%Optimal utilization 90% \ No newline at end of file diff --git a/.assets/ec2b4dc8236ac87f8058f121d86de1d99e029c5c.svg b/.assets/ec2b4dc8236ac87f8058f121d86de1d99e029c5c.svg new file mode 100644 index 000000000..f9bccbdd6 --- /dev/null +++ b/.assets/ec2b4dc8236ac87f8058f121d86de1d99e029c5c.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%100%200%300%Optimal utilization 70%Optimal utilization 70% \ No newline at end of file diff --git a/.assets/fb6ebf3fa05cf980f374598b56757dbc5cae3662.svg b/.assets/fb6ebf3fa05cf980f374598b56757dbc5cae3662.svg new file mode 100644 index 000000000..df2260094 --- /dev/null +++ b/.assets/fb6ebf3fa05cf980f374598b56757dbc5cae3662.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%100%200%300%Optimal utilization 45%Optimal utilization 45% \ No newline at end of file diff --git a/.assets/fe79e1c7a3e943262824d4f683059c85d91a233d.svg b/.assets/fe79e1c7a3e943262824d4f683059c85d91a233d.svg new file mode 100644 index 000000000..5dff1554b --- /dev/null +++ b/.assets/fe79e1c7a3e943262824d4f683059c85d91a233d.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%100%200%300%Optimal utilization 45%Optimal utilization 45% \ No newline at end of file diff --git a/diffs/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021_before_AaveV3Arbitrum_GHOCCIP150Upgrade_20241021_after.md b/diffs/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021_before_AaveV3Arbitrum_GHOCCIP150Upgrade_20241021_after.md new file mode 100644 index 000000000..dbd03dce4 --- /dev/null +++ b/diffs/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021_before_AaveV3Arbitrum_GHOCCIP150Upgrade_20241021_after.md @@ -0,0 +1,7 @@ +## Emodes changes + +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3Ethereum_GHOCCIP150Upgrade_20241021_before_AaveV3Ethereum_GHOCCIP150Upgrade_20241021_after.md b/diffs/AaveV3Ethereum_GHOCCIP150Upgrade_20241021_before_AaveV3Ethereum_GHOCCIP150Upgrade_20241021_after.md new file mode 100644 index 000000000..dbd03dce4 --- /dev/null +++ b/diffs/AaveV3Ethereum_GHOCCIP150Upgrade_20241021_before_AaveV3Ethereum_GHOCCIP150Upgrade_20241021_after.md @@ -0,0 +1,7 @@ +## Emodes changes + +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.sol b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.sol new file mode 100644 index 000000000..7daeb4d52 --- /dev/null +++ b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.sol @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {TransparentUpgradeableProxy} from 'solidity-utils/contracts/transparent-proxy/TransparentUpgradeableProxy.sol'; +import {ProxyAdmin} from 'solidity-utils/contracts/transparent-proxy/ProxyAdmin.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {MiscArbitrum} from 'aave-address-book/MiscArbitrum.sol'; +import {IUpgradeableBurnMintTokenPool} from 'src/interfaces/ccip/IUpgradeableBurnMintTokenPool.sol'; +import {IRateLimiter} from 'src/interfaces/ccip/IRateLimiter.sol'; + +/** + * @title GHO CCIP 1.50 Upgrade + * @author Aave Labs + * - Discussion: https://governance.aave.com/t/bgd-technical-maintenance-proposals/15274/51 + */ +contract AaveV3Arbitrum_GHOCCIP150Upgrade_20241021 is IProposalGenericExecutor { + uint64 public constant ETH_CHAIN_SELECTOR = 5009297550715157269; + + // https://arbiscan.io/address/0xfc421aD3C883Bf9E7C4f42dE845C4e4405799e73 + address public constant TOKEN_POOL_IMPL = 0xfc421aD3C883Bf9E7C4f42dE845C4e4405799e73; + // https://arbiscan.io/address/0x26329558f08cbb40d6a4CCA0E0C67b29D64A8c50 + address public constant GHO_CCIP_PROXY_POOL = 0x26329558f08cbb40d6a4CCA0E0C67b29D64A8c50; + + /// @dev Token Rate Limit Capacity: 300_000 GHO + uint128 public constant CCIP_RATE_LIMIT_CAPACITY = 300_000e18; + + /// @dev Token Rate Limit Refill Rate: 60 GHO per second (=> 216_000 GHO per hour) + uint128 public constant CCIP_RATE_LIMIT_REFILL_RATE = 60e18; + + function execute() external { + IUpgradeableBurnMintTokenPool tokenPoolProxy = IUpgradeableBurnMintTokenPool( + MiscArbitrum.GHO_CCIP_TOKEN_POOL + ); + + ProxyAdmin(MiscArbitrum.PROXY_ADMIN).upgrade( + TransparentUpgradeableProxy(payable(address(tokenPoolProxy))), + TOKEN_POOL_IMPL + ); + + // Update proxyPool address + tokenPoolProxy.setProxyPool(GHO_CCIP_PROXY_POOL); + + // Set rate limit + IRateLimiter.Config memory rateLimitConfig = IRateLimiter.Config({ + isEnabled: true, + capacity: CCIP_RATE_LIMIT_CAPACITY, + rate: CCIP_RATE_LIMIT_REFILL_RATE + }); + tokenPoolProxy.setChainRateLimiterConfig(ETH_CHAIN_SELECTOR, rateLimitConfig, rateLimitConfig); + } +} diff --git a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.t.sol b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.t.sol new file mode 100644 index 000000000..79e12a8d7 --- /dev/null +++ b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.t.sol @@ -0,0 +1,493 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import 'forge-std/Test.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {AaveV3Arbitrum, AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol'; +import {MiscArbitrum} from 'aave-address-book/MiscArbitrum.sol'; +import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {IClient} from 'src/interfaces/ccip/IClient.sol'; +import {IInternal} from 'src/interfaces/ccip/IInternal.sol'; +import {IRouter} from 'src/interfaces/ccip/IRouter.sol'; +import {ITypeAndVersion} from 'src/interfaces/ccip/ITypeAndVersion.sol'; +import {IProxyPool} from 'src/interfaces/ccip/IProxyPool.sol'; +import {IRateLimiter} from 'src/interfaces/ccip/IRateLimiter.sol'; +import {ITokenAdminRegistry} from 'src/interfaces/ccip/ITokenAdminRegistry.sol'; +import {IGhoToken} from 'src/interfaces/IGhoToken.sol'; +import {IGhoCcipSteward} from 'src/interfaces/IGhoCcipSteward.sol'; +import {IUpgradeableBurnMintTokenPool} from 'src/interfaces/ccip/IUpgradeableBurnMintTokenPool.sol'; +import {CCIPUtils} from './utils/CCIPUtils.sol'; + +import {AaveV3Arbitrum_GHOCCIP150Upgrade_20241021} from './AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.sol'; + +/** + * @dev Test for AaveV3Arbitrum_GHOCCIP150Upgrade_20241021 + * command: FOUNDRY_PROFILE=arbitrum forge test --match-path=src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.t.sol -vv + */ +contract AaveV3Arbitrum_GHOCCIP150Upgrade_20241021_Test is ProtocolV3TestBase { + struct CCIPSendParams { + IRouter router; + uint256 amount; + bool migrated; + } + + AaveV3Arbitrum_GHOCCIP150Upgrade_20241021 internal proposal; + IUpgradeableBurnMintTokenPool internal ghoTokenPool; + IProxyPool internal proxyPool; + + address internal alice = makeAddr('alice'); + + uint64 internal constant ETH_CHAIN_SELECTOR = 5009297550715157269; + uint64 internal constant ARB_CHAIN_SELECTOR = 4949039107694359620; + address internal constant ARB_GHO_TOKEN = AaveV3ArbitrumAssets.GHO_UNDERLYING; + address internal constant ETH_PROXY_POOL = 0x9Ec9F9804733df96D1641666818eFb5198eC50f0; + ITokenAdminRegistry internal constant TOKEN_ADMIN_REGISTRY = + ITokenAdminRegistry(0x39AE1032cF4B334a1Ed41cdD0833bdD7c7E7751E); + + address internal constant ON_RAMP_1_2 = 0xCe11020D56e5FDbfE46D9FC3021641FfbBB5AdEE; + address internal constant ON_RAMP_1_5 = 0x67761742ac8A21Ec4D76CA18cbd701e5A6F3Bef3; + address internal constant OFF_RAMP_1_2 = 0x542ba1902044069330e8c5b36A84EC503863722f; + address internal constant OFF_RAMP_1_5 = 0x91e46cc5590A4B9182e47f40006140A7077Dec31; + + IGhoCcipSteward internal constant GHO_CCIP_STEWARD = + IGhoCcipSteward(0xb329CEFF2c362F315900d245eC88afd24C4949D5); + + event Burned(address indexed sender, uint256 amount); + event Minted(address indexed sender, address indexed recipient, uint256 amount); + event CCIPSendRequested(IInternal.EVM2EVMMessage message); + + error CallerIsNotARampOnRouter(address caller); + error NotACompatiblePool(address pool); + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('arbitrum'), 271788784); + proposal = new AaveV3Arbitrum_GHOCCIP150Upgrade_20241021(); + ghoTokenPool = IUpgradeableBurnMintTokenPool(MiscArbitrum.GHO_CCIP_TOKEN_POOL); + proxyPool = IProxyPool(proposal.GHO_CCIP_PROXY_POOL()); + + _validateConstants(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + assertEq( + ghoTokenPool.getCurrentInboundRateLimiterState(ETH_CHAIN_SELECTOR), + _getDisabledConfig() + ); + assertEq( + ghoTokenPool.getCurrentOutboundRateLimiterState(ETH_CHAIN_SELECTOR), + _getDisabledConfig() + ); + + bytes memory dynamicParamsBefore = _getDynamicParams(); + bytes memory staticParamsBefore = _getStaticParams(); + + defaultTest( + 'AaveV3Arbitrum_GHOCCIP150Upgrade_20241021', + AaveV3Arbitrum.POOL, + address(proposal) + ); + + assertEq(keccak256(_getDynamicParams()), keccak256(dynamicParamsBefore)); + assertEq(keccak256(_getStaticParams()), keccak256(staticParamsBefore)); + + assertEq( + ghoTokenPool.getCurrentInboundRateLimiterState(ETH_CHAIN_SELECTOR), + _getRateLimiterConfig() + ); + assertEq( + ghoTokenPool.getCurrentOutboundRateLimiterState(ETH_CHAIN_SELECTOR), + _getRateLimiterConfig() + ); + } + + function test_getProxyPool() public { + // proxyPool getter does not exist before the upgrade + vm.expectRevert(); + ghoTokenPool.getProxyPool(); + + executePayload(vm, address(proposal)); + + assertEq(ghoTokenPool.getProxyPool(), address(proxyPool)); + } + + function test_tokenPoolCannotBeInitializedAgain() public { + vm.expectRevert('Initializable: contract is already initialized'); + ghoTokenPool.initialize(makeAddr('owner'), new address[](0), makeAddr('router')); + /// proxy implementation is initialized + assertEq(_readInitialized(address(ghoTokenPool)), 1); + assertEq(_readInitialized(_getImplementation(address(ghoTokenPool))), 255); + + executePayload(vm, address(proposal)); + + vm.expectRevert('Initializable: contract is already initialized'); + ghoTokenPool.initialize(makeAddr('owner'), new address[](0), makeAddr('router')); + assertEq(_readInitialized(address(ghoTokenPool)), 1); + /// proxy implementation is initialized + assertEq(_readInitialized(_getImplementation(address(ghoTokenPool))), 255); + } + + function test_sendMessagePreCCIPMigration(uint256 amount) public { + executePayload(vm, address(proposal)); + + IRouter router = IRouter(ghoTokenPool.getRouter()); + amount = bound(amount, 1, _getRateLimiterConfig().capacity); + uint256 facilitatorLevelBefore = _getFacilitatorLevel(address(ghoTokenPool)); + + // wait for the rate limiter to refill + skip(_getOutboundRefillTime(amount)); + + vm.prank(alice); + IERC20(ARB_GHO_TOKEN).approve(address(router), amount); + deal(ARB_GHO_TOKEN, alice, amount); + + ( + IClient.EVM2AnyMessage memory message, + IInternal.EVM2EVMMessage memory eventArg + ) = _getTokenMessage(CCIPSendParams({router: router, amount: amount, migrated: false})); + + vm.expectEmit(address(ghoTokenPool)); + emit Burned(ON_RAMP_1_2, amount); + vm.expectEmit(ON_RAMP_1_2); + emit CCIPSendRequested(eventArg); + vm.prank(alice); + router.ccipSend{value: eventArg.feeTokenAmount}(ETH_CHAIN_SELECTOR, message); + + assertEq(IERC20(ARB_GHO_TOKEN).balanceOf(alice), 0); + assertEq(_getFacilitatorLevel(address(ghoTokenPool)), facilitatorLevelBefore - amount); + } + + function test_sendMessagePostCCIPMigration(uint256 amount) public { + executePayload(vm, address(proposal)); + + _mockCCIPMigration(); + + IRouter router = IRouter(ghoTokenPool.getRouter()); + amount = bound(amount, 1, _getRateLimiterConfig().capacity); + uint256 facilitatorLevelBefore = _getFacilitatorLevel(address(ghoTokenPool)); + + // wait for the rate limiter to refill + skip(_getOutboundRefillTime(amount)); + + vm.prank(alice); + IERC20(ARB_GHO_TOKEN).approve(address(router), amount); + deal(ARB_GHO_TOKEN, alice, amount); + + ( + IClient.EVM2AnyMessage memory message, + IInternal.EVM2EVMMessage memory eventArg + ) = _getTokenMessage(CCIPSendParams({router: router, amount: amount, migrated: true})); + + vm.expectEmit(address(ghoTokenPool)); + emit Burned(address(proxyPool), amount); + vm.expectEmit(address(proxyPool)); + emit Burned(ON_RAMP_1_5, amount); + vm.expectEmit(ON_RAMP_1_5); + emit CCIPSendRequested(eventArg); + vm.prank(alice); + router.ccipSend{value: eventArg.feeTokenAmount}(ETH_CHAIN_SELECTOR, message); + + assertEq(IERC20(ARB_GHO_TOKEN).balanceOf(alice), 0); + assertEq(_getFacilitatorLevel(address(ghoTokenPool)), facilitatorLevelBefore - amount); + } + + function test_executeMessagePreCCIPMigration(uint256 amount) public { + executePayload(vm, address(proposal)); + + amount = bound(amount, 1, _getRateLimiterConfig().capacity); + uint256 facilitatorLevelBefore = _getFacilitatorLevel(address(ghoTokenPool)); + + // wait for the rate limiter to refill + skip(_getInboundRefillTime(amount)); + + vm.expectEmit(address(ghoTokenPool)); + emit Minted(OFF_RAMP_1_2, alice, amount); + vm.prank(OFF_RAMP_1_2); + ghoTokenPool.releaseOrMint(abi.encode(alice), alice, amount, ETH_CHAIN_SELECTOR, ''); + + assertEq(IERC20(ARB_GHO_TOKEN).balanceOf(alice), amount); + assertEq(_getFacilitatorLevel(address(ghoTokenPool)), facilitatorLevelBefore + amount); + } + + function test_executeMessagePostCCIPMigration(uint256 amount) public { + executePayload(vm, address(proposal)); + + _mockCCIPMigration(); + + amount = bound(amount, 1, _getRateLimiterConfig().capacity); + uint256 facilitatorLevelBefore = _getFacilitatorLevel(address(ghoTokenPool)); + + // wait for the rate limiter to refill + skip(_getInboundRefillTime(amount)); + + vm.expectEmit(address(ghoTokenPool)); + emit Minted(OFF_RAMP_1_5, alice, amount); + vm.prank(OFF_RAMP_1_5); + ghoTokenPool.releaseOrMint(abi.encode(alice), alice, amount, ETH_CHAIN_SELECTOR, ''); + + assertEq(IERC20(ARB_GHO_TOKEN).balanceOf(alice), amount); + assertEq(_getFacilitatorLevel(address(ghoTokenPool)), facilitatorLevelBefore + amount); + } + + function test_executeMessagePostCCIPMigrationViaLegacyOffRamp(uint256 amount) public { + executePayload(vm, address(proposal)); + + _mockCCIPMigration(); + + amount = bound(amount, 1, _getRateLimiterConfig().capacity); + uint256 facilitatorLevelBefore = _getFacilitatorLevel(address(ghoTokenPool)); + + // wait for the rate limiter to refill + skip(_getInboundRefillTime(amount)); + + vm.expectEmit(address(ghoTokenPool)); + emit Minted(OFF_RAMP_1_2, alice, amount); + vm.prank(OFF_RAMP_1_2); + ghoTokenPool.releaseOrMint(abi.encode(alice), alice, amount, ETH_CHAIN_SELECTOR, ''); + + assertEq(IERC20(ARB_GHO_TOKEN).balanceOf(alice), amount); + assertEq(_getFacilitatorLevel(address(ghoTokenPool)), facilitatorLevelBefore + amount); + } + + function test_proxyPoolCanOnRamp(uint256 amount) public { + amount = bound(amount, 1, _getRateLimiterConfig().capacity); + + vm.expectRevert(abi.encodeWithSelector(CallerIsNotARampOnRouter.selector, proxyPool)); + vm.prank(address(proxyPool)); + ghoTokenPool.lockOrBurn(alice, abi.encode(alice), amount, ETH_CHAIN_SELECTOR, new bytes(0)); + + executePayload(vm, address(proposal)); + // router is responsible for transferring liquidity, so we mock router.token.transferFrom(user, tokenPool) + deal(ARB_GHO_TOKEN, address(ghoTokenPool), amount); + uint256 facilitatorLevelBefore = _getFacilitatorLevel(address(ghoTokenPool)); + + // wait for the rate limiter to refill + skip(_getOutboundRefillTime(amount)); + + vm.expectEmit(address(ghoTokenPool)); + emit Burned(address(proxyPool), amount); + vm.prank(address(proxyPool)); + ghoTokenPool.lockOrBurn(alice, abi.encode(alice), amount, ETH_CHAIN_SELECTOR, new bytes(0)); + + assertEq(IERC20(ARB_GHO_TOKEN).balanceOf(alice), 0); + assertEq(_getFacilitatorLevel(address(ghoTokenPool)), facilitatorLevelBefore - amount); + } + + function test_proxyPoolCanOffRamp(uint256 amount) public { + amount = bound(amount, 1, _getRateLimiterConfig().capacity); + + vm.expectRevert(abi.encodeWithSelector(CallerIsNotARampOnRouter.selector, proxyPool)); + vm.prank(address(proxyPool)); + ghoTokenPool.releaseOrMint(abi.encode(alice), alice, amount, ETH_CHAIN_SELECTOR, new bytes(0)); + + executePayload(vm, address(proposal)); + uint256 facilitatorLevelBefore = _getFacilitatorLevel(address(ghoTokenPool)); + + // wait for the rate limiter to refill + skip(_getInboundRefillTime(amount)); + + vm.expectEmit(address(ghoTokenPool)); + emit Minted(address(proxyPool), alice, amount); + vm.prank(address(proxyPool)); + ghoTokenPool.releaseOrMint(abi.encode(alice), alice, amount, ETH_CHAIN_SELECTOR, new bytes(0)); + + assertEq(IERC20(ARB_GHO_TOKEN).balanceOf(alice), amount); + assertEq(_getFacilitatorLevel(address(ghoTokenPool)), facilitatorLevelBefore + amount); + } + + function test_stewardCanDisableRateLimit() public { + executePayload(vm, address(proposal)); + + assertEq(ghoTokenPool.getRateLimitAdmin(), address(GHO_CCIP_STEWARD)); + + vm.prank(GHO_CCIP_STEWARD.RISK_COUNCIL()); + GHO_CCIP_STEWARD.updateRateLimit(ETH_CHAIN_SELECTOR, false, 0, 0, false, 0, 0); + + assertEq( + abi.encode( + _tokenBucketToConfig(ghoTokenPool.getCurrentInboundRateLimiterState(ETH_CHAIN_SELECTOR)) + ), + abi.encode(_getDisabledConfig()) + ); + assertEq( + abi.encode( + _tokenBucketToConfig(ghoTokenPool.getCurrentOutboundRateLimiterState(ETH_CHAIN_SELECTOR)) + ), + abi.encode(_getDisabledConfig()) + ); + } + + function test_ownershipTransferOfGhoProxyPool() public { + executePayload(vm, address(proposal)); + _mockCCIPMigration(); + + assertEq(ghoTokenPool.owner(), AaveV3Arbitrum.ACL_ADMIN); + + // CLL team transfers ownership of proxyPool and GHO token in TokenAdminRegistry + vm.prank(proxyPool.owner()); + proxyPool.transferOwnership(AaveV3Arbitrum.ACL_ADMIN); + vm.prank(TOKEN_ADMIN_REGISTRY.owner()); + TOKEN_ADMIN_REGISTRY.transferAdminRole(ARB_GHO_TOKEN, AaveV3Arbitrum.ACL_ADMIN); + + // new AIP to accept ownership + vm.startPrank(AaveV3Arbitrum.ACL_ADMIN); + proxyPool.acceptOwnership(); + TOKEN_ADMIN_REGISTRY.acceptAdminRole(ARB_GHO_TOKEN); + vm.stopPrank(); + + assertEq(proxyPool.owner(), AaveV3Arbitrum.ACL_ADMIN); + assertTrue(TOKEN_ADMIN_REGISTRY.isAdministrator(ARB_GHO_TOKEN, AaveV3Arbitrum.ACL_ADMIN)); + } + + function _mockCCIPMigration() private { + IRouter router = IRouter(ghoTokenPool.getRouter()); + + assertEq(TOKEN_ADMIN_REGISTRY.getPool(ARB_GHO_TOKEN), address(proxyPool)); + + assertEq(proxyPool.getRouter(), address(router)); + + assertTrue(proxyPool.isSupportedChain(ETH_CHAIN_SELECTOR)); + assertEq(proxyPool.getCurrentInboundRateLimiterState(ETH_CHAIN_SELECTOR), _getDisabledConfig()); + assertEq( + proxyPool.getCurrentOutboundRateLimiterState(ETH_CHAIN_SELECTOR), + _getDisabledConfig() + ); + assertEq(proxyPool.getRemotePool(ETH_CHAIN_SELECTOR), abi.encode(ETH_PROXY_POOL)); + assertEq(proxyPool.getRemoteToken(ETH_CHAIN_SELECTOR), abi.encode(MiscEthereum.GHO_TOKEN)); + + IRouter.OnRamp[] memory onRampUpdates = new IRouter.OnRamp[](1); + onRampUpdates[0] = IRouter.OnRamp({ + destChainSelector: ETH_CHAIN_SELECTOR, + onRamp: ON_RAMP_1_5 // new onRamp + }); + IRouter.OffRamp[] memory offRampUpdates = new IRouter.OffRamp[](1); + offRampUpdates[0] = IRouter.OffRamp({ + sourceChainSelector: ARB_CHAIN_SELECTOR, + offRamp: OFF_RAMP_1_5 // new offRamp + }); + + vm.prank(router.owner()); + router.applyRampUpdates(onRampUpdates, new IRouter.OffRamp[](0), offRampUpdates); + } + + function _getTokenMessage( + CCIPSendParams memory params + ) internal returns (IClient.EVM2AnyMessage memory, IInternal.EVM2EVMMessage memory) { + IClient.EVM2AnyMessage memory message = CCIPUtils.generateMessage(alice, 1); + message.tokenAmounts[0] = IClient.EVMTokenAmount({token: ARB_GHO_TOKEN, amount: params.amount}); + + uint256 feeAmount = params.router.getFee(ETH_CHAIN_SELECTOR, message); + deal(alice, feeAmount); + + IInternal.EVM2EVMMessage memory eventArg = CCIPUtils.messageToEvent( + CCIPUtils.MessageToEventParams({ + message: message, + router: params.router, + sourceChainSelector: ARB_CHAIN_SELECTOR, + feeTokenAmount: feeAmount, + originalSender: alice, + destinationToken: MiscEthereum.GHO_TOKEN, + migrated: params.migrated + }) + ); + + return (message, eventArg); + } + + function _getImplementation(address proxy) private view returns (address) { + bytes32 slot = bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1); + return address(uint160(uint256(vm.load(proxy, slot)))); + } + + function _readInitialized(address proxy) private view returns (uint8) { + /// slot 0 + // <1 byte ^ 1 byte ^ ---------- 20 bytes ----------> + // initialized initializing owner + return uint8(uint256(vm.load(proxy, bytes32(0)))); + } + + function _getFacilitatorLevel(address f) internal view returns (uint256) { + (, uint256 level) = IGhoToken(ARB_GHO_TOKEN).getFacilitatorBucket(f); + return level; + } + + function _getStaticParams() private view returns (bytes memory) { + return + abi.encode( + address(ghoTokenPool.getToken()), + ghoTokenPool.getAllowList(), + ghoTokenPool.getArmProxy(), + ghoTokenPool.getRouter() + ); + } + + function _getDynamicParams() private view returns (bytes memory) { + return + abi.encode( + ghoTokenPool.owner(), + ghoTokenPool.getSupportedChains(), + ghoTokenPool.getAllowListEnabled(), + ghoTokenPool.getRateLimitAdmin() + ); + } + + function _validateConstants() private view { + assertEq(TOKEN_ADMIN_REGISTRY.typeAndVersion(), 'TokenAdminRegistry 1.5.0'); + assertEq(proxyPool.typeAndVersion(), 'BurnMintTokenPoolAndProxy 1.5.0'); + assertEq(ITypeAndVersion(ON_RAMP_1_2).typeAndVersion(), 'EVM2EVMOnRamp 1.2.0'); + assertEq(ITypeAndVersion(ON_RAMP_1_5).typeAndVersion(), 'EVM2EVMOnRamp 1.5.0'); + assertEq(ITypeAndVersion(OFF_RAMP_1_2).typeAndVersion(), 'EVM2EVMOffRamp 1.2.0'); + assertEq(ITypeAndVersion(OFF_RAMP_1_5).typeAndVersion(), 'EVM2EVMOffRamp 1.5.0'); + + assertEq(GHO_CCIP_STEWARD.GHO_TOKEN(), ARB_GHO_TOKEN); + assertEq(GHO_CCIP_STEWARD.GHO_TOKEN_POOL(), address(ghoTokenPool)); + + assertEq(proxyPool.getPreviousPool(), address(ghoTokenPool)); + } + + function _getOutboundRefillTime(uint256 amount) private view returns (uint256) { + uint128 rate = _getRateLimiterConfig().rate; + assertNotEq(rate, 0); + return amount / uint256(rate) + 1; // account for rounding + } + + function _getInboundRefillTime(uint256 amount) private view returns (uint256) { + uint128 rate = _getRateLimiterConfig().rate; + assertNotEq(rate, 0); + return amount / uint256(rate) + 1; // account for rounding + } + + function _tokenBucketToConfig( + IRateLimiter.TokenBucket memory bucket + ) private pure returns (IRateLimiter.Config memory) { + return + IRateLimiter.Config({ + isEnabled: bucket.isEnabled, + capacity: bucket.capacity, + rate: bucket.rate + }); + } + + function _getDisabledConfig() private pure returns (IRateLimiter.Config memory) { + return IRateLimiter.Config({isEnabled: false, capacity: 0, rate: 0}); + } + + function assertEq( + IRateLimiter.TokenBucket memory bucket, + IRateLimiter.Config memory config + ) internal pure { + assertEq(abi.encode(_tokenBucketToConfig(bucket)), abi.encode(config)); + } + + function _getRateLimiterConfig() internal view returns (IRateLimiter.Config memory) { + return + IRateLimiter.Config({ + isEnabled: true, + capacity: proposal.CCIP_RATE_LIMIT_CAPACITY(), + rate: proposal.CCIP_RATE_LIMIT_REFILL_RATE() + }); + } +} diff --git a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3E2E_GHOCCIP150Upgrade_20241021.t.sol b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3E2E_GHOCCIP150Upgrade_20241021.t.sol new file mode 100644 index 000000000..e64678526 --- /dev/null +++ b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3E2E_GHOCCIP150Upgrade_20241021.t.sol @@ -0,0 +1,873 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import 'forge-std/Test.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {MiscArbitrum} from 'aave-address-book/MiscArbitrum.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {IClient} from 'src/interfaces/ccip/IClient.sol'; +import {IInternal} from 'src/interfaces/ccip/IInternal.sol'; +import {IRouter} from 'src/interfaces/ccip/IRouter.sol'; +import {IEVM2EVMOnRamp} from 'src/interfaces/ccip/IEVM2EVMOnRamp.sol'; +import {ITypeAndVersion} from 'src/interfaces/ccip/ITypeAndVersion.sol'; +import {IProxyPool} from 'src/interfaces/ccip/IProxyPool.sol'; +import {IRateLimiter} from 'src/interfaces/ccip/IRateLimiter.sol'; +import {IEVM2EVMOffRamp_1_2, IEVM2EVMOffRamp_1_5} from 'src/interfaces/ccip/IEVM2EVMOffRamp.sol'; +import {ITokenAdminRegistry} from 'src/interfaces/ccip/ITokenAdminRegistry.sol'; +import {IUpgradeableBurnMintTokenPool} from 'src/interfaces/ccip/IUpgradeableBurnMintTokenPool.sol'; +import {IUpgradeableLockReleaseTokenPool} from 'src/interfaces/ccip/IUpgradeableLockReleaseTokenPool.sol'; +import {CCIPUtils} from './utils/CCIPUtils.sol'; +import {AaveV3Ethereum_GHOCCIP150Upgrade_20241021} from './AaveV3Ethereum_GHOCCIP150Upgrade_20241021.sol'; +import {AaveV3Arbitrum_GHOCCIP150Upgrade_20241021} from './AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.sol'; + +/** + * @dev Test for AaveV3E2E_GHOCCIP150Upgrade_20241021 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241021_Multi_GHOCCIP150Upgrade/AaveV3E2E_GHOCCIP150Upgrade_20241021.t.sol -vv + */ +contract AaveV3E2E_GHOCCIP150Upgrade_20241021_Base is ProtocolV3TestBase { + struct CCIPSendParams { + IRouter router; + IERC20 token; + uint256 amount; + uint64 sourceChainSelector; + uint64 destinationChainSelector; + address sender; + bool migrated; + } + + struct Common { + IRouter router; + IERC20 token; + IEVM2EVMOnRamp EVM2EVMOnRamp1_2; + IEVM2EVMOnRamp EVM2EVMOnRamp1_5; + IEVM2EVMOffRamp_1_2 EVM2EVMOffRamp1_2; + IEVM2EVMOffRamp_1_5 EVM2EVMOffRamp1_5; + ITokenAdminRegistry tokenAdminRegistry; + IProxyPool proxyPool; + uint64 chainSelector; + uint256 forkId; + } + + struct L1 { + AaveV3Ethereum_GHOCCIP150Upgrade_20241021 proposal; + IUpgradeableLockReleaseTokenPool tokenPool; + IRateLimiter.Config rateLimitConfig; + Common c; + } + + struct L2 { + AaveV3Arbitrum_GHOCCIP150Upgrade_20241021 proposal; + IUpgradeableBurnMintTokenPool tokenPool; + IRateLimiter.Config rateLimitConfig; + Common c; + } + + L1 internal l1; + L2 internal l2; + address internal alice = makeAddr('alice'); + + event CCIPSendRequested(IInternal.EVM2EVMMessage message); + event Locked(address indexed sender, uint256 amount); + event Burned(address indexed sender, uint256 amount); + event Released(address indexed sender, address indexed recipient, uint256 amount); + event Minted(address indexed sender, address indexed recipient, uint256 amount); + + error CallerIsNotARampOnRouter(address caller); + error NotACompatiblePool(address pool); + + function setUp() public virtual { + l1.c.forkId = vm.createFork(vm.rpcUrl('mainnet'), 21131872); + l2.c.forkId = vm.createFork(vm.rpcUrl('arbitrum'), 271788784); + + vm.selectFork(l1.c.forkId); + l1.proposal = new AaveV3Ethereum_GHOCCIP150Upgrade_20241021(); + l1.c.proxyPool = IProxyPool(l1.proposal.GHO_CCIP_PROXY_POOL()); + l1.tokenPool = IUpgradeableLockReleaseTokenPool(MiscEthereum.GHO_CCIP_TOKEN_POOL); + l1.rateLimitConfig = IRateLimiter.Config({ + isEnabled: true, + capacity: l1.proposal.CCIP_RATE_LIMIT_CAPACITY(), + rate: l1.proposal.CCIP_RATE_LIMIT_REFILL_RATE() + }); + l1.c.router = IRouter(l1.tokenPool.getRouter()); + l2.c.chainSelector = l1.tokenPool.getSupportedChains()[0]; + l1.c.token = IERC20(address(l1.tokenPool.getToken())); + l1.c.EVM2EVMOnRamp1_2 = IEVM2EVMOnRamp(l1.c.router.getOnRamp(l2.c.chainSelector)); + l1.c.EVM2EVMOnRamp1_5 = IEVM2EVMOnRamp(0x69eCC4E2D8ea56E2d0a05bF57f4Fd6aEE7f2c284); // new onramp + l1.c.EVM2EVMOffRamp1_2 = IEVM2EVMOffRamp_1_2(0xeFC4a18af59398FF23bfe7325F2401aD44286F4d); + l1.c.EVM2EVMOffRamp1_5 = IEVM2EVMOffRamp_1_5(0xdf615eF8D4C64d0ED8Fd7824BBEd2f6a10245aC9); // new offramp + l1.c.tokenAdminRegistry = ITokenAdminRegistry(0xb22764f98dD05c789929716D677382Df22C05Cb6); + + vm.selectFork(l2.c.forkId); + l2.proposal = new AaveV3Arbitrum_GHOCCIP150Upgrade_20241021(); + l2.c.proxyPool = IProxyPool(l2.proposal.GHO_CCIP_PROXY_POOL()); + l2.tokenPool = IUpgradeableBurnMintTokenPool(MiscArbitrum.GHO_CCIP_TOKEN_POOL); + l2.rateLimitConfig = IRateLimiter.Config({ + isEnabled: true, + capacity: l2.proposal.CCIP_RATE_LIMIT_CAPACITY(), + rate: l2.proposal.CCIP_RATE_LIMIT_REFILL_RATE() + }); + l2.c.router = IRouter(l2.tokenPool.getRouter()); + l1.c.chainSelector = l2.tokenPool.getSupportedChains()[0]; + l2.c.token = IERC20(address(l2.tokenPool.getToken())); + l2.c.EVM2EVMOnRamp1_2 = IEVM2EVMOnRamp(l2.c.router.getOnRamp(l1.c.chainSelector)); + l2.c.EVM2EVMOnRamp1_5 = IEVM2EVMOnRamp(0x67761742ac8A21Ec4D76CA18cbd701e5A6F3Bef3); // new onramp + l2.c.EVM2EVMOffRamp1_2 = IEVM2EVMOffRamp_1_2(0x542ba1902044069330e8c5b36A84EC503863722f); + l2.c.EVM2EVMOffRamp1_5 = IEVM2EVMOffRamp_1_5(0x91e46cc5590A4B9182e47f40006140A7077Dec31); // new offramp + l2.c.tokenAdminRegistry = ITokenAdminRegistry(0x39AE1032cF4B334a1Ed41cdD0833bdD7c7E7751E); + + _validateConfig({migrated: false}); + } + + function _getTokenMessage( + CCIPSendParams memory params + ) internal returns (IClient.EVM2AnyMessage memory, IInternal.EVM2EVMMessage memory) { + IClient.EVM2AnyMessage memory message = CCIPUtils.generateMessage(params.sender, 1); + message.tokenAmounts[0] = IClient.EVMTokenAmount({ + token: address(params.token), + amount: params.amount + }); + + uint256 feeAmount = params.router.getFee(params.destinationChainSelector, message); + deal(params.sender, feeAmount); + + IInternal.EVM2EVMMessage memory eventArg = CCIPUtils.messageToEvent( + CCIPUtils.MessageToEventParams({ + message: message, + router: params.router, + sourceChainSelector: params.sourceChainSelector, + feeTokenAmount: feeAmount, + originalSender: params.sender, + destinationToken: address(params.token == l1.c.token ? l2.c.token : l1.c.token), + migrated: params.migrated + }) + ); + + return (message, eventArg); + } + + function _validateConfig(bool migrated) internal { + vm.selectFork(l1.c.forkId); + assertEq(l1.c.chainSelector, 5009297550715157269); + assertEq(address(l1.c.token), MiscEthereum.GHO_TOKEN); + assertEq(ITypeAndVersion(address(l1.c.router)).typeAndVersion(), 'Router 1.2.0'); + assertEq( + ITypeAndVersion(address(l1.c.EVM2EVMOnRamp1_2)).typeAndVersion(), + 'EVM2EVMOnRamp 1.2.0' + ); + assertEq( + ITypeAndVersion(address(l1.c.EVM2EVMOnRamp1_5)).typeAndVersion(), + 'EVM2EVMOnRamp 1.5.0' + ); + assertEq( + ITypeAndVersion(address(l1.c.EVM2EVMOffRamp1_2)).typeAndVersion(), + 'EVM2EVMOffRamp 1.2.0' + ); + assertEq( + ITypeAndVersion(address(l1.c.EVM2EVMOffRamp1_5)).typeAndVersion(), + 'EVM2EVMOffRamp 1.5.0' + ); + assertEq(l1.c.proxyPool.typeAndVersion(), 'LockReleaseTokenPoolAndProxy 1.5.0'); + assertEq(l1.tokenPool.typeAndVersion(), 'LockReleaseTokenPool 1.4.0'); + assertEq(l1.c.tokenAdminRegistry.typeAndVersion(), 'TokenAdminRegistry 1.5.0'); + assertTrue(l1.c.router.isOffRamp(l2.c.chainSelector, address(l1.c.EVM2EVMOffRamp1_2))); + assertTrue(l1.c.router.isOffRamp(l2.c.chainSelector, address(l1.c.EVM2EVMOffRamp1_5))); + + // ensure only 1.2 & 1.5 offRamps are configured + IRouter.OffRamp[] memory offRamps = l1.c.router.getOffRamps(); + for (uint256 i; i < offRamps.length; ++i) { + if (offRamps[i].sourceChainSelector == l2.c.chainSelector) { + assertTrue( + offRamps[i].offRamp == address(l1.c.EVM2EVMOffRamp1_2) || + offRamps[i].offRamp == address(l1.c.EVM2EVMOffRamp1_5) + ); + } + } + + if (migrated) { + assertEq(l1.c.router.getOnRamp(l2.c.chainSelector), address(l1.c.EVM2EVMOnRamp1_5)); + } else { + assertEq(l1.c.router.getOnRamp(l2.c.chainSelector), address(l1.c.EVM2EVMOnRamp1_2)); + } + + vm.selectFork(l2.c.forkId); + assertEq(l2.c.chainSelector, 4949039107694359620); + assertEq(address(l2.c.token), 0x7dfF72693f6A4149b17e7C6314655f6A9F7c8B33); + assertEq(ITypeAndVersion(address(l2.c.router)).typeAndVersion(), 'Router 1.2.0'); + assertEq( + ITypeAndVersion(address(l2.c.EVM2EVMOnRamp1_2)).typeAndVersion(), + 'EVM2EVMOnRamp 1.2.0' + ); + assertEq( + ITypeAndVersion(address(l2.c.EVM2EVMOnRamp1_5)).typeAndVersion(), + 'EVM2EVMOnRamp 1.5.0' + ); + assertEq( + ITypeAndVersion(address(l2.c.EVM2EVMOffRamp1_2)).typeAndVersion(), + 'EVM2EVMOffRamp 1.2.0' + ); + assertEq( + ITypeAndVersion(address(l2.c.EVM2EVMOffRamp1_5)).typeAndVersion(), + 'EVM2EVMOffRamp 1.5.0' + ); + assertEq(l2.c.proxyPool.typeAndVersion(), 'BurnMintTokenPoolAndProxy 1.5.0'); + assertEq(l2.tokenPool.typeAndVersion(), 'BurnMintTokenPool 1.4.0'); + assertEq(l2.c.tokenAdminRegistry.typeAndVersion(), 'TokenAdminRegistry 1.5.0'); + assertTrue(l2.c.router.isOffRamp(l1.c.chainSelector, address(l2.c.EVM2EVMOffRamp1_2))); + assertTrue(l2.c.router.isOffRamp(l1.c.chainSelector, address(l2.c.EVM2EVMOffRamp1_5))); + + // ensure only 1.2 & 1.5 offRamps are configured + offRamps = l2.c.router.getOffRamps(); + for (uint256 i; i < offRamps.length; ++i) { + if (offRamps[i].sourceChainSelector == l1.c.chainSelector) { + assertTrue( + offRamps[i].offRamp == address(l2.c.EVM2EVMOffRamp1_2) || + offRamps[i].offRamp == address(l2.c.EVM2EVMOffRamp1_5) + ); + } + } + + if (migrated) { + assertEq(l2.c.router.getOnRamp(l1.c.chainSelector), address(l2.c.EVM2EVMOnRamp1_5)); + } else { + assertEq(l2.c.router.getOnRamp(l1.c.chainSelector), address(l2.c.EVM2EVMOnRamp1_2)); + } + } + + function _mockCCIPMigration(Common memory src, Common memory dest) internal { + vm.selectFork(src.forkId); + assertEq(src.tokenAdminRegistry.getPool(address(src.token)), address(src.proxyPool)); + assertEq(src.proxyPool.getRouter(), address(src.router)); + assertTrue(src.proxyPool.isSupportedChain(dest.chainSelector)); + assertEq( + src.proxyPool.getCurrentInboundRateLimiterState(dest.chainSelector), + _getDisabledConfig() + ); + assertEq( + src.proxyPool.getCurrentOutboundRateLimiterState(dest.chainSelector), + _getDisabledConfig() + ); + assertEq(src.proxyPool.getRemotePool(dest.chainSelector), abi.encode(dest.proxyPool)); + assertEq(src.proxyPool.getRemoteToken(dest.chainSelector), abi.encode(dest.token)); + + IRouter.OnRamp[] memory onRampUpdates = new IRouter.OnRamp[](1); + onRampUpdates[0] = IRouter.OnRamp({ + destChainSelector: dest.chainSelector, + onRamp: address(src.EVM2EVMOnRamp1_5) // new onRamp + }); + IRouter.OffRamp[] memory offRampUpdates = new IRouter.OffRamp[](1); + offRampUpdates[0] = IRouter.OffRamp({ + sourceChainSelector: dest.chainSelector, + offRamp: address(src.EVM2EVMOffRamp1_5) // new offRamp + }); + + vm.prank(src.router.owner()); + src.router.applyRampUpdates(onRampUpdates, new IRouter.OffRamp[](0), offRampUpdates); + } + + function _getDisabledConfig() private pure returns (IRateLimiter.Config memory) { + return IRateLimiter.Config({isEnabled: false, capacity: 0, rate: 0}); + } + + function _tokenBucketToConfig( + IRateLimiter.TokenBucket memory bucket + ) private pure returns (IRateLimiter.Config memory) { + return + IRateLimiter.Config({ + isEnabled: bucket.isEnabled, + capacity: bucket.capacity, + rate: bucket.rate + }); + } + + function assertEq( + IRateLimiter.TokenBucket memory bucket, + IRateLimiter.Config memory config + ) internal pure { + assertEq(abi.encode(_tokenBucketToConfig(bucket)), abi.encode(config)); + } +} + +contract AaveV3E2E_GHOCCIP150Upgrade_20241021_PreCCIPMigration is + AaveV3E2E_GHOCCIP150Upgrade_20241021_Base +{ + function setUp() public override { + super.setUp(); + + vm.selectFork(l1.c.forkId); + executePayload(vm, address(l1.proposal)); + vm.selectFork(l2.c.forkId); + executePayload(vm, address(l2.proposal)); + + _validateConfig({migrated: false}); + } + + function test_E2E() public { + uint256 amount = l1.rateLimitConfig.capacity; + // ETH (=> ARB) sendMessage + { + vm.selectFork(l1.c.forkId); + deal(address(l1.c.token), alice, amount, true); + vm.prank(alice); + l1.c.token.approve(address(l1.c.router), amount); + + uint128 outBoundRate = l1.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(outBoundRate) + 1); // rate is non zero + + uint256 tokenPoolBalance = l1.c.token.balanceOf(address(l1.tokenPool)); + uint256 bridgedAmount = l1.tokenPool.getCurrentBridgedAmount(); + + ( + IClient.EVM2AnyMessage memory message, + IInternal.EVM2EVMMessage memory eventArg + ) = _getTokenMessage( + CCIPSendParams({ + router: l1.c.router, + token: l1.c.token, + amount: amount, + sourceChainSelector: l1.c.chainSelector, + destinationChainSelector: l2.c.chainSelector, + sender: alice, + migrated: false + }) + ); + + vm.expectEmit(address(l1.tokenPool)); + emit Locked(address(l1.c.EVM2EVMOnRamp1_2), amount); + vm.expectEmit(address(l1.c.EVM2EVMOnRamp1_2)); + emit CCIPSendRequested(eventArg); + vm.prank(alice); + l1.c.router.ccipSend{value: eventArg.feeTokenAmount}(l2.c.chainSelector, message); + + assertEq(l1.c.token.balanceOf(address(l1.tokenPool)), tokenPoolBalance + amount); + assertEq(l1.tokenPool.getCurrentBridgedAmount(), bridgedAmount + amount); + + // ARB executeMessage + vm.selectFork(l2.c.forkId); + + uint256 aliceBalanceBefore = l2.c.token.balanceOf(alice); + + uint128 inBoundRate = l2.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(inBoundRate) + 1); // rate is non zero + + vm.expectEmit(address(l2.tokenPool)); + emit Minted(address(l2.c.EVM2EVMOffRamp1_2), alice, amount); + vm.prank(address(l2.c.EVM2EVMOffRamp1_2)); + l2.c.EVM2EVMOffRamp1_2.executeSingleMessage( + eventArg, + new bytes[](message.tokenAmounts.length) + ); + + assertEq(l2.c.token.balanceOf(alice), aliceBalanceBefore + amount); + } + + // ARB (=> ETH) sendMessage + { + vm.selectFork(l2.c.forkId); + + vm.prank(alice); + l2.c.token.approve(address(l2.c.router), amount); + uint128 outBoundRate = l2.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(outBoundRate) + 1); // rate is non zero + + ( + IClient.EVM2AnyMessage memory message, + IInternal.EVM2EVMMessage memory eventArg + ) = _getTokenMessage( + CCIPSendParams({ + router: l2.c.router, + token: l2.c.token, + amount: amount, + sourceChainSelector: l2.c.chainSelector, + destinationChainSelector: l1.c.chainSelector, + sender: alice, + migrated: false + }) + ); + + vm.expectEmit(address(l2.tokenPool)); + emit Burned(address(l2.c.EVM2EVMOnRamp1_2), amount); + vm.expectEmit(address(l2.c.EVM2EVMOnRamp1_2)); + emit CCIPSendRequested(eventArg); + vm.prank(alice); + l2.c.router.ccipSend{value: eventArg.feeTokenAmount}(l1.c.chainSelector, message); + + assertEq(l2.c.token.balanceOf(alice), 0); + + // ETH executeMessage + vm.selectFork(l1.c.forkId); + + uint256 tokenPoolBalanceBefore = l1.c.token.balanceOf(address(l1.tokenPool)); + + uint128 inBoundRate = l1.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(inBoundRate) + 1); // rate is non zero + + vm.expectEmit(address(l1.tokenPool)); + emit Released(address(l1.c.EVM2EVMOffRamp1_2), alice, amount); + vm.prank(address(l1.c.EVM2EVMOffRamp1_2)); + l1.c.EVM2EVMOffRamp1_2.executeSingleMessage( + eventArg, + new bytes[](message.tokenAmounts.length) + ); + + assertEq(l1.c.token.balanceOf(address(l1.tokenPool)), tokenPoolBalanceBefore - amount); + assertEq(l1.c.token.balanceOf(alice), amount); + } + } +} + +contract AaveV3E2E_GHOCCIP150Upgrade_20241021_PostCCIPMigration is + AaveV3E2E_GHOCCIP150Upgrade_20241021_Base +{ + function setUp() public override { + super.setUp(); + + // execute proposal + vm.selectFork(l1.c.forkId); + executePayload(vm, address(l1.proposal)); + vm.selectFork(l2.c.forkId); + executePayload(vm, address(l2.proposal)); + + _mockCCIPMigration(l1.c, l2.c); + _mockCCIPMigration(l2.c, l1.c); + + _validateConfig({migrated: true}); + } + + function test_E2E() public { + uint256 amount = l1.rateLimitConfig.capacity; + // ETH (=> ARB) sendMessage + { + vm.selectFork(l1.c.forkId); + deal(address(l1.c.token), alice, amount, true); + vm.prank(alice); + l1.c.token.approve(address(l1.c.router), amount); + + uint128 outBoundRate = l1.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(outBoundRate) + 1); // rate is non zero + + uint256 tokenPoolBalance = l1.c.token.balanceOf(address(l1.tokenPool)); + uint256 bridgedAmount = l1.tokenPool.getCurrentBridgedAmount(); + + ( + IClient.EVM2AnyMessage memory message, + IInternal.EVM2EVMMessage memory eventArg + ) = _getTokenMessage( + CCIPSendParams({ + router: l1.c.router, + token: l1.c.token, + amount: amount, + sourceChainSelector: l1.c.chainSelector, + destinationChainSelector: l2.c.chainSelector, + sender: alice, + migrated: true + }) + ); + + /// expected flow: router => onRamp => proxyPool => tokenPool + vm.expectEmit(address(l1.tokenPool)); + emit Locked(address(l1.c.proxyPool), amount); + + vm.expectEmit(address(l1.c.proxyPool)); + emit Locked(address(l1.c.EVM2EVMOnRamp1_5), amount); + + vm.expectEmit(address(l1.c.EVM2EVMOnRamp1_5)); // @dev caller is now 1.5 onRamp + emit CCIPSendRequested(eventArg); + vm.prank(alice); + l1.c.router.ccipSend{value: eventArg.feeTokenAmount}(l2.c.chainSelector, message); + + assertEq(l1.c.token.balanceOf(address(l1.tokenPool)), tokenPoolBalance + amount); + assertEq(l1.tokenPool.getCurrentBridgedAmount(), bridgedAmount + amount); + + // ARB executeMessage + vm.selectFork(l2.c.forkId); + + uint128 inBoundRate = l2.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(inBoundRate) + 1); // rate is non zero + + vm.expectEmit(address(l2.tokenPool)); + emit Minted(address(l2.c.EVM2EVMOffRamp1_2), alice, amount); + vm.prank(address(l2.c.EVM2EVMOffRamp1_2)); + l2.c.EVM2EVMOffRamp1_2.executeSingleMessage( + eventArg, + new bytes[](message.tokenAmounts.length) + ); + + // wait for the rate limiter to refill + skip(amount / uint256(inBoundRate) + 1); // rate is non zero + + vm.expectEmit(address(l2.c.proxyPool)); // emitter is proxyPool for 1.5 on ramp + emit Minted(address(l2.c.EVM2EVMOffRamp1_5), alice, amount); + vm.prank(address(l2.c.EVM2EVMOffRamp1_5)); + l2.c.EVM2EVMOffRamp1_5.executeSingleMessage( + eventArg, + new bytes[](message.tokenAmounts.length), + new uint32[](1) // tokenGasOverrides + ); + } + + // ARB (=> ETH) sendMessage + { + vm.selectFork(l2.c.forkId); + + vm.prank(alice); + l2.c.token.approve(address(l2.c.router), amount); + uint128 outBoundRate = l2.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(outBoundRate) + 1); // rate is non zero + + ( + IClient.EVM2AnyMessage memory message, + IInternal.EVM2EVMMessage memory eventArg + ) = _getTokenMessage( + CCIPSendParams({ + router: l2.c.router, + token: l2.c.token, + amount: amount, + sourceChainSelector: l2.c.chainSelector, + destinationChainSelector: l1.c.chainSelector, + sender: alice, + migrated: true + }) + ); + + /// expected flow: router => onRamp => proxyPool => tokenPool + vm.expectEmit(address(l2.tokenPool)); + emit Burned(address(l2.c.proxyPool), amount); // @dev caller is now 1.5 onRamp + + vm.expectEmit(address(l2.c.proxyPool)); + emit Burned(address(l2.c.EVM2EVMOnRamp1_5), amount); // @dev caller is now 1.5 onRamp + + vm.expectEmit(address(l2.c.EVM2EVMOnRamp1_5)); + emit CCIPSendRequested(eventArg); + vm.prank(alice); + l2.c.router.ccipSend{value: eventArg.feeTokenAmount}(l1.c.chainSelector, message); + + // ETH executeMessage + vm.selectFork(l1.c.forkId); + + uint256 tokenPoolBalanceBefore = l1.c.token.balanceOf(address(l1.tokenPool)); + + uint128 inBoundRate = l1.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(inBoundRate) + 1); // rate is non zero + + vm.expectEmit(address(l1.c.proxyPool)); // emitter is proxyPool for 1.5 off ramp + emit Released(address(l1.c.EVM2EVMOffRamp1_5), alice, amount); + vm.prank(address(l1.c.EVM2EVMOffRamp1_5)); + l1.c.EVM2EVMOffRamp1_5.executeSingleMessage( + eventArg, + new bytes[](message.tokenAmounts.length), + new uint32[](1) // tokenGasOverrides + ); + + assertEq(l1.c.token.balanceOf(address(l1.tokenPool)), tokenPoolBalanceBefore - amount); + assertEq(l1.c.token.balanceOf(alice), amount); + } + } + + function test_SendRevertsWithoutUpgrade() public { + { + vm.selectFork(l1.c.forkId); + uint256 amount = l1.rateLimitConfig.capacity; + deal(address(l1.c.token), alice, amount, true); + vm.prank(alice); + l1.c.token.approve(address(l1.c.router), amount); + uint128 rate = l1.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(rate) + 1); // rate is non zero + + ( + IClient.EVM2AnyMessage memory message, + IInternal.EVM2EVMMessage memory eventArg + ) = _getTokenMessage( + CCIPSendParams({ + router: l1.c.router, + token: l1.c.token, + amount: amount, + sourceChainSelector: l1.c.chainSelector, + destinationChainSelector: l2.c.chainSelector, + sender: alice, + migrated: true + }) + ); + + // mock undo upgrade by setting proxy pool to random address + vm.prank(l1.tokenPool.owner()); + l1.tokenPool.setProxyPool(address(1337)); + + vm.expectRevert(abi.encodeWithSelector(CallerIsNotARampOnRouter.selector, l1.c.proxyPool)); + vm.prank(alice); + l1.c.router.ccipSend{value: eventArg.feeTokenAmount}(l2.c.chainSelector, message); + } + + { + vm.selectFork(l2.c.forkId); + uint256 amount = l1.rateLimitConfig.capacity; + deal(address(l2.c.token), alice, amount, true); + vm.prank(alice); + l2.c.token.approve(address(l2.c.router), amount); + uint128 rate = l2.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(rate) + 1); // rate is non zero + + ( + IClient.EVM2AnyMessage memory message, + IInternal.EVM2EVMMessage memory eventArg + ) = _getTokenMessage( + CCIPSendParams({ + router: l2.c.router, + token: l2.c.token, + amount: amount, + sourceChainSelector: l2.c.chainSelector, + destinationChainSelector: l1.c.chainSelector, + sender: alice, + migrated: true + }) + ); + + // mock undo upgrade by setting proxy pool to random address + vm.prank(l2.tokenPool.owner()); + l2.tokenPool.setProxyPool(address(1337)); + + vm.expectRevert(abi.encodeWithSelector(CallerIsNotARampOnRouter.selector, l2.c.proxyPool)); + vm.prank(alice); + l2.c.router.ccipSend{value: eventArg.feeTokenAmount}(l1.c.chainSelector, message); + } + } + + function test_ExecuteRevertsWithoutUpgrade() public { + { + vm.selectFork(l1.c.forkId); + uint256 amount = l1.rateLimitConfig.capacity; + deal(address(l1.c.token), alice, amount, true); + vm.prank(alice); + l1.c.token.approve(address(l1.c.router), amount); + + uint128 inBoundRate = l1.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(inBoundRate) + 1); // rate is non zero + + ( + IClient.EVM2AnyMessage memory message, + IInternal.EVM2EVMMessage memory eventArg + ) = _getTokenMessage( + CCIPSendParams({ + router: l1.c.router, + token: l1.c.token, + amount: amount, + sourceChainSelector: l1.c.chainSelector, + destinationChainSelector: l2.c.chainSelector, + sender: alice, + migrated: true + }) + ); + + // mock undo upgrade by setting proxy pool to random address + vm.prank(l1.tokenPool.owner()); + l1.tokenPool.setProxyPool(address(1337)); + + vm.expectRevert(abi.encodeWithSelector(NotACompatiblePool.selector, address(0))); + vm.prank(address(l1.c.EVM2EVMOffRamp1_5)); + l1.c.EVM2EVMOffRamp1_5.executeSingleMessage( + eventArg, + new bytes[](message.tokenAmounts.length), + new uint32[](1) // tokenGasOverrides + ); + } + + { + vm.selectFork(l2.c.forkId); + uint256 amount = l1.rateLimitConfig.capacity; + deal(address(l2.c.token), alice, amount, true); + vm.prank(alice); + l2.c.token.approve(address(l2.c.router), amount); + + uint128 inBoundRate = l2.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(inBoundRate) + 1); // rate is non zero + + ( + IClient.EVM2AnyMessage memory message, + IInternal.EVM2EVMMessage memory eventArg + ) = _getTokenMessage( + CCIPSendParams({ + router: l2.c.router, + token: l2.c.token, + amount: amount, + sourceChainSelector: l2.c.chainSelector, + destinationChainSelector: l1.c.chainSelector, + sender: alice, + migrated: true + }) + ); + + // mock undo upgrade by setting proxy pool to random address + vm.prank(l2.tokenPool.owner()); + l2.tokenPool.setProxyPool(address(1337)); + + vm.expectRevert(abi.encodeWithSelector(NotACompatiblePool.selector, address(0))); + vm.prank(address(l2.c.EVM2EVMOffRamp1_5)); + l2.c.EVM2EVMOffRamp1_5.executeSingleMessage( + eventArg, + new bytes[](message.tokenAmounts.length), + new uint32[](1) // tokenGasOverrides + ); + } + } +} + +// sendMsg => CCIP Migration => executeMsg +contract AaveV3E2E_GHOCCIP150Upgrade_20241021_InFlightCCIPMigration is + AaveV3E2E_GHOCCIP150Upgrade_20241021_Base +{ + function setUp() public override { + super.setUp(); + + // execute proposal + vm.selectFork(l1.c.forkId); + executePayload(vm, address(l1.proposal)); + vm.selectFork(l2.c.forkId); + executePayload(vm, address(l2.proposal)); + + _validateConfig({migrated: false}); + } + + function test_SendFlowInFlightCCIPMigrationFromEth() public { + // ETH => ARB, ccipSend 1.4; CCIP migration, Destination executeMessage + { + vm.selectFork(l1.c.forkId); + uint256 amount = l1.rateLimitConfig.capacity; + deal(address(l1.c.token), alice, amount, true); + vm.prank(alice); + l1.c.token.approve(address(l1.c.router), amount); + uint128 rate = l1.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(rate) + 1); // rate is non zero + + ( + IClient.EVM2AnyMessage memory message, + IInternal.EVM2EVMMessage memory eventArg + ) = _getTokenMessage( + CCIPSendParams({ + router: l1.c.router, + token: l1.c.token, + amount: amount, + sourceChainSelector: l1.c.chainSelector, + destinationChainSelector: l2.c.chainSelector, + sender: alice, + migrated: false + }) + ); + + vm.expectEmit(address(l1.tokenPool)); + emit Locked(address(l1.c.EVM2EVMOnRamp1_2), amount); + vm.expectEmit(address(l1.c.EVM2EVMOnRamp1_2)); + emit CCIPSendRequested(eventArg); + vm.prank(alice); + l1.c.router.ccipSend{value: eventArg.feeTokenAmount}(l2.c.chainSelector, message); + + assertEq(l1.c.token.balanceOf(alice), 0); + + // CCIP Migration + _mockCCIPMigration(l1.c, l2.c); + _mockCCIPMigration(l2.c, l1.c); + + vm.selectFork(l2.c.forkId); + + uint128 inBoundRate = l2.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(inBoundRate) + 1); // rate is non zero + + // reverts with 1.5 off ramp because eventArg is in CCIP 1.4 message format + vm.expectRevert(); + vm.prank(address(l2.c.EVM2EVMOffRamp1_5)); + l2.c.EVM2EVMOffRamp1_5.executeSingleMessage( + eventArg, + new bytes[](message.tokenAmounts.length), + new uint32[](0) // tokenGasOverrides + ); + + // system can use legacy 1.2 off ramp after migration + vm.expectEmit(address(l2.tokenPool)); + emit Minted(address(l2.c.EVM2EVMOffRamp1_2), alice, amount); + vm.prank(address(l2.c.EVM2EVMOffRamp1_2)); + l2.c.EVM2EVMOffRamp1_2.executeSingleMessage( + eventArg, + new bytes[](message.tokenAmounts.length) + ); + } + } + + function test_SendFlowInFlightCCIPMigrationFromArb() public { + // ARB => ETH, ccipSend 1.4; CCIP migration, Destination executeMessage + { + vm.selectFork(l2.c.forkId); + uint256 amount = l1.rateLimitConfig.capacity; + deal(address(l2.c.token), alice, amount, true); + vm.prank(alice); + l2.c.token.approve(address(l2.c.router), amount); + uint128 outBoundRate = l2.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(outBoundRate) + 1); // rate is non zero + + ( + IClient.EVM2AnyMessage memory message, + IInternal.EVM2EVMMessage memory eventArg + ) = _getTokenMessage( + CCIPSendParams({ + router: l2.c.router, + token: l2.c.token, + amount: amount, + sourceChainSelector: l2.c.chainSelector, + destinationChainSelector: l1.c.chainSelector, + sender: alice, + migrated: false + }) + ); + + vm.expectEmit(address(l2.tokenPool)); + emit Burned(address(l2.c.EVM2EVMOnRamp1_2), amount); + vm.expectEmit(address(l2.c.EVM2EVMOnRamp1_2)); + emit CCIPSendRequested(eventArg); + vm.prank(alice); + l2.c.router.ccipSend{value: eventArg.feeTokenAmount}(l1.c.chainSelector, message); + + assertEq(l2.c.token.balanceOf(alice), 0); + + // CCIP Migration + _mockCCIPMigration(l1.c, l2.c); + _mockCCIPMigration(l2.c, l1.c); + + vm.selectFork(l1.c.forkId); + + uint128 inBoundRate = l1.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(inBoundRate) + 1); // rate is non zero + + // reverts with 1.5 off ramp + vm.expectRevert(); + vm.prank(address(l1.c.EVM2EVMOffRamp1_5)); + l1.c.EVM2EVMOffRamp1_5.executeSingleMessage( + eventArg, + new bytes[](message.tokenAmounts.length), + new uint32[](0) // tokenGasOverrides + ); + + // system can use legacy 1.2 off ramp after migration + vm.expectEmit(address(l1.tokenPool)); + emit Released(address(l1.c.EVM2EVMOffRamp1_2), alice, amount); + vm.prank(address(l1.c.EVM2EVMOffRamp1_2)); + l1.c.EVM2EVMOffRamp1_2.executeSingleMessage( + eventArg, + new bytes[](message.tokenAmounts.length) + ); + } + } +} diff --git a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.sol b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.sol new file mode 100644 index 000000000..7d6a405fe --- /dev/null +++ b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.sol @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {TransparentUpgradeableProxy} from 'solidity-utils/contracts/transparent-proxy/TransparentUpgradeableProxy.sol'; +import {ProxyAdmin} from 'solidity-utils/contracts/transparent-proxy/ProxyAdmin.sol'; +import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {IUpgradeableLockReleaseTokenPool} from 'src/interfaces/ccip/IUpgradeableLockReleaseTokenPool.sol'; +import {IRateLimiter} from 'src/interfaces/ccip/IRateLimiter.sol'; + +/** + * @title GHO CCIP 1.50 Upgrade + * @author Aave Labs + * - Discussion: https://governance.aave.com/t/bgd-technical-maintenance-proposals/15274/51 + */ +contract AaveV3Ethereum_GHOCCIP150Upgrade_20241021 is IProposalGenericExecutor { + uint64 public constant ARB_CHAIN_SELECTOR = 4949039107694359620; + + // https://etherscan.io/address/0xb77E872A68C62CfC0dFb02C067Ecc3DA23B4bbf3 + address public constant TOKEN_POOL_IMPL = 0xb77E872A68C62CfC0dFb02C067Ecc3DA23B4bbf3; + // https://etherscan.io/address/0x9Ec9F9804733df96D1641666818eFb5198eC50f0 + address public constant GHO_CCIP_PROXY_POOL = 0x9Ec9F9804733df96D1641666818eFb5198eC50f0; + + /// @dev Token Rate Limit Capacity: 300_000 GHO + uint128 public constant CCIP_RATE_LIMIT_CAPACITY = 300_000e18; + + /// @dev Token Rate Limit Refill Rate: 60 GHO per second (=> 216_000 GHO per hour) + uint128 public constant CCIP_RATE_LIMIT_REFILL_RATE = 60e18; + + function execute() external { + IUpgradeableLockReleaseTokenPool tokenPoolProxy = IUpgradeableLockReleaseTokenPool( + MiscEthereum.GHO_CCIP_TOKEN_POOL + ); + + ProxyAdmin(MiscEthereum.PROXY_ADMIN).upgrade( + TransparentUpgradeableProxy(payable(address(tokenPoolProxy))), + TOKEN_POOL_IMPL + ); + + // Update proxyPool address + tokenPoolProxy.setProxyPool(GHO_CCIP_PROXY_POOL); + + // Set rate limit + IRateLimiter.Config memory rateLimitConfig = IRateLimiter.Config({ + isEnabled: true, + capacity: CCIP_RATE_LIMIT_CAPACITY, + rate: CCIP_RATE_LIMIT_REFILL_RATE + }); + tokenPoolProxy.setChainRateLimiterConfig(ARB_CHAIN_SELECTOR, rateLimitConfig, rateLimitConfig); + } +} diff --git a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.t.sol b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.t.sol new file mode 100644 index 000000000..c9b0b63d8 --- /dev/null +++ b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.t.sol @@ -0,0 +1,501 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import 'forge-std/Test.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {AaveV3Ethereum} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol'; +import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {IClient} from 'src/interfaces/ccip/IClient.sol'; +import {IInternal} from 'src/interfaces/ccip/IInternal.sol'; +import {IRouter} from 'src/interfaces/ccip/IRouter.sol'; +import {ITypeAndVersion} from 'src/interfaces/ccip/ITypeAndVersion.sol'; +import {IProxyPool} from 'src/interfaces/ccip/IProxyPool.sol'; +import {IRateLimiter} from 'src/interfaces/ccip/IRateLimiter.sol'; +import {ITokenAdminRegistry} from 'src/interfaces/ccip/ITokenAdminRegistry.sol'; +import {IGhoCcipSteward} from 'src/interfaces/IGhoCcipSteward.sol'; +import {IUpgradeableLockReleaseTokenPool} from 'src/interfaces/ccip/IUpgradeableLockReleaseTokenPool.sol'; +import {CCIPUtils} from './utils/CCIPUtils.sol'; +import {AaveV3Ethereum_GHOCCIP150Upgrade_20241021} from './AaveV3Ethereum_GHOCCIP150Upgrade_20241021.sol'; + +/** + * @dev Test for AaveV3Ethereum_GHOCCIP150Upgrade_20241021 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.t.sol -vv + */ +contract AaveV3Ethereum_GHOCCIP150Upgrade_20241021_Test is ProtocolV3TestBase { + struct CCIPSendParams { + IRouter router; + uint256 amount; + bool migrated; + } + + AaveV3Ethereum_GHOCCIP150Upgrade_20241021 internal proposal; + IUpgradeableLockReleaseTokenPool internal ghoTokenPool; + IProxyPool internal proxyPool; + + address internal alice = makeAddr('alice'); + + uint64 internal constant ETH_CHAIN_SELECTOR = 5009297550715157269; + uint64 internal constant ARB_CHAIN_SELECTOR = 4949039107694359620; + address internal constant ARB_PROXY_POOL = 0x26329558f08cbb40d6a4CCA0E0C67b29D64A8c50; + ITokenAdminRegistry internal constant TOKEN_ADMIN_REGISTRY = + ITokenAdminRegistry(0xb22764f98dD05c789929716D677382Df22C05Cb6); + + address internal constant ON_RAMP_1_2 = 0x925228D7B82d883Dde340A55Fe8e6dA56244A22C; + address internal constant ON_RAMP_1_5 = 0x69eCC4E2D8ea56E2d0a05bF57f4Fd6aEE7f2c284; + address internal constant OFF_RAMP_1_2 = 0xeFC4a18af59398FF23bfe7325F2401aD44286F4d; + address internal constant OFF_RAMP_1_5 = 0xdf615eF8D4C64d0ED8Fd7824BBEd2f6a10245aC9; + + IGhoCcipSteward internal constant GHO_CCIP_STEWARD = + IGhoCcipSteward(0x101Efb7b9Beb073B1219Cd5473a7C8A2f2EB84f4); + + event Locked(address indexed sender, uint256 amount); + event Released(address indexed sender, address indexed recipient, uint256 amount); + event CCIPSendRequested(IInternal.EVM2EVMMessage message); + + error CallerIsNotARampOnRouter(address caller); + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21131872); + proposal = new AaveV3Ethereum_GHOCCIP150Upgrade_20241021(); + ghoTokenPool = IUpgradeableLockReleaseTokenPool(MiscEthereum.GHO_CCIP_TOKEN_POOL); + proxyPool = IProxyPool(proposal.GHO_CCIP_PROXY_POOL()); + + _validateConstants(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + assertEq( + ghoTokenPool.getCurrentInboundRateLimiterState(ARB_CHAIN_SELECTOR), + _getDisabledConfig() + ); + assertEq( + ghoTokenPool.getCurrentOutboundRateLimiterState(ARB_CHAIN_SELECTOR), + _getDisabledConfig() + ); + + bytes memory dynamicParamsBefore = _getDynamicParams(); + bytes memory staticParamsBefore = _getStaticParams(); + + defaultTest( + 'AaveV3Ethereum_GHOCCIP150Upgrade_20241021', + AaveV3Ethereum.POOL, + address(proposal) + ); + + assertEq(keccak256(_getDynamicParams()), keccak256(dynamicParamsBefore)); + assertEq(keccak256(_getStaticParams()), keccak256(staticParamsBefore)); + + assertEq( + ghoTokenPool.getCurrentInboundRateLimiterState(ARB_CHAIN_SELECTOR), + _getRateLimiterConfig() + ); + assertEq( + ghoTokenPool.getCurrentOutboundRateLimiterState(ARB_CHAIN_SELECTOR), + _getRateLimiterConfig() + ); + } + + function test_getProxyPool() public { + // proxyPool getter does not exist before the upgrade + vm.expectRevert(); + ghoTokenPool.getProxyPool(); + + executePayload(vm, address(proposal)); + + assertEq(ghoTokenPool.getProxyPool(), address(proxyPool)); + } + + function test_tokenPoolCannotBeInitializedAgain() public { + vm.expectRevert('Initializable: contract is already initialized'); + ghoTokenPool.initialize(makeAddr('owner'), new address[](0), makeAddr('router'), 0); + assertEq(_readInitialized(address(ghoTokenPool)), 1); + /// proxy implementation is initialized + assertEq(_readInitialized(_getImplementation(address(ghoTokenPool))), 255); + + executePayload(vm, address(proposal)); + + vm.expectRevert('Initializable: contract is already initialized'); + ghoTokenPool.initialize(makeAddr('owner'), new address[](0), makeAddr('router'), 0); + assertEq(_readInitialized(address(ghoTokenPool)), 1); + /// proxy implementation is initialized + assertEq(_readInitialized(_getImplementation(address(ghoTokenPool))), 255); + } + + function test_sendMessagePreCCIPMigration(uint256 amount) public { + executePayload(vm, address(proposal)); + + IERC20 gho = IERC20(address(ghoTokenPool.getToken())); + IRouter router = IRouter(ghoTokenPool.getRouter()); + amount = bound(amount, 1, _getRateLimiterConfig().capacity); + + // wait for the rate limiter to refill + skip(_getOutboundRefillTime(amount)); + + vm.prank(alice); + gho.approve(address(router), amount); + deal(address(gho), alice, amount); + + uint256 tokenPoolBalance = gho.balanceOf(address(ghoTokenPool)); + uint256 bridgedAmount = ghoTokenPool.getCurrentBridgedAmount(); + + ( + IClient.EVM2AnyMessage memory message, + IInternal.EVM2EVMMessage memory eventArg + ) = _getTokenMessage(CCIPSendParams({router: router, amount: amount, migrated: false})); + + vm.expectEmit(address(ghoTokenPool)); + emit Locked(ON_RAMP_1_2, amount); + vm.expectEmit(ON_RAMP_1_2); + emit CCIPSendRequested(eventArg); + vm.prank(alice); + router.ccipSend{value: eventArg.feeTokenAmount}(ARB_CHAIN_SELECTOR, message); + + assertEq(gho.balanceOf(address(ghoTokenPool)), tokenPoolBalance + amount); + assertEq(ghoTokenPool.getCurrentBridgedAmount(), bridgedAmount + amount); + } + + function test_sendMessagePostCCIPMigration(uint256 amount) public { + executePayload(vm, address(proposal)); + + _mockCCIPMigration(); + + IERC20 gho = IERC20(address(ghoTokenPool.getToken())); + IRouter router = IRouter(ghoTokenPool.getRouter()); + amount = bound(amount, 1, _getRateLimiterConfig().capacity); + + // wait for the rate limiter to refill + skip(_getOutboundRefillTime(amount)); + + vm.prank(alice); + gho.approve(address(router), amount); + deal(address(gho), alice, amount); + + uint256 tokenPoolBalance = gho.balanceOf(address(ghoTokenPool)); + uint256 bridgedAmount = ghoTokenPool.getCurrentBridgedAmount(); + + ( + IClient.EVM2AnyMessage memory message, + IInternal.EVM2EVMMessage memory eventArg + ) = _getTokenMessage(CCIPSendParams({router: router, amount: amount, migrated: true})); + + vm.expectEmit(address(ghoTokenPool)); + emit Locked(address(proxyPool), amount); + vm.expectEmit(address(proxyPool)); + emit Locked(ON_RAMP_1_5, amount); + vm.expectEmit(ON_RAMP_1_5); + emit CCIPSendRequested(eventArg); + vm.prank(alice); + router.ccipSend{value: eventArg.feeTokenAmount}(ARB_CHAIN_SELECTOR, message); + + assertEq(gho.balanceOf(address(ghoTokenPool)), tokenPoolBalance + amount); + assertEq(ghoTokenPool.getCurrentBridgedAmount(), bridgedAmount + amount); + } + + function test_executeMessagePreCCIPMigration(uint256 amount) public { + executePayload(vm, address(proposal)); + + IERC20 gho = IERC20(address(ghoTokenPool.getToken())); + amount = bound(amount, 1, _getRateLimiterConfig().capacity); + + // wait for the rate limiter to refill + skip(_getInboundRefillTime(amount)); + // mock previously locked gho + deal(address(gho), address(ghoTokenPool), amount); + + vm.expectEmit(address(ghoTokenPool)); + emit Released(OFF_RAMP_1_2, alice, amount); + vm.prank(OFF_RAMP_1_2); + ghoTokenPool.releaseOrMint(abi.encode(alice), alice, amount, ARB_CHAIN_SELECTOR, ''); + + assertEq(gho.balanceOf(alice), amount); + } + + function test_executeMessagePostCCIPMigration(uint256 amount) public { + executePayload(vm, address(proposal)); + + _mockCCIPMigration(); + + IERC20 gho = IERC20(address(ghoTokenPool.getToken())); + amount = bound(amount, 1, _getRateLimiterConfig().capacity); + // wait for the rate limiter to refill + skip(_getInboundRefillTime(amount)); + // mock previously locked gho + deal(address(gho), address(ghoTokenPool), amount); + + vm.expectEmit(address(ghoTokenPool)); + emit Released(OFF_RAMP_1_5, alice, amount); + vm.prank(OFF_RAMP_1_5); + ghoTokenPool.releaseOrMint(abi.encode(alice), alice, amount, ARB_CHAIN_SELECTOR, ''); + + assertEq(gho.balanceOf(alice), amount); + } + + function test_executeMessagePostCCIPMigrationViaLegacyOffRamp(uint256 amount) public { + executePayload(vm, address(proposal)); + + _mockCCIPMigration(); + + IERC20 gho = IERC20(address(ghoTokenPool.getToken())); + amount = bound(amount, 1, _getRateLimiterConfig().capacity); + + // wait for the rate limiter to refill + skip(_getInboundRefillTime(amount)); + // mock previously locked gho + deal(address(gho), address(ghoTokenPool), amount); + + vm.expectEmit(address(ghoTokenPool)); + emit Released(OFF_RAMP_1_2, alice, amount); + vm.prank(OFF_RAMP_1_2); + ghoTokenPool.releaseOrMint(abi.encode(alice), alice, amount, ARB_CHAIN_SELECTOR, ''); + + assertEq(gho.balanceOf(alice), amount); + } + + function test_proxyPoolCanOnRamp(uint256 amount) public { + amount = bound(amount, 1, _getRateLimiterConfig().capacity); + + uint256 bridgedAmount = ghoTokenPool.getCurrentBridgedAmount(); + + vm.expectRevert(abi.encodeWithSelector(CallerIsNotARampOnRouter.selector, proxyPool)); + vm.prank(address(proxyPool)); + ghoTokenPool.lockOrBurn(alice, abi.encode(alice), amount, ARB_CHAIN_SELECTOR, new bytes(0)); + + executePayload(vm, address(proposal)); + + // wait for the rate limiter to refill + skip(_getOutboundRefillTime(amount)); + + vm.expectEmit(address(ghoTokenPool)); + emit Locked(address(proxyPool), amount); + vm.prank(address(proxyPool)); + ghoTokenPool.lockOrBurn(alice, abi.encode(alice), amount, ARB_CHAIN_SELECTOR, new bytes(0)); + + assertEq(ghoTokenPool.getCurrentBridgedAmount(), bridgedAmount + amount); + } + + function test_proxyPoolCanOffRamp(uint256 amount) public { + amount = bound(amount, 1, _getRateLimiterConfig().capacity); + + vm.expectRevert(abi.encodeWithSelector(CallerIsNotARampOnRouter.selector, proxyPool)); + vm.prank(address(proxyPool)); + ghoTokenPool.releaseOrMint(abi.encode(alice), alice, amount, ARB_CHAIN_SELECTOR, new bytes(0)); + + executePayload(vm, address(proposal)); + // mock previously locked gho + deal(MiscEthereum.GHO_TOKEN, address(ghoTokenPool), amount); + // wait for the rate limiter to refill + skip(_getInboundRefillTime(amount)); + + vm.expectEmit(address(ghoTokenPool)); + emit Released(address(proxyPool), alice, amount); + vm.prank(address(proxyPool)); + ghoTokenPool.releaseOrMint(abi.encode(alice), alice, amount, ARB_CHAIN_SELECTOR, new bytes(0)); + } + + function test_stewardCanDisableRateLimit() public { + executePayload(vm, address(proposal)); + + assertEq(ghoTokenPool.getRateLimitAdmin(), address(GHO_CCIP_STEWARD)); + + vm.prank(GHO_CCIP_STEWARD.RISK_COUNCIL()); + GHO_CCIP_STEWARD.updateRateLimit(ARB_CHAIN_SELECTOR, false, 0, 0, false, 0, 0); + + assertEq( + abi.encode( + _tokenBucketToConfig(ghoTokenPool.getCurrentInboundRateLimiterState(ARB_CHAIN_SELECTOR)) + ), + abi.encode(_getDisabledConfig()) + ); + assertEq( + abi.encode( + _tokenBucketToConfig(ghoTokenPool.getCurrentOutboundRateLimiterState(ARB_CHAIN_SELECTOR)) + ), + abi.encode(_getDisabledConfig()) + ); + } + + function test_ownershipTransferOfGhoProxyPool() public { + executePayload(vm, address(proposal)); + _mockCCIPMigration(); + + assertEq(ghoTokenPool.owner(), AaveV3Ethereum.ACL_ADMIN); + + // CLL team transfers ownership of proxyPool and GHO token in TokenAdminRegistry + vm.prank(proxyPool.owner()); + proxyPool.transferOwnership(AaveV3Ethereum.ACL_ADMIN); + vm.prank(TOKEN_ADMIN_REGISTRY.owner()); + TOKEN_ADMIN_REGISTRY.transferAdminRole(MiscEthereum.GHO_TOKEN, AaveV3Ethereum.ACL_ADMIN); + + // new AIP to accept ownership + vm.startPrank(AaveV3Ethereum.ACL_ADMIN); + proxyPool.acceptOwnership(); + TOKEN_ADMIN_REGISTRY.acceptAdminRole(MiscEthereum.GHO_TOKEN); + vm.stopPrank(); + + assertEq(proxyPool.owner(), AaveV3Ethereum.ACL_ADMIN); + assertTrue( + TOKEN_ADMIN_REGISTRY.isAdministrator(MiscEthereum.GHO_TOKEN, AaveV3Ethereum.ACL_ADMIN) + ); + } + + function _mockCCIPMigration() private { + IRouter router = IRouter(ghoTokenPool.getRouter()); + + assertEq(TOKEN_ADMIN_REGISTRY.getPool(MiscEthereum.GHO_TOKEN), address(proxyPool)); + + assertEq(proxyPool.getRouter(), address(router)); + + assertTrue(proxyPool.isSupportedChain(ARB_CHAIN_SELECTOR)); + assertEq(proxyPool.getCurrentInboundRateLimiterState(ARB_CHAIN_SELECTOR), _getDisabledConfig()); + assertEq( + proxyPool.getCurrentOutboundRateLimiterState(ARB_CHAIN_SELECTOR), + _getDisabledConfig() + ); + assertEq(proxyPool.getRemotePool(ARB_CHAIN_SELECTOR), abi.encode(ARB_PROXY_POOL)); + assertEq( + proxyPool.getRemoteToken(ARB_CHAIN_SELECTOR), + abi.encode(AaveV3ArbitrumAssets.GHO_UNDERLYING) + ); + + IRouter.OnRamp[] memory onRampUpdates = new IRouter.OnRamp[](1); + onRampUpdates[0] = IRouter.OnRamp({ + destChainSelector: ARB_CHAIN_SELECTOR, + onRamp: ON_RAMP_1_5 // new onRamp + }); + IRouter.OffRamp[] memory offRampUpdates = new IRouter.OffRamp[](1); + offRampUpdates[0] = IRouter.OffRamp({ + sourceChainSelector: ARB_CHAIN_SELECTOR, + offRamp: OFF_RAMP_1_5 // new offRamp + }); + + vm.prank(router.owner()); + router.applyRampUpdates(onRampUpdates, new IRouter.OffRamp[](0), offRampUpdates); + } + + function _getTokenMessage( + CCIPSendParams memory params + ) internal returns (IClient.EVM2AnyMessage memory, IInternal.EVM2EVMMessage memory) { + IClient.EVM2AnyMessage memory message = CCIPUtils.generateMessage(alice, 1); + message.tokenAmounts[0] = IClient.EVMTokenAmount({ + token: MiscEthereum.GHO_TOKEN, + amount: params.amount + }); + + uint256 feeAmount = params.router.getFee(ARB_CHAIN_SELECTOR, message); + deal(alice, feeAmount); + + IInternal.EVM2EVMMessage memory eventArg = CCIPUtils.messageToEvent( + CCIPUtils.MessageToEventParams({ + message: message, + router: params.router, + sourceChainSelector: ETH_CHAIN_SELECTOR, + feeTokenAmount: feeAmount, + originalSender: alice, + destinationToken: AaveV3ArbitrumAssets.GHO_UNDERLYING, + migrated: params.migrated + }) + ); + + return (message, eventArg); + } + + function _getImplementation(address proxy) private view returns (address) { + bytes32 slot = bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1); + return address(uint160(uint256(vm.load(proxy, slot)))); + } + + function _readInitialized(address proxy) private view returns (uint8) { + /// slot 0 + // <1 byte ^ 1 byte ^ ---------- 20 bytes ----------> + // initialized initializing owner + return uint8(uint256(vm.load(proxy, bytes32(0)))); + } + + function _getStaticParams() private view returns (bytes memory) { + return + abi.encode( + address(ghoTokenPool.getToken()), + ghoTokenPool.getAllowList(), + ghoTokenPool.getArmProxy(), + ghoTokenPool.canAcceptLiquidity(), + ghoTokenPool.getRouter() + ); + } + + function _getDynamicParams() private view returns (bytes memory) { + return + abi.encode( + ghoTokenPool.owner(), + ghoTokenPool.getSupportedChains(), + ghoTokenPool.getAllowListEnabled(), + ghoTokenPool.getRateLimitAdmin(), + ghoTokenPool.getBridgeLimitAdmin(), + ghoTokenPool.getRebalancer(), + ghoTokenPool.getLockReleaseInterfaceId(), + ghoTokenPool.getBridgeLimit(), + ghoTokenPool.getCurrentBridgedAmount() + ); + } + + function _validateConstants() private view { + assertEq(TOKEN_ADMIN_REGISTRY.typeAndVersion(), 'TokenAdminRegistry 1.5.0'); + assertEq(proxyPool.typeAndVersion(), 'LockReleaseTokenPoolAndProxy 1.5.0'); + assertEq(ITypeAndVersion(ON_RAMP_1_2).typeAndVersion(), 'EVM2EVMOnRamp 1.2.0'); + assertEq(ITypeAndVersion(ON_RAMP_1_5).typeAndVersion(), 'EVM2EVMOnRamp 1.5.0'); + assertEq(ITypeAndVersion(OFF_RAMP_1_2).typeAndVersion(), 'EVM2EVMOffRamp 1.2.0'); + assertEq(ITypeAndVersion(OFF_RAMP_1_5).typeAndVersion(), 'EVM2EVMOffRamp 1.5.0'); + + assertEq(GHO_CCIP_STEWARD.GHO_TOKEN(), MiscEthereum.GHO_TOKEN); + assertEq(GHO_CCIP_STEWARD.GHO_TOKEN_POOL(), address(ghoTokenPool)); + + assertEq(proxyPool.getPreviousPool(), address(ghoTokenPool)); + } + + function _getOutboundRefillTime(uint256 amount) private view returns (uint256) { + uint128 rate = _getRateLimiterConfig().rate; + assertNotEq(rate, 0); + return amount / uint256(rate) + 1; // account for rounding + } + + function _getInboundRefillTime(uint256 amount) private view returns (uint256) { + uint128 rate = _getRateLimiterConfig().rate; + assertNotEq(rate, 0); + return amount / uint256(rate) + 1; // account for rounding + } + + function _tokenBucketToConfig( + IRateLimiter.TokenBucket memory bucket + ) private pure returns (IRateLimiter.Config memory) { + return + IRateLimiter.Config({ + isEnabled: bucket.isEnabled, + capacity: bucket.capacity, + rate: bucket.rate + }); + } + + function _getDisabledConfig() private pure returns (IRateLimiter.Config memory) { + return IRateLimiter.Config({isEnabled: false, capacity: 0, rate: 0}); + } + + function assertEq( + IRateLimiter.TokenBucket memory bucket, + IRateLimiter.Config memory config + ) internal pure { + assertEq(abi.encode(_tokenBucketToConfig(bucket)), abi.encode(config)); + } + + function _getRateLimiterConfig() internal view returns (IRateLimiter.Config memory) { + return + IRateLimiter.Config({ + isEnabled: true, + capacity: proposal.CCIP_RATE_LIMIT_CAPACITY(), + rate: proposal.CCIP_RATE_LIMIT_REFILL_RATE() + }); + } +} diff --git a/src/20241021_Multi_GHOCCIP150Upgrade/GHOCCIP150Upgrade.md b/src/20241021_Multi_GHOCCIP150Upgrade/GHOCCIP150Upgrade.md new file mode 100644 index 000000000..ea56acb50 --- /dev/null +++ b/src/20241021_Multi_GHOCCIP150Upgrade/GHOCCIP150Upgrade.md @@ -0,0 +1,35 @@ +--- +title: "GHO CCIP Integration Maintenance (CCIP v1.5 upgrade)" +author: "Aave Labs" +discussions: "https://governance.aave.com/t/bgd-technical-maintenance-proposals/15274/51" +--- + +## Simple Summary + +Proposal to update GHO CCIP Token Pools to ensure GHO’s CCIP integration remains functional during and after the upcoming migration to CCIP version 1.5. + +## Motivation + +The Chainlink Cross-Chain Interoperability Protocol (CCIP) is upgrading to version 1.5 in Q4 2024, introducing several new features and enhancements. We are expecting that a detailed description of this new version will be announced by Chainlink soon. +Currently, GHO CCIP Token Pools are based on version 1.4, and they are not compatible in their current form with CCIP 1.5. The Chainlink CCIP team cannot migrate the GHO CCIP Token Pools as part of the system-wide upgrade, as these are fully controlled by the Aave DAO. +Aave Labs will provide technical support to ensure that GHO CCIP Token Pools remain functional, secure, and aligned with the latest updates, enabling GHO to expand to other networks if needed. + +## Specification + +Below actions are taken in order to make GHO token pools work with the new CCIP 1.5 protocol by allowing the "Intermediary Contract" (proxyPool) to translate the interface between 1.4 & 1.5 OnRamps and OffRamps: + +- Configure an Intermediary Contract: This contract translates execution calls between the new OnRamp and the existing GHO Token Pools. It was developed and deployed by the Chainlink CCIP team on behalf of the Aave DAO. +- Upgrade the Existing GHO Token Pools: The existing Token Pools are adjusted to allow calls from both the old and new versions of the OnRamp and OffRamp, through the intermediary contract. +- Setup a Token Rate Limit: A token rate limit of 300,000 GHO as limit capacity and 60 GHO per second as refill rate is set for both directions of Ethereum <> Arbitrum lane. This is a temporary security measure that can be lifted later via AIP or by GHO Stewards. + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.t.sol) +- Snapshot - Direct-to-AIP +- [Discussion](https://governance.aave.com/t/bgd-technical-maintenance-proposals/15274/51) +- Token Pool Contracts - [UpgradeableLockReleaseTokenPool](https://github.com/aave/ccip/blob/bc0561e6a9615f410086d4766839eaf3ca9b9f49/contracts/src/v0.8/ccip/pools/GHO/UpgradeableLockReleaseTokenPool.sol), [UpgradeableBurnMintTokenPool](https://github.com/aave/ccip/blob/bc0561e6a9615f410086d4766839eaf3ca9b9f49/contracts/src/v0.8/ccip/pools/GHO/UpgradeableBurnMintTokenPool.sol) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241021_Multi_GHOCCIP150Upgrade/GHOCCIP150Upgrade_20241021.s.sol b/src/20241021_Multi_GHOCCIP150Upgrade/GHOCCIP150Upgrade_20241021.s.sol new file mode 100644 index 000000000..728f912ec --- /dev/null +++ b/src/20241021_Multi_GHOCCIP150Upgrade/GHOCCIP150Upgrade_20241021.s.sol @@ -0,0 +1,87 @@ +// 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, ArbitrumScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Ethereum_GHOCCIP150Upgrade_20241021} from './AaveV3Ethereum_GHOCCIP150Upgrade_20241021.sol'; +import {AaveV3Arbitrum_GHOCCIP150Upgrade_20241021} from './AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241021_Multi_GHOCCIP150Upgrade/GHOCCIP150Upgrade_20241021.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/GHOCCIP150Upgrade_20241021.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_GHOCCIP150Upgrade_20241021).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Arbitrum + * deploy-command: make deploy-ledger contract=src/20241021_Multi_GHOCCIP150Upgrade/GHOCCIP150Upgrade_20241021.s.sol:DeployArbitrum chain=arbitrum + * verify-command: FOUNDRY_PROFILE=arbitrum npx catapulta-verify -b broadcast/GHOCCIP150Upgrade_20241021.s.sol/42161/run-latest.json + */ +contract DeployArbitrum is ArbitrumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Arbitrum_GHOCCIP150Upgrade_20241021).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/20241021_Multi_GHOCCIP150Upgrade/GHOCCIP150Upgrade_20241021.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_GHOCCIP150Upgrade_20241021).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsArbitrum = new IPayloadsControllerCore.ExecutionAction[](1); + actionsArbitrum[0] = GovV3Helpers.buildAction( + type(AaveV3Arbitrum_GHOCCIP150Upgrade_20241021).creationCode + ); + payloads[1] = GovV3Helpers.buildArbitrumPayload(vm, actionsArbitrum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile(vm, 'src/20241021_Multi_GHOCCIP150Upgrade/GHOCCIP150Upgrade.md') + ); + } +} diff --git a/src/20241021_Multi_GHOCCIP150Upgrade/config.ts b/src/20241021_Multi_GHOCCIP150Upgrade/config.ts new file mode 100644 index 000000000..f1a49b82f --- /dev/null +++ b/src/20241021_Multi_GHOCCIP150Upgrade/config.ts @@ -0,0 +1,17 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3Ethereum', 'AaveV3Arbitrum'], + title: 'GHO CCIP 1.5.0 Upgrade', + shortName: 'GHOCCIP150Upgrade', + date: '20241021', + author: 'Aave Labs', + discussion: 'https://governance.aave.com/t/bgd-technical-maintenance-proposals/15274/51', + snapshot: 'Direct-to-AIP', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Ethereum: {configs: {OTHERS: {}}, cache: {blockNumber: 21131872}}, + AaveV3Arbitrum: {configs: {OTHERS: {}}, cache: {blockNumber: 271788784}}, + }, +}; diff --git a/src/20241021_Multi_GHOCCIP150Upgrade/utils/CCIPUtils.sol b/src/20241021_Multi_GHOCCIP150Upgrade/utils/CCIPUtils.sol new file mode 100644 index 000000000..c73b30175 --- /dev/null +++ b/src/20241021_Multi_GHOCCIP150Upgrade/utils/CCIPUtils.sol @@ -0,0 +1,161 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IClient} from 'src/interfaces/ccip/IClient.sol'; +import {IRouter} from 'src/interfaces/ccip/IRouter.sol'; +import {IInternal} from 'src/interfaces/ccip/IInternal.sol'; +import {IEVM2EVMOnRamp} from 'src/interfaces/ccip/IEVM2EVMOnRamp.sol'; + +library CCIPUtils { + uint64 internal constant ETH_CHAIN_SELECTOR = 5009297550715157269; + uint64 internal constant ARB_CHAIN_SELECTOR = 4949039107694359620; + + bytes32 internal constant LEAF_DOMAIN_SEPARATOR = + 0x0000000000000000000000000000000000000000000000000000000000000000; + bytes32 internal constant INTERNAL_DOMAIN_SEPARATOR = + 0x0000000000000000000000000000000000000000000000000000000000000001; + bytes32 internal constant EVM_2_EVM_MESSAGE_HASH = keccak256('EVM2EVMMessageHashV2'); + bytes4 public constant EVM_EXTRA_ARGS_V1_TAG = 0x97a657c9; + + struct SourceTokenData { + bytes sourcePoolAddress; + bytes destTokenAddress; + bytes extraData; + uint32 destGasAmount; + } + + struct MessageToEventParams { + IClient.EVM2AnyMessage message; + IRouter router; + uint64 sourceChainSelector; + uint256 feeTokenAmount; + address originalSender; + address destinationToken; + bool migrated; + } + + function generateMessage( + address receiver, + uint256 tokenAmountsLength + ) internal pure returns (IClient.EVM2AnyMessage memory) { + return + IClient.EVM2AnyMessage({ + receiver: abi.encode(receiver), + data: '', + tokenAmounts: new IClient.EVMTokenAmount[](tokenAmountsLength), + feeToken: address(0), + extraArgs: argsToBytes(IClient.EVMExtraArgsV1({gasLimit: 0})) + }); + } + + function messageToEvent( + MessageToEventParams memory params + ) public view returns (IInternal.EVM2EVMMessage memory) { + uint64 destChainSelector = params.sourceChainSelector == ETH_CHAIN_SELECTOR + ? ARB_CHAIN_SELECTOR + : ETH_CHAIN_SELECTOR; + IEVM2EVMOnRamp onRamp = IEVM2EVMOnRamp(params.router.getOnRamp(destChainSelector)); + + bytes memory args = new bytes(params.message.extraArgs.length - 4); + for (uint256 i = 4; i < params.message.extraArgs.length; ++i) { + args[i - 4] = params.message.extraArgs[i]; + } + + IInternal.EVM2EVMMessage memory messageEvent = IInternal.EVM2EVMMessage({ + sequenceNumber: onRamp.getExpectedNextSequenceNumber(), + feeTokenAmount: params.feeTokenAmount, + sender: params.originalSender, + nonce: onRamp.getSenderNonce(params.originalSender) + 1, + gasLimit: abi.decode(args, (IClient.EVMExtraArgsV1)).gasLimit, + strict: false, + sourceChainSelector: params.sourceChainSelector, + receiver: abi.decode(params.message.receiver, (address)), + data: params.message.data, + tokenAmounts: params.message.tokenAmounts, + sourceTokenData: new bytes[](params.message.tokenAmounts.length), + feeToken: params.router.getWrappedNative(), + messageId: '' + }); + + // change introduced in CCIP 1.5, hence we only apply if CCIP has migrated to 1.5 + if (params.migrated) { + for (uint256 i; i < params.message.tokenAmounts.length; ++i) { + messageEvent.sourceTokenData[i] = abi.encode( + SourceTokenData({ + sourcePoolAddress: abi.encode( + onRamp.getPoolBySourceToken(destChainSelector, params.message.tokenAmounts[i].token) + ), + destTokenAddress: abi.encode(params.destinationToken), + extraData: '', + destGasAmount: getDestGasAmount(onRamp, params.message.tokenAmounts[i].token) + }) + ); + } + } + + messageEvent.messageId = hash( + messageEvent, + generateMetadataHash(params.sourceChainSelector, destChainSelector, address(onRamp)) + ); + return messageEvent; + } + + function generateMetadataHash( + uint64 sourceChainSelector, + uint64 destChainSelector, + address onRamp + ) internal pure returns (bytes32) { + return + keccak256(abi.encode(EVM_2_EVM_MESSAGE_HASH, sourceChainSelector, destChainSelector, onRamp)); + } + + function argsToBytes( + IClient.EVMExtraArgsV1 memory extraArgs + ) internal pure returns (bytes memory bts) { + return abi.encodeWithSelector(EVM_EXTRA_ARGS_V1_TAG, extraArgs); + } + + /// @dev Used to hash messages for single-lane ramps. + /// OnRamp hash(EVM2EVMMessage) = OffRamp hash(EVM2EVMMessage) + /// The EVM2EVMMessage's messageId is expected to be the output of this hash function + /// @param original Message to hash + /// @param metadataHash Immutable metadata hash representing a lane with a fixed OnRamp + /// @return hashedMessage hashed message as a keccak256 + function hash( + IInternal.EVM2EVMMessage memory original, + bytes32 metadataHash + ) internal pure returns (bytes32) { + // Fixed-size message fields are included in nested hash to reduce stack pressure. + // This hashing scheme is also used by RMN. If changing it, please notify the RMN maintainers. + return + keccak256( + abi.encode( + LEAF_DOMAIN_SEPARATOR, + metadataHash, + keccak256( + abi.encode( + original.sender, + original.receiver, + original.sequenceNumber, + original.gasLimit, + original.strict, + original.nonce, + original.feeToken, + original.feeTokenAmount + ) + ), + keccak256(original.data), + keccak256(abi.encode(original.tokenAmounts)), + keccak256(abi.encode(original.sourceTokenData)) + ) + ); + } + + function getDestGasAmount(IEVM2EVMOnRamp onRamp, address token) internal view returns (uint32) { + IEVM2EVMOnRamp.TokenTransferFeeConfig memory config = onRamp.getTokenTransferFeeConfig(token); + return + config.isEnabled + ? config.destGasOverhead + : onRamp.getDynamicConfig().defaultTokenDestGasOverhead; + } +} diff --git a/src/interfaces/ccip/IEVM2EVMOffRamp.sol b/src/interfaces/ccip/IEVM2EVMOffRamp.sol index b900be64b..7f8b84385 100644 --- a/src/interfaces/ccip/IEVM2EVMOffRamp.sol +++ b/src/interfaces/ccip/IEVM2EVMOffRamp.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.0; import {IInternal} from 'src/interfaces/ccip/IInternal.sol'; -interface IEVM2EVMOffRamp { +interface IEVM2EVMOffRamp_1_2 { /// @notice Execute a single message. /// @param message The message that will be executed. /// @param offchainTokenData Token transfer data to be passed to TokenPool. @@ -17,3 +17,18 @@ interface IEVM2EVMOffRamp { bytes[] memory offchainTokenData ) external; } + +interface IEVM2EVMOffRamp_1_5 { + /// @notice Execute a single message. + /// @param message The message that will be executed. + /// @param offchainTokenData Token transfer data to be passed to TokenPool. + /// @dev We make this external and callable by the contract itself, in order to try/catch + /// its execution and enforce atomicity among successful message processing and token transfer. + /// @dev We use ERC-165 to check for the ccipReceive interface to permit sending tokens to contracts + /// (for example smart contract wallets) without an associated message. + function executeSingleMessage( + IInternal.EVM2EVMMessage calldata message, + bytes[] calldata offchainTokenData, + uint32[] memory tokenGasOverrides + ) external; +} diff --git a/src/interfaces/ccip/IEVM2EVMOnRamp.sol b/src/interfaces/ccip/IEVM2EVMOnRamp.sol new file mode 100644 index 000000000..20efb0cfd --- /dev/null +++ b/src/interfaces/ccip/IEVM2EVMOnRamp.sol @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import {IInternal} from './IInternal.sol'; + +interface IEVM2EVMOnRamp { + struct TokenTransferFeeConfig { + uint32 minFeeUSDCents; // ──────────╮ Minimum fee to charge per token transfer, multiples of 0.01 USD + uint32 maxFeeUSDCents; // │ Maximum fee to charge per token transfer, multiples of 0.01 USD + uint16 deciBps; // │ Basis points charged on token transfers, multiples of 0.1bps, or 1e-5 + uint32 destGasOverhead; // │ Gas charged to execute the token transfer on the destination chain + // │ Extra data availability bytes that are returned from the source pool and sent + uint32 destBytesOverhead; // │ to the destination pool. Must be >= Pool.CCIP_LOCK_OR_BURN_V1_RET_BYTES + bool aggregateRateLimitEnabled; // │ Whether this transfer token is to be included in Aggregate Rate Limiting + bool isEnabled; // ─────────────────╯ Whether this token has custom transfer fees + } + + struct DynamicConfig { + address router; // ──────────────────────────╮ Router address + uint16 maxNumberOfTokensPerMsg; // │ Maximum number of distinct ERC20 token transferred per message + uint32 destGasOverhead; // │ Gas charged on top of the gasLimit to cover destination chain costs + uint16 destGasPerPayloadByte; // │ Destination chain gas charged for passing each byte of `data` payload to receiver + uint32 destDataAvailabilityOverheadGas; // ──╯ Extra data availability gas charged on top of the message, e.g. for OCR + uint16 destGasPerDataAvailabilityByte; // ───╮ Amount of gas to charge per byte of message data that needs availability + uint16 destDataAvailabilityMultiplierBps; // │ Multiplier for data availability gas, multiples of bps, or 0.0001 + address priceRegistry; // │ Price registry address + uint32 maxDataBytes; // │ Maximum payload data size in bytes + uint32 maxPerMsgGasLimit; // ────────────────╯ Maximum gas limit for messages targeting EVMs + // │ + // The following three properties are defaults, they can be overridden by setting the TokenTransferFeeConfig for a token + uint16 defaultTokenFeeUSDCents; // ──────────╮ Default token fee charged per token transfer + uint32 defaultTokenDestGasOverhead; // │ Default gas charged to execute the token transfer on the destination chain + bool enforceOutOfOrder; // ──────────────────╯ Whether to enforce the allowOutOfOrderExecution extraArg value to be true. + } + + /// @notice Gets the next sequence number to be used in the onRamp + /// @return the next sequence number to be used + function getExpectedNextSequenceNumber() external view returns (uint64); + + /// @notice Get the next nonce for a given sender + /// @param sender The sender to get the nonce for + /// @return nonce The next nonce for the sender + function getSenderNonce(address sender) external view returns (uint64 nonce); + + /// @notice Adds and removed token pools. + /// @param removes The tokens and pools to be removed + /// @param adds The tokens and pools to be added. + function applyPoolUpdates( + IInternal.PoolUpdate[] memory removes, + IInternal.PoolUpdate[] memory adds + ) external; + + /// @notice Get the pool for a specific token + /// @param destChainSelector The destination chain selector + /// @param sourceToken The source chain token to get the pool for + /// @return pool Token pool + function getPoolBySourceToken( + uint64 destChainSelector, + address sourceToken + ) external view returns (address); + + /// @notice Gets the transfer fee config for a given token. + function getTokenTransferFeeConfig( + address token + ) external view returns (TokenTransferFeeConfig memory tokenTransferFeeConfig); + + /// @notice Returns the dynamic onRamp config. + /// @return dynamicConfig the configuration. + function getDynamicConfig() external view returns (DynamicConfig memory dynamicConfig); +} diff --git a/src/interfaces/ccip/IInternal.sol b/src/interfaces/ccip/IInternal.sol index fa8c78f6d..062ee93da 100644 --- a/src/interfaces/ccip/IInternal.sol +++ b/src/interfaces/ccip/IInternal.sol @@ -5,6 +5,11 @@ pragma solidity ^0.8.0; import {IClient} from 'src/interfaces/ccip/IClient.sol'; interface IInternal { + struct PoolUpdate { + address token; // The IERC20 token address + address pool; // The token pool address + } + /// @notice The cross chain message that gets committed to EVM chains. /// @dev RMN depends on this struct, if changing, please notify the RMN maintainers. struct EVM2EVMMessage { diff --git a/src/interfaces/ccip/IProxyPool.sol b/src/interfaces/ccip/IProxyPool.sol new file mode 100644 index 000000000..4810b9e9d --- /dev/null +++ b/src/interfaces/ccip/IProxyPool.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {ITypeAndVersion} from './ITypeAndVersion.sol'; +import {IRateLimiter} from './IRateLimiter.sol'; + +interface IProxyPool is ITypeAndVersion { + struct ChainUpdate { + uint64 remoteChainSelector; + bool allowed; + bytes remotePoolAddress; + bytes remoteTokenAddress; + IRateLimiter.Config inboundRateLimiterConfig; + IRateLimiter.Config outboundRateLimiterConfig; + } + + function owner() external view returns (address); + function transferOwnership(address newOwner) external; + function acceptOwnership() external; + function getRouter() external view returns (address); + function setRouter(address router) external; + function applyChainUpdates(ChainUpdate[] memory updates) external; + function isSupportedChain(uint64 chainSelector) external view returns (bool); + function getPreviousPool() external view returns (address); + function getCurrentInboundRateLimiterState( + uint64 chainSelector + ) external view returns (IRateLimiter.TokenBucket memory); + function getCurrentOutboundRateLimiterState( + uint64 chainSelector + ) external view returns (IRateLimiter.TokenBucket memory); + function getRemotePool(uint64 remoteChainSelector) external view returns (bytes memory); + function getRemoteToken(uint64 remoteChainSelector) external view returns (bytes memory); +} diff --git a/src/interfaces/ccip/IRateLimiter.sol b/src/interfaces/ccip/IRateLimiter.sol new file mode 100644 index 000000000..d4cb9ffa4 --- /dev/null +++ b/src/interfaces/ccip/IRateLimiter.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +interface IRateLimiter { + struct TokenBucket { + uint128 tokens; // ──────╮ Current number of tokens that are in the bucket. + uint32 lastUpdated; // │ Timestamp in seconds of the last token refill, good for 100+ years. + bool isEnabled; // ──────╯ Indication whether the rate limiting is enabled or not + uint128 capacity; // ────╮ Maximum number of tokens that can be in the bucket. + uint128 rate; // ────────╯ Number of tokens per second that the bucket is refilled. + } + + struct Config { + bool isEnabled; // Indication whether the rate limiting should be enabled + uint128 capacity; // ────╮ Specifies the capacity of the rate limiter + uint128 rate; // ───────╯ Specifies the rate of the rate limiter + } +} diff --git a/src/interfaces/ccip/IRouter.sol b/src/interfaces/ccip/IRouter.sol index 4e524b42f..89c9275b2 100644 --- a/src/interfaces/ccip/IRouter.sol +++ b/src/interfaces/ccip/IRouter.sol @@ -5,23 +5,38 @@ pragma solidity ^0.8.0; import {IClient} from 'src/interfaces/ccip/IClient.sol'; interface IRouter { - /// @notice Request a message to be sent to the destination chain - /// @param destinationChainSelector The destination chain ID - /// @param message The cross-chain CCIP message including data and/or tokens - /// @return messageId The message ID - /// @dev Note if msg.value is larger than the required fee (from getFee) we accept - /// the overpayment with no refund. - /// @dev Reverts with appropriate reason upon invalid message. + error UnsupportedDestinationChain(uint64 destChainSelector); + error InsufficientFeeTokenAmount(); + error InvalidMsgValue(); + + struct OnRamp { + uint64 destChainSelector; + address onRamp; + } + struct OffRamp { + uint64 sourceChainSelector; + address offRamp; + } + + function owner() external view returns (address); + function getWrappedNative() external view returns (address); + function getOffRamps() external view returns (OffRamp[] memory); + function getOnRamp(uint64 destChainSelector) external view returns (address onRampAddress); + function isOffRamp( + uint64 sourceChainSelector, + address offRamp + ) external view returns (bool isOffRamp); + function applyRampUpdates( + OnRamp[] calldata onRampUpdates, + OffRamp[] calldata offRampRemoves, + OffRamp[] calldata offRampAdds + ) external; + function isChainSupported(uint64 chainSelector) external view returns (bool supported); + function getSupportedTokens(uint64 chainSelector) external view returns (address[] memory tokens); function ccipSend( uint64 destinationChainSelector, IClient.EVM2AnyMessage memory message ) external payable returns (bytes32); - - /// @param destinationChainSelector The destination chainSelector - /// @param message The cross-chain CCIP message including data and/or tokens - /// @return fee returns execution fee for the message - /// delivery to destination chain, denominated in the feeToken specified in the message. - /// @dev Reverts with appropriate reason upon invalid message. function getFee( uint64 destinationChainSelector, IClient.EVM2AnyMessage memory message diff --git a/src/interfaces/ccip/ITokenAdminRegistry.sol b/src/interfaces/ccip/ITokenAdminRegistry.sol new file mode 100644 index 000000000..05667ccba --- /dev/null +++ b/src/interfaces/ccip/ITokenAdminRegistry.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {ITypeAndVersion} from './ITypeAndVersion.sol'; +interface ITokenAdminRegistry is ITypeAndVersion { + function owner() external view returns (address); + function acceptAdminRole(address from) external; + function proposeAdministrator(address localToken, address administrator) external; + function transferAdminRole(address localToken, address newAdministrator) external; + function isAdministrator(address localToken, address administrator) external view returns (bool); + function getPool(address token) external view returns (address); + function setPool(address source, address pool) external; +} diff --git a/src/interfaces/ccip/ITypeAndVersion.sol b/src/interfaces/ccip/ITypeAndVersion.sol new file mode 100644 index 000000000..135f6d0ae --- /dev/null +++ b/src/interfaces/ccip/ITypeAndVersion.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface ITypeAndVersion { + function typeAndVersion() external pure returns (string memory); +} diff --git a/src/interfaces/ccip/IUpgradeableBurnMintTokenPool.sol b/src/interfaces/ccip/IUpgradeableBurnMintTokenPool.sol new file mode 100644 index 000000000..09c322ccc --- /dev/null +++ b/src/interfaces/ccip/IUpgradeableBurnMintTokenPool.sol @@ -0,0 +1,93 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IRateLimiter} from './IRateLimiter.sol'; + +interface IUpgradeableBurnMintTokenPool { + error AggregateValueMaxCapacityExceeded(uint256 capacity, uint256 requested); + error AggregateValueRateLimitReached(uint256 minWaitInSeconds, uint256 available); + error AllowListNotEnabled(); + error BadARMSignal(); + error BucketOverfilled(); + error CallerIsNotARampOnRouter(address caller); + error ChainAlreadyExists(uint64 chainSelector); + error ChainNotAllowed(uint64 remoteChainSelector); + error DisabledNonZeroRateLimit(IRateLimiter.Config config); + error InvalidRatelimitRate(IRateLimiter.Config rateLimiterConfig); + error NonExistentChain(uint64 remoteChainSelector); + error RateLimitMustBeDisabled(); + error SenderNotAllowed(address sender); + error TokenMaxCapacityExceeded(uint256 capacity, uint256 requested, address tokenAddress); + error TokenRateLimitReached(uint256 minWaitInSeconds, uint256 available, address tokenAddress); + error Unauthorized(address caller); + error ZeroAddressNotAllowed(); + + event AllowListAdd(address sender); + event AllowListRemove(address sender); + event Burned(address indexed sender, uint256 amount); + event ChainAdded( + uint64 remoteChainSelector, + IRateLimiter.Config outboundRateLimiterConfig, + IRateLimiter.Config inboundRateLimiterConfig + ); + event ChainConfigured( + uint64 remoteChainSelector, + IRateLimiter.Config outboundRateLimiterConfig, + IRateLimiter.Config inboundRateLimiterConfig + ); + event ChainRemoved(uint64 remoteChainSelector); + event ConfigChanged(IRateLimiter.Config config); + event Initialized(uint8 version); + event Locked(address indexed sender, uint256 amount); + event Minted(address indexed sender, address indexed recipient, uint256 amount); + event OwnershipTransferRequested(address indexed from, address indexed to); + event OwnershipTransferred(address indexed from, address indexed to); + event Released(address indexed sender, address indexed recipient, uint256 amount); + event RouterUpdated(address oldRouter, address newRouter); + event TokensConsumed(uint256 tokens); + + function acceptOwnership() external; + function applyAllowListUpdates(address[] memory removes, address[] memory adds) external; + function getAllowList() external view returns (address[] memory); + function getAllowListEnabled() external view returns (bool); + function getArmProxy() external view returns (address armProxy); + function getCurrentInboundRateLimiterState( + uint64 remoteChainSelector + ) external view returns (IRateLimiter.TokenBucket memory); + function getCurrentOutboundRateLimiterState( + uint64 remoteChainSelector + ) external view returns (IRateLimiter.TokenBucket memory); + function getProxyPool() external view returns (address proxyPool); + function getRateLimitAdmin() external view returns (address); + function getRouter() external view returns (address router); + function getSupportedChains() external view returns (uint64[] memory); + function getToken() external view returns (address token); + function initialize(address owner, address[] memory allowlist, address router) external; + function isSupportedChain(uint64 remoteChainSelector) external view returns (bool); + function lockOrBurn( + address originalSender, + bytes memory, + uint256 amount, + uint64 remoteChainSelector, + bytes memory + ) external returns (bytes memory); + function owner() external view returns (address); + function releaseOrMint( + bytes memory, + address receiver, + uint256 amount, + uint64 remoteChainSelector, + bytes memory + ) external; + function setChainRateLimiterConfig( + uint64 remoteChainSelector, + IRateLimiter.Config memory outboundConfig, + IRateLimiter.Config memory inboundConfig + ) external; + function setProxyPool(address proxyPool) external; + function setRateLimitAdmin(address rateLimitAdmin) external; + function setRouter(address newRouter) external; + function supportsInterface(bytes4 interfaceId) external pure returns (bool); + function transferOwnership(address to) external; + function typeAndVersion() external view returns (string memory); +} diff --git a/src/interfaces/ccip/IUpgradeableLockReleaseTokenPool.sol b/src/interfaces/ccip/IUpgradeableLockReleaseTokenPool.sol index 02252f92c..bdc364e79 100644 --- a/src/interfaces/ccip/IUpgradeableLockReleaseTokenPool.sol +++ b/src/interfaces/ccip/IUpgradeableLockReleaseTokenPool.sol @@ -1,40 +1,117 @@ // SPDX-License-Identifier: MIT - pragma solidity ^0.8.0; -import {IClient} from 'src/interfaces/ccip/IClient.sol'; +import {IRateLimiter} from './IRateLimiter.sol'; interface IUpgradeableLockReleaseTokenPool { + error AggregateValueMaxCapacityExceeded(uint256 capacity, uint256 requested); + error AggregateValueRateLimitReached(uint256 minWaitInSeconds, uint256 available); + error AllowListNotEnabled(); + error BadARMSignal(); error BridgeLimitExceeded(uint256 bridgeLimit); + error BucketOverfilled(); + error CallerIsNotARampOnRouter(address caller); + error ChainAlreadyExists(uint64 chainSelector); + error ChainNotAllowed(uint64 remoteChainSelector); + error DisabledNonZeroRateLimit(IRateLimiter.Config config); + error InsufficientLiquidity(); + error InvalidRatelimitRate(IRateLimiter.Config rateLimiterConfig); + error LiquidityNotAccepted(); + error NonExistentChain(uint64 remoteChainSelector); + error NotEnoughBridgedAmount(); + error RateLimitMustBeDisabled(); + error SenderNotAllowed(address sender); + error TokenMaxCapacityExceeded(uint256 capacity, uint256 requested, address tokenAddress); + error TokenRateLimitReached(uint256 minWaitInSeconds, uint256 available, address tokenAddress); + error Unauthorized(address caller); + error ZeroAddressNotAllowed(); - /// @dev Initializer - /// @dev The address passed as `owner` must accept ownership after initialization. - /// @dev The `allowlist` is only effective if pool is set to access-controlled mode - /// @param owner The address of the owner - /// @param allowlist A set of addresses allowed to trigger lockOrBurn as original senders - /// @param router The address of the router - function initialize(address owner, address[] memory allowlist, address router) external; + event AllowListAdd(address sender); + event AllowListRemove(address sender); + event BridgeLimitAdminUpdated(address indexed oldAdmin, address indexed newAdmin); + event BridgeLimitUpdated(uint256 oldBridgeLimit, uint256 newBridgeLimit); + event Burned(address indexed sender, uint256 amount); + event ChainAdded( + uint64 remoteChainSelector, + IRateLimiter.Config outboundRateLimiterConfig, + IRateLimiter.Config inboundRateLimiterConfig + ); + event ChainConfigured( + uint64 remoteChainSelector, + IRateLimiter.Config outboundRateLimiterConfig, + IRateLimiter.Config inboundRateLimiterConfig + ); + event ChainRemoved(uint64 remoteChainSelector); + event ConfigChanged(IRateLimiter.Config config); + event Initialized(uint8 version); + event LiquidityAdded(address indexed provider, uint256 indexed amount); + event LiquidityRemoved(address indexed provider, uint256 indexed amount); + event Locked(address indexed sender, uint256 amount); + event Minted(address indexed sender, address indexed recipient, uint256 amount); + event OwnershipTransferRequested(address indexed from, address indexed to); + event OwnershipTransferred(address indexed from, address indexed to); + event Released(address indexed sender, address indexed recipient, uint256 amount); + event RouterUpdated(address oldRouter, address newRouter); + event TokensConsumed(uint256 tokens); - /// @dev Ownable + function acceptOwnership() external; + function applyAllowListUpdates(address[] memory removes, address[] memory adds) external; + function canAcceptLiquidity() external view returns (bool); + function getAllowList() external view returns (address[] memory); + function getAllowListEnabled() external view returns (bool); + function getArmProxy() external view returns (address armProxy); + function getBridgeLimit() external view returns (uint256); + function getBridgeLimitAdmin() external view returns (address); + function getCurrentBridgedAmount() external view returns (uint256); + function getCurrentInboundRateLimiterState( + uint64 remoteChainSelector + ) external view returns (IRateLimiter.TokenBucket memory); + function getCurrentOutboundRateLimiterState( + uint64 remoteChainSelector + ) external view returns (IRateLimiter.TokenBucket memory); + function getLockReleaseInterfaceId() external pure returns (bytes4); + function getProxyPool() external view returns (address proxyPool); + function getRateLimitAdmin() external view returns (address); + function getRebalancer() external view returns (address); + function getRouter() external view returns (address router); + function getSupportedChains() external view returns (uint64[] memory); + function getToken() external view returns (address token); + function initialize( + address owner, + address[] memory allowlist, + address router, + uint256 bridgeLimit + ) external; + function isSupportedChain(uint64 remoteChainSelector) external view returns (bool); + function lockOrBurn( + address originalSender, + bytes memory, + uint256 amount, + uint64 remoteChainSelector, + bytes memory + ) external returns (bytes memory); function owner() external view returns (address); - - /// @notice Sets the bridge limit - /// @param limit The new limit - function setBridgeLimit(uint256 limit) external; - - /// @notice Sets the bridge limit admin address. - /// @dev Only callable by the owner. - /// @param bridgeLimitAdmin The new bridge limit admin address. + function provideLiquidity(uint256 amount) external; + function releaseOrMint( + bytes memory, + address receiver, + uint256 amount, + uint64 remoteChainSelector, + bytes memory + ) external; + function setBridgeLimit(uint256 newBridgeLimit) external; function setBridgeLimitAdmin(address bridgeLimitAdmin) external; - - /// @notice Sets the rate limiter admin address. - /// @dev Only callable by the owner. - /// @param rateLimitAdmin The new rate limiter admin address. + function setChainRateLimiterConfig( + uint64 remoteChainSelector, + IRateLimiter.Config memory outboundConfig, + IRateLimiter.Config memory inboundConfig + ) external; + function setProxyPool(address proxyPool) external; function setRateLimitAdmin(address rateLimitAdmin) external; - - /// @notice Gets the bridge limiter admin address. - function getBridgeLimitAdmin() external view returns (address); - - /// @notice Gets the rate limiter admin address. - function getRateLimitAdmin() external view returns (address); + function setRebalancer(address rebalancer) external; + function setRouter(address newRouter) external; + function supportsInterface(bytes4 interfaceId) external pure returns (bool); + function transferOwnership(address to) external; + function typeAndVersion() external view returns (string memory); + function withdrawLiquidity(uint256 amount) external; } From 03a94d45e94c61434caa03609d8e9c6bbda64df5 Mon Sep 17 00:00:00 2001 From: Cache bot Date: Thu, 7 Nov 2024 10:27:35 +0000 Subject: [PATCH 06/35] fix(cache): automated cache update [skip ci] --- src/20241021_Multi_GHOCCIP150Upgrade/GHOCCIP150Upgrade.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/20241021_Multi_GHOCCIP150Upgrade/GHOCCIP150Upgrade.md b/src/20241021_Multi_GHOCCIP150Upgrade/GHOCCIP150Upgrade.md index ea56acb50..e0576475e 100644 --- a/src/20241021_Multi_GHOCCIP150Upgrade/GHOCCIP150Upgrade.md +++ b/src/20241021_Multi_GHOCCIP150Upgrade/GHOCCIP150Upgrade.md @@ -24,8 +24,8 @@ Below actions are taken in order to make GHO token pools work with the new CCIP ## References -- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.sol) -- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.t.sol) +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/c016f11d2d921748459bb0aaca37f462b2639e1a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/c016f11d2d921748459bb0aaca37f462b2639e1a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/c016f11d2d921748459bb0aaca37f462b2639e1a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/c016f11d2d921748459bb0aaca37f462b2639e1a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.t.sol) - Snapshot - Direct-to-AIP - [Discussion](https://governance.aave.com/t/bgd-technical-maintenance-proposals/15274/51) - Token Pool Contracts - [UpgradeableLockReleaseTokenPool](https://github.com/aave/ccip/blob/bc0561e6a9615f410086d4766839eaf3ca9b9f49/contracts/src/v0.8/ccip/pools/GHO/UpgradeableLockReleaseTokenPool.sol), [UpgradeableBurnMintTokenPool](https://github.com/aave/ccip/blob/bc0561e6a9615f410086d4766839eaf3ca9b9f49/contracts/src/v0.8/ccip/pools/GHO/UpgradeableBurnMintTokenPool.sol) From d7f260e226e42cf6b87e348ab5601aec27f48d1d Mon Sep 17 00:00:00 2001 From: Harsh Pandey Date: Mon, 11 Nov 2024 22:41:18 +0530 Subject: [PATCH 07/35] feat: automated AGRS activation (#521) * feat: automated agrs activation * Update src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AutomatedAGRSActivation.md Co-authored-by: Ernesto Boado * chore: bump aave-cli and reduce diffs * fix: reduce link amount and use CollectorUtils * chore: fix package lock * chore: revert to old lockfile * chore: test ipfs ci * chore: update writeup * Update src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AutomatedAGRSActivation.md Co-authored-by: Ernesto Boado * Update src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AutomatedAGRSActivation.md Co-authored-by: Ernesto Boado * chore: update aave cli to new version --------- Co-authored-by: Ernesto Boado --- ..._AutomatedAGRSActivation_20241108_after.md | 19 + package.json | 2 +- ...mLido_AutomatedAGRSActivation_20241108.sol | 55 + ...ido_AutomatedAGRSActivation_20241108.t.sol | 108 ++ .../AutomatedAGRSActivation.md | 79 + .../AutomatedAGRSActivation_20241108.s.sol | 60 + .../config.ts | 15 + .../AutomationCompatibleInterface.sol | 43 + .../interfaces/IAaveCLRobotOperator.sol | 30 + .../interfaces/IAaveStewardInjector.sol | 80 + .../interfaces/IRiskOracle.sol | 114 ++ .../interfaces/IRiskSteward.sol | 14 + yarn.lock | 1527 +++++------------ 13 files changed, 1083 insertions(+), 1063 deletions(-) create mode 100644 diffs/AaveV3EthereumLido_AutomatedAGRSActivation_20241108_before_AaveV3EthereumLido_AutomatedAGRSActivation_20241108_after.md create mode 100644 src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AaveV3EthereumLido_AutomatedAGRSActivation_20241108.sol create mode 100644 src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AaveV3EthereumLido_AutomatedAGRSActivation_20241108.t.sol create mode 100644 src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AutomatedAGRSActivation.md create mode 100644 src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AutomatedAGRSActivation_20241108.s.sol create mode 100644 src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/config.ts create mode 100644 src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/AutomationCompatibleInterface.sol create mode 100644 src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/IAaveCLRobotOperator.sol create mode 100644 src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/IAaveStewardInjector.sol create mode 100644 src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/IRiskOracle.sol create mode 100644 src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/IRiskSteward.sol diff --git a/diffs/AaveV3EthereumLido_AutomatedAGRSActivation_20241108_before_AaveV3EthereumLido_AutomatedAGRSActivation_20241108_after.md b/diffs/AaveV3EthereumLido_AutomatedAGRSActivation_20241108_before_AaveV3EthereumLido_AutomatedAGRSActivation_20241108_after.md new file mode 100644 index 000000000..2f4674aba --- /dev/null +++ b/diffs/AaveV3EthereumLido_AutomatedAGRSActivation_20241108_before_AaveV3EthereumLido_AutomatedAGRSActivation_20241108_after.md @@ -0,0 +1,19 @@ +## Emodes changed + +### EMode: ETH correlated(id: 1) + + + +### EMode: LRT Stablecoins main(id: 2) + + + +### EMode: LRT wstETH main(id: 3) + + + +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/package.json b/package.json index cd967f431..a1bae94ef 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ }, "dependencies": { "@bgd-labs/aave-address-book": "4.0.0", - "@bgd-labs/aave-cli": "0.16.4", + "@bgd-labs/aave-cli": "^1.1.10", "@bgd-labs/js-utils": "^1.4.2", "@inquirer/prompts": "^3.3.0", "@inquirer/testing": "^2.1.13", diff --git a/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AaveV3EthereumLido_AutomatedAGRSActivation_20241108.sol b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AaveV3EthereumLido_AutomatedAGRSActivation_20241108.sol new file mode 100644 index 000000000..1f79fbb96 --- /dev/null +++ b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AaveV3EthereumLido_AutomatedAGRSActivation_20241108.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {IAaveCLRobotOperator} from './interfaces/IAaveCLRobotOperator.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV3EthereumLido} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {CollectorUtils} from 'aave-helpers/src/CollectorUtils.sol'; +import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol'; +import {SafeCast} from 'solidity-utils/contracts/oz-common/SafeCast.sol'; + +/** + * @title Automated AGRS Activation + * @author BGD Labs (@bgdlabs) + * - Discussion: https://governance.aave.com/t/arfc-aave-generalized-risk-stewards-agrs-activation/19178/3 + * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x4809f179e517e5745ec13eba8f40d98dab73ca65f8a141bd2f18cc16dcd0cc16 + */ +contract AaveV3EthereumLido_AutomatedAGRSActivation_20241108 is IProposalGenericExecutor { + using SafeERC20 for IERC20; + using SafeCast for uint256; + + address public constant EDGE_RISK_STEWARD = 0x81aFd0F99c2Afa2f2DD7E387c2Ef9CD2a29b6E1A; + address public constant AAVE_STEWARD_INJECTOR = 0x834a5aC6e9D05b92F599A031941262F761c34859; + uint256 public constant LINK_AMOUNT = 600 ether; + + function execute() external { + AaveV3EthereumLido.ACL_MANAGER.addRiskAdmin(EDGE_RISK_STEWARD); + + uint256 linkAmount = CollectorUtils.withdrawFromV3( + AaveV3Ethereum.COLLECTOR, + CollectorUtils.IOInput({ + pool: address(AaveV3Ethereum.POOL), + underlying: AaveV3EthereumAssets.LINK_UNDERLYING, + amount: LINK_AMOUNT + }), + address(this) + ); + + IERC20(AaveV3EthereumAssets.LINK_UNDERLYING).forceApprove( + MiscEthereum.AAVE_CL_ROBOT_OPERATOR, + linkAmount + ); + IAaveCLRobotOperator(MiscEthereum.AAVE_CL_ROBOT_OPERATOR).register( + 'LIDO WETH AGRS Injector', + AAVE_STEWARD_INJECTOR, + '', + 5_000_000, + linkAmount.toUint96(), + 0, + '' + ); + } +} diff --git a/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AaveV3EthereumLido_AutomatedAGRSActivation_20241108.t.sol b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AaveV3EthereumLido_AutomatedAGRSActivation_20241108.t.sol new file mode 100644 index 000000000..54170ddbc --- /dev/null +++ b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AaveV3EthereumLido_AutomatedAGRSActivation_20241108.t.sol @@ -0,0 +1,108 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumLido, AaveV3EthereumLidoAssets} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {IRiskSteward} from './interfaces/IRiskSteward.sol'; +import {IRiskOracle} from './interfaces/IRiskOracle.sol'; +import {IAaveStewardInjector} from './interfaces/IAaveStewardInjector.sol'; +import {AutomationCompatibleInterface} from './interfaces/AutomationCompatibleInterface.sol'; +import {AaveV3EthereumLido_AutomatedAGRSActivation_20241108} from './AaveV3EthereumLido_AutomatedAGRSActivation_20241108.sol'; +import {IAaveV3ConfigEngine as IEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {IDefaultInterestRateStrategyV2} from 'aave-v3-origin/contracts/interfaces/IDefaultInterestRateStrategyV2.sol'; + +/** + * @dev Test for AaveV3EthereumLido_AutomatedAGRSActivation_20241108 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AaveV3EthereumLido_AutomatedAGRSActivation_20241108.t.sol -vv + */ +contract AaveV3EthereumLido_AutomatedAGRSActivation_20241108_Test is ProtocolV3TestBase { + AaveV3EthereumLido_AutomatedAGRSActivation_20241108 internal proposal; + address public constant RISK_ORACLE_OWNER = 0x42939e82DF15afc586bb95f7dD69Afb6Dc24A6f9; + IRiskOracle public RISK_ORACLE; + + event KeeperRegistered(uint256 indexed id, address indexed upkeep, uint96 indexed amount); + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21142784); + proposal = new AaveV3EthereumLido_AutomatedAGRSActivation_20241108(); + RISK_ORACLE = IRiskOracle(IAaveStewardInjector(proposal.AAVE_STEWARD_INJECTOR()).RISK_ORACLE()); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3EthereumLido_AutomatedAGRSActivation_20241108', + AaveV3EthereumLido.POOL, + address(proposal) + ); + } + + function test_permissions() public { + executePayload(vm, address(proposal)); + + assertEq(AaveV3EthereumLido.ACL_MANAGER.isRiskAdmin(proposal.EDGE_RISK_STEWARD()), true); + assertEq( + IRiskSteward(proposal.EDGE_RISK_STEWARD()).RISK_COUNCIL(), + proposal.AAVE_STEWARD_INJECTOR() + ); + } + + function test_robotInjectorRegistered() public { + vm.expectEmit(false, true, true, true); + emit KeeperRegistered( + uint256(0), + proposal.AAVE_STEWARD_INJECTOR(), + uint96(proposal.LINK_AMOUNT()) + ); + executePayload(vm, address(proposal)); + } + + function test_injectUpdateToProtocol() public { + executePayload(vm, address(proposal)); + address rateStrategyAddress = AaveV3EthereumLido + .AAVE_PROTOCOL_DATA_PROVIDER + .getInterestRateStrategyAddress(AaveV3EthereumLidoAssets.WETH_UNDERLYING); + + IDefaultInterestRateStrategyV2.InterestRateData + memory currentRate = IDefaultInterestRateStrategyV2(rateStrategyAddress) + .getInterestRateDataBps(AaveV3EthereumLidoAssets.WETH_UNDERLYING); + + IEngine.InterestRateInputData memory newRate = IEngine.InterestRateInputData({ + optimalUsageRatio: currentRate.optimalUsageRatio + 3_00, + baseVariableBorrowRate: currentRate.baseVariableBorrowRate, + variableRateSlope1: currentRate.variableRateSlope1 + 50, + variableRateSlope2: currentRate.variableRateSlope2 + 5_00 + }); + + _addUpdateToRiskOracle(newRate); + + (bool upkeepNeeded, bytes memory performData) = AutomationCompatibleInterface( + proposal.AAVE_STEWARD_INJECTOR() + ).checkUpkeep(''); + assertTrue(upkeepNeeded); + + AutomationCompatibleInterface(proposal.AAVE_STEWARD_INJECTOR()).performUpkeep(performData); + + currentRate = IDefaultInterestRateStrategyV2(rateStrategyAddress).getInterestRateDataBps( + AaveV3EthereumLidoAssets.WETH_UNDERLYING + ); + assertEq(newRate.optimalUsageRatio, currentRate.optimalUsageRatio); + assertEq(newRate.baseVariableBorrowRate, currentRate.baseVariableBorrowRate); + assertEq(newRate.variableRateSlope1, currentRate.variableRateSlope1); + assertEq(newRate.variableRateSlope2, currentRate.variableRateSlope2); + } + + function _addUpdateToRiskOracle(IEngine.InterestRateInputData memory rate) internal { + vm.startPrank(RISK_ORACLE_OWNER); + RISK_ORACLE.publishRiskParameterUpdate( + 'referenceId', + abi.encode(rate), + 'RateStrategyUpdate', + address(AaveV3EthereumLidoAssets.WETH_UNDERLYING), + 'additionalData' + ); + vm.stopPrank(); + } +} diff --git a/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AutomatedAGRSActivation.md b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AutomatedAGRSActivation.md new file mode 100644 index 000000000..105659c08 --- /dev/null +++ b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AutomatedAGRSActivation.md @@ -0,0 +1,79 @@ +--- +title: "Automated (Edge) AGRS Activation" +author: "BGD Labs (@bgdlabs)" +discussions: "https://governance.aave.com/t/arfc-aave-generalized-risk-stewards-agrs-activation/19178/3" +snapshot: "https://snapshot.org/#/aave.eth/proposal/0x4809f179e517e5745ec13eba8f40d98dab73ca65f8a141bd2f18cc16dcd0cc16" +--- + +## Simple Summary + +This proposal activates the automated Aave Generalized Risk Stewards (AGRS) system on the Aave Ethereum Lido Instance to perform automated interest rate updates for the WETH asset. +Under the hood, the AGRS consumes the Edge infrastructure by Chaos Labs. + +## Motivation + +With the manual Aave Generalized Risk Stewards (AGRS) already being activated via this [proposal](https://vote.onaave.com/proposal/?proposalId=197), we think it's fair to also activate the automated AGRS system to perform automated interest rate update for WETH on Lido instance using the [Edge Risk Oracle](https://chaoslabs.xyz/posts/introducing-edge-the-next-generation-oracle) proposed by Chaos Labs. + +Regarding this pilot integration of automated AGRS with Chaos Labs new Edge infrastructure, it has the following rationale: + +- Whenever aligned with other strategic and technical aspects, Aave should benefit from infrastructure built by service providers, in this case, Chaos Labs. +- This pilot will be very non-invasive and with only positive outcomes, as the AGRS layer will guarantee that only acceptable interest rate recommendations will reach the Aave protocol, while ideally having a way more dynamic rate. + +The Aave Lido Market facilitates leveraged staking strategy by allowing users to supply wstETH as collateral for WETH borrowing. The market's viability hinges on maintaining WETH borrowing rates below Lido's daily rebasing staking rewards. However, when utilization approaches the Optimal Utilization point and enters Slope2 of the interest rate model, even minor utilization increases can trigger sharp borrowing rate spikes due to the steeper curve and can make the looping strategy unpredictable and deter user participation. + +The enhanced Liquid E-Mode configurations in the Lido Instance have significantly impacted market dynamics by driving increased demand for wstETH borrowing, as users pursue looping strategies for wstETH interest accrual. This heightened demand creates upward pressure on ETH interest rates, affecting what users are willing to pay. To stabilize rates in this environment, the risk oracle should consider the wstETH supply rate. + +To optimize market dynamics, the interest rate updates being proposed by the risk oracle and updated via AGRS aligns WETH borrowing rates with Lido's staking rewards while considering the impact of pool utilization and E-Mode demand. This alignment helps maintain stable lending conditions and keeps the looping strategy viable for users. + +## Specification + +The automated AGRS will use another instance of AGRS (exactly the same codebase as the other model), but with the following constraints: + +- This instance will only have configurable rate-related parameters: base variable borrow rate, Slope 1, and Slope 2 and uOptimal (Kink). +- Recommendations of these parameters will be submitted to [RiskOracle](https://github.com/ChaosLabsInc/risk-oracle/blob/main/src/RiskOracle.sol) smart contract, from the Edge off-chain infrastructure. +- Between the risk oracle smart contract and the AGRS contract, there will be a very thin middleware [AaveStewardsInjector](https://etherscan.io/address/0x834a5aC6e9D05b92F599A031941262F761c34859), which will have the following logic: + - Will take recommendations from the Edge Risk Oracle side and propagate them to the AGRS contract. + - Enforce that only the WETH asset can be acted upon. + - Given the protections (percentage constraints and time delay) on the AGRS side and that it is an assumption that risk recommendation will be the time correct on the Edge Risk Oracle, the propagation will be permissionless. + +The [AaveStewardsInjector](https://etherscan.io/address/0x834a5aC6e9D05b92F599A031941262F761c34859) middleware, technically being part of the Aave Robot infrastructure, will run on Chainlink Automation and will be registered using the [AaveCLRobotOperator](https://etherscan.io/address/0x1cDF8879eC8bE012bA959EB515b11008E0cb6323) contract with 600 LINK from the Ethereum Collector. + +The new instance of the [RiskSteward](https://etherscan.io/address/0x81aFd0F99c2Afa2f2DD7E387c2Ef9CD2a29b6E1A) will be given the RiskAdmin role with the following method: `ACL_MANAGER.addRiskAdmin()` + +### AGRS + +The automated AGRS system will be configured with the following params: + +| Parameter | Percent change allowed | minimumDelay | +| ------------------------- | ---------------------- | ------------ | +| Base Variable Borrow Rate | 0.5% (absolute change) | 1 day | +| Slope 1 | 0.5% (absolute change) | 1 day | +| Slope 2 | 5% (absolute change) | 1 day | +| Optimal Point (Kink) | 3% (absolute change) | 1 day | + +### Edge Risk Oracle + +- The risk oracle will retrieve the current Lido staking rewards rate once a day, aligning with the stETH rebasing schedule. +- The new Slope1 will be set to Lido’s staking rewards minus a predefined buffer (initially 0.5%) to account for market volatility and incentives. +- The initial buffer of 0.5% provides a safety margin to accommodate minor fluctuations in staking rewards and market conditions. +- The buffer may be adjusted based on the level of incentives and market feedback to optimize profitability and risk management. +- Update Frequency: + - Adjustments will occur once daily to align with stETH rebasing. +- Parameter Adjustments: + - While the risk oracle has the technical capability to adjust the entire interest rate strategy (base rate, optimal utilization, slope 1, slope 2) under the constraints of the risk stewards, the most updated parameter will be slop 1. +- Monitoring and Transparency: + - All adjustments and calculations will be transparent and auditable, with data available for community review. + +## References + +- Implementation: [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AaveV3EthereumLido_AutomatedAGRSActivation_20241108.sol) +- Tests: [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AaveV3EthereumLido_AutomatedAGRSActivation_20241108.t.sol) +- [Snapshot](https://snapshot.org/#/aave.eth/proposal/0x4809f179e517e5745ec13eba8f40d98dab73ca65f8a141bd2f18cc16dcd0cc16) +- [Discussion](https://governance.aave.com/t/arfc-aave-generalized-risk-stewards-agrs-activation/19178/3) +- AaveStewardsInjector: [github](https://github.com/aave-dao/aave-v3-risk-stewards/blob/650d51e2ec6bb1f4d9ae56da5a341436ef9bb8a1/src/contracts/AaveStewardInjector.sol), [deployed-contract](https://etherscan.io/address/0x834a5aC6e9D05b92F599A031941262F761c34859) +- EdgeRiskSteward: [github](https://github.com/aave-dao/aave-v3-risk-stewards/blob/650d51e2ec6bb1f4d9ae56da5a341436ef9bb8a1/src/contracts/EdgeRiskSteward.sol), [deployed-contract](https://etherscan.io/address/0x81aFd0F99c2Afa2f2DD7E387c2Ef9CD2a29b6E1A) +- EdgeRiskOracle: [github](https://github.com/ChaosLabsInc/risk-oracle/blob/be09f47d749985f9537e185016d0f81c003a9fc9/src/RiskOracle.sol), [deployed-contract](https://etherscan.io/address/0x7ABB46C690C52E919687D19ebF89C81A6136C1F2) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AutomatedAGRSActivation_20241108.s.sol b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AutomatedAGRSActivation_20241108.s.sol new file mode 100644 index 000000000..b6e4a37c4 --- /dev/null +++ b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AutomatedAGRSActivation_20241108.s.sol @@ -0,0 +1,60 @@ +// 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 {AaveV3EthereumLido_AutomatedAGRSActivation_20241108} from './AaveV3EthereumLido_AutomatedAGRSActivation_20241108.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AutomatedAGRSActivation_20241108.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/AutomatedAGRSActivation_20241108.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3EthereumLido_AutomatedAGRSActivation_20241108).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/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AutomatedAGRSActivation_20241108.s.sol:CreateProposal chain=mainnet + */ +contract CreateProposal is EthereumScript { + function run() external { + // create payloads + PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](1); + + // compose actions for validation + IPayloadsControllerCore.ExecutionAction[] + memory actionsEthereum = new IPayloadsControllerCore.ExecutionAction[](1); + actionsEthereum[0] = GovV3Helpers.buildAction( + type(AaveV3EthereumLido_AutomatedAGRSActivation_20241108).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AutomatedAGRSActivation.md' + ) + ); + } +} diff --git a/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/config.ts b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/config.ts new file mode 100644 index 000000000..05aa92912 --- /dev/null +++ b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/config.ts @@ -0,0 +1,15 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3EthereumLido'], + title: 'Automated AGRS Activation', + shortName: 'AutomatedAGRSActivation', + date: '20241108', + author: 'BGD Labs (@bgdlabs)', + discussion: + 'https://governance.aave.com/t/arfc-aave-generalized-risk-stewards-agrs-activation/19178/3', + snapshot: '', + votingNetwork: 'POLYGON', + }, + poolOptions: {AaveV3EthereumLido: {configs: {OTHERS: {}}, cache: {blockNumber: 21142503}}}, +}; diff --git a/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/AutomationCompatibleInterface.sol b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/AutomationCompatibleInterface.sol new file mode 100644 index 000000000..6d30ab5d5 --- /dev/null +++ b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/AutomationCompatibleInterface.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface AutomationCompatibleInterface { + /** + * @notice method that is simulated by the keepers to see if any work actually + * needs to be performed. This method does does not actually need to be + * executable, and since it is only ever simulated it can consume lots of gas. + * @dev To ensure that it is never called, you may want to add the + * cannotExecute modifier from KeeperBase to your implementation of this + * method. + * @param checkData specified in the upkeep registration so it is always the + * same for a registered upkeep. This can easily be broken down into specific + * arguments using `abi.decode`, so multiple upkeeps can be registered on the + * same contract and easily differentiated by the contract. + * @return upkeepNeeded boolean to indicate whether the keeper should call + * performUpkeep or not. + * @return performData bytes that the keeper should call performUpkeep with, if + * upkeep is needed. If you would like to encode data to decode later, try + * `abi.encode`. + */ + function checkUpkeep( + bytes calldata checkData + ) external returns (bool upkeepNeeded, bytes memory performData); + + /** + * @notice method that is actually executed by the keepers, via the registry. + * The data returned by the checkUpkeep simulation will be passed into + * this method to actually be executed. + * @dev The input to this method should not be trusted, and the caller of the + * method should not even be restricted to any single registry. Anyone should + * be able call it, and the input should be validated, there is no guarantee + * that the data passed in is the performData returned from checkUpkeep. This + * could happen due to malicious keepers, racing keepers, or simply a state + * change while the performUpkeep transaction is waiting for confirmation. + * Always validate the data passed in. + * @param performData is the data which was passed back from the checkData + * simulation. If it is encoded, it can easily be decoded into other types by + * calling `abi.decode`. This data should not be trusted, and should be + * validated against the contract's current state. + */ + function performUpkeep(bytes calldata performData) external; +} diff --git a/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/IAaveCLRobotOperator.sol b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/IAaveCLRobotOperator.sol new file mode 100644 index 000000000..884e4d2af --- /dev/null +++ b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/IAaveCLRobotOperator.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveCLRobotOperator + * @author BGD Labs + * @notice Defines the interface for the robot operator contract to perform admin actions on the automation keepers. + **/ +interface IAaveCLRobotOperator { + /** + * @notice method called by owner to register the automation robot keeper. + * @param name name of keeper. + * @param upkeepContract upkeepContract of the keeper. + * @param upkeepCheckData checkData of the keeper which get passed to the checkUpkeep. + * @param gasLimit max gasLimit which the chainlink automation node can execute for the automation. + * @param amountToFund amount of link to fund the keeper with. + * @param triggerType type of robot keeper to register, 0 for conditional and 1 for event log based. + * @param triggerConfig encoded trigger config for event log based robots, unused for conditional type robots. + * @return chainlink id for the registered keeper. + **/ + function register( + string calldata name, + address upkeepContract, + bytes calldata upkeepCheckData, + uint32 gasLimit, + uint96 amountToFund, + uint8 triggerType, + bytes calldata triggerConfig + ) external returns (uint256); +} diff --git a/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/IAaveStewardInjector.sol b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/IAaveStewardInjector.sol new file mode 100644 index 000000000..2991eab06 --- /dev/null +++ b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/IAaveStewardInjector.sol @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AutomationCompatibleInterface} from './AutomationCompatibleInterface.sol'; + +/** + * @title IAaveStewardInjector + * @author BGD Labs + * @notice Defines the interface for the injector contract to automate actions for Risk Steward. + **/ +interface IAaveStewardInjector is AutomationCompatibleInterface { + /** + * @notice Emitted when performUpkeep is called and an update is injected into the risk steward. + * @param updateId the risk oracle update id injected into the risk steward. + */ + event ActionSucceeded(uint256 indexed updateId); + + /** + * @notice Emitted when injection of a updateId is disabled/enabled. + * @param updateId the risk oracle update id for which automation is disabled/enabled. + * @param disabled true if updateId is disabled, false otherwise. + */ + event UpdateDisabled(uint256 indexed updateId, bool indexed disabled); + + /** + * @notice The following update cannot be injected in the steward injector because the conditions are not met. + */ + error UpdateCannotBeInjected(); + + /** + * @notice method to check if injection of a updateId on risk steward is disabled. + * @param updateId updateId from risk oracle to check if disabled. + * @return bool if updateId is disabled or not. + **/ + function isDisabled(uint256 updateId) external view returns (bool); + + /** + * @notice method called by owner to disable/enabled injection of a updateId on risk steward. + * @param updateId updateId from risk oracle for which we need to disable/enable injection. + * @param disabled true if updateId should be disabled, false otherwise. + */ + function disableUpdateById(uint256 updateId, bool disabled) external; + + /** + * @notice method to check if the updateId from the risk oracle has been executed/injected into the risk steward. + * @param updateid the updateId from the risk oracle to check if already executed/injected. + * @return bool true if the updateId is executed/injected, false otherwise. + */ + function isUpdateIdExecuted(uint256 updateid) external view returns (bool); + + /** + * @notice method to get the address of the edge risk oracle contract. + * @return edge risk oracle contract address. + */ + function RISK_ORACLE() external view returns (address); + + /** + * @notice method to get the address of the aave risk steward contract. + * @return aave risk steward contract address. + */ + function RISK_STEWARD() external view returns (address); + + /** + * @notice method to get the expiration time for an update from the risk oracle. + * @return time in seconds of the expiration time. + */ + function EXPIRATION_PERIOD() external view returns (uint256); + + /** + * @notice method to get the whitelisted update type for which injection is allowed from the risk oracle into the stewards. + * @return string for the whitelisted update type - interest rate update. + */ + function WHITELISTED_UPDATE_TYPE() external view returns (string memory); + + /** + * @notice method to get the whitelisted asset for which injection is allowed from the risk oracle into the stewards. + * @return address for the whitelisted asset. + */ + function WHITELISTED_ASSET() external view returns (address); +} diff --git a/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/IRiskOracle.sol b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/IRiskOracle.sol new file mode 100644 index 000000000..16d757589 --- /dev/null +++ b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/IRiskOracle.sol @@ -0,0 +1,114 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface IRiskOracle { + struct RiskParameterUpdate { + uint256 timestamp; // Timestamp of the update + bytes newValue; // Encoded parameters, flexible for various data types + string referenceId; // External reference, potentially linking to a document or off-chain data + bytes previousValue; // Previous value of the parameter for historical comparison + string updateType; // Classification of the update for validation purposes + uint256 updateId; // Unique identifier for this specific update + address market; // Address for market of the parameter update + bytes additionalData; // Additional data for the update + } + + event ParameterUpdated( + string referenceId, + bytes newValue, + bytes previousValue, + uint256 timestamp, + string indexed updateType, + uint256 indexed updateId, + address indexed market, + bytes additionalData + ); + + event AuthorizedSenderAdded(address indexed sender); + event AuthorizedSenderRemoved(address indexed sender); + event UpdateTypeAdded(string indexed updateType); + + /** + * @notice Adds a new sender to the list of addresses authorized to perform updates. + * @param sender Address to be authorized. + */ + function addAuthorizedSender(address sender) external; + + /** + * @notice Removes an address from the list of authorized senders. + * @param sender Address to be unauthorized. + */ + function removeAuthorizedSender(address sender) external; + + /** + * @notice Method to fetch the counter which tracks of the total number of updates. + * @return The latest update counter. + */ + function updateCounter() external view returns (uint256); + + /** + * @notice Adds a new type of update to the list of authorized update types. + * @param newUpdateType New type of update to allow. + */ + function addUpdateType(string memory newUpdateType) external; + + /** + * @notice Publishes a new risk parameter update. + * @param referenceId An external reference ID associated with the update. + * @param newValue The new value of the risk parameter being updated. + * @param updateType Type of update performed, must be previously authorized. + * @param market Address for market of the parameter update + * @param additionalData Additional data for the update + */ + function publishRiskParameterUpdate( + string memory referenceId, + bytes memory newValue, + string memory updateType, + address market, + bytes memory additionalData + ) external; + + /** + * @notice Publishes multiple risk parameter updates in a single transaction. + * @param referenceIds Array of external reference IDs. + * @param newValues Array of new values for each update. + * @param updateTypes Array of types for each update, all must be authorized. + * @param markets Array of addresses for markets of the parameter updates + * @param additionalData Array of additional data for the updates + * + */ + function publishBulkRiskParameterUpdates( + string[] memory referenceIds, + bytes[] memory newValues, + string[] memory updateTypes, + address[] memory markets, + bytes[] memory additionalData + ) external; + + function getAllUpdateTypes() external view returns (string[] memory); + + /** + * @notice Fetches the most recent update for a specific parameter in a specific market. + * @param updateType The identifier for the parameter. + * @param market The market identifier. + * @return The most recent RiskParameterUpdate for the specified parameter and market. + */ + function getLatestUpdateByParameterAndMarket( + string memory updateType, + address market + ) external view returns (RiskParameterUpdate memory); + + /* + * @notice Fetches the update for a provided updateId. + * @param updateId Update ID. + * @return The most recent RiskParameterUpdate for the specified id. + */ + function getUpdateById(uint256 updateId) external view returns (RiskParameterUpdate memory); + + /** + * @notice Checks if an address is authorized to perform updates. + * @param sender Address to check. + * @return Boolean indicating whether the address is authorized. + */ + function isAuthorized(address sender) external view returns (bool); +} diff --git a/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/IRiskSteward.sol b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/IRiskSteward.sol new file mode 100644 index 000000000..16a27ba9e --- /dev/null +++ b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/IRiskSteward.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IRiskSteward + * @author BGD labs + * @notice Defines the interface for the contract to manage the risk params updates on aave v3 pool + */ +interface IRiskSteward { + /** + * @notice The safe controlling the steward + */ + function RISK_COUNCIL() external view returns (address); +} diff --git a/yarn.lock b/yarn.lock index 963c07af0..349d360c7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,14 +2,14 @@ # yarn lockfile v1 -"@adraffy/ens-normalize@1.10.0": - version "1.10.0" - resolved "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz" - integrity sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q== +"@adraffy/ens-normalize@^1.10.1": + version "1.11.0" + resolved "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz" + integrity sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg== "@ampproject/remapping@^2.3.0": version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz" integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: "@jridgewell/gen-mapping" "^0.3.5" @@ -20,68 +20,46 @@ resolved "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.9.4.tgz" integrity sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA== -"@babel/code-frame@^7.0.0": - version "7.22.13" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz" - integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== - dependencies: - "@babel/highlight" "^7.22.13" - chalk "^2.4.2" - -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== - -"@babel/highlight@^7.22.13": - version "7.22.20" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz" - integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" - js-tokens "^4.0.0" - "@bgd-labs/aave-address-book@4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@bgd-labs/aave-address-book/-/aave-address-book-4.0.0.tgz#3084117c33102bc9de718d47d6a48a2aae698543" + resolved "https://registry.npmjs.org/@bgd-labs/aave-address-book/-/aave-address-book-4.0.0.tgz" integrity sha512-OCeLg2Q4vL45SVU/nkBETGheYnUbbj1LvCwNR3TeI7MboESIcspoXJbiQWOeyJA6f9Uzo6+k3pa/KtK329gMww== -"@bgd-labs/aave-address-book@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@bgd-labs/aave-address-book/-/aave-address-book-3.0.0.tgz#a75cf2e217688e63728bec1b9c956b0134bc647c" - integrity sha512-ALT9T/aIZ7BztozWvGhjVKGAEfe6wLhop0z+0ZSwAdyHXrBfpXXDZa9siHNtOZfNojPVMPvkpgsiPnFmDD8OJQ== +"@bgd-labs/aave-address-book@^4.2.0": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@bgd-labs/aave-address-book/-/aave-address-book-4.3.1.tgz#c77943b980ba4636989ad72df65ba7d41fb5fd9c" + integrity sha512-Rg5ak/OuXgT6Q0q+CcP4GvutsTVaR6HmSsyHogkjwPgrgApg4d8GxtKHqBj9oXbNHnW5/N7piEGZc8Jd5z7G/Q== -"@bgd-labs/aave-cli@0.16.4": - version "0.16.4" - resolved "https://registry.yarnpkg.com/@bgd-labs/aave-cli/-/aave-cli-0.16.4.tgz#be97caea0b74e96b46b12984f4e656269badef59" - integrity sha512-5AmfCXKXC0tjTn2ZZpodqSkqccammykwhP86+GEFT5N0zcqizqv/wHT9opb4ctZjLcxCvwXEKjdcdm7a6MApwA== +"@bgd-labs/aave-cli@^1.1.10": + version "1.1.10" + resolved "https://registry.yarnpkg.com/@bgd-labs/aave-cli/-/aave-cli-1.1.10.tgz#4d8084dd0fc0a57f662acd90facc8f03c33aea89" + integrity sha512-ax2qIvbMmOle24GPDqA+syJRB8SOnCOftR7UCfxZ5jT5m0RjR0AWxGGKPILfXAuCwXj0NV5Xi5Zelu2BalBAEA== dependencies: - "@bgd-labs/aave-address-book" "^3.0.0" - "@bgd-labs/aave-v3-governance-cache" "^1.0.6" + "@bgd-labs/aave-address-book" "^4.2.0" + "@bgd-labs/aave-v3-governance-cache" "^1.0.8" "@bgd-labs/js-utils" "^1.4.2" "@commander-js/extra-typings" "^11.1.0" "@inquirer/prompts" "^3.3.2" + blockstore-core "^5.0.2" chalk "^4.1.2" - commander "^11.1.0" + commander "^12.1.0" deepmerge "^4.3.1" dotenv "^16.4.1" find-object-paths "^1.1.0" gray-matter "^4.0.3" - ipfs-only-hash "^4.0.0" + ipfs-unixfs-importer "^15.3.1" json-bigint "^1.0.0" - object-hash "^3.0.0" - viem "^2.17.11" + viem "^2.21.32" zod "^3.23.8" -"@bgd-labs/aave-v3-governance-cache@^1.0.6": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@bgd-labs/aave-v3-governance-cache/-/aave-v3-governance-cache-1.0.6.tgz#a56268e5e759b84d3691c8b23f23743170d04468" - integrity sha512-FpWMBxt18c8pk+10gvWtHBuXhb1uVYF63PgIs6CY4WMSEs/42KCmGYJSamCNYR9nEEX4PVqjPViu3zBoqZOgCQ== +"@bgd-labs/aave-v3-governance-cache@^1.0.8": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@bgd-labs/aave-v3-governance-cache/-/aave-v3-governance-cache-1.0.8.tgz#7458d11ab87d0e08393220bf85847072911a35bc" + integrity sha512-niaJafgxLQcuzZ13Wo1rO5tJ8f5pE5AdWs+5/PoHMrk5Z+bm5kE59oHbIO2xpg1pCQ7IZmsxXEIIlC2c0+v/Jg== "@bgd-labs/js-utils@^1.4.2": version "1.4.2" - resolved "https://registry.yarnpkg.com/@bgd-labs/js-utils/-/js-utils-1.4.2.tgz#dd6d954fdda153d76cbcabaeff9b7e8adcf528b1" + resolved "https://registry.npmjs.org/@bgd-labs/js-utils/-/js-utils-1.4.2.tgz" integrity sha512-hKiorNIyEApdH1w7laYQ+sGkrCGZTem9kD5Ud7YP/ZKtkoPx12FcTAp+P+JZ42BerPEqzGLZMDRJDB2ZGKeAJw== dependencies: "@supercharge/promise-pool" "^3.1.1" @@ -89,26 +67,28 @@ gray-matter "^4.0.3" tsx "^4.7.1" +"@chainsafe/is-ip@^2.0.1": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@chainsafe/is-ip/-/is-ip-2.0.2.tgz#7311e7403f11d8c5cfa48111f56fcecaac37c9f6" + integrity sha512-ndGqEMG1W5WkGagaqOZHpPU172AGdxr+LD15sv3WIUvT5oCFUrG1Y0CW/v2Egwj4JXEvSibaIIIqImsm98y1nA== + +"@chainsafe/netmask@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@chainsafe/netmask/-/netmask-2.0.0.tgz#0d4a75f47919f65011da4327a3845c9661f1038a" + integrity sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg== + dependencies: + "@chainsafe/is-ip" "^2.0.1" + "@commander-js/extra-typings@^11.1.0": version "11.1.0" resolved "https://registry.npmjs.org/@commander-js/extra-typings/-/extra-typings-11.1.0.tgz" integrity sha512-GuvZ38d23H+7Tz2C9DhzCepivsOsky03s5NI+KCy7ke1FNUvsJ2oO47scQ9YaGGhgjgNW5OYYNSADmbjcSoIhw== -"@esbuild/aix-ppc64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz#2acd20be6d4f0458bc8c784103495ff24f13b1d3" - integrity sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g== - "@esbuild/aix-ppc64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== -"@esbuild/android-arm64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz#b45d000017385c9051a4f03e17078abb935be220" - integrity sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q== - "@esbuild/android-arm64@0.19.9": version "0.19.9" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.9.tgz#683794bdc3d27222d3eced7b74cad15979548031" @@ -119,11 +99,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== -"@esbuild/android-arm@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.11.tgz#f46f55414e1c3614ac682b29977792131238164c" - integrity sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw== - "@esbuild/android-arm@0.19.9": version "0.19.9" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.9.tgz#21a4de41f07b2af47401c601d64dfdefd056c595" @@ -134,11 +109,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== -"@esbuild/android-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.11.tgz#bfc01e91740b82011ef503c48f548950824922b2" - integrity sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg== - "@esbuild/android-x64@0.19.9": version "0.19.9" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.9.tgz#e2d7674bc025ddc8699f0cc76cb97823bb63c252" @@ -149,26 +119,16 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== -"@esbuild/darwin-arm64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz#533fb7f5a08c37121d82c66198263dcc1bed29bf" - integrity sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ== - "@esbuild/darwin-arm64@0.19.9": version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.9.tgz#ae7a582289cc5c0bac15d4b9020a90cb7288f1e9" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.9.tgz" integrity sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw== "@esbuild/darwin-arm64@0.21.5": version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz" integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== -"@esbuild/darwin-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz#62f3819eff7e4ddc656b7c6815a31cf9a1e7d98e" - integrity sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g== - "@esbuild/darwin-x64@0.19.9": version "0.19.9" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.9.tgz#8a216c66dcf51addeeb843d8cfaeff712821d12b" @@ -179,11 +139,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== -"@esbuild/freebsd-arm64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz#d478b4195aa3ca44160272dab85ef8baf4175b4a" - integrity sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA== - "@esbuild/freebsd-arm64@0.19.9": version "0.19.9" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.9.tgz#63d4f603e421252c3cd836b18d01545be7c6c440" @@ -194,11 +149,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== -"@esbuild/freebsd-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz#7bdcc1917409178257ca6a1a27fe06e797ec18a2" - integrity sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw== - "@esbuild/freebsd-x64@0.19.9": version "0.19.9" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.9.tgz#a3db52595be65360eae4de1d1fa3c1afd942e1e4" @@ -209,11 +159,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== -"@esbuild/linux-arm64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz#58ad4ff11685fcc735d7ff4ca759ab18fcfe4545" - integrity sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg== - "@esbuild/linux-arm64@0.19.9": version "0.19.9" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.9.tgz#4ae5811ce9f8d7df5eb9edd9765ea9401a534f13" @@ -224,11 +169,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== -"@esbuild/linux-arm@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz#ce82246d873b5534d34de1e5c1b33026f35e60e3" - integrity sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q== - "@esbuild/linux-arm@0.19.9": version "0.19.9" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.9.tgz#9807e92cfd335f46326394805ad488e646e506f2" @@ -239,11 +179,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== -"@esbuild/linux-ia32@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz#cbae1f313209affc74b80f4390c4c35c6ab83fa4" - integrity sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA== - "@esbuild/linux-ia32@0.19.9": version "0.19.9" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.9.tgz#18892c10f3106652b16f9da88a0362dc95ed46c7" @@ -254,11 +189,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== -"@esbuild/linux-loong64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz#5f32aead1c3ec8f4cccdb7ed08b166224d4e9121" - integrity sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg== - "@esbuild/linux-loong64@0.19.9": version "0.19.9" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.9.tgz#dc2ebf9a125db0a1bba18c2bbfd4fbdcbcaf61c2" @@ -269,11 +199,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== -"@esbuild/linux-mips64el@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz#38eecf1cbb8c36a616261de858b3c10d03419af9" - integrity sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg== - "@esbuild/linux-mips64el@0.19.9": version "0.19.9" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.9.tgz#4c2f7c5d901015e3faf1563c4a89a50776cb07fd" @@ -284,11 +209,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== -"@esbuild/linux-ppc64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz#9c5725a94e6ec15b93195e5a6afb821628afd912" - integrity sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA== - "@esbuild/linux-ppc64@0.19.9": version "0.19.9" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.9.tgz#8385332713b4e7812869622163784a5633f76fc4" @@ -299,11 +219,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== -"@esbuild/linux-riscv64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz#2dc4486d474a2a62bbe5870522a9a600e2acb916" - integrity sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ== - "@esbuild/linux-riscv64@0.19.9": version "0.19.9" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.9.tgz#23f1db24fa761be311874f32036c06249aa20cba" @@ -314,11 +229,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== -"@esbuild/linux-s390x@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz#4ad8567df48f7dd4c71ec5b1753b6f37561a65a8" - integrity sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q== - "@esbuild/linux-s390x@0.19.9": version "0.19.9" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.9.tgz#2dffe497726b897c9f0109e774006e25b33b4fd0" @@ -329,14 +239,9 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== -"@esbuild/linux-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz#b7390c4d5184f203ebe7ddaedf073df82a658766" - integrity sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA== - "@esbuild/linux-x64@0.19.9": version "0.19.9" - resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.9.tgz" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.9.tgz#ceb1d62cd830724ff5b218e5d3172a8bad59420e" integrity sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A== "@esbuild/linux-x64@0.21.5": @@ -344,11 +249,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== -"@esbuild/netbsd-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz#d633c09492a1721377f3bccedb2d821b911e813d" - integrity sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ== - "@esbuild/netbsd-x64@0.19.9": version "0.19.9" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.9.tgz#0cbca65e9ef4d3fc41502d3e055e6f49479a8f18" @@ -359,11 +259,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== -"@esbuild/openbsd-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz#17388c76e2f01125bf831a68c03a7ffccb65d1a2" - integrity sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw== - "@esbuild/openbsd-x64@0.19.9": version "0.19.9" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.9.tgz#1f57adfbee09c743292c6758a3642e875bcad1cf" @@ -374,11 +269,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== -"@esbuild/sunos-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz#e320636f00bb9f4fdf3a80e548cb743370d41767" - integrity sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ== - "@esbuild/sunos-x64@0.19.9": version "0.19.9" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.9.tgz#116be6adbd2c7479edeeb5f6ea0441002ab4cb9c" @@ -389,11 +279,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== -"@esbuild/win32-arm64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz#c778b45a496e90b6fc373e2a2bb072f1441fe0ee" - integrity sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ== - "@esbuild/win32-arm64@0.19.9": version "0.19.9" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.9.tgz#2be22131ab18af4693fd737b161d1ef34de8ca9d" @@ -404,11 +289,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== -"@esbuild/win32-ia32@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz#481a65fee2e5cce74ec44823e6b09ecedcc5194c" - integrity sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg== - "@esbuild/win32-ia32@0.19.9": version "0.19.9" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.9.tgz#e10ead5a55789b167b4225d2469324538768af7c" @@ -419,11 +299,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== -"@esbuild/win32-x64@0.19.11": - version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz#a5d300008960bb39677c46bf16f53ec70d8dee04" - integrity sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw== - "@esbuild/win32-x64@0.19.9": version "0.19.9" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.9.tgz#b2da6219b603e3fa371a78f53f5361260d0c5585" @@ -447,7 +322,7 @@ "@inquirer/checkbox@^1.5.2": version "1.5.2" - resolved "https://registry.yarnpkg.com/@inquirer/checkbox/-/checkbox-1.5.2.tgz#043ca370ebbc0b92691c2309bc12e8716ed701c4" + resolved "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-1.5.2.tgz" integrity sha512-CifrkgQjDkUkWexmgYYNyB5603HhTHI91vLFeQXh6qrTKiCMVASol01Rs1cv6LP/A2WccZSRlJKZhbaBIs/9ZA== dependencies: "@inquirer/core" "^6.0.0" @@ -467,7 +342,7 @@ "@inquirer/confirm@^2.0.17": version "2.0.17" - resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-2.0.17.tgz#a45eb1b973c51c993a3c093a0114e960b1cf09a4" + resolved "https://registry.npmjs.org/@inquirer/confirm/-/confirm-2.0.17.tgz" integrity sha512-EqzhGryzmGpy2aJf6LxJVhndxYmFs+m8cxXzf8nejb1DE3sabf6mUgBcp4J0jAUEiAcYzqmkqRr7LPFh/WdnXA== dependencies: "@inquirer/core" "^6.0.0" @@ -496,7 +371,7 @@ "@inquirer/core@^6.0.0": version "6.0.0" - resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-6.0.0.tgz#d44ccd8ae09a4879a78f09cca35bf1ab894b95f4" + resolved "https://registry.npmjs.org/@inquirer/core/-/core-6.0.0.tgz" integrity sha512-fKi63Khkisgda3ohnskNf5uZJj+zXOaBvOllHsOkdsXRA/ubQLJQrZchFFi57NKbZzkTunXiBMdvWOv71alonw== dependencies: "@inquirer/type" "^1.1.6" @@ -526,7 +401,7 @@ "@inquirer/editor@^1.2.15": version "1.2.15" - resolved "https://registry.yarnpkg.com/@inquirer/editor/-/editor-1.2.15.tgz#28de2dabbcf1e07a37149320093798e3f4856f91" + resolved "https://registry.npmjs.org/@inquirer/editor/-/editor-1.2.15.tgz" integrity sha512-gQ77Ls09x5vKLVNMH9q/7xvYPT6sIs5f7URksw+a2iJZ0j48tVS6crLqm2ugG33tgXHIwiEqkytY60Zyh5GkJQ== dependencies: "@inquirer/core" "^6.0.0" @@ -546,7 +421,7 @@ "@inquirer/expand@^1.1.16": version "1.1.16" - resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-1.1.16.tgz#63dce81240e5f7b2b1d7942b3e3cae18f4f03d07" + resolved "https://registry.npmjs.org/@inquirer/expand/-/expand-1.1.16.tgz" integrity sha512-TGLU9egcuo+s7PxphKUCnJnpCIVY32/EwPCLLuu+gTvYiD8hZgx8Z2niNQD36sa6xcfpdLY6xXDBiL/+g1r2XQ== dependencies: "@inquirer/core" "^6.0.0" @@ -565,7 +440,7 @@ "@inquirer/input@^1.2.16": version "1.2.16" - resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-1.2.16.tgz#94d8765a47689e799fd55ed0361dedc8f554341b" + resolved "https://registry.npmjs.org/@inquirer/input/-/input-1.2.16.tgz" integrity sha512-Ou0LaSWvj1ni+egnyQ+NBtfM1885UwhRCMtsRt2bBO47DoC1dwtCa+ZUNgrxlnCHHF0IXsbQHYtIIjFGAavI4g== dependencies: "@inquirer/core" "^6.0.0" @@ -584,7 +459,7 @@ "@inquirer/password@^1.1.16": version "1.1.16" - resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-1.1.16.tgz#37ddebbe37c6e76f8ad27d1f726aacdd7c423558" + resolved "https://registry.npmjs.org/@inquirer/password/-/password-1.1.16.tgz" integrity sha512-aZYZVHLUXZ2gbBot+i+zOJrks1WaiI95lvZCn1sKfcw6MtSSlYC8uDX8sTzQvAsQ8epHoP84UNvAIT0KVGOGqw== dependencies: "@inquirer/core" "^6.0.0" @@ -609,7 +484,7 @@ "@inquirer/prompts@^3.3.2": version "3.3.2" - resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-3.3.2.tgz#0c3a44bbf7e560439590f2fcb769cd8392b0f555" + resolved "https://registry.npmjs.org/@inquirer/prompts/-/prompts-3.3.2.tgz" integrity sha512-k52mOMRvTUejrqyF1h8Z07chC+sbaoaUYzzr1KrJXyj7yaX7Nrh0a9vktv8TuocRwIJOQMaj5oZEmkspEcJFYQ== dependencies: "@inquirer/checkbox" "^1.5.2" @@ -633,7 +508,7 @@ "@inquirer/rawlist@^1.2.16": version "1.2.16" - resolved "https://registry.yarnpkg.com/@inquirer/rawlist/-/rawlist-1.2.16.tgz#ac6cc0bb2a60d51dccdfe2c3ea624185f1fbd5bc" + resolved "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-1.2.16.tgz" integrity sha512-pZ6TRg2qMwZAOZAV6TvghCtkr53dGnK29GMNQ3vMZXSNguvGqtOVc4j/h1T8kqGJFagjyfBZhUPGwNS55O5qPQ== dependencies: "@inquirer/core" "^6.0.0" @@ -653,7 +528,7 @@ "@inquirer/select@^1.3.3": version "1.3.3" - resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-1.3.3.tgz#7d832ee603c15b706148e47cda29cdf6634cd94b" + resolved "https://registry.npmjs.org/@inquirer/select/-/select-1.3.3.tgz" integrity sha512-RzlRISXWqIKEf83FDC9ZtJ3JvuK1l7aGpretf41BCWYrvla2wU8W8MTRNMiPrPJ+1SIqrRC1nZdZ60hD9hRXLg== dependencies: "@inquirer/core" "^6.0.0" @@ -664,7 +539,7 @@ "@inquirer/testing@^2.1.13": version "2.1.13" - resolved "https://registry.yarnpkg.com/@inquirer/testing/-/testing-2.1.13.tgz#e5f0bb263263e1537c5727415eb11e0194ab77f2" + resolved "https://registry.npmjs.org/@inquirer/testing/-/testing-2.1.13.tgz" integrity sha512-q0r3k9Gog9RJYkcsBzi4DLN9ZKApxLKddAbdRBTITOdmTiTqiTnFHgvWsXdSd+1xkRk5F/7rgiJgo0hW4xLaPQ== dependencies: "@inquirer/type" "^1.2.1" @@ -681,17 +556,24 @@ "@inquirer/type@^1.1.6": version "1.1.6" - resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-1.1.6.tgz#f2656456e58fb93c7b73d5aad583b928c77b9206" + resolved "https://registry.npmjs.org/@inquirer/type/-/type-1.1.6.tgz" integrity sha512-OCKOpn0CrFDslR8s3who7hlr823zXTb1iShGCaaWgEJFfkIV0T9aLZV2QGnOuU78IrsPYLkr3oKx9dZwwCH3Rw== "@inquirer/type@^1.2.1": version "1.2.1" - resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-1.2.1.tgz#fbc7ab3a2e5050d0c150642d5e8f5e88faa066b8" + resolved "https://registry.npmjs.org/@inquirer/type/-/type-1.2.1.tgz" integrity sha512-xwMfkPAxeo8Ji/IxfUSqzRi0/+F2GIqJmpc5/thelgMGsjNZcjDDRBO9TLXT1s/hdx/mK5QbVIvgoLIFgXhTMQ== +"@ipld/dag-pb@^4.1.2": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@ipld/dag-pb/-/dag-pb-4.1.3.tgz#b572d7978fa548a3a9219f566a80884189261858" + integrity sha512-ueULCaaSCcD+dQga6nKiRr+RSeVgdiYiEPKVUu5iQMNYDN+9osd0KpR3UDd9uQQ+6RWuv9L34SchfEwj7YIbOA== + dependencies: + multiformats "^13.1.0" + "@jridgewell/gen-mapping@^0.3.5": version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz" integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: "@jridgewell/set-array" "^1.2.1" @@ -700,103 +582,99 @@ "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/set-array@^1.2.1": version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== "@jridgewell/trace-mapping@^0.3.24": version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@multiformats/base-x@^4.0.1": - version "4.0.1" - resolved "https://registry.npmjs.org/@multiformats/base-x/-/base-x-4.0.1.tgz" - integrity sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw== +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" + integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== -"@noble/curves@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.0.tgz#f05771ef64da724997f69ee1261b2417a49522d6" - integrity sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg== - dependencies: - "@noble/hashes" "1.4.0" - -"@noble/curves@^1.4.0", "@noble/curves@~1.4.0": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.2.tgz#40309198c76ed71bc6dbf7ba24e81ceb4d0d1fe9" - integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== +"@libp2p/interface@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@libp2p/interface/-/interface-2.2.0.tgz#8718c29a0cf8c82b00d2ff9b140bcec9185578a2" + integrity sha512-Pn3P5ixDggBjDyuULT0GvwdgD3JA426OqZ0e521mI7ysS+/M9Z9fp4Qcy8JrkJ45bLmIi9cgrNrefuU/Zu+bAQ== + dependencies: + "@multiformats/multiaddr" "^12.2.3" + it-pushable "^3.2.3" + it-stream-types "^2.0.1" + multiformats "^13.1.0" + progress-events "^1.0.0" + uint8arraylist "^2.4.8" + +"@libp2p/logger@^5.0.1": + version "5.1.3" + resolved "https://registry.yarnpkg.com/@libp2p/logger/-/logger-5.1.3.tgz#fca69a5de0b3a80cfc1ec039bb76f30e9e26eab7" + integrity sha512-NUVWEWGbXlBDgDE5ntdm51+ZICmaKYI8mor6KrlPeB1WXDyIFxRWIBw6uzt+HgprQJWzLTojeUEGv6OPsj95Dg== + dependencies: + "@libp2p/interface" "^2.2.0" + "@multiformats/multiaddr" "^12.2.3" + interface-datastore "^8.3.0" + multiformats "^13.1.0" + weald "^1.0.2" + +"@multiformats/dns@^1.0.3": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@multiformats/dns/-/dns-1.0.6.tgz#b8c7de11459a02a5f4e609d35d3cdb95cb6ad152" + integrity sha512-nt/5UqjMPtyvkG9BQYdJ4GfLK3nMqGpFZOzf4hAmIa0sJh2LlS9YKXZ4FgwBDsaHvzZqR/rUFIywIc7pkHNNuw== dependencies: - "@noble/hashes" "1.4.0" - -"@noble/hashes@1.4.0", "@noble/hashes@^1.4.0", "@noble/hashes@~1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" - integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== - -"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz" - integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== - -"@protobufjs/base64@^1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz" - integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== - -"@protobufjs/codegen@^2.0.4": - version "2.0.4" - resolved "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz" - integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== - -"@protobufjs/eventemitter@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz" - integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== + "@types/dns-packet" "^5.6.5" + buffer "^6.0.3" + dns-packet "^5.6.1" + hashlru "^2.3.0" + p-queue "^8.0.1" + progress-events "^1.0.0" + uint8arrays "^5.0.2" + +"@multiformats/multiaddr@^12.2.3": + version "12.3.1" + resolved "https://registry.yarnpkg.com/@multiformats/multiaddr/-/multiaddr-12.3.1.tgz#953ceb4ae3b39125b7b2c721230ea7b398cf49fe" + integrity sha512-yoGODQY4nIj41ENJClucS8FtBoe8w682bzbKldEQr9lSlfdHqAsRC+vpJAOBpiMwPps1tHua4kxrDmvprdhoDQ== + dependencies: + "@chainsafe/is-ip" "^2.0.1" + "@chainsafe/netmask" "^2.0.0" + "@multiformats/dns" "^1.0.3" + multiformats "^13.0.0" + uint8-varint "^2.0.1" + uint8arrays "^5.0.0" + +"@multiformats/murmur3@^2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@multiformats/murmur3/-/murmur3-2.1.8.tgz#81c1c15b6391109f3febfca4b3205196615a04e9" + integrity sha512-6vId1C46ra3R1sbJUOFCZnsUIveR9oF20yhPmAFxPm0JfrX3/ZRCgP3YDrBzlGoEppOXnA9czHeYc0T9mB6hbA== + dependencies: + multiformats "^13.0.0" + murmurhash3js-revisited "^3.0.0" -"@protobufjs/fetch@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz" - integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== +"@noble/curves@1.6.0", "@noble/curves@^1.4.0", "@noble/curves@^1.6.0", "@noble/curves@~1.6.0": + version "1.6.0" + resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.6.0.tgz" + integrity sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ== dependencies: - "@protobufjs/aspromise" "^1.1.1" - "@protobufjs/inquire" "^1.1.0" - -"@protobufjs/float@^1.0.2": - version "1.0.2" - resolved "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz" - integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== - -"@protobufjs/inquire@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz" - integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== + "@noble/hashes" "1.5.0" -"@protobufjs/path@^1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz" - integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== - -"@protobufjs/pool@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz" - integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== - -"@protobufjs/utf8@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz" - integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== +"@noble/hashes@1.5.0", "@noble/hashes@^1.4.0", "@noble/hashes@^1.5.0", "@noble/hashes@~1.5.0": + version "1.5.0" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz" + integrity sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA== "@rollup/rollup-android-arm-eabi@4.9.0": version "4.9.0" @@ -810,7 +688,7 @@ "@rollup/rollup-darwin-arm64@4.9.0": version "4.9.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.0.tgz#6f3fdf5712db6b5e3d8f62a86a09cd659dd871f9" + resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.0.tgz" integrity sha512-u7aTMskN6Dmg1lCT0QJ+tINRt+ntUrvVkhbPfFz4bCwRZvjItx2nJtwJnJRlKMMaQCHRjrNqHRDYvE4mBm3DlQ== "@rollup/rollup-darwin-x64@4.9.0": @@ -840,12 +718,12 @@ "@rollup/rollup-linux-x64-gnu@4.9.0": version "4.9.0" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.0.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.0.tgz#ece153613f0cf2c864dbfc2076c579da8abd51a9" integrity sha512-m6pkSwcZZD2LCFHZX/zW2aLIISyzWLU3hrLLzQKMI12+OLEzgruTovAxY5sCZJkipklaZqPy/2bEEBNjp+Y7xg== "@rollup/rollup-linux-x64-musl@4.9.0": version "4.9.0" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.0.tgz" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.0.tgz#2d2dbdf5fbf2c19d1f3d31b8a7850b57f5799037" integrity sha512-VFAC1RDRSbU3iOF98X42KaVicAfKf0m0OvIu8dbnqhTe26Kh6Ym9JrDulz7Hbk7/9zGc41JkV02g+p3BivOdAg== "@rollup/rollup-win32-arm64-msvc@4.9.0": @@ -863,53 +741,50 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.0.tgz#4ea610e0c40a07a8afa2977cbf80507f41c2271c" integrity sha512-aPP5Q5AqNGuT0tnuEkK/g4mnt3ZhheiXrDIiSVIHN9mcN21OyXDVbEMqmXPE7e2OplNLDkcvV+ZoGJa2ZImFgw== -"@scure/base@~1.1.6": - version "1.1.7" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.7.tgz#fe973311a5c6267846aa131bc72e96c5d40d2b30" - integrity sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g== +"@scure/base@~1.1.7", "@scure/base@~1.1.8": + version "1.1.9" + resolved "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz" + integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== -"@scure/bip32@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.4.0.tgz#4e1f1e196abedcef395b33b9674a042524e20d67" - integrity sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg== +"@scure/bip32@1.5.0", "@scure/bip32@^1.5.0": + version "1.5.0" + resolved "https://registry.npmjs.org/@scure/bip32/-/bip32-1.5.0.tgz" + integrity sha512-8EnFYkqEQdnkuGBVpCzKxyIwDCBLDVj3oiX0EKUFre/tOjL/Hqba1D6n/8RcmaQy4f95qQFrO2A8Sr6ybh4NRw== dependencies: - "@noble/curves" "~1.4.0" - "@noble/hashes" "~1.4.0" - "@scure/base" "~1.1.6" + "@noble/curves" "~1.6.0" + "@noble/hashes" "~1.5.0" + "@scure/base" "~1.1.7" -"@scure/bip39@1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.3.0.tgz#0f258c16823ddd00739461ac31398b4e7d6a18c3" - integrity sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ== +"@scure/bip39@1.4.0", "@scure/bip39@^1.4.0": + version "1.4.0" + resolved "https://registry.npmjs.org/@scure/bip39/-/bip39-1.4.0.tgz" + integrity sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw== dependencies: - "@noble/hashes" "~1.4.0" - "@scure/base" "~1.1.6" + "@noble/hashes" "~1.5.0" + "@scure/base" "~1.1.8" "@solidity-parser/parser@^0.17.0": version "0.17.0" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.17.0.tgz#52a2fcc97ff609f72011014e4c5b485ec52243ef" + resolved "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.17.0.tgz" integrity sha512-Nko8R0/kUo391jsEHHxrGM07QFdnPGvlmox4rmH0kNiNAashItAilhy4Mv4pK5gQmW5f4sXAF58fwJbmlkGcVw== "@supercharge/promise-pool@^3.1.1": version "3.1.1" - resolved "https://registry.yarnpkg.com/@supercharge/promise-pool/-/promise-pool-3.1.1.tgz#237d4e151b8591e2ff4f0ae388f7d6b4741bacc0" + resolved "https://registry.npmjs.org/@supercharge/promise-pool/-/promise-pool-3.1.1.tgz" integrity sha512-TgCm6jVqMPv+OgD5uBNND/CkCwNDdXPQlcprtnXsWSBpTCy0q5CI6vRj+jsUiXE1xeRaKIX4UeaYJqzZBL92sg== +"@types/dns-packet@^5.6.5": + version "5.6.5" + resolved "https://registry.yarnpkg.com/@types/dns-packet/-/dns-packet-5.6.5.tgz#49fc29a40f5d30227ed028fa1ee82601d3745e15" + integrity sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q== + dependencies: + "@types/node" "*" + "@types/estree@^1.0.0": version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== -"@types/long@^4.0.1": - version "4.0.2" - resolved "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz" - integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== - -"@types/minimist@^1.2.0": - version "1.2.3" - resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.3.tgz" - integrity sha512-ZYFzrvyWUNhaPomn80dsMNgMeXxNWZBdkuG/hWlUvXvbdUH8ZERNBGXnU87McuGcWDsyzX2aChCv/SVN348k3A== - "@types/mute-stream@^0.0.4": version "0.0.4" resolved "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz" @@ -917,39 +792,20 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@>=13.7.0": - version "20.8.4" - resolved "https://registry.npmjs.org/@types/node/-/node-20.8.4.tgz" - integrity sha512-ZVPnqU58giiCjSxjVUESDtdPk4QR5WQhhINbc9UBrKLU68MX5BF6kbQzTrkwbolyr0X8ChBpXfavr5mZFKZQ5A== - dependencies: - undici-types "~5.25.1" - -"@types/node@^20.10.7", "@types/node@^20.11.10": +"@types/node@*", "@types/node@^20.10.7", "@types/node@^20.11.10", "@types/node@^20.9.0": version "20.11.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.10.tgz#6c3de8974d65c362f82ee29db6b5adf4205462f9" + resolved "https://registry.npmjs.org/@types/node/-/node-20.11.10.tgz" integrity sha512-rZEfe/hJSGYmdfX9tvcPMYeYPW2sNl50nsw4jZmRcaG0HIAb0WYEpsB05GOb53vjqpyE9GUhlDQ4jLSoB5q9kg== dependencies: undici-types "~5.26.4" "@types/node@^20.11.26": version "20.11.30" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.30.tgz#9c33467fc23167a347e73834f788f4b9f399d66f" + resolved "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz" integrity sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw== dependencies: undici-types "~5.26.4" -"@types/node@^20.9.0": - version "20.9.0" - resolved "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz" - integrity sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw== - dependencies: - undici-types "~5.26.4" - -"@types/normalize-package-data@^2.4.0": - version "2.4.2" - resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.2.tgz" - integrity sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A== - "@types/wrap-ansi@^3.0.0": version "3.0.0" resolved "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz" @@ -957,7 +813,7 @@ "@vitest/expect@2.0.4": version "2.0.4" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-2.0.4.tgz#d365c106c84f2a3aae96000e95be21956acc099c" + resolved "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.4.tgz" integrity sha512-39jr5EguIoanChvBqe34I8m1hJFI4+jxvdOpD7gslZrVQBKhh8H9eD7J/LJX4zakrw23W+dITQTDqdt43xVcJw== dependencies: "@vitest/spy" "2.0.4" @@ -967,14 +823,14 @@ "@vitest/pretty-format@2.0.4", "@vitest/pretty-format@^2.0.4": version "2.0.4" - resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.0.4.tgz#9a3934932e7f8ddd836b38c34ddaeec91bd0f82e" + resolved "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.4.tgz" integrity sha512-RYZl31STbNGqf4l2eQM1nvKPXE0NhC6Eq0suTTePc4mtMQ1Fn8qZmjV4emZdEdG2NOWGKSCrHZjmTqDCDoeFBw== dependencies: tinyrainbow "^1.2.0" "@vitest/runner@2.0.4": version "2.0.4" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-2.0.4.tgz#0b1edb8ab5f81a1c7dfd50090e5e7e971a117891" + resolved "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.4.tgz" integrity sha512-Gk+9Su/2H2zNfNdeJR124gZckd5st4YoSuhF1Rebi37qTXKnqYyFCd9KP4vl2cQHbtuVKjfEKrNJxHHCW8thbQ== dependencies: "@vitest/utils" "2.0.4" @@ -982,7 +838,7 @@ "@vitest/snapshot@2.0.4": version "2.0.4" - resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-2.0.4.tgz#7d7dea9df17c5c13386f1a7a433b99dc0ffe3c14" + resolved "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.4.tgz" integrity sha512-or6Mzoz/pD7xTvuJMFYEtso1vJo1S5u6zBTinfl+7smGUhqybn6VjzCDMhmTyVOFWwkCMuNjmNNxnyXPgKDoPw== dependencies: "@vitest/pretty-format" "2.0.4" @@ -991,14 +847,14 @@ "@vitest/spy@2.0.4": version "2.0.4" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-2.0.4.tgz#19083386a741a158c2f142beffe43be68b1375cf" + resolved "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.4.tgz" integrity sha512-uTXU56TNoYrTohb+6CseP8IqNwlNdtPwEO0AWl+5j7NelS6x0xZZtP0bDWaLvOfUbaYwhhWp1guzXUxkC7mW7Q== dependencies: tinyspy "^3.0.0" "@vitest/utils@2.0.4": version "2.0.4" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.0.4.tgz#2db1df35aaeb5caa932770a190df636a68d284d5" + resolved "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.4.tgz" integrity sha512-Zc75QuuoJhOBnlo99ZVUkJIuq4Oj0zAkrQ2VzCqNCx6wAwViHEh5Fnp4fiJTE9rA+sAoXRf00Z9xGgfEzV6fzQ== dependencies: "@vitest/pretty-format" "2.0.4" @@ -1006,10 +862,10 @@ loupe "^3.1.1" tinyrainbow "^1.2.0" -abitype@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.5.tgz#29d0daa3eea867ca90f7e4123144c1d1270774b6" - integrity sha512-YzDhti7cjlfaBhHutMaboYB21Ha3rXR9QTkNJFzYC4kC8YclaiwPBBBJY8ejFdu2wnJeZCVZSMlQJ7fi8S6hsw== +abitype@1.0.6, abitype@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/abitype/-/abitype-1.0.6.tgz" + integrity sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A== ansi-escapes@^4.3.2: version "4.3.2" @@ -1020,7 +876,7 @@ ansi-escapes@^4.3.2: ansi-escapes@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.0.0.tgz#00fc19f491bbb18e1d481b97868204f92109bfe7" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz" integrity sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw== dependencies: environment "^1.0.0" @@ -1035,13 +891,6 @@ ansi-regex@^6.0.1: resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" @@ -1061,14 +910,9 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" - integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== - assertion-error@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" + resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz" integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== base-x@^4.0.0: @@ -1095,14 +939,23 @@ bl@^5.0.0: inherits "^2.0.4" readable-stream "^3.4.0" -blakejs@^1.1.0: - version "1.2.1" - resolved "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz" - integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== +blockstore-core@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/blockstore-core/-/blockstore-core-5.0.2.tgz#c29e00bdbae121d31b5fed50e64afa549237ec9a" + integrity sha512-y7/BHdYLO3YCpJMg6Ue7b4Oz4FT1HWSZoHHdlsaJTsvoE8XieXb6kUCB9UkkUBDw2x4neRDwlgYBpyK77+Ro2Q== + dependencies: + "@libp2p/logger" "^5.0.1" + interface-blockstore "^5.0.0" + interface-store "^6.0.0" + it-drain "^3.0.7" + it-filter "^3.1.1" + it-merge "^3.0.5" + it-pushable "^3.2.3" + multiformats "^13.2.3" braces@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: fill-range "^7.1.1" @@ -1127,28 +980,14 @@ cac@^6.7.14: resolved "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz" integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== -camelcase-keys@^6.2.2: - version "6.2.2" - resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz" - integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== - dependencies: - camelcase "^5.3.1" - map-obj "^4.0.0" - quick-lru "^4.0.1" - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - catapulta-verify@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/catapulta-verify/-/catapulta-verify-1.1.1.tgz#46ac6c9ed50480ef982060147f4ff4a34609efd0" + resolved "https://registry.npmjs.org/catapulta-verify/-/catapulta-verify-1.1.1.tgz" integrity sha512-VZ9pQpno1bjjZ/+7d1AbPWkOhYcZdNSova5Y1L9jj8ftdimv3JrwDTg9i0fs4I8/A/sRXK7AUb1pmL3016Cykw== chai@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/chai/-/chai-5.1.1.tgz#f035d9792a22b481ead1c65908d14bb62ec1c82c" + resolved "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz" integrity sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA== dependencies: assertion-error "^2.0.1" @@ -1157,15 +996,6 @@ chai@^5.1.1: loupe "^3.1.0" pathval "^2.0.0" -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - chalk@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" @@ -1176,7 +1006,7 @@ chalk@^4.1.2: chalk@~5.3.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + resolved "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz" integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== chardet@^0.7.0: @@ -1186,34 +1016,19 @@ chardet@^0.7.0: check-error@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" + resolved "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz" integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== -cids@^1.0.0, cids@^1.1.5, cids@^1.1.6: - version "1.1.9" - resolved "https://registry.npmjs.org/cids/-/cids-1.1.9.tgz" - integrity sha512-l11hWRfugIcbGuTZwAM5PwpjPPjyb6UZOGwlHSnOBV5o07XhQ4gNpBN67FbODvpjyHtd+0Xs6KNvUcGBiDRsdg== - dependencies: - multibase "^4.0.1" - multicodec "^3.0.1" - multihashes "^4.0.1" - uint8arrays "^3.0.0" - cli-cursor@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-5.0.0.tgz#24a4831ecf5a6b01ddeb32fb71a4b2088b0dce38" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz" integrity sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw== dependencies: restore-cursor "^5.0.0" -cli-spinners@^2.9.1: - version "2.9.1" - resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.1.tgz" - integrity sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ== - -cli-spinners@^2.9.2: +cli-spinners@^2.9.1, cli-spinners@^2.9.2: version "2.9.2" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz" integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== cli-truncate@^4.0.0: @@ -1229,13 +1044,6 @@ cli-width@^4.1.0: resolved "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz" integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - color-convert@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" @@ -1243,11 +1051,6 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" @@ -1258,14 +1061,9 @@ colorette@^2.0.20: resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== -commander@^11.1.0: - version "11.1.0" - resolved "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz" - integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== - commander@^12.1.0, commander@~12.1.0: version "12.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" + resolved "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz" integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== cross-spawn@^7.0.3: @@ -1277,36 +1075,16 @@ cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -debug@^4.3.1: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^4.3.5, debug@~4.3.4: +debug@^4.3.1, debug@^4.3.5, debug@~4.3.4: version "4.3.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz" integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== dependencies: ms "2.1.2" -decamelize-keys@^1.1.0: - version "1.1.1" - resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz" - integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.1.0, decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - deep-eql@^5.0.1: version "5.0.2" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" + resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz" integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== deepmerge@^4.3.1: @@ -1314,9 +1092,16 @@ deepmerge@^4.3.1: resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== +dns-packet@^5.6.1: + version "5.6.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" + integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + dotenv@^16.4.1: version "16.4.1" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.1.tgz#1d9931f1d3e5d2959350d1250efab299561f7f11" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.4.1.tgz" integrity sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ== emoji-regex@^10.3.0: @@ -1331,21 +1116,9 @@ emoji-regex@^8.0.0: environment@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1" + resolved "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz" integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== -err-code@^3.0.0, err-code@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz" - integrity sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - esbuild@^0.19.3: version "0.19.9" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.19.9.tgz" @@ -1374,38 +1147,9 @@ esbuild@^0.19.3: "@esbuild/win32-ia32" "0.19.9" "@esbuild/win32-x64" "0.19.9" -esbuild@~0.19.10: - version "0.19.11" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.11.tgz#4a02dca031e768b5556606e1b468fe72e3325d96" - integrity sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA== - optionalDependencies: - "@esbuild/aix-ppc64" "0.19.11" - "@esbuild/android-arm" "0.19.11" - "@esbuild/android-arm64" "0.19.11" - "@esbuild/android-x64" "0.19.11" - "@esbuild/darwin-arm64" "0.19.11" - "@esbuild/darwin-x64" "0.19.11" - "@esbuild/freebsd-arm64" "0.19.11" - "@esbuild/freebsd-x64" "0.19.11" - "@esbuild/linux-arm" "0.19.11" - "@esbuild/linux-arm64" "0.19.11" - "@esbuild/linux-ia32" "0.19.11" - "@esbuild/linux-loong64" "0.19.11" - "@esbuild/linux-mips64el" "0.19.11" - "@esbuild/linux-ppc64" "0.19.11" - "@esbuild/linux-riscv64" "0.19.11" - "@esbuild/linux-s390x" "0.19.11" - "@esbuild/linux-x64" "0.19.11" - "@esbuild/netbsd-x64" "0.19.11" - "@esbuild/openbsd-x64" "0.19.11" - "@esbuild/sunos-x64" "0.19.11" - "@esbuild/win32-arm64" "0.19.11" - "@esbuild/win32-ia32" "0.19.11" - "@esbuild/win32-x64" "0.19.11" - esbuild@~0.21.5: version "0.21.5" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz" integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== optionalDependencies: "@esbuild/aix-ppc64" "0.21.5" @@ -1444,19 +1188,19 @@ esprima@^4.0.0: estree-walker@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz" integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== dependencies: "@types/estree" "^1.0.0" -eventemitter3@^5.0.1: +eventemitter3@5.0.1, eventemitter3@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz" integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== execa@^8.0.1, execa@~8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + resolved "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz" integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== dependencies: cross-spawn "^7.0.3" @@ -1494,27 +1238,19 @@ figures@^3.2.0: fill-range@^7.1.1: version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" find-object-paths@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/find-object-paths/-/find-object-paths-1.1.0.tgz#2d2fe99f24c95e63af4b51377a1ba0510490376c" + resolved "https://registry.npmjs.org/find-object-paths/-/find-object-paths-1.1.0.tgz" integrity sha512-UJvfPQibLUOrXl76PJ49cYbXJPsU1lYX6Pw7mHVW+ahaGx6kVHiozNIQriDc/EOlSvkDa6L9GyTFXPYQsa6sGA== -find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== get-east-asian-width@^1.0.0: @@ -1532,16 +1268,9 @@ get-stream@^8.0.1: resolved "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz" integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== -get-tsconfig@^4.7.2: - version "4.7.2" - resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz" - integrity sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A== - dependencies: - resolve-pkg-maps "^1.0.0" - get-tsconfig@^4.7.5: version "4.7.6" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.6.tgz#118fd5b7b9bae234cc7705a00cd771d7eb65d62a" + resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz" integrity sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA== dependencies: resolve-pkg-maps "^1.0.0" @@ -1556,45 +1285,23 @@ gray-matter@^4.0.3: section-matter "^1.0.0" strip-bom-string "^1.0.0" -hamt-sharding@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/hamt-sharding/-/hamt-sharding-2.0.1.tgz" - integrity sha512-vnjrmdXG9dDs1m/H4iJ6z0JFI2NtgsW5keRkTcM85NGak69Mkf5PHUqBz+Xs0T4sg0ppvj9O5EGAJo40FTxmmA== +hamt-sharding@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/hamt-sharding/-/hamt-sharding-3.0.6.tgz#3643107a3021af66ac95684aec87b196add5ba57" + integrity sha512-nZeamxfymIWLpVcAN0CRrb7uVq3hCOGj9IcL6NMA6VVCVWqj+h9Jo/SmaWuS92AEDf1thmHsM5D5c70hM3j2Tg== dependencies: sparse-array "^1.3.1" - uint8arrays "^3.0.0" - -hard-rejection@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz" - integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + uint8arrays "^5.0.1" has-flag@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/has/-/has-1.0.4.tgz" - integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -hosted-git-info@^4.0.1: - version "4.1.0" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz" - integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== - dependencies: - lru-cache "^6.0.0" +hashlru@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/hashlru/-/hashlru-2.3.0.tgz#5dc15928b3f6961a2056416bb3a4910216fdfb51" + integrity sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A== human-signals@^5.0.0: version "5.0.0" @@ -1618,85 +1325,60 @@ ieee754@^1.2.1: resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -interface-ipld-format@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/interface-ipld-format/-/interface-ipld-format-1.0.1.tgz" - integrity sha512-WV/ar+KQJVoQpqRDYdo7YPGYIUHJxCuOEhdvsRpzLqoOIVCqPKdMMYmsLL1nCRsF3yYNio+PAJbCKiv6drrEAg== - dependencies: - cids "^1.1.6" - multicodec "^3.0.1" - multihashes "^4.0.2" - -ipfs-only-hash@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/ipfs-only-hash/-/ipfs-only-hash-4.0.0.tgz" - integrity sha512-TE1DZCvfw8i3gcsTq3P4TFx3cKFJ3sluu/J3XINkJhIN9OwJgNMqKA+WnKx6ByCb1IoPXsTp1KM7tupElb6SyA== - dependencies: - ipfs-unixfs-importer "^7.0.1" - meow "^9.0.0" - -ipfs-unixfs-importer@^7.0.1: - version "7.0.3" - resolved "https://registry.npmjs.org/ipfs-unixfs-importer/-/ipfs-unixfs-importer-7.0.3.tgz" - integrity sha512-qeFOlD3AQtGzr90sr5Tq1Bi8pT5Nr2tSI8z310m7R4JDYgZc6J1PEZO3XZQ8l1kuGoqlAppBZuOYmPEqaHcVQQ== - dependencies: - bl "^5.0.0" - cids "^1.1.5" - err-code "^3.0.1" - hamt-sharding "^2.0.0" - ipfs-unixfs "^4.0.3" - ipld-dag-pb "^0.22.2" - it-all "^1.0.5" - it-batch "^1.0.8" - it-first "^1.0.6" - it-parallel-batch "^1.0.9" - merge-options "^3.0.4" - multihashing-async "^2.1.0" - rabin-wasm "^0.1.4" - uint8arrays "^2.1.2" - -ipfs-unixfs@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/ipfs-unixfs/-/ipfs-unixfs-4.0.3.tgz" - integrity sha512-hzJ3X4vlKT8FQ3Xc4M1szaFVjsc1ZydN+E4VQ91aXxfpjFn9G2wsMo1EFdAXNq/BUnN5dgqIOMP5zRYr3DTsAw== - dependencies: - err-code "^3.0.1" - protobufjs "^6.10.2" - -ipld-dag-pb@^0.22.2: - version "0.22.3" - resolved "https://registry.npmjs.org/ipld-dag-pb/-/ipld-dag-pb-0.22.3.tgz" - integrity sha512-dfG5C5OVAR4FEP7Al2CrHWvAyIM7UhAQrjnOYOIxXGQz5NlEj6wGX0XQf6Ru6or1na6upvV3NQfstapQG8X2rg== - dependencies: - cids "^1.0.0" - interface-ipld-format "^1.0.0" - multicodec "^3.0.1" - multihashing-async "^2.0.0" - protobufjs "^6.10.2" - stable "^0.1.8" - uint8arrays "^2.0.5" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-core-module@^2.13.0, is-core-module@^2.5.0: - version "2.13.0" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz" - integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== - dependencies: - has "^1.0.3" +interface-blockstore@^5.0.0, interface-blockstore@^5.3.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/interface-blockstore/-/interface-blockstore-5.3.1.tgz#03f511431be2b8b04a536eaae8effe4565ea6536" + integrity sha512-nhgrQnz6yUQEqxTFLhlOBurQOy5lWlwCpgFmZ3GTObTVTQS9RZjK/JTozY6ty9uz2lZs7VFJSqwjWAltorJ4Vw== + dependencies: + interface-store "^6.0.0" + multiformats "^13.2.3" + +interface-datastore@^8.3.0: + version "8.3.1" + resolved "https://registry.yarnpkg.com/interface-datastore/-/interface-datastore-8.3.1.tgz#c793f990c5cf078a24a8a2ded13f7e2099a2a282" + integrity sha512-3r0ETmHIi6HmvM5sc09QQiCD3gUfwtEM/AAChOyAd/UAKT69uk8LXfTSUBufbUIO/dU65Vj8nb9O6QjwW8vDSQ== + dependencies: + interface-store "^6.0.0" + uint8arrays "^5.1.0" + +interface-store@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/interface-store/-/interface-store-6.0.2.tgz#1746a1ee07634f7678b3aa778738b79e3f75c909" + integrity sha512-KSFCXtBlNoG0hzwNa0RmhHtrdhzexp+S+UY2s0rWTBJyfdEIgn6i6Zl9otVqrcFYbYrneBT7hbmHQ8gE0C3umA== + +ipfs-unixfs-importer@^15.3.1: + version "15.3.1" + resolved "https://registry.yarnpkg.com/ipfs-unixfs-importer/-/ipfs-unixfs-importer-15.3.1.tgz#93cf3bad77e3fff7ee25b4ba822c1a0d2fd56b6e" + integrity sha512-wHCTBqNsZXLJZ9/GSr7Msb3FDXD5yXF20Y9sKyUbbqNjbvaXs3n3h1+NM/5+WrgESHfwRcJIlJtaOKafL8Ymdg== + dependencies: + "@ipld/dag-pb" "^4.1.2" + "@multiformats/murmur3" "^2.1.8" + hamt-sharding "^3.0.6" + interface-blockstore "^5.3.0" + interface-store "^6.0.0" + ipfs-unixfs "^11.0.0" + it-all "^3.0.6" + it-batch "^3.0.6" + it-first "^3.0.6" + it-parallel-batch "^3.0.6" + multiformats "^13.2.3" + progress-events "^1.0.1" + rabin-wasm "^0.1.5" + uint8arraylist "^2.4.8" + uint8arrays "^5.1.0" + +ipfs-unixfs@^11.0.0: + version "11.2.0" + resolved "https://registry.yarnpkg.com/ipfs-unixfs/-/ipfs-unixfs-11.2.0.tgz#a7f3d1f9bce29033f273bda124a0eb8bc0c752f6" + integrity sha512-J8FN1qM5nfrDo8sQKQwfj0+brTg1uBfZK2vY9hxci33lcl3BFrsELS9+1+4q/8tO1ASKfxZO8W3Pi2O4sVX2Lg== + dependencies: + protons-runtime "^5.5.0" + uint8arraylist "^2.4.8" is-extendable@^0.1.0: version "0.1.1" @@ -1725,16 +1407,6 @@ is-number@^7.0.0: resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" - integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== - -is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - is-stream@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz" @@ -1745,42 +1417,68 @@ isexe@^2.0.0: resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isows@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.4.tgz#810cd0d90cc4995c26395d2aa4cfa4037ebdf061" - integrity sha512-hEzjY+x9u9hPmBom9IIAqdJCwNLax+xrPb51vEPpERoFlIxgmZcHzsT5jKG06nvInKOBGvReAVz80Umed5CczQ== - -it-all@^1.0.5: +isows@1.0.6: version "1.0.6" - resolved "https://registry.npmjs.org/it-all/-/it-all-1.0.6.tgz" - integrity sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A== + resolved "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz" + integrity sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw== -it-batch@^1.0.8, it-batch@^1.0.9: - version "1.0.9" - resolved "https://registry.npmjs.org/it-batch/-/it-batch-1.0.9.tgz" - integrity sha512-7Q7HXewMhNFltTsAMdSz6luNhyhkhEtGGbYek/8Xb/GiqYMtwUmopE1ocPSiJKKp3rM4Dt045sNFoUu+KZGNyA== +it-all@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/it-all/-/it-all-3.0.6.tgz#30a4f922ae9ca0945b0f720d3478ae6f5b6707ab" + integrity sha512-HXZWbxCgQZJfrv5rXvaVeaayXED8nTKx9tj9fpBhmcUJcedVZshMMMqTj0RG2+scGypb9Ut1zd1ifbf3lA8L+Q== -it-first@^1.0.6: - version "1.0.7" - resolved "https://registry.npmjs.org/it-first/-/it-first-1.0.7.tgz" - integrity sha512-nvJKZoBpZD/6Rtde6FXqwDqDZGF1sCADmr2Zoc0hZsIvnE449gRFnGctxDf09Bzc/FWnHXAdaHVIetY6lrE0/g== +it-batch@^3.0.0, it-batch@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/it-batch/-/it-batch-3.0.6.tgz#0bcda35bf1c600e821c6d5f4d2446fe85a26ab1d" + integrity sha512-pQAAlSvJ4aV6xM/6LRvkPdKSKXxS4my2fGzNUxJyAQ8ccFdxPmK1bUuF5OoeUDkcdrbs8jtsmc4DypCMrGY6sg== -it-parallel-batch@^1.0.9: - version "1.0.11" - resolved "https://registry.npmjs.org/it-parallel-batch/-/it-parallel-batch-1.0.11.tgz" - integrity sha512-UWsWHv/kqBpMRmyZJzlmZeoAMA0F3SZr08FBdbhtbe+MtoEBgr/ZUAKrnenhXCBrsopy76QjRH2K/V8kNdupbQ== +it-drain@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/it-drain/-/it-drain-3.0.7.tgz#671a5d0220802c5bce9e68fc2b07088540fbc674" + integrity sha512-vy6S1JKjjHSIFHgBpLpD1zhkCRl3z1zYWUxE14+kAYf+BL9ssWSFImJfhl361IIcwr0ofw8etzg11VqqB+ntUA== + +it-filter@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/it-filter/-/it-filter-3.1.1.tgz#d9f55ecb26200baca41e5e330e5808b3afdfa7b7" + integrity sha512-TOXmVuaSkxlLp2hXKoMTra0WMZMKVFxE3vSsbIA+PbADNCBAHhjJ/lM31vBOUTddHMO34Ku++vU8T9PLlBxQtg== dependencies: - it-batch "^1.0.9" + it-peekable "^3.0.0" -js-sha3@^0.8.0: - version "0.8.0" - resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== +it-first@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/it-first/-/it-first-3.0.6.tgz#f532f0f36fe9bf0c291e0162b9d3375d59fe8f05" + integrity sha512-ExIewyK9kXKNAplg2GMeWfgjUcfC1FnUXz/RPfAvIXby+w7U4b3//5Lic0NV03gXT8O/isj5Nmp6KiY0d45pIQ== -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +it-merge@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/it-merge/-/it-merge-3.0.5.tgz#2b0d1d07c825b9d20c4c2889aab8e07322fd803e" + integrity sha512-2l7+mPf85pyRF5pqi0dKcA54E5Jm/2FyY5GsOaN51Ta0ipC7YZ3szuAsH8wOoB6eKY4XsU4k2X+mzPmFBMayEA== + dependencies: + it-pushable "^3.2.3" + +it-parallel-batch@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/it-parallel-batch/-/it-parallel-batch-3.0.6.tgz#61487fdaca03cc34c648b3432f59e82e0c805172" + integrity sha512-3wgiQGvMMHy65OXScrtrtmY+bJSF7P6St1AP+BU+SK83fEr8NNk/MrmJKrtB1+MahYX2a8I+pOGKDj8qVtuV0Q== + dependencies: + it-batch "^3.0.0" + +it-peekable@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/it-peekable/-/it-peekable-3.0.5.tgz#63b0c750e27e2ba0c1db6d6a3496b7ef51a6547d" + integrity sha512-JWQOGMt6rKiPcY30zUVMR4g6YxkpueTwHVE7CMs/aGqCf4OydM6w+7ZM3PvmO1e0TocjuR4aL8xyZWR46cTqCQ== + +it-pushable@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/it-pushable/-/it-pushable-3.2.3.tgz#e2b80aed90cfbcd54b620c0a0785e546d4e5f334" + integrity sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg== + dependencies: + p-defer "^4.0.0" + +it-stream-types@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/it-stream-types/-/it-stream-types-2.0.2.tgz#60bbace90096796b4e6cc3bfab99cf9f2b86c152" + integrity sha512-Rz/DEZ6Byn/r9+/SBCuJhpPATDF9D+dz5pbgSUyBsCDtza6wtNATrz/jz1gDyNanC3XdLboriHnOC925bZRBww== js-yaml@^3.13.1: version "3.14.1" @@ -1797,29 +1495,19 @@ json-bigint@^1.0.0: dependencies: bignumber.js "^9.0.0" -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: +kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.3" resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== lilconfig@~3.1.1: version "3.1.2" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz" integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - lint-staged@^15.2.7: version "15.2.7" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.2.7.tgz#97867e29ed632820c0fb90be06cd9ed384025649" + resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.7.tgz" integrity sha512-+FdVbbCZ+yoh7E/RosSdqKJyUM2OEjTciH0TFNkawKgvFp1zbGlEC39RADg+xKBG1R4mhoH2j85myBQZ5wR+lw== dependencies: chalk "~5.3.0" @@ -1835,7 +1523,7 @@ lint-staged@^15.2.7: listr2@~8.2.1: version "8.2.4" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.2.4.tgz#486b51cbdb41889108cb7e2c90eeb44519f5a77f" + resolved "https://registry.npmjs.org/listr2/-/listr2-8.2.4.tgz" integrity sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g== dependencies: cli-truncate "^4.0.0" @@ -1845,16 +1533,9 @@ listr2@~8.2.1: rfdc "^1.4.1" wrap-ansi "^9.0.0" -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - log-update@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.1.0.tgz#1a04ff38166f94647ae1af562f4bd6a15b1b7cd4" + resolved "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz" integrity sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w== dependencies: ansi-escapes "^7.0.0" @@ -1863,14 +1544,9 @@ log-update@^6.1.0: strip-ansi "^7.1.0" wrap-ansi "^9.0.0" -long@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/long/-/long-4.0.0.tgz" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== - loupe@^3.1.0, loupe@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.1.1.tgz#71d038d59007d890e3247c5db97c1ec5a92edc54" + resolved "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz" integrity sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw== dependencies: get-func-name "^2.0.1" @@ -1884,46 +1560,11 @@ lru-cache@^6.0.0: magic-string@^0.30.10: version "0.30.11" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.11.tgz#301a6f93b3e8c2cb13ac1a7a673492c0dfd12954" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz" integrity sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A== dependencies: "@jridgewell/sourcemap-codec" "^1.5.0" -map-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" - integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== - -map-obj@^4.0.0: - version "4.3.0" - resolved "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz" - integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== - -meow@^9.0.0: - version "9.0.0" - resolved "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz" - integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ== - dependencies: - "@types/minimist" "^1.2.0" - camelcase-keys "^6.2.2" - decamelize "^1.2.0" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "4.1.0" - normalize-package-data "^3.0.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.18.0" - yargs-parser "^20.2.3" - -merge-options@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz" - integrity sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ== - dependencies: - is-plain-obj "^2.1.0" - merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" @@ -1931,7 +1572,7 @@ merge-stream@^2.0.0: micromatch@~4.0.7: version "4.0.7" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz" integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== dependencies: braces "^3.0.3" @@ -1944,23 +1585,9 @@ mimic-fn@^4.0.0: mimic-function@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" + resolved "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz" integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== -min-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== - -minimist-options@4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz" - integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - kind-of "^6.0.3" - minimist@^1.2.5: version "1.2.8" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" @@ -1971,46 +1598,15 @@ ms@2.1.2: resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -multibase@^4.0.1: - version "4.0.6" - resolved "https://registry.npmjs.org/multibase/-/multibase-4.0.6.tgz" - integrity sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ== - dependencies: - "@multiformats/base-x" "^4.0.1" - -multicodec@^3.0.1: - version "3.2.1" - resolved "https://registry.npmjs.org/multicodec/-/multicodec-3.2.1.tgz" - integrity sha512-+expTPftro8VAW8kfvcuNNNBgb9gPeNYV9dn+z1kJRWF2vih+/S79f2RVeIwmrJBUJ6NT9IUPWnZDQvegEh5pw== - dependencies: - uint8arrays "^3.0.0" - varint "^6.0.0" +ms@^3.0.0-canary.1: + version "3.0.0-canary.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-3.0.0-canary.1.tgz#c7b34fbce381492fd0b345d1cf56e14d67b77b80" + integrity sha512-kh8ARjh8rMN7Du2igDRO9QJnqCb2xYTJxyQYK7vJJS4TvLLmsbyhiKpSW+t+y26gyOyMd0riphX0GeWKU3ky5g== -multiformats@^9.4.2: - version "9.9.0" - resolved "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz" - integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== - -multihashes@^4.0.1, multihashes@^4.0.2: - version "4.0.3" - resolved "https://registry.npmjs.org/multihashes/-/multihashes-4.0.3.tgz" - integrity sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA== - dependencies: - multibase "^4.0.1" - uint8arrays "^3.0.0" - varint "^5.0.2" - -multihashing-async@^2.0.0, multihashing-async@^2.1.0: - version "2.1.4" - resolved "https://registry.npmjs.org/multihashing-async/-/multihashing-async-2.1.4.tgz" - integrity sha512-sB1MiQXPSBTNRVSJc2zM157PXgDtud2nMFUEIvBrsq5Wv96sUclMRK/ecjoP1T/W61UJBqt4tCTwMkUpt2Gbzg== - dependencies: - blakejs "^1.1.0" - err-code "^3.0.0" - js-sha3 "^0.8.0" - multihashes "^4.0.1" - murmurhash3js-revisited "^3.0.0" - uint8arrays "^3.0.0" +multiformats@^13.0.0, multiformats@^13.1.0, multiformats@^13.2.3: + version "13.3.1" + resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-13.3.1.tgz#ea30d134b5697dcf2036ac819a17948f8a1775be" + integrity sha512-QxowxTNwJ3r5RMctoGA5p13w5RbRT2QDkoM+yFlqfLiioBp78nhDjnRLvmSBI9+KAqN4VdgOVWM9c0CHd86m3g== murmurhash3js-revisited@^3.0.0: version "3.0.0" @@ -2034,26 +1630,6 @@ node-fetch@^2.6.1: dependencies: whatwg-url "^5.0.0" -normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-package-data@^3.0.0: - version "3.0.3" - resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz" - integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== - dependencies: - hosted-git-info "^4.0.1" - is-core-module "^2.5.0" - semver "^7.3.4" - validate-npm-package-license "^3.0.1" - npm-run-path@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz" @@ -2061,11 +1637,6 @@ npm-run-path@^5.1.0: dependencies: path-key "^4.0.0" -object-hash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" - integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== - onetime@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz" @@ -2075,7 +1646,7 @@ onetime@^6.0.0: onetime@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-7.0.0.tgz#9f16c92d8c9ef5120e3acd9dd9957cceecc1ab60" + resolved "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz" integrity sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ== dependencies: mimic-function "^5.0.0" @@ -2085,39 +1656,36 @@ os-tmpdir@~1.0.2: resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== +ox@0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/ox/-/ox-0.1.2.tgz" + integrity sha512-ak/8K0Rtphg9vnRJlbOdaX9R7cmxD2MiSthjWGaQdMk3D7hrAlDoM+6Lxn7hN52Za3vrXfZ7enfke/5WjolDww== dependencies: - p-limit "^2.2.0" + "@adraffy/ens-normalize" "^1.10.1" + "@noble/curves" "^1.6.0" + "@noble/hashes" "^1.5.0" + "@scure/bip32" "^1.5.0" + "@scure/bip39" "^1.4.0" + abitype "^1.0.6" + eventemitter3 "5.0.1" -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +p-defer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-4.0.1.tgz#d12c6d41420785ed0d162dbd86b71ba490f7f99e" + integrity sha512-Mr5KC5efvAK5VUptYEIopP1bakB85k2IWXaRC0rsh1uwn1L6M0LVml8OIQ4Gudg4oyZakf7FmeRLkMMtZW1i5A== -parse-json@^5.0.0: - version "5.2.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== +p-queue@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-8.0.1.tgz#718b7f83836922ef213ddec263ff4223ce70bef8" + integrity sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA== dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" + eventemitter3 "^5.0.1" + p-timeout "^6.1.2" -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== +p-timeout@^6.1.2: + version "6.1.3" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-6.1.3.tgz#9635160c4e10c7b4c3db45b7d5d26f911d9fd853" + integrity sha512-UJUyfKbwvr/uZSV6btANfb+0t/mOhKV/KXcCUTp8FcQI+v/0d+wXqH4htrW0E4rR6WiEO/EPvUFiV9D5OI4vlw== path-key@^3.1.0: version "3.1.1" @@ -2129,19 +1697,14 @@ path-key@^4.0.0: resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz" integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - pathe@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" + resolved "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz" integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== pathval@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25" + resolved "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz" integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== picocolors@^1.0.0: @@ -2156,7 +1719,7 @@ picomatch@^2.3.1: pidtree@~0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" + resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz" integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== postcss@^8.4.32: @@ -2170,7 +1733,7 @@ postcss@^8.4.32: prettier-plugin-solidity@1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.3.1.tgz#59944d3155b249f7f234dee29f433524b9a4abcf" + resolved "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.3.1.tgz" integrity sha512-MN4OP5I2gHAzHZG1wcuJl0FsLS3c4Cc5494bbg+6oQWBPuEamjwDvmGfFMZ6NFzsh3Efd9UUxeT7ImgjNH4ozA== dependencies: "@solidity-parser/parser" "^0.17.0" @@ -2179,36 +1742,26 @@ prettier-plugin-solidity@1.3.1: prettier@3.2.5: version "3.2.5" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" + resolved "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz" integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== -protobufjs@^6.10.2: - version "6.11.4" - resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz" - integrity sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/long" "^4.0.1" - "@types/node" ">=13.7.0" - long "^4.0.0" - -quick-lru@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz" - integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== +progress-events@^1.0.0, progress-events@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/progress-events/-/progress-events-1.0.1.tgz#693b6d4153f08c1418ae3cd5fcad8596c91db7e8" + integrity sha512-MOzLIwhpt64KIVN64h1MwdKWiyKFNc/S6BoYKPIVUHFg0/eIEyBulhWCgn678v/4c0ri3FdGuzXymNCv02MUIw== -rabin-wasm@^0.1.4: +protons-runtime@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/protons-runtime/-/protons-runtime-5.5.0.tgz#ea06d9ef843aad77ea5de3e1ebafa81b58c24570" + integrity sha512-EsALjF9QsrEk6gbCx3lmfHxVN0ah7nG3cY7GySD4xf4g8cr7g543zB88Foh897Sr1RQJ9yDCUsoT1i1H/cVUFA== + dependencies: + uint8-varint "^2.0.2" + uint8arraylist "^2.4.3" + uint8arrays "^5.0.1" + +rabin-wasm@^0.1.5: version "0.1.5" - resolved "https://registry.npmjs.org/rabin-wasm/-/rabin-wasm-0.1.5.tgz" + resolved "https://registry.yarnpkg.com/rabin-wasm/-/rabin-wasm-0.1.5.tgz#5b625ca007d6a2cbc1456c78ae71d550addbc9c9" integrity sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA== dependencies: "@assemblyscript/loader" "^0.9.4" @@ -2218,25 +1771,6 @@ rabin-wasm@^0.1.4: node-fetch "^2.6.1" readable-stream "^3.6.0" -read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.2" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" @@ -2246,31 +1780,14 @@ readable-stream@^3.4.0, readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" -redent@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz" - integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== - dependencies: - indent-string "^4.0.0" - strip-indent "^3.0.0" - resolve-pkg-maps@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== -resolve@^1.10.0: - version "1.22.8" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - restore-cursor@^5.0.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-5.1.0.tgz#0766d95699efacb14150993f55baf0953ea1ebe7" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz" integrity sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA== dependencies: onetime "^7.0.0" @@ -2278,7 +1795,7 @@ restore-cursor@^5.0.0: rfdc@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" + resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz" integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== rollup@^4.2.0: @@ -2324,21 +1841,9 @@ section-matter@^1.0.0: extend-shallow "^2.0.1" kind-of "^6.0.0" -"semver@2 || 3 || 4 || 5": - version "5.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@^7.3.4: - version "7.5.4" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - semver@^7.5.4: version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== dependencies: lru-cache "^6.0.0" @@ -2375,7 +1880,7 @@ slice-ansi@^5.0.0: slice-ansi@^7.1.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.0.tgz#cd6b4655e298a8d1bdeb04250a433094b347b9a9" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz" integrity sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg== dependencies: ansi-styles "^6.2.1" @@ -2383,12 +1888,12 @@ slice-ansi@^7.1.0: solidity-comments-extractor@^0.0.8: version "0.0.8" - resolved "https://registry.yarnpkg.com/solidity-comments-extractor/-/solidity-comments-extractor-0.0.8.tgz#f6e148ab0c49f30c1abcbecb8b8df01ed8e879f8" + resolved "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.8.tgz" integrity sha512-htM7Vn6LhHreR+EglVMd2s+sZhcXAirB1Zlyrv5zBuTxieCvjfnRpd7iZk75m/u6NOlEyQ94C6TWbBn2cY7w8g== source-map-js@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== sparse-array@^1.3.1: @@ -2396,42 +1901,11 @@ sparse-array@^1.3.1: resolved "https://registry.npmjs.org/sparse-array/-/sparse-array-1.3.2.tgz" integrity sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg== -spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.16" - resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz" - integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw== - sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - stackback@0.0.2: version "0.0.2" resolved "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz" @@ -2439,12 +1913,12 @@ stackback@0.0.2: std-env@^3.7.0: version "3.7.0" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" + resolved "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz" integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== string-argv@~0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" + resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz" integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== string-width@^4.1.0: @@ -2496,20 +1970,6 @@ strip-final-newline@^3.0.0: resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz" integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== -strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== - dependencies: - min-indent "^1.0.0" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - supports-color@^7.1.0: version "7.2.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" @@ -2517,29 +1977,29 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +supports-color@^9.4.0: + version "9.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.4.0.tgz#17bfcf686288f531db3dea3215510621ccb55954" + integrity sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw== tinybench@^2.8.0: version "2.8.0" - resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.8.0.tgz#30e19ae3a27508ee18273ffed9ac7018949acd7b" + resolved "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz" integrity sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw== tinypool@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.0.0.tgz#a68965218e04f4ad9de037d2a1cd63cda9afb238" + resolved "https://registry.npmjs.org/tinypool/-/tinypool-1.0.0.tgz" integrity sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ== tinyrainbow@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-1.2.0.tgz#5c57d2fc0fb3d1afd78465c33ca885d04f02abb5" + resolved "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz" integrity sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ== tinyspy@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-3.0.0.tgz#cb61644f2713cd84dee184863f4642e06ddf0585" + resolved "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.0.tgz" integrity sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA== tmp@^0.0.33: @@ -2561,14 +2021,9 @@ tr46@~0.0.3: resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== -trim-newlines@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz" - integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== - -tsx@^4.16.3: +tsx@^4.16.3, tsx@^4.7.1: version "4.16.3" - resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.16.3.tgz#56eb2f14f67b798e8bd8a907a9ceec57cba0e8b9" + resolved "https://registry.npmjs.org/tsx/-/tsx-4.16.3.tgz" integrity sha512-MP8AEUxVnboD2rCC6kDLxnpDBNWN9k3BSVU/0/nNxgm70bPBnfn+yCKcnOsIVPQwdkbKYoFOlKjjWZWJ2XCXUg== dependencies: esbuild "~0.21.5" @@ -2576,54 +2031,32 @@ tsx@^4.16.3: optionalDependencies: fsevents "~2.3.3" -tsx@^4.7.1: - version "4.7.1" - resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.7.1.tgz#27af6cbf4e1cdfcb9b5425b1c61bb7e668eb5e84" - integrity sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g== - dependencies: - esbuild "~0.19.10" - get-tsconfig "^4.7.2" - optionalDependencies: - fsevents "~2.3.3" - -type-fest@^0.18.0: - version "0.18.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz" - integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== - type-fest@^0.21.3: version "0.21.3" resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -uint8arrays@^2.0.5, uint8arrays@^2.1.2: - version "2.1.10" - resolved "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.10.tgz" - integrity sha512-Q9/hhJa2836nQfEJSZTmr+pg9+cDJS9XEAp7N2Vg5MzL3bK/mkMVfjscRGYruP9jNda6MAdf4QD/y78gSzkp6A== +uint8-varint@^2.0.1, uint8-varint@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/uint8-varint/-/uint8-varint-2.0.4.tgz#85be52b3849eb30f2c3640a2df8a14364180affb" + integrity sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw== dependencies: - multiformats "^9.4.2" + uint8arraylist "^2.0.0" + uint8arrays "^5.0.0" -uint8arrays@^3.0.0: - version "3.1.1" - resolved "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz" - integrity sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg== +uint8arraylist@^2.0.0, uint8arraylist@^2.4.3, uint8arraylist@^2.4.8: + version "2.4.8" + resolved "https://registry.yarnpkg.com/uint8arraylist/-/uint8arraylist-2.4.8.tgz#5a4d17f4defd77799cb38e93fd5db0f0dceddc12" + integrity sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ== dependencies: - multiformats "^9.4.2" + uint8arrays "^5.0.1" -undici-types@~5.25.1: - version "5.25.3" - resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz" - integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== +uint8arrays@^5.0.0, uint8arrays@^5.0.1, uint8arrays@^5.0.2, uint8arrays@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-5.1.0.tgz#14047c9bdf825d025b7391299436e5e50e7270f1" + integrity sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww== + dependencies: + multiformats "^13.0.0" undici-types@~5.26.4: version "5.26.5" @@ -2635,57 +2068,24 @@ util-deprecate@^1.0.1: resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -varint@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz" - integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== - -varint@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz" - integrity sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg== - -viem@^2.17.11: - version "2.18.0" - resolved "https://registry.yarnpkg.com/viem/-/viem-2.18.0.tgz#ea0d037f0db356e6d71f1251243825345d6dc08f" - integrity sha512-HA4Dj+PCNWvvZDThWcUPg0sjiS8uwGRaxs3CMBOASL/j0p2pD4nR9vY/y/pAiRr491hGCnrSCVCmb/qqA57wIw== - dependencies: - "@adraffy/ens-normalize" "1.10.0" - "@noble/curves" "1.4.0" - "@noble/hashes" "1.4.0" - "@scure/bip32" "1.4.0" - "@scure/bip39" "1.3.0" - abitype "1.0.5" - isows "1.0.4" - webauthn-p256 "0.0.5" - ws "8.17.1" - -viem@^2.18.6: - version "2.18.6" - resolved "https://registry.yarnpkg.com/viem/-/viem-2.18.6.tgz#527c54a032cdd4c1f1795fcb44072e8c3efd16c6" - integrity sha512-KughUodIEjzkC+KfQ4+259yRXYfo0VLkZQ7NVC3RGfCMMOiVWaOxHjmcaY0FnZzKX3pwrlMyTAZbwH9tVAN/Yw== - dependencies: - "@adraffy/ens-normalize" "1.10.0" - "@noble/curves" "1.4.0" - "@noble/hashes" "1.4.0" - "@scure/bip32" "1.4.0" - "@scure/bip39" "1.3.0" - abitype "1.0.5" - isows "1.0.4" - webauthn-p256 "0.0.5" - ws "8.17.1" +viem@^2.18.6, viem@^2.21.32: + version "2.21.44" + resolved "https://registry.yarnpkg.com/viem/-/viem-2.21.44.tgz#793600a6afa8c0c1d62b4b819d036f833f623195" + integrity sha512-oyLTCt7OQUetQN2m9KPNgSA//MzpnQLABAyglPKh+fAypU8cTT/hC5UyLQvaYt4WPg6dkbKOxfsahV4739pu9w== + dependencies: + "@noble/curves" "1.6.0" + "@noble/hashes" "1.5.0" + "@scure/bip32" "1.5.0" + "@scure/bip39" "1.4.0" + abitype "1.0.6" + isows "1.0.6" + ox "0.1.2" + webauthn-p256 "0.0.10" + ws "8.18.0" vite-node@2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-2.0.4.tgz#5600cc9f0d9c3ff9a64050c6858e7e1b62fb3fcd" + resolved "https://registry.npmjs.org/vite-node/-/vite-node-2.0.4.tgz" integrity sha512-ZpJVkxcakYtig5iakNeL7N3trufe3M6vGuzYAr4GsbCTwobDeyPJpE4cjDhhPluv8OvQCFzu2LWp6GkoKRITXA== dependencies: cac "^6.7.14" @@ -2707,7 +2107,7 @@ vite@^5.0.0: vitest@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-2.0.4.tgz#ac6bfbaee53e502cee864b07a5b2edf1fcba793e" + resolved "https://registry.npmjs.org/vitest/-/vitest-2.0.4.tgz" integrity sha512-luNLDpfsnxw5QSW4bISPe6tkxVvv5wn2BBs/PuDRkhXZ319doZyLOBr1sjfB5yCEpTiU7xCAdViM8TNVGPwoog== dependencies: "@ampproject/remapping" "^2.3.0" @@ -2730,10 +2130,18 @@ vitest@^2.0.4: vite-node "2.0.4" why-is-node-running "^2.3.0" -webauthn-p256@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/webauthn-p256/-/webauthn-p256-0.0.5.tgz#0baebd2ba8a414b21cc09c0d40f9dd0be96a06bd" - integrity sha512-drMGNWKdaixZNobeORVIqq7k5DsRC9FnG201K2QjeOoQLmtSDaSsVZdkg6n5jUALJKcAG++zBPJXmv6hy0nWFg== +weald@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/weald/-/weald-1.0.4.tgz#8858cf9186869deba58357ae10cf26eaada80bb0" + integrity sha512-+kYTuHonJBwmFhP1Z4YQK/dGi3jAnJGCYhyODFpHK73rbxnp9lnZQj7a2m+WVgn8fXr5bJaxUpF6l8qZpPeNWQ== + dependencies: + ms "^3.0.0-canary.1" + supports-color "^9.4.0" + +webauthn-p256@0.0.10: + version "0.0.10" + resolved "https://registry.npmjs.org/webauthn-p256/-/webauthn-p256-0.0.10.tgz" + integrity sha512-EeYD+gmIT80YkSIDb2iWq0lq2zbHo1CxHlQTeJ+KkCILWpVy3zASH3ByD4bopzfk0uCwXxLqKGLqp2W4O28VFA== dependencies: "@noble/curves" "^1.4.0" "@noble/hashes" "^1.4.0" @@ -2760,7 +2168,7 @@ which@^2.0.1: why-is-node-running@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" + resolved "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz" integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== dependencies: siginfo "^2.0.0" @@ -2784,10 +2192,10 @@ wrap-ansi@^9.0.0: string-width "^7.0.0" strip-ansi "^7.1.0" -ws@8.17.1: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" - integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== +ws@8.18.0: + version "8.18.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== yallist@^4.0.0: version "4.0.0" @@ -2796,15 +2204,10 @@ yallist@^4.0.0: yaml@~2.4.2: version "2.4.5" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.5.tgz#60630b206dd6d84df97003d33fc1ddf6296cca5e" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz" integrity sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg== -yargs-parser@^20.2.3: - version "20.2.9" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - zod@^3.23.8: version "3.23.8" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" + resolved "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz" integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== From 21469ba754ce914ed946d26efd45374966f7f61f Mon Sep 17 00:00:00 2001 From: Cache bot Date: Mon, 11 Nov 2024 17:11:49 +0000 Subject: [PATCH 08/35] fix(cache): automated cache update [skip ci] --- .../AutomatedAGRSActivation.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AutomatedAGRSActivation.md b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AutomatedAGRSActivation.md index 105659c08..f7dc818a5 100644 --- a/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AutomatedAGRSActivation.md +++ b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AutomatedAGRSActivation.md @@ -66,8 +66,8 @@ The automated AGRS system will be configured with the following params: ## References -- Implementation: [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AaveV3EthereumLido_AutomatedAGRSActivation_20241108.sol) -- Tests: [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AaveV3EthereumLido_AutomatedAGRSActivation_20241108.t.sol) +- Implementation: [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/d7f260e226e42cf6b87e348ab5601aec27f48d1d/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AaveV3EthereumLido_AutomatedAGRSActivation_20241108.sol) +- Tests: [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/d7f260e226e42cf6b87e348ab5601aec27f48d1d/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AaveV3EthereumLido_AutomatedAGRSActivation_20241108.t.sol) - [Snapshot](https://snapshot.org/#/aave.eth/proposal/0x4809f179e517e5745ec13eba8f40d98dab73ca65f8a141bd2f18cc16dcd0cc16) - [Discussion](https://governance.aave.com/t/arfc-aave-generalized-risk-stewards-agrs-activation/19178/3) - AaveStewardsInjector: [github](https://github.com/aave-dao/aave-v3-risk-stewards/blob/650d51e2ec6bb1f4d9ae56da5a341436ef9bb8a1/src/contracts/AaveStewardInjector.sol), [deployed-contract](https://etherscan.io/address/0x834a5aC6e9D05b92F599A031941262F761c34859) From 3f98ef3473db6db5009d9e4e369fde61ddbe8265 Mon Sep 17 00:00:00 2001 From: Fermin 'Piscu' Carranza Date: Mon, 11 Nov 2024 12:19:49 -0500 Subject: [PATCH 09/35] stkAAVE Rewards Update (#520) * feat: stkAAVE rewards restart * chore: update readme with forum post * chore: update readme * feat: remove configure assets * chore: fix readme --- ...yModuleStkAAVEReEnableRewards_20241106.sol | 43 +++++++++++ ...oduleStkAAVEReEnableRewards_20241106.t.sol | 74 +++++++++++++++++++ .../SafetyModuleStkAAVEReEnableRewards.md | 35 +++++++++ ...oduleStkAAVEReEnableRewards_20241106.s.sol | 60 +++++++++++++++ .../config.ts | 14 ++++ 5 files changed, 226 insertions(+) create mode 100644 src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106.sol create mode 100644 src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106.t.sol create mode 100644 src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/SafetyModuleStkAAVEReEnableRewards.md create mode 100644 src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/SafetyModuleStkAAVEReEnableRewards_20241106.s.sol create mode 100644 src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/config.ts diff --git a/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106.sol b/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106.sol new file mode 100644 index 000000000..d0fb54f43 --- /dev/null +++ b/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {AaveSafetyModule} from 'aave-address-book/AaveSafetyModule.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; + +import {IStakeToken} from 'aave-address-book/common/IStakeToken.sol'; + +/** + * @title Safety Module stkAAVE - Re-enable Rewards + * @author @karpatkey_TokenLogic + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-amend-safety-module-emissions/16640/13 + */ +contract AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106 is IProposalGenericExecutor { + uint256 public constant DISTRIBUTION_DURATION = 180 days; + uint128 public constant AAVE_EMISSION_PER_SECOND_STK_AAVE = uint128(360e18) / 1 days; // 360 AAVE per day + + function execute() external { + uint256 remainingAllowance = IERC20(AaveV3EthereumAssets.AAVE_UNDERLYING).allowance( + address(MiscEthereum.ECOSYSTEM_RESERVE), + AaveSafetyModule.STK_AAVE + ); + + // Approval needs to be reset in order to increase it + MiscEthereum.AAVE_ECOSYSTEM_RESERVE_CONTROLLER.approve( + MiscEthereum.ECOSYSTEM_RESERVE, + AaveV3EthereumAssets.AAVE_UNDERLYING, + AaveSafetyModule.STK_AAVE, + 0 + ); + + MiscEthereum.AAVE_ECOSYSTEM_RESERVE_CONTROLLER.approve( + MiscEthereum.ECOSYSTEM_RESERVE, + AaveV3EthereumAssets.AAVE_UNDERLYING, + AaveSafetyModule.STK_AAVE, + remainingAllowance + (AAVE_EMISSION_PER_SECOND_STK_AAVE * DISTRIBUTION_DURATION) + ); + } +} diff --git a/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106.t.sol b/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106.t.sol new file mode 100644 index 000000000..474616977 --- /dev/null +++ b/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106.t.sol @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {AaveSafetyModule} from 'aave-address-book/AaveSafetyModule.sol'; +import {IStakeToken} from 'aave-address-book/common/IStakeToken.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; + +import {AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106} from './AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106.sol'; + +/** + * @dev Test for AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106.t.sol -vv + */ +contract AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106_Test is ProtocolV3TestBase { + AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21128772); + proposal = new AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106(); + } + + function test_checkConfig() public { + (uint128 emissionPerSecondBeforeStkAAVE, , ) = IStakeToken(AaveSafetyModule.STK_AAVE).assets( + AaveSafetyModule.STK_AAVE + ); + + assertEq( + emissionPerSecondBeforeStkAAVE, + proposal.AAVE_EMISSION_PER_SECOND_STK_AAVE(), + 'emissions before not equal stkAAVE' + ); + + executePayload(vm, address(proposal)); + + (uint128 emissionPerSecondAfterStkAAVE, , ) = IStakeToken(AaveSafetyModule.STK_AAVE).assets( + AaveSafetyModule.STK_AAVE + ); + + assertEq( + emissionPerSecondAfterStkAAVE, + proposal.AAVE_EMISSION_PER_SECOND_STK_AAVE(), + 'emissions after not equal stkAAVE' + ); + assertApproxEqAbs( + emissionPerSecondAfterStkAAVE, + emissionPerSecondBeforeStkAAVE, + 1, + 'stkAAVE emissions not same as previous' + ); + } + + function test_checkRewards_stkAAVE() public { + address staker = 0x5a801a9418D036fD453078c3ADCB761fdc5Ae695; + uint256 rewardsPerDay = proposal.AAVE_EMISSION_PER_SECOND_STK_AAVE(); + + executePayload(vm, address(proposal)); + + vm.startPrank(staker); + IERC20(AaveV3EthereumAssets.AAVE_UNDERLYING).approve(AaveSafetyModule.STK_AAVE, 1e18); + + IStakeToken(AaveSafetyModule.STK_AAVE).stake(staker, 1e18); + + vm.warp(block.timestamp + 1 days); + + uint256 rewardsBalance = IStakeToken(AaveSafetyModule.STK_AAVE).getTotalRewardsBalance(staker); + + assertTrue(rewardsBalance > 0 && rewardsBalance <= rewardsPerDay); + + vm.stopPrank(); + } +} diff --git a/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/SafetyModuleStkAAVEReEnableRewards.md b/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/SafetyModuleStkAAVEReEnableRewards.md new file mode 100644 index 000000000..adb7606ab --- /dev/null +++ b/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/SafetyModuleStkAAVEReEnableRewards.md @@ -0,0 +1,35 @@ +--- +title: "Safety Module stkAAVE - Re-enable Rewards" +author: "@karpatkey_TokenLogic" +discussions: "https://governance.aave.com/t/arfc-amend-safety-module-emissions/16640/13" +snapshot: "Direct-to-AIP" +--- + +## Simple Summary + +This publication proposes renewing the AAVE emissions to stkAAVE holders for the following 180 days. + +## Motivation + +With the conclusion of the recent reward cycle, this proposal aims to renew $AAVE emissions for stkAAVE holders. The stkAAVE module has proven to be a crucial mechanism as an AAVE supply sink, currently holding a TVL of $480M and accounting for 18.8% of the supply. It is recommended to maintain these emissions in anticipation of upcoming Umbrella developments, with adjustments to be made following the outcomes of the Umbrella upgrade. + +More information on stkAAVE can be found in these dashboards, [here](https://dune.com/xmc2/aave-safety-module) and [here](https://dune.com/KARTOD/AAVE-Staking). + +## Specification + +This proposal will implement the following changes to the AAVE emissions across the three SM categories: + +| Asset | Current AAVE/Day | Proposed AAVE/Day | +| ------- | ---------------- | ----------------- | +| stkAAVE | 360 | 360 | + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106.t.sol) +- [Snapshot]: Direct-to-AIP +- [Discussion](https://governance.aave.com/t/arfc-amend-safety-module-emissions/16640/13) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/SafetyModuleStkAAVEReEnableRewards_20241106.s.sol b/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/SafetyModuleStkAAVEReEnableRewards_20241106.s.sol new file mode 100644 index 000000000..3594948c4 --- /dev/null +++ b/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/SafetyModuleStkAAVEReEnableRewards_20241106.s.sol @@ -0,0 +1,60 @@ +// 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_SafetyModuleStkAAVEReEnableRewards_20241106} from './AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/SafetyModuleStkAAVEReEnableRewards_20241106.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/SafetyModuleStkAAVEReEnableRewards_20241106.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106).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/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/SafetyModuleStkAAVEReEnableRewards_20241106.s.sol:CreateProposal chain=mainnet + */ +contract CreateProposal is EthereumScript { + function run() external { + // create payloads + PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](1); + + // compose actions for validation + IPayloadsControllerCore.ExecutionAction[] + memory actionsEthereum = new IPayloadsControllerCore.ExecutionAction[](1); + actionsEthereum[0] = GovV3Helpers.buildAction( + type(AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/SafetyModuleStkAAVEReEnableRewards.md' + ) + ); + } +} diff --git a/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/config.ts b/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/config.ts new file mode 100644 index 000000000..84ba8e736 --- /dev/null +++ b/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/config.ts @@ -0,0 +1,14 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3Ethereum'], + title: 'Safety Module stkAAVE - Re-enable Rewards', + shortName: 'SafetyModuleStkAAVEReEnableRewards', + date: '20241106', + author: '@karpatkey_TokenLogic', + discussion: '', + snapshot: 'Direct-to-AIP', + votingNetwork: 'POLYGON', + }, + poolOptions: {AaveV3Ethereum: {configs: {OTHERS: {}}, cache: {blockNumber: 21128772}}}, +}; From 7b4278b8ce6089c9f2bad0da57d4226dfe79af2e Mon Sep 17 00:00:00 2001 From: Cache bot Date: Mon, 11 Nov 2024 17:20:15 +0000 Subject: [PATCH 10/35] fix(cache): automated cache update [skip ci] --- .../SafetyModuleStkAAVEReEnableRewards.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/SafetyModuleStkAAVEReEnableRewards.md b/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/SafetyModuleStkAAVEReEnableRewards.md index adb7606ab..46ab8b8b0 100644 --- a/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/SafetyModuleStkAAVEReEnableRewards.md +++ b/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/SafetyModuleStkAAVEReEnableRewards.md @@ -25,8 +25,8 @@ This proposal will implement the following changes to the AAVE emissions across ## References -- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106.sol) -- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106.t.sol) +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/3f98ef3473db6db5009d9e4e369fde61ddbe8265/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/3f98ef3473db6db5009d9e4e369fde61ddbe8265/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106.t.sol) - [Snapshot]: Direct-to-AIP - [Discussion](https://governance.aave.com/t/arfc-amend-safety-module-emissions/16640/13) From b1d68042df145fd28071478bad0c980a835af5d4 Mon Sep 17 00:00:00 2001 From: Lucas Wong <101302451+LucasWongC@users.noreply.github.com> Date: Mon, 11 Nov 2024 21:47:44 -0500 Subject: [PATCH 11/35] pyUSD Adjustments and ALC Funding (#517) * PYUSD Reserve Configuration Update & Incentive Campaign * PYUSD Reserve Configuration Update & Incentive Campaign * feat: remove emode addition for PyUSD * set EmissionAdmin for PYUSD * readme updated --------- Co-authored-by: luigy-lemon --- ...nUpdateIncentiveCampaign_20241031_after.md | 64 +++++++++++++++++ lib/aave-helpers | 2 +- ...rationUpdateIncentiveCampaign_20241031.sol | 68 +++++++++++++++++++ ...tionUpdateIncentiveCampaign_20241031.t.sol | 61 +++++++++++++++++ ...rveConfigurationUpdateIncentiveCampaign.md | 63 +++++++++++++++++ ...tionUpdateIncentiveCampaign_20241031.s.sol | 60 ++++++++++++++++ .../config.ts | 33 +++++++++ 7 files changed, 350 insertions(+), 1 deletion(-) create mode 100644 diffs/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031_before_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031_after.md create mode 100644 src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.sol create mode 100644 src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.t.sol create mode 100644 src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/PYUSDReserveConfigurationUpdateIncentiveCampaign.md create mode 100644 src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.s.sol create mode 100644 src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/config.ts diff --git a/diffs/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031_before_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031_after.md b/diffs/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031_before_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031_after.md new file mode 100644 index 000000000..f4b947cf4 --- /dev/null +++ b/diffs/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031_before_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031_after.md @@ -0,0 +1,64 @@ +## Reserve changes + +### Reserves altered + +#### PYUSD ([0x6c3ea9036406852006290770BEdFcAbA0e23A0e8](https://etherscan.io/address/0x6c3ea9036406852006290770BEdFcAbA0e23A0e8)) + +| description | value before | value after | +| --- | --- | --- | +| borrowCap | 48,000,000 PYUSD | 15,000,000 PYUSD | +| usageAsCollateralEnabled | false | true | +| ltv | 0 % [0] | 75 % [7500] | +| liquidationThreshold | 0 % [0] | 78 % [7800] | +| liquidationBonus | 0 % | 7.5 % | +| liquidationProtocolFee | 0 % [0] | 10 % [1000] | + + +## Emodes changed + +### EMode: ETH correlated(id: 1) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label (unchanged) | ETH correlated | ETH correlated | +| eMode.ltv (unchanged) | 93 % | 93 % | +| eMode.liquidationThreshold (unchanged) | 95 % | 95 % | +| eMode.liquidationBonus (unchanged) | 1 % | 1 % | +| eMode.borrowableBitmap (unchanged) | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | +| eMode.collateralBitmap (unchanged) | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | + + +## Raw diff + +```json +{ + "reserves": { + "0x6c3ea9036406852006290770BEdFcAbA0e23A0e8": { + "borrowCap": { + "from": 48000000, + "to": 15000000 + }, + "liquidationBonus": { + "from": 0, + "to": 10750 + }, + "liquidationProtocolFee": { + "from": 0, + "to": 1000 + }, + "liquidationThreshold": { + "from": 0, + "to": 7800 + }, + "ltv": { + "from": 0, + "to": 7500 + }, + "usageAsCollateralEnabled": { + "from": false, + "to": true + } + } + } +} +``` \ No newline at end of file diff --git a/lib/aave-helpers b/lib/aave-helpers index 19d8ece8a..d378deda2 160000 --- a/lib/aave-helpers +++ b/lib/aave-helpers @@ -1 +1 @@ -Subproject commit 19d8ece8a12d3d789ccb96fd184fef0a646b201c +Subproject commit d378deda2e0477900a84bffb1c2f45d199dc3138 diff --git a/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.sol b/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.sol new file mode 100644 index 000000000..23bc54f7c --- /dev/null +++ b/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.sol @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV3PayloadEthereum} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereum.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {IEmissionManager} from 'aave-v3-origin/contracts/rewards/interfaces/IEmissionManager.sol'; + +/** + * @title PYUSD Reserve Configuration Update & Incentive Campaign + * @author karpatkey_TokenLogic + * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0xcd73f17361c7757cd94ec758b4d9f160b7cecefa7f4cb23b0b4ee49b5eb1b8b2 + * - Discussion: https://governance.aave.com/t/arfc-pyusd-reserve-configuration-update-incentive-campaign/19573 + */ +contract AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031 is + AaveV3PayloadEthereum +{ + address public constant ALC_SAFE = 0xA1c93D2687f7014Aaf588c764E3Ce80aF016229b; + address public constant ACI_TREASURY = 0xac140648435d03f784879cd789130F22Ef588Fcd; + uint256 public constant GHO_AMOUNT = 300_000 ether; + + function _postExecute() internal override { + AaveV3Ethereum.COLLECTOR.approve(AaveV3EthereumAssets.GHO_UNDERLYING, ALC_SAFE, GHO_AMOUNT); + + IEmissionManager(AaveV3Ethereum.EMISSION_MANAGER).setEmissionAdmin( + AaveV3EthereumAssets.PYUSD_UNDERLYING, + ACI_TREASURY + ); + IEmissionManager(AaveV3Ethereum.EMISSION_MANAGER).setEmissionAdmin( + AaveV3EthereumAssets.PYUSD_A_TOKEN, + ACI_TREASURY + ); + } + + function capsUpdates() public pure override returns (IAaveV3ConfigEngine.CapsUpdate[] memory) { + IAaveV3ConfigEngine.CapsUpdate[] memory capsUpdate = new IAaveV3ConfigEngine.CapsUpdate[](1); + + capsUpdate[0] = IAaveV3ConfigEngine.CapsUpdate({ + asset: AaveV3EthereumAssets.PYUSD_UNDERLYING, + supplyCap: EngineFlags.KEEP_CURRENT, + borrowCap: 15_000_000 + }); + + return capsUpdate; + } + + function collateralsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.CollateralUpdate[] memory) + { + IAaveV3ConfigEngine.CollateralUpdate[] + memory collateralUpdate = new IAaveV3ConfigEngine.CollateralUpdate[](1); + + collateralUpdate[0] = IAaveV3ConfigEngine.CollateralUpdate({ + asset: AaveV3EthereumAssets.PYUSD_UNDERLYING, + ltv: 75_00, + liqThreshold: 78_00, + liqBonus: 7_50, + debtCeiling: EngineFlags.KEEP_CURRENT, + liqProtocolFee: 10_00 + }); + + return collateralUpdate; + } +} diff --git a/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.t.sol b/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.t.sol new file mode 100644 index 000000000..ef29f76d2 --- /dev/null +++ b/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.t.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {IEmissionManager} from 'aave-v3-origin/contracts/rewards/interfaces/IEmissionManager.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031} from './AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.sol'; +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; + +/** + * @dev Test for AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.t.sol -vv + */ +contract AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031_Test is + ProtocolV3TestBase +{ + AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21085967); + proposal = new AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031', + AaveV3Ethereum.POOL, + address(proposal) + ); + } + + function test_checkAllowanceAndEmissionAdmin() public { + uint256 allowanceBefore = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).allowance( + address(AaveV3Ethereum.COLLECTOR), + proposal.ALC_SAFE() + ); + + GovV3Helpers.executePayload(vm, address(proposal)); + + uint256 allowanceAfter = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).allowance( + address(AaveV3Ethereum.COLLECTOR), + proposal.ALC_SAFE() + ); + + assertEq(allowanceAfter - allowanceBefore, proposal.GHO_AMOUNT()); + + address pyusdEmissionAdmin = IEmissionManager(AaveV3Ethereum.EMISSION_MANAGER).getEmissionAdmin( + AaveV3EthereumAssets.PYUSD_UNDERLYING + ); + assertEq(pyusdEmissionAdmin, proposal.ACI_TREASURY()); + address pyusdAEmissionAdmin = IEmissionManager(AaveV3Ethereum.EMISSION_MANAGER) + .getEmissionAdmin(AaveV3EthereumAssets.PYUSD_A_TOKEN); + assertEq(pyusdAEmissionAdmin, proposal.ACI_TREASURY()); + } +} diff --git a/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/PYUSDReserveConfigurationUpdateIncentiveCampaign.md b/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/PYUSDReserveConfigurationUpdateIncentiveCampaign.md new file mode 100644 index 000000000..4113d8368 --- /dev/null +++ b/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/PYUSDReserveConfigurationUpdateIncentiveCampaign.md @@ -0,0 +1,63 @@ +--- +title: "PYUSD Reserve Configuration Update & Incentive Campaign" +author: "karpatkey_TokenLogic" +discussions: "https://governance.aave.com/t/arfc-pyusd-reserve-configuration-update-incentive-campaign/19573" +snapshot: "https://snapshot.org/#/aave.eth/proposal/0xcd73f17361c7757cd94ec758b4d9f160b7cecefa7f4cb23b0b4ee49b5eb1b8b2" +--- + +## Simple Summary + +This publication proposes amendments to the PYUSD Reserve in preparation for an upcoming incentive campaign. + +Additionally, a co-incentive campaign is to be implemented to improve the PYUSD and GHO liquidity. + +## Motivation + +Trident Digital with support from PayPal, presents the Aave DAO with an opportunity to promote the adoption of PYUSD on Aave Protocol and PYUSD/GHO liquidity on Balancer for an initial 6 month period. + +Eligible Aave Protocol users are expected to receive up to 4.00% APR in Liquidity Mining (LM) rewards made available by Trident Digital on behalf of PayPal. The PYUSD reserve on Aave v3 is to be adjusted to align with the objectives of the PYUSD incentive campaign. Further details can be found on the governance forum. + +### PYUSD/GHO Liquidity + +As part of the PYUSD growth iniative, a 8M PYUSD/GHO Elliptic Liquidity Pool (ECLP) with an asymmetric concentrated liquidity profile will be used on Balancer. + +The pool will be funded and supported for an initial 6 month period with an additional 300k GHO made available to the ALC. + +## Specification + +The following PYUSD Reserve parameters are to be updated: + +| Parameter | PYUSD | +| ------------------------ | ------ | +| Borrowable | Yes | +| Collateral | Yes | +| Borrow Cap | 15M | +| LTV | 75.00% | +| LT | 78.00% | +| Liquidation Penalty | 7.50% | +| Liquidation Protocol Fee | 10.00% | + +Create 300k GHO Allowance for the ALC SAFE. + +ALC SAFE: `0xA1c93D2687f7014Aaf588c764E3Ce80aF016229b` +GHO: `0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f` + +Whilst not expected to be needed, in case aEthPYUSD Liquidity Mining rewards are to be distributed across Aave v3, the ACI is to be granted sufficient permission to do so. + +EMISSION_MANAGER.setEmissionAdmin(`PYUSD`,`ACI Treasury`) +EMISSION_MANAGER.setEmissionAdmin(`aEthPYUSD`,`ACI Treasury`) + +PYUSD: `0x6c3ea9036406852006290770BEdFcAbA0e23A0e8` +aEthPYUSD: `0x0C0d01AbF3e6aDfcA0989eBbA9d6e85dD58EaB1E` +ACI Treasury: `0xac140648435d03f784879cd789130F22Ef588Fcd` + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.t.sol) +- [Snapshot](https://snapshot.org/#/aave.eth/proposal/0xcd73f17361c7757cd94ec758b4d9f160b7cecefa7f4cb23b0b4ee49b5eb1b8b2) +- [Discussion](https://governance.aave.com/t/arfc-pyusd-reserve-configuration-update-incentive-campaign/19573) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.s.sol b/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.s.sol new file mode 100644 index 000000000..17200fd3f --- /dev/null +++ b/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.s.sol @@ -0,0 +1,60 @@ +// 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_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031} from './AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031).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/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.s.sol:CreateProposal chain=mainnet + */ +contract CreateProposal is EthereumScript { + function run() external { + // create payloads + PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](1); + + // compose actions for validation + IPayloadsControllerCore.ExecutionAction[] + memory actionsEthereum = new IPayloadsControllerCore.ExecutionAction[](1); + actionsEthereum[0] = GovV3Helpers.buildAction( + type(AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/PYUSDReserveConfigurationUpdateIncentiveCampaign.md' + ) + ); + } +} diff --git a/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/config.ts b/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/config.ts new file mode 100644 index 000000000..8b1e37273 --- /dev/null +++ b/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/config.ts @@ -0,0 +1,33 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3Ethereum'], + title: 'PYUSD Reserve Configuration Update & Incentive Campaign', + shortName: 'PYUSDReserveConfigurationUpdateIncentiveCampaign', + date: '20241031', + author: 'karpatkey_TokenLogic', + discussion: + 'https://governance.aave.com/t/arfc-pyusd-reserve-configuration-update-incentive-campaign/19573', + snapshot: + 'https://snapshot.org/#/aave.eth/proposal/0xcd73f17361c7757cd94ec758b4d9f160b7cecefa7f4cb23b0b4ee49b5eb1b8b2', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Ethereum: { + configs: { + CAPS_UPDATE: [{asset: 'PYUSD', supplyCap: '', borrowCap: '15000000'}], + COLLATERALS_UPDATE: [ + { + asset: 'PYUSD', + ltv: '75', + liqThreshold: '78', + liqBonus: '7.5', + debtCeiling: '', + liqProtocolFee: '10', + }, + ], + }, + cache: {blockNumber: 21085967}, + }, + }, +}; From 775cfa32afa7b2cb167b48497a13ed47ed57bd9d Mon Sep 17 00:00:00 2001 From: Cache bot Date: Tue, 12 Nov 2024 02:48:07 +0000 Subject: [PATCH 12/35] fix(cache): automated cache update [skip ci] --- .../PYUSDReserveConfigurationUpdateIncentiveCampaign.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/PYUSDReserveConfigurationUpdateIncentiveCampaign.md b/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/PYUSDReserveConfigurationUpdateIncentiveCampaign.md index 4113d8368..7f08512ea 100644 --- a/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/PYUSDReserveConfigurationUpdateIncentiveCampaign.md +++ b/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/PYUSDReserveConfigurationUpdateIncentiveCampaign.md @@ -53,8 +53,8 @@ ACI Treasury: `0xac140648435d03f784879cd789130F22Ef588Fcd` ## References -- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.sol) -- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.t.sol) +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/b1d68042df145fd28071478bad0c980a835af5d4/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/b1d68042df145fd28071478bad0c980a835af5d4/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.t.sol) - [Snapshot](https://snapshot.org/#/aave.eth/proposal/0xcd73f17361c7757cd94ec758b4d9f160b7cecefa7f4cb23b0b4ee49b5eb1b8b2) - [Discussion](https://governance.aave.com/t/arfc-pyusd-reserve-configuration-update-incentive-campaign/19573) From 3a0085b8e9db515f846ee6fd54f7801e47b64d90 Mon Sep 17 00:00:00 2001 From: Lucas Wong <101302451+LucasWongC@users.noreply.github.com> Date: Tue, 12 Nov 2024 10:41:15 -0500 Subject: [PATCH 13/35] wstETH Borrow Rate Update - Main Instance (#509) * rateSlope1 update of wstETH on Mainnet Instance * bugfix on readme * Update WstETHReserveBorrowRateUpdateMainInstance.md only hackmd changes. * base br changed * config bugfix * Update src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/WstETHReserveBorrowRateUpdateMainInstance.md Co-authored-by: Ian Flexa <85500650+ianflexa@users.noreply.github.com> --------- Co-authored-by: Matthew <135056105+Matt-Graham-TL@users.noreply.github.com> Co-authored-by: Ian Flexa <85500650+ianflexa@users.noreply.github.com> --- ...owRateUpdateMainInstance_20241024_after.md | 49 +++++++++++++++ ...eBorrowRateUpdateMainInstance_20241024.sol | 37 ++++++++++++ ...orrowRateUpdateMainInstance_20241024.t.sol | 34 +++++++++++ ...tETHReserveBorrowRateUpdateMainInstance.md | 38 ++++++++++++ ...orrowRateUpdateMainInstance_20241024.s.sol | 60 +++++++++++++++++++ .../config.ts | 31 ++++++++++ 6 files changed, 249 insertions(+) create mode 100644 diffs/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024_before_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024_after.md create mode 100644 src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024.sol create mode 100644 src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024.t.sol create mode 100644 src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/WstETHReserveBorrowRateUpdateMainInstance.md create mode 100644 src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/WstETHReserveBorrowRateUpdateMainInstance_20241024.s.sol create mode 100644 src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/config.ts diff --git a/diffs/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024_before_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024_after.md b/diffs/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024_before_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024_after.md new file mode 100644 index 000000000..935241fdd --- /dev/null +++ b/diffs/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024_before_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024_after.md @@ -0,0 +1,49 @@ +## Reserve changes + +### Reserves altered + +#### wstETH ([0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0](https://etherscan.io/address/0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 84.75 % | 82 % | +| baseVariableBorrowRate | 0.25 % | 0 % | +| variableRateSlope1 | 4.5 % | 2 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=45000000000000000000000000&variableRateSlope2=800000000000000000000000000&optimalUsageRatio=450000000000000000000000000&baseVariableBorrowRate=2500000000000000000000000&maxVariableBorrowRate=847500000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=20000000000000000000000000&variableRateSlope2=800000000000000000000000000&optimalUsageRatio=450000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=820000000000000000000000000) | + +## Emodes changed + +### EMode: ETH correlated(id: 1) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label (unchanged) | ETH correlated | ETH correlated | +| eMode.ltv (unchanged) | 93 % | 93 % | +| eMode.liquidationThreshold (unchanged) | 95 % | 95 % | +| eMode.liquidationBonus (unchanged) | 1 % | 1 % | +| eMode.borrowableBitmap (unchanged) | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | +| eMode.collateralBitmap (unchanged) | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | + + +## Raw diff + +```json +{ + "strategies": { + "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0": { + "baseVariableBorrowRate": { + "from": "2500000000000000000000000", + "to": "0" + }, + "maxVariableBorrowRate": { + "from": "847500000000000000000000000", + "to": "820000000000000000000000000" + }, + "variableRateSlope1": { + "from": "45000000000000000000000000", + "to": "20000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024.sol b/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024.sol new file mode 100644 index 000000000..0e5ee6ec3 --- /dev/null +++ b/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024.sol @@ -0,0 +1,37 @@ +// 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 {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title wstETH Reserve Borrow Rate Update - Main Instance + * @author karpatkey_TokenLogic + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-weth-wsteth-borrow-rate-updates/19550 + */ +contract AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024 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: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: 0, + variableRateSlope1: 2_00, + variableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); + + return rateStrategies; + } +} diff --git a/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024.t.sol b/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024.t.sol new file mode 100644 index 000000000..631bd62ac --- /dev/null +++ b/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024.t.sol @@ -0,0 +1,34 @@ +// 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_WstETHReserveBorrowRateUpdateMainInstance_20241024} from './AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024.sol'; + +/** + * @dev Test for AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024.t.sol -vv + */ +contract AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024_Test is + ProtocolV3TestBase +{ + AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21036418); + proposal = new AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024', + AaveV3Ethereum.POOL, + address(proposal) + ); + } +} diff --git a/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/WstETHReserveBorrowRateUpdateMainInstance.md b/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/WstETHReserveBorrowRateUpdateMainInstance.md new file mode 100644 index 000000000..db5620d16 --- /dev/null +++ b/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/WstETHReserveBorrowRateUpdateMainInstance.md @@ -0,0 +1,38 @@ +--- +title: "wstETH Reserve Borrow Rate Update - Main Instance" +author: "karpatkey_TokenLogic" +discussions: "https://governance.aave.com/t/arfc-weth-wsteth-borrow-rate-updates/19550" +snapshot: "Direct-to-AIP" +--- + +## Simple Summary + +This publication proposes reducing wstETH Slope1 parameter on the Main instance of Aave v3 on Ethereum. + +## Motivation + +With the goal of encouraging user to borrow wstETH on the Main instance of Aave v3, the wstETH borrow rate will be lowered. + +The anticipated rsETH collateral and wETH debt eMode category is expected to create demand for wstETH debt. Given the size of the wstETH reserve the Uoptimal is not being increased by this proposal. + +After monitoring how the market responds, future borrow rate adjustments across the Aave v3 instances on Ethereum will be assessed and any change presented for discussion. + +## Specification + +The Main instance the wstETH Slope1 and base parameter is to be revised as follows: + +| Asset | Parameter | Current | Proposed | Change | +| :----: | :-------: | :-----: | :------: | :----: | +| wstETH | Base | 0.25% | 0.00% | -0.25% | +| wstETH | Slope1 | 4.50% | 2.00% | -2.50% | + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024.t.sol) +- [Snapshot](Direct-to-AIP) +- [Discussion](https://governance.aave.com/t/arfc-weth-wsteth-borrow-rate-updates/19550) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/WstETHReserveBorrowRateUpdateMainInstance_20241024.s.sol b/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/WstETHReserveBorrowRateUpdateMainInstance_20241024.s.sol new file mode 100644 index 000000000..92083f6db --- /dev/null +++ b/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/WstETHReserveBorrowRateUpdateMainInstance_20241024.s.sol @@ -0,0 +1,60 @@ +// 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_WstETHReserveBorrowRateUpdateMainInstance_20241024} from './AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/WstETHReserveBorrowRateUpdateMainInstance_20241024.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/WstETHReserveBorrowRateUpdateMainInstance_20241024.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024).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/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/WstETHReserveBorrowRateUpdateMainInstance_20241024.s.sol:CreateProposal chain=mainnet + */ +contract CreateProposal is EthereumScript { + function run() external { + // create payloads + PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](1); + + // compose actions for validation + IPayloadsControllerCore.ExecutionAction[] + memory actionsEthereum = new IPayloadsControllerCore.ExecutionAction[](1); + actionsEthereum[0] = GovV3Helpers.buildAction( + type(AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/WstETHReserveBorrowRateUpdateMainInstance.md' + ) + ); + } +} diff --git a/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/config.ts b/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/config.ts new file mode 100644 index 000000000..04aec1ccf --- /dev/null +++ b/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/config.ts @@ -0,0 +1,31 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3Ethereum'], + title: 'wstETH Reserve Borrow Rate Update - Main Instance', + shortName: 'WstETHReserveBorrowRateUpdateMainInstance', + date: '20241024', + author: 'karpatkey_TokenLogic', + discussion: 'https://governance.aave.com/t/arfc-weth-wsteth-borrow-rate-updates/19550', + snapshot: 'Direct-to-AIP', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Ethereum: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'wstETH', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '0.00', + variableRateSlope1: '2.00', + variableRateSlope2: '', + }, + }, + ], + }, + cache: {blockNumber: 21036418}, + }, + }, +}; From ab30997f37a10dcce1e35709cf9ff1ed8a6522cc Mon Sep 17 00:00:00 2001 From: Cache bot Date: Tue, 12 Nov 2024 15:42:01 +0000 Subject: [PATCH 14/35] fix(cache): automated cache update [skip ci] --- .../WstETHReserveBorrowRateUpdateMainInstance.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/WstETHReserveBorrowRateUpdateMainInstance.md b/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/WstETHReserveBorrowRateUpdateMainInstance.md index db5620d16..259ebbb0c 100644 --- a/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/WstETHReserveBorrowRateUpdateMainInstance.md +++ b/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/WstETHReserveBorrowRateUpdateMainInstance.md @@ -28,8 +28,8 @@ The Main instance the wstETH Slope1 and base parameter is to be revised as follo ## References -- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024.sol) -- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024.t.sol) +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/3a0085b8e9db515f846ee6fd54f7801e47b64d90/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/3a0085b8e9db515f846ee6fd54f7801e47b64d90/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024.t.sol) - [Snapshot](Direct-to-AIP) - [Discussion](https://governance.aave.com/t/arfc-weth-wsteth-borrow-rate-updates/19550) From 5ad1d7f8b6810d084d6c09cafbf03083dd9fb17f Mon Sep 17 00:00:00 2001 From: MartinGbz Date: Wed, 13 Nov 2024 16:17:14 +0700 Subject: [PATCH 15/35] =?UTF-8?q?=E2=9C=A8=20Onboard=20sUSDe=20on=20Lido?= =?UTF-8?q?=20instance=20and=20Enable=20sUSDe=20E-mode=20on=20Mainnet=20an?= =?UTF-8?q?d=20Lido=20instances=20(#522)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🎉 first generation * 🐛 fix emode configurations * ♻️ change emode name * ✨ update md file * 🐛 fix compilation errors * ✅ ran AaveV3Ethereum Tests * 🔧 update seed amount * fix: RF & UOpt can't be 0 * fix: forum link Co-authored-by: Harsh Pandey * fix: forum link Co-authored-by: Harsh Pandey * fix: forum link Co-authored-by: Harsh Pandey * fix: forum link Co-authored-by: Harsh Pandey * fix: emode label Co-authored-by: Harsh Pandey * fix: emode label Co-authored-by: Harsh Pandey * fix: update reserve factor with generic value Co-authored-by: Harsh Pandey * fix: snapshot link Co-authored-by: Harsh Pandey * fix: summary Co-authored-by: Harsh Pandey * fix: motivation Co-authored-by: Harsh Pandey * ♻️ fix emode label on Mainnet pool contract * ♻️ set borrow cap of 1000 * ♻️ set generic params on rates * 🐛 update diff file 1 * ✅ add new test * fix: space issue in md file Co-authored-by: Ian Flexa <85500650+ianflexa@users.noreply.github.com> * ✨ remove sUSDe from isolation * 🐛 add collateral update debt ceiling to 0 * fix: remove borrow update * ✅ tests passed * 🐛 fix emode category from 2 to 4 * ✅ update diff * 🐛 match specs with payload * fix: borrow rate in md Co-authored-by: Harsh Pandey * fix: slop 1 in md Co-authored-by: Harsh Pandey * fix: slope 2 in md Co-authored-by: Harsh Pandey * 🎨 lint md --------- Co-authored-by: Rozengarden Co-authored-by: Harsh Pandey Co-authored-by: Ian Flexa <85500650+ianflexa@users.noreply.github.com> --- ...3MainnetAndLidoInstances_20241108_after.md | 152 ++++++++++++++++++ ...3MainnetAndLidoInstances_20241108_after.md | 57 +++++++ ...AaveV3MainnetAndLidoInstances_20241108.sol | 120 ++++++++++++++ ...veV3MainnetAndLidoInstances_20241108.t.sol | 64 ++++++++ ...AaveV3MainnetAndLidoInstances_20241108.sol | 86 ++++++++++ ...veV3MainnetAndLidoInstances_20241108.t.sol | 35 ++++ ...uidEModeOnAaveV3MainnetAndLidoInstances.md | 72 +++++++++ ...veV3MainnetAndLidoInstances_20241108.s.sol | 74 +++++++++ .../config.ts | 109 +++++++++++++ 9 files changed, 769 insertions(+) create mode 100644 diffs/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_before_AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_after.md create mode 100644 diffs/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_before_AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_after.md create mode 100644 src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol create mode 100644 src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol create mode 100644 src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol create mode 100644 src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol create mode 100644 src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances.md create mode 100644 src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.s.sol create mode 100644 src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/config.ts diff --git a/diffs/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_before_AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_after.md b/diffs/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_before_AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_after.md new file mode 100644 index 000000000..5979e8c64 --- /dev/null +++ b/diffs/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_before_AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_after.md @@ -0,0 +1,152 @@ +## Reserve changes + +### Reserves added + +#### sUSDe ([0x9D39A5DE30e57443BfF2A8307A4256c8797A3497](https://etherscan.io/address/0x9D39A5DE30e57443BfF2A8307A4256c8797A3497)) + +| description | value | +| --- | --- | +| decimals | 18 | +| isActive | true | +| isFrozen | false | +| supplyCap | 20,000,000 sUSDe | +| borrowCap | 1,000 sUSDe | +| debtCeiling | 0 $ [0] | +| isSiloed | false | +| isFlashloanable | true | +| oracle | [0xb37aE8aBa6C0C1Bf2c509fc06E11aa4AF29B665A](https://etherscan.io/address/0xb37aE8aBa6C0C1Bf2c509fc06E11aa4AF29B665A) | +| oracleDecimals | 8 | +| oracleDescription | Capped sUSDe / USDe / USD | +| oracleLatestAnswer | 1.11869905 | +| usageAsCollateralEnabled | true | +| ltv | 0.05 % [5] | +| liquidationThreshold | 0.1 % [10] | +| liquidationBonus | 7.5 % | +| liquidationProtocolFee | 10 % [1000] | +| reserveFactor | 10 % [1000] | +| aToken | [0xc2015641564a5914A17CB9A92eC8d8feCfa8f2D0](https://etherscan.io/address/0xc2015641564a5914A17CB9A92eC8d8feCfa8f2D0) | +| aTokenImpl | [0x7F8Fc14D462bdF93c681c1f2Fd615389bF969Fb2](https://etherscan.io/address/0x7F8Fc14D462bdF93c681c1f2Fd615389bF969Fb2) | +| variableDebtToken | [0x2ABbAab3EF4e4A899d39e7EC996b5715E76b399a](https://etherscan.io/address/0x2ABbAab3EF4e4A899d39e7EC996b5715E76b399a) | +| variableDebtTokenImpl | [0x3E59212c34588a63350142EFad594a20C88C2CEd](https://etherscan.io/address/0x3E59212c34588a63350142EFad594a20C88C2CEd) | +| borrowingEnabled | false | +| isBorrowableInIsolation | false | +| interestRateStrategy | [0x8958b1C39269167527821f8c276Ef7504883f2fa](https://etherscan.io/address/0x8958b1C39269167527821f8c276Ef7504883f2fa) | +| aTokenName | Aave Ethereum Lido sUSDe | +| aTokenSymbol | aEthLidosUSDe | +| aTokenUnderlyingBalance | 100 sUSDe [100000000000000000000] | +| id | 5 | +| isPaused | false | +| variableDebtTokenName | Aave Ethereum Lido Variable Debt sUSDe | +| variableDebtTokenSymbol | variableDebtEthLidosUSDe | +| virtualAccountingActive | true | +| virtualBalance | 100 sUSDe [100000000000000000000] | +| optimalUsageRatio | 1 % | +| maxVariableBorrowRate | 3.15 % | +| baseVariableBorrowRate | 0.05 % | +| variableRateSlope1 | 0.1 % | +| variableRateSlope2 | 3 % | +| interestRate | ![ir](https://dash.onaave.com/api/static?variableRateSlope1=1000000000000000000000000&variableRateSlope2=30000000000000000000000000&optimalUsageRatio=10000000000000000000000000&baseVariableBorrowRate=500000000000000000000000&maxVariableBorrowRate=31500000000000000000000000) | + + +## Emodes changed + +### EMode: ETH correlated(id: 1) + + + +### EMode: LRT Stablecoins main(id: 2) + + + +### EMode: LRT wstETH main(id: 3) + + + +### EMode: sUSDe Stablecoins(id: 4) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label | - | sUSDe Stablecoins | +| eMode.ltv | - | 90 % | +| eMode.liquidationThreshold | - | 92 % | +| eMode.liquidationBonus | - | 3 % | +| eMode.borrowableBitmap | - | USDS, USDC | +| eMode.collateralBitmap | - | sUSDe | + + +## Raw diff + +```json +{ + "eModes": { + "4": { + "from": null, + "to": { + "borrowableBitmap": 12, + "collateralBitmap": 32, + "eModeCategory": 4, + "label": "sUSDe Stablecoins", + "liquidationBonus": 10300, + "liquidationThreshold": 9200, + "ltv": 9000 + } + } + }, + "reserves": { + "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497": { + "from": null, + "to": { + "aToken": "0xc2015641564a5914A17CB9A92eC8d8feCfa8f2D0", + "aTokenImpl": "0x7F8Fc14D462bdF93c681c1f2Fd615389bF969Fb2", + "aTokenName": "Aave Ethereum Lido sUSDe", + "aTokenSymbol": "aEthLidosUSDe", + "aTokenUnderlyingBalance": "100000000000000000000", + "borrowCap": 1000, + "borrowingEnabled": false, + "debtCeiling": 0, + "decimals": 18, + "id": 5, + "interestRateStrategy": "0x8958b1C39269167527821f8c276Ef7504883f2fa", + "isActive": true, + "isBorrowableInIsolation": false, + "isFlashloanable": true, + "isFrozen": false, + "isPaused": false, + "isSiloed": false, + "liquidationBonus": 10750, + "liquidationProtocolFee": 1000, + "liquidationThreshold": 10, + "ltv": 5, + "oracle": "0xb37aE8aBa6C0C1Bf2c509fc06E11aa4AF29B665A", + "oracleDecimals": 8, + "oracleDescription": "Capped sUSDe / USDe / USD", + "oracleLatestAnswer": 111869905, + "reserveFactor": 1000, + "supplyCap": 20000000, + "symbol": "sUSDe", + "underlying": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "usageAsCollateralEnabled": true, + "variableDebtToken": "0x2ABbAab3EF4e4A899d39e7EC996b5715E76b399a", + "variableDebtTokenImpl": "0x3E59212c34588a63350142EFad594a20C88C2CEd", + "variableDebtTokenName": "Aave Ethereum Lido Variable Debt sUSDe", + "variableDebtTokenSymbol": "variableDebtEthLidosUSDe", + "virtualAccountingActive": true, + "virtualBalance": "100000000000000000000" + } + } + }, + "strategies": { + "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497": { + "from": null, + "to": { + "address": "0x8958b1C39269167527821f8c276Ef7504883f2fa", + "baseVariableBorrowRate": "500000000000000000000000", + "maxVariableBorrowRate": "31500000000000000000000000", + "optimalUsageRatio": "10000000000000000000000000", + "variableRateSlope1": "1000000000000000000000000", + "variableRateSlope2": "30000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_before_AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_after.md b/diffs/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_before_AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_after.md new file mode 100644 index 000000000..afe196a77 --- /dev/null +++ b/diffs/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_before_AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_after.md @@ -0,0 +1,57 @@ +## Reserve changes + +### Reserves altered + +#### sUSDe ([0x9D39A5DE30e57443BfF2A8307A4256c8797A3497](https://etherscan.io/address/0x9D39A5DE30e57443BfF2A8307A4256c8797A3497)) + +| description | value before | value after | +| --- | --- | --- | +| debtCeiling | 40,000,000 $ [4000000000] | 0 $ [0] | + + +## Emodes changed + +### EMode: ETH correlated(id: 1) + + + +### EMode: sUSDe Stablecoins(id: 2) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label | - | sUSDe Stablecoins | +| eMode.ltv | - | 90 % | +| eMode.liquidationThreshold | - | 92 % | +| eMode.liquidationBonus | - | 3 % | +| eMode.borrowableBitmap | - | USDC, USDS | +| eMode.collateralBitmap | - | sUSDe | + + +## Raw diff + +```json +{ + "eModes": { + "2": { + "from": null, + "to": { + "borrowableBitmap": 34359738376, + "collateralBitmap": 4294967296, + "eModeCategory": 2, + "label": "sUSDe Stablecoins", + "liquidationBonus": 10300, + "liquidationThreshold": 9200, + "ltv": 9000 + } + } + }, + "reserves": { + "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497": { + "debtCeiling": { + "from": 4000000000, + "to": 0 + } + } + } +} +``` \ No newline at end of file diff --git a/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol new file mode 100644 index 000000000..923b799b9 --- /dev/null +++ b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol @@ -0,0 +1,120 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumLido, AaveV3EthereumLidoAssets, AaveV3EthereumLidoEModes} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {AaveV3PayloadEthereumLido} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereumLido.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol'; +import {IEmissionManager} from 'aave-v3-origin/contracts/rewards/interfaces/IEmissionManager.sol'; +/** + * @title Onboard and Enable sUSDe liquid E-Mode on Aave v3 Mainnet and Lido Instances + * @author ACI + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-enable-susde-liquid-e-mode-on-aave-v3-mainnet-and-lido-instance/19703 + */ +contract AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108 is + AaveV3PayloadEthereumLido +{ + using SafeERC20 for IERC20; + + address public constant sUSDe = 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497; + uint256 public constant sUSDe_SEED_AMOUNT = 100 * 1e18; + address public constant sUSDe_ADMIN = 0xac140648435d03f784879cd789130F22Ef588Fcd; + + function _postExecute() internal override { + IERC20(sUSDe).forceApprove(address(AaveV3EthereumLido.POOL), sUSDe_SEED_AMOUNT); + AaveV3EthereumLido.POOL.supply( + sUSDe, + sUSDe_SEED_AMOUNT, + address(AaveV3EthereumLido.COLLECTOR), + 0 + ); + + (address asUSDe, , ) = AaveV3EthereumLido.AAVE_PROTOCOL_DATA_PROVIDER.getReserveTokensAddresses( + sUSDe + ); + IEmissionManager(AaveV3EthereumLido.EMISSION_MANAGER).setEmissionAdmin(sUSDe, sUSDe_ADMIN); + IEmissionManager(AaveV3EthereumLido.EMISSION_MANAGER).setEmissionAdmin(asUSDe, sUSDe_ADMIN); + } + + function eModeCategoriesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.EModeCategoryUpdate[] memory) + { + IAaveV3ConfigEngine.EModeCategoryUpdate[] + memory eModeUpdates = new IAaveV3ConfigEngine.EModeCategoryUpdate[](1); + + eModeUpdates[0] = IAaveV3ConfigEngine.EModeCategoryUpdate({ + eModeCategory: 4, + ltv: 90_00, + liqThreshold: 92_00, + liqBonus: 3_00, + label: 'sUSDe Stablecoins' + }); + + return eModeUpdates; + } + function assetsEModeUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.AssetEModeUpdate[] memory) + { + IAaveV3ConfigEngine.AssetEModeUpdate[] + memory assetEModeUpdates = new IAaveV3ConfigEngine.AssetEModeUpdate[](3); + + assetEModeUpdates[0] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: sUSDe, + eModeCategory: 4, + borrowable: EngineFlags.DISABLED, + collateral: EngineFlags.ENABLED + }); + assetEModeUpdates[1] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3EthereumLidoAssets.USDS_UNDERLYING, + eModeCategory: 4, + borrowable: EngineFlags.ENABLED, + collateral: EngineFlags.DISABLED + }); + assetEModeUpdates[2] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3EthereumLidoAssets.USDC_UNDERLYING, + eModeCategory: 4, + borrowable: EngineFlags.ENABLED, + collateral: EngineFlags.DISABLED + }); + + return assetEModeUpdates; + } + function newListings() public pure override returns (IAaveV3ConfigEngine.Listing[] memory) { + IAaveV3ConfigEngine.Listing[] memory listings = new IAaveV3ConfigEngine.Listing[](1); + + listings[0] = IAaveV3ConfigEngine.Listing({ + asset: sUSDe, + assetSymbol: 'sUSDe', + priceFeed: 0xb37aE8aBa6C0C1Bf2c509fc06E11aa4AF29B665A, + enabledToBorrow: EngineFlags.DISABLED, + borrowableInIsolation: EngineFlags.DISABLED, + withSiloedBorrowing: EngineFlags.DISABLED, + flashloanable: EngineFlags.ENABLED, + ltv: 5, + liqThreshold: 10, + liqBonus: 7_50, + reserveFactor: 10_00, + supplyCap: 20_000_000, + borrowCap: 1000, + debtCeiling: 0, + liqProtocolFee: 10_00, + rateStrategyParams: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: 1_00, + baseVariableBorrowRate: 5, + variableRateSlope1: 10, + variableRateSlope2: 300 + }) + }); + + return listings; + } +} diff --git a/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol new file mode 100644 index 000000000..f40d0b820 --- /dev/null +++ b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3EthereumLido} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {IEmissionManager} from 'aave-v3-origin/contracts/rewards/interfaces/IEmissionManager.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108} from './AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol'; + +/** + * @dev Test for AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol -vv + */ +contract AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_Test is + ProtocolV3TestBase +{ + AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108 + internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21171005); + proposal = new AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108', + AaveV3EthereumLido.POOL, + address(proposal) + ); + } + + function test_collectorHassUSDeFunds() public { + GovV3Helpers.executePayload(vm, address(proposal)); + (address aTokenAddress, , ) = AaveV3EthereumLido + .AAVE_PROTOCOL_DATA_PROVIDER + .getReserveTokensAddresses(proposal.sUSDe()); + assertGe( + IERC20(aTokenAddress).balanceOf(address(AaveV3EthereumLido.COLLECTOR)), + 100 * 10 ** 18 + ); + } + + function test_sUSDeAdmin() public { + GovV3Helpers.executePayload(vm, address(proposal)); + (address asUSDe, , ) = AaveV3EthereumLido.AAVE_PROTOCOL_DATA_PROVIDER.getReserveTokensAddresses( + proposal.sUSDe() + ); + assertEq( + IEmissionManager(AaveV3EthereumLido.EMISSION_MANAGER).getEmissionAdmin(proposal.sUSDe()), + proposal.sUSDe_ADMIN() + ); + assertEq( + IEmissionManager(AaveV3EthereumLido.EMISSION_MANAGER).getEmissionAdmin(asUSDe), + proposal.sUSDe_ADMIN() + ); + } +} diff --git a/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol new file mode 100644 index 000000000..5e9bce0c9 --- /dev/null +++ b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumAssets, AaveV3EthereumEModes} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV3PayloadEthereum} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereum.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title Onboard and Enable sUSDe liquid E-Mode on Aave v3 Mainnet and Lido Instances + * @author ACI + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-enable-susde-liquid-e-mode-on-aave-v3-mainnet-and-lido-instance/19703 + */ +contract AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108 is + AaveV3PayloadEthereum +{ + function eModeCategoriesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.EModeCategoryUpdate[] memory) + { + IAaveV3ConfigEngine.EModeCategoryUpdate[] + memory eModeUpdates = new IAaveV3ConfigEngine.EModeCategoryUpdate[](1); + + eModeUpdates[0] = IAaveV3ConfigEngine.EModeCategoryUpdate({ + eModeCategory: 2, + ltv: 90_00, + liqThreshold: 92_00, + liqBonus: 3_00, + label: 'sUSDe Stablecoins' + }); + + return eModeUpdates; + } + function assetsEModeUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.AssetEModeUpdate[] memory) + { + IAaveV3ConfigEngine.AssetEModeUpdate[] + memory assetEModeUpdates = new IAaveV3ConfigEngine.AssetEModeUpdate[](3); + + assetEModeUpdates[0] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3EthereumAssets.USDC_UNDERLYING, + eModeCategory: 2, + borrowable: EngineFlags.ENABLED, + collateral: EngineFlags.DISABLED + }); + assetEModeUpdates[1] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3EthereumAssets.sUSDe_UNDERLYING, + eModeCategory: 2, + borrowable: EngineFlags.DISABLED, + collateral: EngineFlags.ENABLED + }); + assetEModeUpdates[2] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3EthereumAssets.USDS_UNDERLYING, + eModeCategory: 2, + borrowable: EngineFlags.ENABLED, + collateral: EngineFlags.DISABLED + }); + + return assetEModeUpdates; + } + function collateralsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.CollateralUpdate[] memory) + { + IAaveV3ConfigEngine.CollateralUpdate[] + memory collateralUpdate = new IAaveV3ConfigEngine.CollateralUpdate[](1); + + collateralUpdate[0] = IAaveV3ConfigEngine.CollateralUpdate({ + asset: AaveV3EthereumAssets.sUSDe_UNDERLYING, + ltv: EngineFlags.KEEP_CURRENT, + liqThreshold: EngineFlags.KEEP_CURRENT, + liqBonus: EngineFlags.KEEP_CURRENT, + debtCeiling: 0, + liqProtocolFee: EngineFlags.KEEP_CURRENT + }); + + return collateralUpdate; + } +} diff --git a/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol new file mode 100644 index 000000000..e6c27b1bc --- /dev/null +++ b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Ethereum} from 'aave-address-book/AaveV3Ethereum.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108} from './AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol'; + +/** + * @dev Test for AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol -vv + */ +contract AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_Test is + ProtocolV3TestBase +{ + AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108 + internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21171005); + proposal = new AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108', + AaveV3Ethereum.POOL, + address(proposal) + ); + } +} diff --git a/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances.md b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances.md new file mode 100644 index 000000000..dfe559d33 --- /dev/null +++ b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances.md @@ -0,0 +1,72 @@ +--- +title: "Onboard and Enable sUSDe liquid E-Mode on Aave v3 Mainnet and Lido Instances" +author: "ACI" +discussions: "https://governance.aave.com/t/arfc-enable-susde-liquid-e-mode-on-aave-v3-mainnet-and-lido-instance/19703" +snapshot: "Direct-to-AIP" +--- + +## Simple Summary + +This proposal aims to enable sUSDe liquid E-Mode on Aave v3 Mainnet for the Main and Lido instances. By implementing this change, we seek to enhance capital efficiency for borrowers using sUSDe as collateral, particularly for borrowing other stablecoins. This is a Direct to AIP proposal. + +## Motivation + +The motivation behind this proposal stems from several key factors: + +- High Utilization: sUSDe has demonstrated significant usage as collateral for borrowing stablecoins on the platform. + Capital Efficiency: Enabling liquid E-Mode for sUSDe will allow borrowers to substantially improve their capital efficiency when using this asset as collateral. +- Controlled Growth: Liquid E-Mode provides a mechanism for more precise control over the growth and borrow demand in relation to the overall stablecoin liquidity within Aave v3 on Mainnet. +- Enhanced Borrowing Capacity: This change will enable users to borrow larger amounts of other stablecoins against their sUSDe collateral, potentially increasing platform utilization and revenue. + By implementing this proposal, we aim to optimize the use of sUSDe within the Aave ecosystem, attracting more liquidity for stablecoins. + +## Specification + +The table below illustrates the configured risk parameters for **sUSDe** on Aave V3 Lido Instance: + +| Parameter | Value | +| ------------------------- | -----------------------------------------: | +| Isolation Mode | false | +| Borrowable | DISABLED | +| Collateral Enabled | true | +| Supply Cap (sUSDe) | 20,000,000 | +| Borrow Cap (sUSDe) | 1000 | +| Debt Ceiling | USD 0 | +| LTV | 0.05 % | +| LT | 0.1 % | +| Liquidation Bonus | 7.5 % | +| Liquidation Protocol Fee | 10 % | +| Reserve Factor | 10 % | +| Base Variable Borrow Rate | 0.05 % | +| Variable Slope 1 | 0.1 % | +| Variable Slope 2 | 3 % | +| Uoptimal | 1 % | +| Flashloanable | ENABLED | +| Siloed Borrowing | DISABLED | +| Borrowable in Isolation | DISABLED | +| Oracle | 0xb37aE8aBa6C0C1Bf2c509fc06E11aa4AF29B665A | + +Additionaly [0xac140648435d03f784879cd789130F22Ef588Fcd](https://etherscan.io/address/0xac140648435d03f784879cd789130F22Ef588Fcd) has been set as the emission admin for sUSDe and the corresponding aToken. + +The table below illustrate the configured "sUSDe Stablecoins" Liquid E-mode + +| Parameter | Value | Value | Value | +| --------------------- | ----- | ----- | ----- | +| Asset | sUSDe | USDS | USDC | +| Collateral | Yes | No | No | +| Borrowable | No | Yes | Yes | +| Max LTV | 90% | - | - | +| Liquidation Threshold | 92% | - | - | +| Liquidation Bonus | 3.0% | - | - | + +Finally, sUSDe on Aave V3 Mainnet will be removed from Isolation Mode on Aave v3 instance. + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol) +- Snapshot: Direct-to-AIP +- [Discussion](https://governance.aave.com/t/arfc-enable-susde-liquid-e-mode-on-aave-v3-mainnet-and-lido-instance/19703) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.s.sol b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.s.sol new file mode 100644 index 000000000..8eadb7b56 --- /dev/null +++ b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.s.sol @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108} from './AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol'; +import {AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108} from './AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108) + .creationCode + ); + address payload1 = GovV3Helpers.deployDeterministic( + type( + AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108 + ).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](2); + actions[0] = GovV3Helpers.buildAction(payload0); + actions[1] = GovV3Helpers.buildAction(payload1); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Create Proposal + * command: make deploy-ledger contract=src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.s.sol:CreateProposal chain=mainnet + */ +contract CreateProposal is EthereumScript { + function run() external { + // create payloads + PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](1); + + // compose actions for validation + IPayloadsControllerCore.ExecutionAction[] + memory actionsEthereum = new IPayloadsControllerCore.ExecutionAction[](2); + actionsEthereum[0] = GovV3Helpers.buildAction( + type(AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108) + .creationCode + ); + actionsEthereum[1] = GovV3Helpers.buildAction( + type( + AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108 + ).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances.md' + ) + ); + } +} diff --git a/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/config.ts b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/config.ts new file mode 100644 index 000000000..debc03f14 --- /dev/null +++ b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/config.ts @@ -0,0 +1,109 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3Ethereum', 'AaveV3EthereumLido'], + title: 'Onboard and Enable sUSDe liquid E-Mode on Aave v3 Mainnet and Lido Instances', + shortName: 'OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances', + date: '20241108', + author: 'ACI', + discussion: + 'https://governance.aave.com/t/arfc-enable-susde-liquid-e-mode-on-aave-v3-mainnet-and-lido-instance/1970', + snapshot: 'Direct-to-AIP', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Ethereum: { + configs: { + EMODES_UPDATES: [ + {eModeCategory: 2, ltv: '90', liqThreshold: '92', liqBonus: '3', label: 'sUSDe'}, + ], + EMODES_ASSETS: [ + { + asset: 'USDC', + eModeCategory: 'AaveV3EthereumEModes.ETH_CORRELATED', + collateral: 'DISABLED', + borrowable: 'ENABLED', + }, + { + asset: 'sUSDe', + eModeCategory: 'AaveV3EthereumEModes.ETH_CORRELATED', + collateral: 'ENABLED', + borrowable: 'DISABLED', + }, + { + asset: 'USDS', + eModeCategory: 'AaveV3EthereumEModes.ETH_CORRELATED', + collateral: 'DISABLED', + borrowable: 'ENABLED', + }, + ], + BORROWS_UPDATE: [ + { + enabledToBorrow: 'KEEP_CURRENT', + flashloanable: 'KEEP_CURRENT', + borrowableInIsolation: 'DISABLED', + withSiloedBorrowing: 'KEEP_CURRENT', + reserveFactor: 'KEEP_CURRENT', + asset: 'sUSDe', + }, + ], + }, + cache: {blockNumber: 21142896}, + }, + AaveV3EthereumLido: { + configs: { + EMODES_UPDATES: [ + {eModeCategory: 2, ltv: '90', liqThreshold: '92', liqBonus: '3', label: 'sUSDe'}, + ], + EMODES_ASSETS: [ + { + asset: 'WETH', + eModeCategory: 'AaveV3EthereumLidoEModes.ETH_CORRELATED', + collateral: 'ENABLED', + borrowable: 'DISABLED', + }, + { + asset: 'USDS', + eModeCategory: 'AaveV3EthereumLidoEModes.ETH_CORRELATED', + collateral: 'DISABLED', + borrowable: 'ENABLED', + }, + { + asset: 'USDC', + eModeCategory: 'AaveV3EthereumLidoEModes.ETH_CORRELATED', + collateral: 'DISABLED', + borrowable: 'ENABLED', + }, + ], + ASSET_LISTING: [ + { + assetSymbol: 'sUSDe', + decimals: 18, + priceFeed: '0xb37aE8aBa6C0C1Bf2c509fc06E11aa4AF29B665A', + ltv: '0.05', + liqThreshold: '0.1', + liqBonus: '7.5', + debtCeiling: '0', + liqProtocolFee: '10', + enabledToBorrow: 'DISABLED', + flashloanable: 'ENABLED', + borrowableInIsolation: 'DISABLED', + withSiloedBorrowing: 'DISABLED', + reserveFactor: '10', + supplyCap: '20000000', + borrowCap: '0', + rateStrategyParams: { + optimalUtilizationRate: '1', + baseVariableBorrowRate: '0', + variableRateSlope1: '0', + variableRateSlope2: '0', + }, + asset: '0x9D39A5DE30e57443BfF2A8307A4256c8797A3497', + admin: '0xac140648435d03f784879cd789130F22Ef588Fcd', + }, + ], + }, + cache: {blockNumber: 21142900}, + }, + }, +}; From d5fec81ad830e91b0504484dc7d9191338535ef1 Mon Sep 17 00:00:00 2001 From: Cache bot Date: Wed, 13 Nov 2024 09:27:11 +0000 Subject: [PATCH 16/35] fix(cache): automated cache update [skip ci] --- ...ndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances.md b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances.md index dfe559d33..ca19549d2 100644 --- a/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances.md +++ b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances.md @@ -62,8 +62,8 @@ Finally, sUSDe on Aave V3 Mainnet will be removed from Isolation Mode on Aave v3 ## References -- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol) -- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol) +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/5ad1d7f8b6810d084d6c09cafbf03083dd9fb17f/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/5ad1d7f8b6810d084d6c09cafbf03083dd9fb17f/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/5ad1d7f8b6810d084d6c09cafbf03083dd9fb17f/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/5ad1d7f8b6810d084d6c09cafbf03083dd9fb17f/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol) - Snapshot: Direct-to-AIP - [Discussion](https://governance.aave.com/t/arfc-enable-susde-liquid-e-mode-on-aave-v3-mainnet-and-lido-instance/19703) From 7a55e9d529097bedca83167e2dfd5c82380e2ab6 Mon Sep 17 00:00:00 2001 From: MartinGbz Date: Fri, 15 Nov 2024 18:47:46 +0700 Subject: [PATCH 17/35] =?UTF-8?q?=E2=9C=A8=20Onboard=20rsETH=20on=20Aave?= =?UTF-8?q?=20V3=20Ethereum=20(#513)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ✨ implement proposal * ✨ set the diferent asset to the new "rsETH E-Mode" * 🐛 fix admin var name issue * 🔧 fix seed amount * 🐛 update seed amount test + blocknumber * ✅ ran test * 📝 fix md * 🐛 fix emode label to "rsETH-Correlated" * 🐛 fix md file * ♻️ rename rsETH emode for "rsETH LST main" * 🐛 fix switch from emode 2 to 3 --- ...ardRsETHToAaveV3Ethereum_20241104_after.md | 172 ++++++++++++++++++ ..._OnboardRsETHToAaveV3Ethereum_20241104.sol | 131 +++++++++++++ ...nboardRsETHToAaveV3Ethereum_20241104.t.sol | 58 ++++++ .../OnboardRsETHToAaveV3Ethereum.md | 71 ++++++++ ...nboardRsETHToAaveV3Ethereum_20241104.s.sol | 61 +++++++ .../config.ts | 61 +++++++ 6 files changed, 554 insertions(+) create mode 100644 diffs/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104_before_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104_after.md create mode 100644 src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104.sol create mode 100644 src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104.t.sol create mode 100644 src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/OnboardRsETHToAaveV3Ethereum.md create mode 100644 src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/OnboardRsETHToAaveV3Ethereum_20241104.s.sol create mode 100644 src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/config.ts diff --git a/diffs/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104_before_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104_after.md b/diffs/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104_before_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104_after.md new file mode 100644 index 000000000..9fc486351 --- /dev/null +++ b/diffs/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104_before_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104_after.md @@ -0,0 +1,172 @@ +## Reserve changes + +### Reserves added + +#### rsETH ([0xA1290d69c65A6Fe4DF752f95823fae25cB99e5A7](https://etherscan.io/address/0xA1290d69c65A6Fe4DF752f95823fae25cB99e5A7)) + +| description | value | +| --- | --- | +| decimals | 18 | +| isActive | true | +| isFrozen | false | +| supplyCap | 19,000 rsETH | +| borrowCap | 1,900 rsETH | +| debtCeiling | 0 $ [0] | +| isSiloed | false | +| isFlashloanable | true | +| oracle | [0x47F52B2e43D0386cF161e001835b03Ad49889e3b](https://etherscan.io/address/0x47F52B2e43D0386cF161e001835b03Ad49889e3b) | +| oracleDecimals | 8 | +| oracleDescription | Capped rsETH / ETH / USD | +| oracleLatestAnswer | 2892.03476952 | +| usageAsCollateralEnabled | true | +| ltv | 72 % [7200] | +| liquidationThreshold | 75 % [7500] | +| liquidationBonus | 7.5 % | +| liquidationProtocolFee | 10 % [1000] | +| reserveFactor | 15 % [1500] | +| aToken | [0x2D62109243b87C4bA3EE7bA1D91B0dD0A074d7b1](https://etherscan.io/address/0x2D62109243b87C4bA3EE7bA1D91B0dD0A074d7b1) | +| aTokenImpl | [0x7EfFD7b47Bfd17e52fB7559d3f924201b9DbfF3d](https://etherscan.io/address/0x7EfFD7b47Bfd17e52fB7559d3f924201b9DbfF3d) | +| variableDebtToken | [0x6De3E52A1B7294A34e271a508082b1Ff4a37E30e](https://etherscan.io/address/0x6De3E52A1B7294A34e271a508082b1Ff4a37E30e) | +| variableDebtTokenImpl | [0xaC725CB59D16C81061BDeA61041a8A5e73DA9EC6](https://etherscan.io/address/0xaC725CB59D16C81061BDeA61041a8A5e73DA9EC6) | +| borrowingEnabled | true | +| isBorrowableInIsolation | false | +| interestRateStrategy | [0x9ec6F08190DeA04A54f8Afc53Db96134e5E3FdFB](https://etherscan.io/address/0x9ec6F08190DeA04A54f8Afc53Db96134e5E3FdFB) | +| aTokenName | Aave Ethereum rsETH | +| aTokenSymbol | aEthrsETH | +| aTokenUnderlyingBalance | 0.04 rsETH [40000000000000000] | +| id | 36 | +| isPaused | false | +| variableDebtTokenName | Aave Ethereum Variable Debt rsETH | +| variableDebtTokenSymbol | variableDebtEthrsETH | +| virtualAccountingActive | true | +| virtualBalance | 0.04 rsETH [40000000000000000] | +| optimalUsageRatio | 45 % | +| maxVariableBorrowRate | 307 % | +| baseVariableBorrowRate | 0 % | +| variableRateSlope1 | 7 % | +| variableRateSlope2 | 300 % | +| interestRate | ![ir](https://dash.onaave.com/api/static?variableRateSlope1=70000000000000000000000000&variableRateSlope2=3000000000000000000000000000&optimalUsageRatio=450000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=3070000000000000000000000000) | + + +### Reserve altered + +#### wstETH ([0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0](https://etherscan.io/address/0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0)) + +| description | value before | value after | +| --- | --- | --- | +| borrowCap | 48,000 wstETH | 60,000 wstETH | + + +#### ETHx ([0xA35b1B31Ce002FBF2058D22F30f95D405200A15b](https://etherscan.io/address/0xA35b1B31Ce002FBF2058D22F30f95D405200A15b)) + +| description | value before | value after | +| --- | --- | --- | +| borrowCap | 320 ETHx | 5,000 ETHx | + + +## Emodes changed + +### EMode: ETH correlated(id: 1) + + + +### EMode: rsETH LST main(id: 3) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label | - | rsETH LST main | +| eMode.ltv | - | 92.5 % | +| eMode.liquidationThreshold | - | 94.5 % | +| eMode.liquidationBonus | - | 1 % | +| eMode.borrowableBitmap | - | wstETH, ETHx | +| eMode.collateralBitmap | - | rsETH | + + +## Raw diff + +```json +{ + "eModes": { + "3": { + "from": null, + "to": { + "borrowableBitmap": 2147483650, + "collateralBitmap": 68719476736, + "eModeCategory": 3, + "label": "rsETH LST main", + "liquidationBonus": 10100, + "liquidationThreshold": 9450, + "ltv": 9250 + } + } + }, + "reserves": { + "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0": { + "borrowCap": { + "from": 48000, + "to": 60000 + } + }, + "0xA35b1B31Ce002FBF2058D22F30f95D405200A15b": { + "borrowCap": { + "from": 320, + "to": 5000 + } + }, + "0xA1290d69c65A6Fe4DF752f95823fae25cB99e5A7": { + "from": null, + "to": { + "aToken": "0x2D62109243b87C4bA3EE7bA1D91B0dD0A074d7b1", + "aTokenImpl": "0x7EfFD7b47Bfd17e52fB7559d3f924201b9DbfF3d", + "aTokenName": "Aave Ethereum rsETH", + "aTokenSymbol": "aEthrsETH", + "aTokenUnderlyingBalance": "40000000000000000", + "borrowCap": 1900, + "borrowingEnabled": true, + "debtCeiling": 0, + "decimals": 18, + "id": 36, + "interestRateStrategy": "0x9ec6F08190DeA04A54f8Afc53Db96134e5E3FdFB", + "isActive": true, + "isBorrowableInIsolation": false, + "isFlashloanable": true, + "isFrozen": false, + "isPaused": false, + "isSiloed": false, + "liquidationBonus": 10750, + "liquidationProtocolFee": 1000, + "liquidationThreshold": 7500, + "ltv": 7200, + "oracle": "0x47F52B2e43D0386cF161e001835b03Ad49889e3b", + "oracleDecimals": 8, + "oracleDescription": "Capped rsETH / ETH / USD", + "oracleLatestAnswer": 289203476952, + "reserveFactor": 1500, + "supplyCap": 19000, + "symbol": "rsETH", + "underlying": "0xA1290d69c65A6Fe4DF752f95823fae25cB99e5A7", + "usageAsCollateralEnabled": true, + "variableDebtToken": "0x6De3E52A1B7294A34e271a508082b1Ff4a37E30e", + "variableDebtTokenImpl": "0xaC725CB59D16C81061BDeA61041a8A5e73DA9EC6", + "variableDebtTokenName": "Aave Ethereum Variable Debt rsETH", + "variableDebtTokenSymbol": "variableDebtEthrsETH", + "virtualAccountingActive": true, + "virtualBalance": "40000000000000000" + } + } + }, + "strategies": { + "0xA1290d69c65A6Fe4DF752f95823fae25cB99e5A7": { + "from": null, + "to": { + "address": "0x9ec6F08190DeA04A54f8Afc53Db96134e5E3FdFB", + "baseVariableBorrowRate": 0, + "maxVariableBorrowRate": "3070000000000000000000000000", + "optimalUsageRatio": "450000000000000000000000000", + "variableRateSlope1": "70000000000000000000000000", + "variableRateSlope2": "3000000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104.sol b/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104.sol new file mode 100644 index 000000000..31f719080 --- /dev/null +++ b/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104.sol @@ -0,0 +1,131 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV3PayloadEthereum} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereum.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol'; +import {IEmissionManager} from 'aave-v3-origin/contracts/rewards/interfaces/IEmissionManager.sol'; +/** + * @title Onboard rsETH to Aave V3 Ethereum + * @author ACI + * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0xe83b67dfdddd469c298ce6133f4fdb84c9796c671c023b88617d5a25b5933c7f + * - Discussion: https://governance.aave.com/t/arfc-add-rseth-to-aave-v3-ethereum/17696 + */ +contract AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104 is AaveV3PayloadEthereum { + using SafeERC20 for IERC20; + + address public constant rsETH = 0xA1290d69c65A6Fe4DF752f95823fae25cB99e5A7; + uint256 public constant rsETH_SEED_AMOUNT = 4e16; + address public constant rsETH_ADMIN = 0xac140648435d03f784879cd789130F22Ef588Fcd; + + function _postExecute() internal override { + IERC20(rsETH).forceApprove(address(AaveV3Ethereum.POOL), rsETH_SEED_AMOUNT); + AaveV3Ethereum.POOL.supply(rsETH, rsETH_SEED_AMOUNT, address(AaveV3Ethereum.COLLECTOR), 0); + + (address arsETH, , ) = AaveV3Ethereum.AAVE_PROTOCOL_DATA_PROVIDER.getReserveTokensAddresses( + rsETH + ); + IEmissionManager(AaveV3Ethereum.EMISSION_MANAGER).setEmissionAdmin(rsETH, rsETH_ADMIN); + IEmissionManager(AaveV3Ethereum.EMISSION_MANAGER).setEmissionAdmin(arsETH, rsETH_ADMIN); + } + + function capsUpdates() public pure override returns (IAaveV3ConfigEngine.CapsUpdate[] memory) { + IAaveV3ConfigEngine.CapsUpdate[] memory capsUpdate = new IAaveV3ConfigEngine.CapsUpdate[](2); + + capsUpdate[0] = IAaveV3ConfigEngine.CapsUpdate({ + asset: AaveV3EthereumAssets.wstETH_UNDERLYING, + supplyCap: EngineFlags.KEEP_CURRENT, + borrowCap: 60_000 + }); + capsUpdate[1] = IAaveV3ConfigEngine.CapsUpdate({ + asset: AaveV3EthereumAssets.ETHx_UNDERLYING, + supplyCap: EngineFlags.KEEP_CURRENT, + borrowCap: 5_000 + }); + + return capsUpdate; + } + function eModeCategoriesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.EModeCategoryUpdate[] memory) + { + IAaveV3ConfigEngine.EModeCategoryUpdate[] + memory eModeUpdates = new IAaveV3ConfigEngine.EModeCategoryUpdate[](1); + + eModeUpdates[0] = IAaveV3ConfigEngine.EModeCategoryUpdate({ + eModeCategory: 3, + ltv: 92_50, + liqThreshold: 94_50, + liqBonus: 1_00, + label: 'rsETH LST main' + }); + + return eModeUpdates; + } + function assetsEModeUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.AssetEModeUpdate[] memory) + { + IAaveV3ConfigEngine.AssetEModeUpdate[] + memory assetEModeUpdates = new IAaveV3ConfigEngine.AssetEModeUpdate[](3); + + assetEModeUpdates[0] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: rsETH, + eModeCategory: 3, + borrowable: EngineFlags.DISABLED, + collateral: EngineFlags.ENABLED + }); + + assetEModeUpdates[1] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3EthereumAssets.wstETH_UNDERLYING, + eModeCategory: 3, + borrowable: EngineFlags.ENABLED, + collateral: EngineFlags.DISABLED + }); + + assetEModeUpdates[2] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3EthereumAssets.ETHx_UNDERLYING, + eModeCategory: 3, + borrowable: EngineFlags.ENABLED, + collateral: EngineFlags.DISABLED + }); + + return assetEModeUpdates; + } + function newListings() public pure override returns (IAaveV3ConfigEngine.Listing[] memory) { + IAaveV3ConfigEngine.Listing[] memory listings = new IAaveV3ConfigEngine.Listing[](1); + + listings[0] = IAaveV3ConfigEngine.Listing({ + asset: rsETH, + assetSymbol: 'rsETH', + priceFeed: 0x47F52B2e43D0386cF161e001835b03Ad49889e3b, + enabledToBorrow: EngineFlags.ENABLED, + borrowableInIsolation: EngineFlags.DISABLED, + withSiloedBorrowing: EngineFlags.DISABLED, + flashloanable: EngineFlags.ENABLED, + ltv: 72_00, + liqThreshold: 75_00, + liqBonus: 7_50, + reserveFactor: 15_00, + supplyCap: 19_000, + borrowCap: 1_900, + debtCeiling: 0, + liqProtocolFee: 10_00, + rateStrategyParams: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: 45_00, + baseVariableBorrowRate: 0, + variableRateSlope1: 7_00, + variableRateSlope2: 300_00 + }) + }); + + return listings; + } +} diff --git a/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104.t.sol b/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104.t.sol new file mode 100644 index 000000000..b9db591db --- /dev/null +++ b/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104.t.sol @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3Ethereum} from 'aave-address-book/AaveV3Ethereum.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {IEmissionManager} from 'aave-v3-origin/contracts/rewards/interfaces/IEmissionManager.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104} from './AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104.sol'; + +/** + * @dev Test for AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104.t.sol -vv + */ +contract AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104_Test is ProtocolV3TestBase { + AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21136339); + proposal = new AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104', + AaveV3Ethereum.POOL, + address(proposal) + ); + } + + function test_collectorHasrsETHFunds() public { + GovV3Helpers.executePayload(vm, address(proposal)); + (address aTokenAddress, , ) = AaveV3Ethereum + .AAVE_PROTOCOL_DATA_PROVIDER + .getReserveTokensAddresses(proposal.rsETH()); + assertGe(IERC20(aTokenAddress).balanceOf(address(AaveV3Ethereum.COLLECTOR)), 4 * 10 ** 16); + } + + function test_rsETHAdmin() public { + GovV3Helpers.executePayload(vm, address(proposal)); + (address arsETH, , ) = AaveV3Ethereum.AAVE_PROTOCOL_DATA_PROVIDER.getReserveTokensAddresses( + proposal.rsETH() + ); + assertEq( + IEmissionManager(AaveV3Ethereum.EMISSION_MANAGER).getEmissionAdmin(proposal.rsETH()), + proposal.rsETH_ADMIN() + ); + assertEq( + IEmissionManager(AaveV3Ethereum.EMISSION_MANAGER).getEmissionAdmin(arsETH), + proposal.rsETH_ADMIN() + ); + } +} diff --git a/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/OnboardRsETHToAaveV3Ethereum.md b/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/OnboardRsETHToAaveV3Ethereum.md new file mode 100644 index 000000000..d619834cb --- /dev/null +++ b/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/OnboardRsETHToAaveV3Ethereum.md @@ -0,0 +1,71 @@ +--- +title: "Onboard rsETH to Aave V3 Ethereum" +author: "ACI" +discussions: "https://governance.aave.com/t/arfc-add-rseth-to-aave-v3-ethereum/17696" +snapshot: "https://snapshot.org/#/aave.eth/proposal/0xe83b67dfdddd469c298ce6133f4fdb84c9796c671c023b88617d5a25b5933c7f" +--- + +## Simple Summary + +Kelp DAO is seeking community support for adding its Liquid Restaking Token, rsETH, to Aave V3 on Ethereum. In addition, rsETH depositors into Aave will accumulate additional Kelp miles and EigenLayer points. + +## Motivation + +KelpDAO (https://www.kelpdao.xyz/restake/) is one of the largest liquid restaking protocol built on top of the Eigen Layer. Restakers on Kelp get access to multiple benefits like restaking rewards, staking rewards and DeFi yields. + +## Specification + +The table below illustrates the configured risk parameters for **rsETH** + +| Parameter | Value | +| ------------------------- | -----------------------------------------: | +| Isolation Mode | false | +| Borrowable | ENABLED | +| Collateral Enabled | true | +| Supply Cap (rsETH) | 19,000 | +| Borrow Cap (rsETH) | 1,900 | +| Debt Ceiling | USD 0 | +| LTV | 72 % | +| LT | 75 % | +| Liquidation Bonus | 7.5 % | +| Liquidation Protocol Fee | 10 % | +| Reserve Factor | 15 % | +| Base Variable Borrow Rate | 0 % | +| Variable Slope 1 | 7 % | +| Variable Slope 2 | 300 % | +| Uoptimal | 45 % | +| Flashloanable | ENABLED | +| Siloed Borrowing | DISABLED | +| Borrowable in Isolation | DISABLED | +| Oracle | 0x47F52B2e43D0386cF161e001835b03Ad49889e3b | + +Additionaly [0xac140648435d03f784879cd789130F22Ef588Fcd](https://etherscan.io/address/0xac140648435d03f784879cd789130F22Ef588Fcd) has been set as the emission admin for rsETH and the corresponding aToken. + +A new rsETH LST main e-mode has also been added: + +| Parameter | Value | Value | Value | +| --------------------- | ----- | ------ | ----- | +| Asset | rsETH | wstETH | ETHx | +| Collateral | Yes | No | No | +| Borrowable | No | Yes | Yes | +| Max LTV | 92.5% | - | - | +| Liquidation Threshold | 94.5% | - | - | +| Liquidation Penalty | 1.00% | - | - | + +The caps of the e-mode related assets have also been updated: + +| | Current Borrow Cap | Recommended Borrow Cap | +| ------ | ------------------ | ---------------------- | +| wstETH | 48,000 | 60,000 | +| ETHx | 320 | 5,000 | + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104.t.sol) +- [Snapshot](https://snapshot.org/#/aave.eth/proposal/0xe83b67dfdddd469c298ce6133f4fdb84c9796c671c023b88617d5a25b5933c7f) +- [Discussion](https://governance.aave.com/t/arfc-add-rseth-to-aave-v3-ethereum/17696) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/OnboardRsETHToAaveV3Ethereum_20241104.s.sol b/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/OnboardRsETHToAaveV3Ethereum_20241104.s.sol new file mode 100644 index 000000000..d196d03b9 --- /dev/null +++ b/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/OnboardRsETHToAaveV3Ethereum_20241104.s.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3Ethereum} from 'aave-address-book/AaveV3Ethereum.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104} from './AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/OnboardRsETHToAaveV3Ethereum_20241104.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/OnboardRsETHToAaveV3Ethereum_20241104.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104).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/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/OnboardRsETHToAaveV3Ethereum_20241104.s.sol:CreateProposal chain=mainnet + */ +contract CreateProposal is EthereumScript { + function run() external { + // create payloads + PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](1); + + // compose actions for validation + IPayloadsControllerCore.ExecutionAction[] + memory actionsEthereum = new IPayloadsControllerCore.ExecutionAction[](1); + actionsEthereum[0] = GovV3Helpers.buildAction( + type(AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/OnboardRsETHToAaveV3Ethereum.md' + ) + ); + } +} diff --git a/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/config.ts b/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/config.ts new file mode 100644 index 000000000..21a064df4 --- /dev/null +++ b/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/config.ts @@ -0,0 +1,61 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3Ethereum'], + title: 'Onboard rsETH to Aave V3 Ethereum', + shortName: 'OnboardRsETHToAaveV3Ethereum', + date: '20241104', + author: 'ACI', + discussion: 'https://governance.aave.com/t/arfc-add-rseth-to-aave-v3-ethereum/17696', + snapshot: + 'https://snapshot.org/#/aave.eth/proposal/0xe83b67dfdddd469c298ce6133f4fdb84c9796c671c023b88617d5a25b5933c7f', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Ethereum: { + configs: { + CAPS_UPDATE: [ + {asset: 'wstETH', supplyCap: '', borrowCap: '60000'}, + {asset: 'ETHx', supplyCap: '', borrowCap: '5000'}, + ], + EMODES_UPDATES: [ + { + eModeCategory: 3, + ltv: '92.5', + liqThreshold: '94.5', + liqBonus: '1', + label: 'rsETH LST main', + }, + ], + ASSET_LISTING: [ + { + assetSymbol: 'rsETH', + decimals: 18, + priceFeed: '0x47F52B2e43D0386cF161e001835b03Ad49889e3b', + ltv: '72', + liqThreshold: '75', + liqBonus: '7.5', + debtCeiling: '0', + liqProtocolFee: '10', + enabledToBorrow: 'ENABLED', + flashloanable: 'ENABLED', + borrowableInIsolation: 'DISABLED', + withSiloedBorrowing: 'DISABLED', + reserveFactor: '15', + supplyCap: '19000', + borrowCap: '1900', + rateStrategyParams: { + optimalUtilizationRate: '45', + baseVariableBorrowRate: '0', + variableRateSlope1: '7', + variableRateSlope2: '300', + }, + asset: '0xA1290d69c65A6Fe4DF752f95823fae25cB99e5A7', + admin: '0xac140648435d03f784879cd789130F22Ef588Fcd', + }, + ], + }, + cache: {blockNumber: 21116205}, + }, + }, +}; From 82829da35d3439852af47d297b2f8cecc34c4cd1 Mon Sep 17 00:00:00 2001 From: Cache bot Date: Fri, 15 Nov 2024 11:48:11 +0000 Subject: [PATCH 18/35] fix(cache): automated cache update [skip ci] --- .../OnboardRsETHToAaveV3Ethereum.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/OnboardRsETHToAaveV3Ethereum.md b/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/OnboardRsETHToAaveV3Ethereum.md index d619834cb..2ed78cae4 100644 --- a/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/OnboardRsETHToAaveV3Ethereum.md +++ b/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/OnboardRsETHToAaveV3Ethereum.md @@ -61,8 +61,8 @@ The caps of the e-mode related assets have also been updated: ## References -- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104.sol) -- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104.t.sol) +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/7a55e9d529097bedca83167e2dfd5c82380e2ab6/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/7a55e9d529097bedca83167e2dfd5c82380e2ab6/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104.t.sol) - [Snapshot](https://snapshot.org/#/aave.eth/proposal/0xe83b67dfdddd469c298ce6133f4fdb84c9796c671c023b88617d5a25b5933c7f) - [Discussion](https://governance.aave.com/t/arfc-add-rseth-to-aave-v3-ethereum/17696) From b81d0fbc70b75e3fc601d8ca3f0ad1df87c84a44 Mon Sep 17 00:00:00 2001 From: Alice <121383428+Rozengarden@users.noreply.github.com> Date: Mon, 18 Nov 2024 09:10:32 +0100 Subject: [PATCH 19/35] feat: move Frax out of isolation mode on mainnet (#518) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: move Frax out of isolation mode on mainnet * Update src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/RemoveFraxFromIsolationModeOnAaveV3Mainnet.md Co-authored-by: Harsh Pandey * Update src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/RemoveFraxFromIsolationModeOnAaveV3Mainnet.md Co-authored-by: Harsh Pandey * 🐛 update PR regarding last chaos review * fix: set debtceiling to 0 * fix: implement fix suggested by @brotherlymite --------- Co-authored-by: Harsh Pandey Co-authored-by: MartinGbz --- ...ationModeOnAaveV3Mainnet_20241105_after.md | 39 ++++++++++++ ...mIsolationModeOnAaveV3Mainnet_20241105.sol | 37 ++++++++++++ ...solationModeOnAaveV3Mainnet_20241105.t.sol | 34 +++++++++++ ...oveFraxFromIsolationModeOnAaveV3Mainnet.md | 36 +++++++++++ ...solationModeOnAaveV3Mainnet_20241105.s.sol | 60 +++++++++++++++++++ .../config.ts | 42 +++++++++++++ 6 files changed, 248 insertions(+) create mode 100644 diffs/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105_before_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105_after.md create mode 100644 src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.sol create mode 100644 src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.t.sol create mode 100644 src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/RemoveFraxFromIsolationModeOnAaveV3Mainnet.md create mode 100644 src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.s.sol create mode 100644 src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/config.ts diff --git a/diffs/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105_before_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105_after.md b/diffs/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105_before_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105_after.md new file mode 100644 index 000000000..e45f17043 --- /dev/null +++ b/diffs/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105_before_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105_after.md @@ -0,0 +1,39 @@ +## Reserve changes + +### Reserves altered + +#### FRAX ([0x853d955aCEf822Db058eb8505911ED77F175b99e](https://etherscan.io/address/0x853d955aCEf822Db058eb8505911ED77F175b99e)) + +| description | value before | value after | +| --- | --- | --- | +| debtCeiling | 10,000,000 $ [1000000000] | 0 $ [0] | + + +## Emodes changed + +### EMode: ETH correlated(id: 1) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label (unchanged) | ETH correlated | ETH correlated | +| eMode.ltv (unchanged) | 93 % | 93 % | +| eMode.liquidationThreshold (unchanged) | 95 % | 95 % | +| eMode.liquidationBonus (unchanged) | 1 % | 1 % | +| eMode.borrowableBitmap (unchanged) | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | +| eMode.collateralBitmap (unchanged) | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | + + +## Raw diff + +```json +{ + "reserves": { + "0x853d955aCEf822Db058eb8505911ED77F175b99e": { + "debtCeiling": { + "from": 1000000000, + "to": 0 + } + } + } +} +``` \ No newline at end of file diff --git a/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.sol b/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.sol new file mode 100644 index 000000000..c70f3fd7e --- /dev/null +++ b/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.sol @@ -0,0 +1,37 @@ +// 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 {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title Remove Frax from Isolation Mode on Aave v3 Mainnet + * @author Aave Chan Initiative + * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x9bc3f3d8e38d70f55887f2f2498e1b39f59467489158923488aceab73cd4f144 + * - Discussion: https://governance.aave.com/t/arfc-remove-frax-from-isolation-mode-on-aave-v3-mainnet/19337 + */ +contract AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105 is + AaveV3PayloadEthereum +{ + function collateralsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.CollateralUpdate[] memory) + { + IAaveV3ConfigEngine.CollateralUpdate[] + memory collateralUpdate = new IAaveV3ConfigEngine.CollateralUpdate[](1); + + collateralUpdate[0] = IAaveV3ConfigEngine.CollateralUpdate({ + asset: AaveV3EthereumAssets.FRAX_UNDERLYING, + ltv: EngineFlags.KEEP_CURRENT, + liqThreshold: EngineFlags.KEEP_CURRENT, + liqBonus: EngineFlags.KEEP_CURRENT, + debtCeiling: 0, + liqProtocolFee: EngineFlags.KEEP_CURRENT + }); + + return collateralUpdate; + } +} diff --git a/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.t.sol b/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.t.sol new file mode 100644 index 000000000..484b4b878 --- /dev/null +++ b/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.t.sol @@ -0,0 +1,34 @@ +// 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_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105} from './AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.sol'; + +/** + * @dev Test for AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.t.sol -vv + */ +contract AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105_Test is + ProtocolV3TestBase +{ + AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21123714); + proposal = new AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105', + AaveV3Ethereum.POOL, + address(proposal) + ); + } +} diff --git a/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/RemoveFraxFromIsolationModeOnAaveV3Mainnet.md b/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/RemoveFraxFromIsolationModeOnAaveV3Mainnet.md new file mode 100644 index 000000000..6bbe99077 --- /dev/null +++ b/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/RemoveFraxFromIsolationModeOnAaveV3Mainnet.md @@ -0,0 +1,36 @@ +--- +title: "Remove Frax from Isolation Mode on Aave v3 Mainnet" +author: "Aave Chan Initiative" +discussions: "https://governance.aave.com/t/arfc-remove-frax-from-isolation-mode-on-aave-v3-mainnet/19337" +snapshot: "https://snapshot.org/#/aave.eth/proposal/0x9bc3f3d8e38d70f55887f2f2498e1b39f59467489158923488aceab73cd4f144" +--- + +## Simple Summary + +This is an AIP to remove FRAX from isolation mode. This is a reboot with minor changes of a [previous ARFC](https://governance.aave.com/t/arfc-remove-frax-from-isolation-mode-and-onboard-sfrax-to-aave-v3-mainnet/18506) which passed Snapshot but has not yet been implemented. + +## Motivation + +FRAX and Aave DAO have found more synergies over the last months. The FRAX team has responded with major updates to security on sfrxETH in response to BGD Labs feedback. FRAX has also initated governance proposals to add GHO to Frax Lend. There are ongoing conversations to have a FRAX AMO included into Aave v3. sFRAX was [previously accepted](https://governance.aave.com/t/arfc-add-sfrax-on-ethereum-v3/16303) for onboarding in a previous [ARFC vote](https://snapshot.org/#/aave.eth/proposal/0xdba99e9c8da24424447d7c7b70eff93ad5b6055714b5f34cf9859c923fb3a38a) before the introduction of CAPO feeds. + +This proposal suggests removing FRAX from isolation mode to facilitate further AMO deployments. + +## Specification + +- FRAX will be removed from Isolation Mode on Aave v3 instances. + +| **Parameter** | FRAX | +| -------------- | ---- | +| Isolation Mode | No | +| Debt Ceiling | 0 | + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.t.sol) +- [Snapshot](https://snapshot.org/#/aave.eth/proposal/0x9bc3f3d8e38d70f55887f2f2498e1b39f59467489158923488aceab73cd4f144) +- [Discussion](https://governance.aave.com/t/arfc-remove-frax-from-isolation-mode-on-aave-v3-mainnet/19337) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.s.sol b/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.s.sol new file mode 100644 index 000000000..e46d79331 --- /dev/null +++ b/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.s.sol @@ -0,0 +1,60 @@ +// 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_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105} from './AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105).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/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.s.sol:CreateProposal chain=mainnet + */ +contract CreateProposal is EthereumScript { + function run() external { + // create payloads + PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](1); + + // compose actions for validation + IPayloadsControllerCore.ExecutionAction[] + memory actionsEthereum = new IPayloadsControllerCore.ExecutionAction[](1); + actionsEthereum[0] = GovV3Helpers.buildAction( + type(AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/RemoveFraxFromIsolationModeOnAaveV3Mainnet.md' + ) + ); + } +} diff --git a/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/config.ts b/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/config.ts new file mode 100644 index 000000000..df673383a --- /dev/null +++ b/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/config.ts @@ -0,0 +1,42 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + author: 'Aave Chan Initiative', + pools: ['AaveV3Ethereum'], + title: 'Remove Frax from Isolation Mode on Aave v3 Mainnet', + shortName: 'RemoveFraxFromIsolationModeOnAaveV3Mainnet', + date: '20241105', + discussion: + 'https://governance.aave.com/t/arfc-remove-frax-from-isolation-mode-on-aave-v3-mainnet/19337', + snapshot: + 'https://snapshot.org/#/aave.eth/proposal/0x9bc3f3d8e38d70f55887f2f2498e1b39f59467489158923488aceab73cd4f144', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Ethereum: { + configs: { + COLLATERALS_UPDATE: [ + { + asset: 'FRAX', + ltv: '0', + liqThreshold: 'KEEP_CURRENT', + liqBonus: 'KEEP_CURRENT', + debtCeiling: '0', + liqProtocolFee: 'KEEP_CURRENT', + }, + ], + BORROWS_UPDATE: [ + { + enabledToBorrow: 'KEEP_CURRENT', + flashloanable: 'KEEP_CURRENT', + borrowableInIsolation: 'KEEP_CURRENT', + withSiloedBorrowing: 'KEEP_CURRENT', + reserveFactor: 'KEEP_CURRENT', + asset: 'FRAX', + }, + ], + }, + cache: {blockNumber: 21123714}, + }, + }, +}; From 9ed1c54db92976dc2f46ad41e61ef47f0ad68bd1 Mon Sep 17 00:00:00 2001 From: Cache bot Date: Mon, 18 Nov 2024 08:11:03 +0000 Subject: [PATCH 20/35] fix(cache): automated cache update [skip ci] --- .../RemoveFraxFromIsolationModeOnAaveV3Mainnet.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/RemoveFraxFromIsolationModeOnAaveV3Mainnet.md b/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/RemoveFraxFromIsolationModeOnAaveV3Mainnet.md index 6bbe99077..59d6d9c98 100644 --- a/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/RemoveFraxFromIsolationModeOnAaveV3Mainnet.md +++ b/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/RemoveFraxFromIsolationModeOnAaveV3Mainnet.md @@ -26,8 +26,8 @@ This proposal suggests removing FRAX from isolation mode to facilitate further A ## References -- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.sol) -- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.t.sol) +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/b81d0fbc70b75e3fc601d8ca3f0ad1df87c84a44/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/b81d0fbc70b75e3fc601d8ca3f0ad1df87c84a44/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.t.sol) - [Snapshot](https://snapshot.org/#/aave.eth/proposal/0x9bc3f3d8e38d70f55887f2f2498e1b39f59467489158923488aceab73cd4f144) - [Discussion](https://governance.aave.com/t/arfc-remove-frax-from-isolation-mode-on-aave-v3-mainnet/19337) From cd6c04854cfd647c3790b85ad7c43c80ad99599d Mon Sep 17 00:00:00 2001 From: Lukas Date: Mon, 18 Nov 2024 10:00:57 +0100 Subject: [PATCH 21/35] fix: refactor ci (#524) --- .github/workflows/test.yml | 50 +++++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 11 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0f186f228..7bcfa2b96 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -29,18 +29,46 @@ jobs: run: yarn lint --check test-sol: - uses: bgd-labs/github-workflows/.github/workflows/foundry-test.yml@main - secrets: inherit - with: - mode: "CHANGED" + name: Foundry build n test + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive - test-sol-zksync: - uses: bgd-labs/github-workflows/.github/workflows/foundry-test.yml@main - secrets: inherit - with: - mode: "CHANGED" - zksync: true - ROOT_DIR: "zksync" + - uses: bgd-labs/action-rpc-env@main + with: + ALCHEMY_API_KEY: ${{ secrets.ALCHEMY_API_KEY }} + + # we simply use foundry zk for all jobs in this repo + - name: Run Foundry setup + uses: bgd-labs/github-workflows/.github/actions/foundry-setup@main + with: + ZKSYNC: "true" + + - name: Run Forge tests + id: test + uses: bgd-labs/github-workflows/.github/actions/foundry-test@main + with: + MODE: "CHANGED" + + - name: Run ZK tests + id: zktest + uses: bgd-labs/github-workflows/.github/actions/foundry-test@main + with: + MODE: "CHANGED" + ZKSYNC: true + ROOT_DIR: "zksync" + + - name: Run Forge tests + uses: bgd-labs/github-workflows/.github/actions/comment-artifact@main + + # we let failing tests pass so we can log them in the comment, still we want the ci to fail + - name: Post test + if: ${{ steps.test.outputs.testStatus != 0 || steps.zktest.outputs.testStatus != 0 }} + run: | + echo "tests failed" + exit 1 test-js: uses: bgd-labs/github-workflows/.github/workflows/test-node.yml@main From ad22f0336adf9ad9957cd0399657f53b31fb4ecb Mon Sep 17 00:00:00 2001 From: Lukas Date: Tue, 19 Nov 2024 13:13:47 +0100 Subject: [PATCH 22/35] feat: additional functionality for the generator (#484) (#525) * feat: additional functionality for the generator (#484) by passing the -u/--update flag when using the -c options the cached block height will get updated * fix: bump deps * fix: update helpers * fix: update actions * fix: update readme --------- Co-authored-by: Alice <121383428+Rozengarden@users.noreply.github.com> --- .github/workflows/ipfs.yml | 9 +- .github/workflows/test.yml | 13 +- .gitignore | 3 +- README.md | 9 +- generator/cli.ts | 4 + lib/aave-helpers | 2 +- package-lock.json | 4135 ++++++++++++++++++++++++++++++++++++ package.json | 18 +- yarn.lock | 2213 ------------------- 9 files changed, 4158 insertions(+), 2248 deletions(-) create mode 100644 package-lock.json delete mode 100644 yarn.lock diff --git a/.github/workflows/ipfs.yml b/.github/workflows/ipfs.yml index d3ec42b93..4c911941d 100644 --- a/.github/workflows/ipfs.yml +++ b/.github/workflows/ipfs.yml @@ -39,14 +39,7 @@ jobs: ref: ${{ inputs.myCommit }} persist-credentials: true - - uses: actions/setup-node@v3 - with: - node-version: 20 - registry-url: "https://registry.npmjs.org" - cache: "yarn" - - - name: Install dependencies - run: yarn install --frozen-lockfile + - uses: bgd-labs/github-workflows/.github/actions/setup-node@main - name: Get all changed *.md file(s) id: changed-files diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7bcfa2b96..79a3f5ee9 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,19 +14,12 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - - uses: actions/setup-node@v3 - with: - node-version: 20 - registry-url: "https://registry.npmjs.org" - cache: "yarn" + - uses: actions/checkout@v4 - - name: Install dependencies - run: yarn install --frozen-lockfile + - uses: bgd-labs/github-workflows/.github/actions/setup-node@main - name: Enforce linting - run: yarn lint --check + run: npm run lint --check test-sol: name: Foundry build n test diff --git a/.gitignore b/.gitignore index 9634c09db..4fdc38c50 100644 --- a/.gitignore +++ b/.gitignore @@ -13,9 +13,8 @@ zkout/ # editors .idea -# well, looks strange to ignore package-lock, but we have only pretter and it's temproray -package-lock.json node_modules +yarn.lock # ignore foundry deploy artifacts broadcast/ diff --git a/README.md b/README.md index d211784a0..b4d97c1e1 100644 --- a/README.md +++ b/README.md @@ -22,19 +22,18 @@ The template ships with sensible default so you can use default `foundry` comman ```sh cp .env.example .env forge install -yarn +npm i ``` ### Create an aip This repository includes a generator to help you bootstrap the required files for an `AIP`. -To generate a proposal you need to run: `yarn generate` +To generate a proposal you need to run: `npm run generate` -To get a full list of available commands run `yarn generate --help` +To get a full list of available commands run `npm run generate -- --help` ```sh -yarn generate --help -yarn run v1.22.19 +npm run generate -- --help $ tsx generator/cli --help Usage: proposal-generator [options] diff --git a/generator/cli.ts b/generator/cli.ts index 321fa5474..76830c1eb 100644 --- a/generator/cli.ts +++ b/generator/cli.ts @@ -48,6 +48,7 @@ program ).choices(Object.values(VOTING_NETWORK)), ) .addOption(new Option('-c, --configFile ', 'path to config file')) + .addOption(new Option('-u, --update', 'when used with -c update block height')) .allowExcessArguments(false) .parse(process.argv); @@ -138,6 +139,9 @@ if (options.configFile) { const module = v2 ? FEATURE_MODULES_V2.find((m) => m.value === feature)! : FEATURE_MODULES_V3.find((m) => m.value === feature)!; + if (options.update) { + poolConfigs[pool]!.cache = await generateDeterministicPoolCache(pool); + } poolConfigs[pool]!.artifacts.push( module.build({ options, diff --git a/lib/aave-helpers b/lib/aave-helpers index d378deda2..dfe93027d 160000 --- a/lib/aave-helpers +++ b/lib/aave-helpers @@ -1 +1 @@ -Subproject commit d378deda2e0477900a84bffb1c2f45d199dc3138 +Subproject commit dfe93027dc822f45e368e2fbe9129e6a037a06e5 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..690a8b47c --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4135 @@ +{ + "name": "aave-proposals-v3", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "aave-proposals-v3", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@bgd-labs/aave-address-book": "4.4.0", + "@bgd-labs/aave-cli": "^1.1.11", + "@bgd-labs/js-utils": "^1.4.6", + "@inquirer/prompts": "^7.1.0", + "@inquirer/testing": "^2.1.37", + "catapulta-verify": "^1.1.1", + "commander": "^12.1.0", + "husky": "^8.0.3", + "lint-staged": "^15.2.10", + "tsx": "^4.19.2", + "viem": "^2.18.6" + }, + "devDependencies": { + "@types/node": "^22.9.0", + "prettier": "3.2.5", + "prettier-plugin-solidity": "1.3.1", + "vitest": "^2.1.5" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@assemblyscript/loader": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.9.4.tgz", + "integrity": "sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==", + "license": "Apache-2.0" + }, + "node_modules/@bgd-labs/aave-address-book": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@bgd-labs/aave-address-book/-/aave-address-book-4.4.0.tgz", + "integrity": "sha512-wEWhdTpqy6PwB3Dc772nX1lF1dQr9qmnmKJHcYKpP/VFBYztxunoZS/c26iKH4SP/DRXwDnMbZcnRkebC73bDA==" + }, + "node_modules/@bgd-labs/aave-cli": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@bgd-labs/aave-cli/-/aave-cli-1.1.11.tgz", + "integrity": "sha512-EUo+ZkcB4Eep/U0CMHBkHXw6BKFzhxsd7PV/ZdKco4IpsVRM68O73CqoIbe0vgo9B4yPwIaop7YqX1DhcwdLqg==", + "dependencies": { + "@bgd-labs/aave-address-book": "^4.4.0", + "@bgd-labs/aave-v3-governance-cache": "^1.0.8", + "@bgd-labs/js-utils": "^1.4.6", + "@commander-js/extra-typings": "^12.1.0", + "@inquirer/prompts": "^7.1.0", + "blockstore-core": "^5.0.2", + "chalk": "^4.1.2", + "commander": "^12.1.0", + "deepmerge": "^4.3.1", + "dotenv": "^16.4.1", + "find-object-paths": "^1.1.0", + "gray-matter": "^4.0.3", + "ipfs-unixfs-importer": "^15.3.1", + "json-bigint": "^1.0.0", + "viem": "^2.21.48", + "zod": "^3.23.8" + }, + "bin": { + "aave-cli": "dist/cli.js" + } + }, + "node_modules/@bgd-labs/aave-cli/node_modules/@bgd-labs/aave-v3-governance-cache": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@bgd-labs/aave-v3-governance-cache/-/aave-v3-governance-cache-1.0.8.tgz", + "integrity": "sha512-niaJafgxLQcuzZ13Wo1rO5tJ8f5pE5AdWs+5/PoHMrk5Z+bm5kE59oHbIO2xpg1pCQ7IZmsxXEIIlC2c0+v/Jg==", + "peerDependencies": { + "@bgd-labs/aave-address-book": "^4.0.1-02c70ec5f8a433b38372b81d27ed44b79aa52f65.0", + "viem": "^2.9.20" + } + }, + "node_modules/@bgd-labs/js-utils": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@bgd-labs/js-utils/-/js-utils-1.4.6.tgz", + "integrity": "sha512-0IA3fbHo/PJvtBPZ0q0zepsmsbZRAujchdd7GVsKJcJQ2xQulWYUZ9IeV+TTroR9wukKBgf6teYxEjCx0FVfuA==", + "dependencies": { + "@supercharge/promise-pool": "^3.1.1", + "bs58": "^5.0.0", + "gray-matter": "^4.0.3", + "tsx": "^4.7.1" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "viem": "^2.0.3" + } + }, + "node_modules/@chainsafe/is-ip": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@chainsafe/is-ip/-/is-ip-2.0.2.tgz", + "integrity": "sha512-ndGqEMG1W5WkGagaqOZHpPU172AGdxr+LD15sv3WIUvT5oCFUrG1Y0CW/v2Egwj4JXEvSibaIIIqImsm98y1nA==", + "license": "MIT" + }, + "node_modules/@chainsafe/netmask": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@chainsafe/netmask/-/netmask-2.0.0.tgz", + "integrity": "sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg==", + "license": "MIT", + "dependencies": { + "@chainsafe/is-ip": "^2.0.1" + } + }, + "node_modules/@commander-js/extra-typings": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@commander-js/extra-typings/-/extra-typings-12.1.0.tgz", + "integrity": "sha512-wf/lwQvWAA0goIghcb91dQYpkLBcyhOhQNqG/VgWhnKzgt+UOMvra7EX/2fv70arm5RW+PUHoQHHDa6/p77Eqg==", + "peerDependencies": { + "commander": "~12.1.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.2.tgz", + "integrity": "sha512-+gznPl8ip8P8HYHYecDtUtdsh1t2jvb+sWCD72GAiZ9m45RqwrLmReDaqdC0umQfamtFXVRoMVJ2/qINKGm9Tg==", + "dependencies": { + "@inquirer/core": "^10.1.0", + "@inquirer/figures": "^1.0.8", + "@inquirer/type": "^3.0.1", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.0.2.tgz", + "integrity": "sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==", + "dependencies": { + "@inquirer/core": "^10.1.0", + "@inquirer/type": "^3.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/core": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.0.tgz", + "integrity": "sha512-I+ETk2AL+yAVbvuKx5AJpQmoaWhpiTFOg/UJb7ZkMAK4blmtG8ATh5ct+T/8xNld0CZG/2UhtkdMwpgvld92XQ==", + "dependencies": { + "@inquirer/figures": "^1.0.8", + "@inquirer/type": "^3.0.1", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/editor": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.1.0.tgz", + "integrity": "sha512-K1gGWsxEqO23tVdp5MT3H799OZ4ER1za7Dlc8F4um0W7lwSv0KGR/YyrUEyimj0g7dXZd8XknM/5QA2/Uy+TbA==", + "dependencies": { + "@inquirer/core": "^10.1.0", + "@inquirer/type": "^3.0.1", + "external-editor": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.2.tgz", + "integrity": "sha512-WdgCX1cUtinz+syKyZdJomovULYlKUWZbVYZzhf+ZeeYf4htAQ3jLymoNs3koIAKfZZl3HUBb819ClCBfyznaw==", + "dependencies": { + "@inquirer/core": "^10.1.0", + "@inquirer/type": "^3.0.1", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.8.tgz", + "integrity": "sha512-tKd+jsmhq21AP1LhexC0pPwsCxEhGgAkg28byjJAd+xhmIs8LUX8JbUc3vBf3PhLxWiB5EvyBE5X7JSPAqMAqg==", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.0.2.tgz", + "integrity": "sha512-yCLCraigU085EcdpIVEDgyfGv4vBiE4I+k1qRkc9C5dMjWF42ADMGy1RFU94+eZlz4YlkmFsiyHZy0W1wdhaNg==", + "dependencies": { + "@inquirer/core": "^10.1.0", + "@inquirer/type": "^3.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.2.tgz", + "integrity": "sha512-MKQhYofdUNk7eqJtz52KvM1dH6R93OMrqHduXCvuefKrsiMjHiMwjc3NZw5Imm2nqY7gWd9xdhYrtcHMJQZUxA==", + "dependencies": { + "@inquirer/core": "^10.1.0", + "@inquirer/type": "^3.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.2.tgz", + "integrity": "sha512-tQXGSu7IO07gsYlGy3VgXRVsbOWqFBMbqAUrJSc1PDTQQ5Qdm+QVwkP0OC0jnUZ62D19iPgXOMO+tnWG+HhjNQ==", + "dependencies": { + "@inquirer/core": "^10.1.0", + "@inquirer/type": "^3.0.1", + "ansi-escapes": "^4.3.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.1.0.tgz", + "integrity": "sha512-5U/XiVRH2pp1X6gpNAjWOglMf38/Ys522ncEHIKT1voRUvSj/DQnR22OVxHnwu5S+rCFaUiPQ57JOtMFQayqYA==", + "dependencies": { + "@inquirer/checkbox": "^4.0.2", + "@inquirer/confirm": "^5.0.2", + "@inquirer/editor": "^4.1.0", + "@inquirer/expand": "^4.0.2", + "@inquirer/input": "^4.0.2", + "@inquirer/number": "^3.0.2", + "@inquirer/password": "^4.0.2", + "@inquirer/rawlist": "^4.0.2", + "@inquirer/search": "^3.0.2", + "@inquirer/select": "^4.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.2.tgz", + "integrity": "sha512-3XGcskMoVF8H0Dl1S5TSZ3rMPPBWXRcM0VeNVsS4ByWeWjSeb0lPqfnBg6N7T0608I1B2bSVnbi2cwCrmOD1Yw==", + "dependencies": { + "@inquirer/core": "^10.1.0", + "@inquirer/type": "^3.0.1", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/search": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.2.tgz", + "integrity": "sha512-Zv4FC7w4dJ13BOJfKRQCICQfShinGjb1bCEIHxTSnjj2telu3+3RHwHubPG9HyD4aix5s+lyAMEK/wSFD75HLA==", + "dependencies": { + "@inquirer/core": "^10.1.0", + "@inquirer/figures": "^1.0.8", + "@inquirer/type": "^3.0.1", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/select": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.2.tgz", + "integrity": "sha512-uSWUzaSYAEj0hlzxa1mUB6VqrKaYx0QxGBLZzU4xWFxaSyGaXxsSE4OSOwdU24j0xl8OajgayqFXW0l2bkl2kg==", + "dependencies": { + "@inquirer/core": "^10.1.0", + "@inquirer/figures": "^1.0.8", + "@inquirer/type": "^3.0.1", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/testing": { + "version": "2.1.37", + "resolved": "https://registry.npmjs.org/@inquirer/testing/-/testing-2.1.37.tgz", + "integrity": "sha512-6QU4Xt8jM9kWEky6/JwjNJ/HvM2VfNB+G6GU8J8UJtRD+sQDGmNR4geX3iu3lYhFAaHH8XtSvBc1aG//58eUKg==", + "dependencies": { + "@inquirer/type": "^3.0.1", + "ansi-escapes": "^4.3.2", + "mute-stream": "^2.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.1.tgz", + "integrity": "sha512-+ksJMIy92sOAiAccGpcKZUc3bYO07cADnscIxHBknEm3uNts3movSmBofc1908BNy5edKscxYeAdaX1NXkHS6A==", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@ipld/dag-pb": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@ipld/dag-pb/-/dag-pb-4.1.3.tgz", + "integrity": "sha512-ueULCaaSCcD+dQga6nKiRr+RSeVgdiYiEPKVUu5iQMNYDN+9osd0KpR3UDd9uQQ+6RWuv9L34SchfEwj7YIbOA==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.1.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" + }, + "node_modules/@libp2p/interface": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@libp2p/interface/-/interface-2.2.0.tgz", + "integrity": "sha512-Pn3P5ixDggBjDyuULT0GvwdgD3JA426OqZ0e521mI7ysS+/M9Z9fp4Qcy8JrkJ45bLmIi9cgrNrefuU/Zu+bAQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@multiformats/multiaddr": "^12.2.3", + "it-pushable": "^3.2.3", + "it-stream-types": "^2.0.1", + "multiformats": "^13.1.0", + "progress-events": "^1.0.0", + "uint8arraylist": "^2.4.8" + } + }, + "node_modules/@libp2p/logger": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@libp2p/logger/-/logger-5.1.3.tgz", + "integrity": "sha512-NUVWEWGbXlBDgDE5ntdm51+ZICmaKYI8mor6KrlPeB1WXDyIFxRWIBw6uzt+HgprQJWzLTojeUEGv6OPsj95Dg==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@libp2p/interface": "^2.2.0", + "@multiformats/multiaddr": "^12.2.3", + "interface-datastore": "^8.3.0", + "multiformats": "^13.1.0", + "weald": "^1.0.2" + } + }, + "node_modules/@multiformats/dns": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@multiformats/dns/-/dns-1.0.6.tgz", + "integrity": "sha512-nt/5UqjMPtyvkG9BQYdJ4GfLK3nMqGpFZOzf4hAmIa0sJh2LlS9YKXZ4FgwBDsaHvzZqR/rUFIywIc7pkHNNuw==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@types/dns-packet": "^5.6.5", + "buffer": "^6.0.3", + "dns-packet": "^5.6.1", + "hashlru": "^2.3.0", + "p-queue": "^8.0.1", + "progress-events": "^1.0.0", + "uint8arrays": "^5.0.2" + } + }, + "node_modules/@multiformats/multiaddr": { + "version": "12.3.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.3.1.tgz", + "integrity": "sha512-yoGODQY4nIj41ENJClucS8FtBoe8w682bzbKldEQr9lSlfdHqAsRC+vpJAOBpiMwPps1tHua4kxrDmvprdhoDQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@chainsafe/is-ip": "^2.0.1", + "@chainsafe/netmask": "^2.0.0", + "@multiformats/dns": "^1.0.3", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" + } + }, + "node_modules/@multiformats/murmur3": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@multiformats/murmur3/-/murmur3-2.1.8.tgz", + "integrity": "sha512-6vId1C46ra3R1sbJUOFCZnsUIveR9oF20yhPmAFxPm0JfrX3/ZRCgP3YDrBzlGoEppOXnA9czHeYc0T9mB6hbA==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.0.0", + "murmurhash3js-revisited": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@noble/curves": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.6.0.tgz", + "integrity": "sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==", + "dependencies": { + "@noble/hashes": "1.5.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", + "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.3.tgz", + "integrity": "sha512-EzxVSkIvCFxUd4Mgm4xR9YXrcp976qVaHnqom/Tgm+vU79k4vV4eYTjmRvGfeoW8m9LVcsAy/lGjcgVegKEhLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.3.tgz", + "integrity": "sha512-LJc5pDf1wjlt9o/Giaw9Ofl+k/vLUaYsE2zeQGH85giX2F+wn/Cg8b3c5CDP3qmVmeO5NzwVUzQQxwZvC2eQKw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.3.tgz", + "integrity": "sha512-OuRysZ1Mt7wpWJ+aYKblVbJWtVn3Cy52h8nLuNSzTqSesYw1EuN6wKp5NW/4eSre3mp12gqFRXOKTcN3AI3LqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.3.tgz", + "integrity": "sha512-xW//zjJMlJs2sOrCmXdB4d0uiilZsOdlGQIC/jjmMWT47lkLLoB1nsNhPUcnoqyi5YR6I4h+FjBpILxbEy8JRg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.3.tgz", + "integrity": "sha512-58E0tIcwZ+12nK1WiLzHOD8I0d0kdrY/+o7yFVPRHuVGY3twBwzwDdTIBGRxLmyjciMYl1B/U515GJy+yn46qw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.3.tgz", + "integrity": "sha512-78fohrpcVwTLxg1ZzBMlwEimoAJmY6B+5TsyAZ3Vok7YabRBUvjYTsRXPTjGEvv/mfgVBepbW28OlMEz4w8wGA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.3.tgz", + "integrity": "sha512-h2Ay79YFXyQi+QZKo3ISZDyKaVD7uUvukEHTOft7kh00WF9mxAaxZsNs3o/eukbeKuH35jBvQqrT61fzKfAB/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.3.tgz", + "integrity": "sha512-Sv2GWmrJfRY57urktVLQ0VKZjNZGogVtASAgosDZ1aUB+ykPxSi3X1nWORL5Jk0sTIIwQiPH7iE3BMi9zGWfkg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.3.tgz", + "integrity": "sha512-FPoJBLsPW2bDNWjSrwNuTPUt30VnfM8GPGRoLCYKZpPx0xiIEdFip3dH6CqgoT0RnoGXptaNziM0WlKgBc+OWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.3.tgz", + "integrity": "sha512-TKxiOvBorYq4sUpA0JT+Fkh+l+G9DScnG5Dqx7wiiqVMiRSkzTclP35pE6eQQYjP4Gc8yEkJGea6rz4qyWhp3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.3.tgz", + "integrity": "sha512-v2M/mPvVUKVOKITa0oCFksnQQ/TqGrT+yD0184/cWHIu0LoIuYHwox0Pm3ccXEz8cEQDLk6FPKd1CCm+PlsISw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.3.tgz", + "integrity": "sha512-LdrI4Yocb1a/tFVkzmOE5WyYRgEBOyEhWYJe4gsDWDiwnjYKjNs7PS6SGlTDB7maOHF4kxevsuNBl2iOcj3b4A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.3.tgz", + "integrity": "sha512-d4wVu6SXij/jyiwPvI6C4KxdGzuZOvJ6y9VfrcleHTwo68fl8vZC5ZYHsCVPUi4tndCfMlFniWgwonQ5CUpQcA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.3.tgz", + "integrity": "sha512-/6bn6pp1fsCGEY5n3yajmzZQAh+mW4QPItbiWxs69zskBzJuheb3tNynEjL+mKOsUSFK11X4LYF2BwwXnzWleA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.3.tgz", + "integrity": "sha512-nBXOfJds8OzUT1qUreT/en3eyOXd2EH5b0wr2bVB5999qHdGKkzGzIyKYaKj02lXk6wpN71ltLIaQpu58YFBoQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.3.tgz", + "integrity": "sha512-ogfbEVQgIZOz5WPWXF2HVb6En+kWzScuxJo/WdQTqEgeyGkaa2ui5sQav9Zkr7bnNCLK48uxmmK0TySm22eiuw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.3.tgz", + "integrity": "sha512-ecE36ZBMLINqiTtSNQ1vzWc5pXLQHlf/oqGp/bSbi7iedcjcNb6QbCBNG73Euyy2C+l/fn8qKWEwxr+0SSfs3w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.3.tgz", + "integrity": "sha512-vliZLrDmYKyaUoMzEbMTg2JkerfBjn03KmAw9CykO0Zzkzoyd7o3iZNam/TpyWNjNT+Cz2iO3P9Smv2wgrR+Eg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@scure/bip32": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.5.0.tgz", + "integrity": "sha512-8EnFYkqEQdnkuGBVpCzKxyIwDCBLDVj3oiX0EKUFre/tOjL/Hqba1D6n/8RcmaQy4f95qQFrO2A8Sr6ybh4NRw==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.6.0", + "@noble/hashes": "~1.5.0", + "@scure/base": "~1.1.7" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.4.0.tgz", + "integrity": "sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.5.0", + "@scure/base": "~1.1.8" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@solidity-parser/parser": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.17.0.tgz", + "integrity": "sha512-Nko8R0/kUo391jsEHHxrGM07QFdnPGvlmox4rmH0kNiNAashItAilhy4Mv4pK5gQmW5f4sXAF58fwJbmlkGcVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@supercharge/promise-pool": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@supercharge/promise-pool/-/promise-pool-3.1.1.tgz", + "integrity": "sha512-TgCm6jVqMPv+OgD5uBNND/CkCwNDdXPQlcprtnXsWSBpTCy0q5CI6vRj+jsUiXE1xeRaKIX4UeaYJqzZBL92sg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@types/dns-packet": { + "version": "5.6.5", + "resolved": "https://registry.npmjs.org/@types/dns-packet/-/dns-packet-5.6.5.tgz", + "integrity": "sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "22.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz", + "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==", + "dependencies": { + "undici-types": "~6.19.8" + } + }, + "node_modules/@vitest/expect": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.5.tgz", + "integrity": "sha512-nZSBTW1XIdpZvEJyoP/Sy8fUg0b8od7ZpGDkTUcfJ7wz/VoZAFzFfLyxVxGFhUjJzhYqSbIpfMtl/+k/dpWa3Q==", + "dev": true, + "dependencies": { + "@vitest/spy": "2.1.5", + "@vitest/utils": "2.1.5", + "chai": "^5.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.5.tgz", + "integrity": "sha512-XYW6l3UuBmitWqSUXTNXcVBUCRytDogBsWuNXQijc00dtnU/9OqpXWp4OJroVrad/gLIomAq9aW8yWDBtMthhQ==", + "dev": true, + "dependencies": { + "@vitest/spy": "2.1.5", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.5.tgz", + "integrity": "sha512-4ZOwtk2bqG5Y6xRGHcveZVr+6txkH7M2e+nPFd6guSoN638v/1XQ0K06eOpi0ptVU/2tW/pIU4IoPotY/GZ9fw==", + "dev": true, + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.5.tgz", + "integrity": "sha512-pKHKy3uaUdh7X6p1pxOkgkVAFW7r2I818vHDthYLvUyjRfkKOU6P45PztOch4DZarWQne+VOaIMwA/erSSpB9g==", + "dev": true, + "dependencies": { + "@vitest/utils": "2.1.5", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.5.tgz", + "integrity": "sha512-zmYw47mhfdfnYbuhkQvkkzYroXUumrwWDGlMjpdUr4jBd3HZiV2w7CQHj+z7AAS4VOtWxI4Zt4bWt4/sKcoIjg==", + "dev": true, + "dependencies": { + "@vitest/pretty-format": "2.1.5", + "magic-string": "^0.30.12", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.5.tgz", + "integrity": "sha512-aWZF3P0r3w6DiYTVskOYuhBc7EMc3jvn1TkBg8ttylFFRqNN2XGD7V5a4aQdk6QiUzZQ4klNBSpCLJgWNdIiNw==", + "dev": true, + "dependencies": { + "tinyspy": "^3.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.5.tgz", + "integrity": "sha512-yfj6Yrp0Vesw2cwJbP+cl04OC+IHFsuQsrsJBL9pyGeQXE56v1UAOQco+SR55Vf1nQzfV0QJg1Qum7AaWUwwYg==", + "dev": true, + "dependencies": { + "@vitest/pretty-format": "2.1.5", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/abitype": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.6.tgz", + "integrity": "sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3 >=3.22.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/base-x": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", + "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/blockstore-core": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/blockstore-core/-/blockstore-core-5.0.2.tgz", + "integrity": "sha512-y7/BHdYLO3YCpJMg6Ue7b4Oz4FT1HWSZoHHdlsaJTsvoE8XieXb6kUCB9UkkUBDw2x4neRDwlgYBpyK77+Ro2Q==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@libp2p/logger": "^5.0.1", + "interface-blockstore": "^5.0.0", + "interface-store": "^6.0.0", + "it-drain": "^3.0.7", + "it-filter": "^3.1.1", + "it-merge": "^3.0.5", + "it-pushable": "^3.2.3", + "multiformats": "^13.2.3" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bs58": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", + "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", + "license": "MIT", + "dependencies": { + "base-x": "^4.0.0" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/catapulta-verify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/catapulta-verify/-/catapulta-verify-1.1.1.tgz", + "integrity": "sha512-VZ9pQpno1bjjZ/+7d1AbPWkOhYcZdNSova5Y1L9jj8ftdimv3JrwDTg9i0fs4I8/A/sRXK7AUb1pmL3016Cykw==", + "license": "MIT", + "bin": { + "catapulta-verify": "out/index.mjs" + }, + "peerDependencies": { + "typescript": "^5.0.0" + } + }, + "node_modules/chai": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", + "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", + "dev": true, + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "engines": { + "node": ">= 16" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dotenv": { + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.1.tgz", + "integrity": "sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "license": "MIT" + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/expect-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", + "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", + "dev": true, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-object-paths": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-object-paths/-/find-object-paths-1.1.0.tgz", + "integrity": "sha512-UJvfPQibLUOrXl76PJ49cYbXJPsU1lYX6Pw7mHVW+ahaGx6kVHiozNIQriDc/EOlSvkDa6L9GyTFXPYQsa6sGA==", + "license": "GPL-3.0-or-later" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz", + "integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==", + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/hamt-sharding": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/hamt-sharding/-/hamt-sharding-3.0.6.tgz", + "integrity": "sha512-nZeamxfymIWLpVcAN0CRrb7uVq3hCOGj9IcL6NMA6VVCVWqj+h9Jo/SmaWuS92AEDf1thmHsM5D5c70hM3j2Tg==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "sparse-array": "^1.3.1", + "uint8arrays": "^5.0.1" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/hashlru": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hashlru/-/hashlru-2.3.0.tgz", + "integrity": "sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A==", + "license": "MIT" + }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/husky": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", + "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", + "license": "MIT", + "bin": { + "husky": "lib/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/interface-blockstore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/interface-blockstore/-/interface-blockstore-5.3.1.tgz", + "integrity": "sha512-nhgrQnz6yUQEqxTFLhlOBurQOy5lWlwCpgFmZ3GTObTVTQS9RZjK/JTozY6ty9uz2lZs7VFJSqwjWAltorJ4Vw==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "interface-store": "^6.0.0", + "multiformats": "^13.2.3" + } + }, + "node_modules/interface-datastore": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/interface-datastore/-/interface-datastore-8.3.1.tgz", + "integrity": "sha512-3r0ETmHIi6HmvM5sc09QQiCD3gUfwtEM/AAChOyAd/UAKT69uk8LXfTSUBufbUIO/dU65Vj8nb9O6QjwW8vDSQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "interface-store": "^6.0.0", + "uint8arrays": "^5.1.0" + } + }, + "node_modules/interface-store": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/interface-store/-/interface-store-6.0.2.tgz", + "integrity": "sha512-KSFCXtBlNoG0hzwNa0RmhHtrdhzexp+S+UY2s0rWTBJyfdEIgn6i6Zl9otVqrcFYbYrneBT7hbmHQ8gE0C3umA==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/ipfs-unixfs": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/ipfs-unixfs/-/ipfs-unixfs-11.2.0.tgz", + "integrity": "sha512-J8FN1qM5nfrDo8sQKQwfj0+brTg1uBfZK2vY9hxci33lcl3BFrsELS9+1+4q/8tO1ASKfxZO8W3Pi2O4sVX2Lg==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "protons-runtime": "^5.5.0", + "uint8arraylist": "^2.4.8" + } + }, + "node_modules/ipfs-unixfs-importer": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/ipfs-unixfs-importer/-/ipfs-unixfs-importer-15.3.1.tgz", + "integrity": "sha512-wHCTBqNsZXLJZ9/GSr7Msb3FDXD5yXF20Y9sKyUbbqNjbvaXs3n3h1+NM/5+WrgESHfwRcJIlJtaOKafL8Ymdg==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@ipld/dag-pb": "^4.1.2", + "@multiformats/murmur3": "^2.1.8", + "hamt-sharding": "^3.0.6", + "interface-blockstore": "^5.3.0", + "interface-store": "^6.0.0", + "ipfs-unixfs": "^11.0.0", + "it-all": "^3.0.6", + "it-batch": "^3.0.6", + "it-first": "^3.0.6", + "it-parallel-batch": "^3.0.6", + "multiformats": "^13.2.3", + "progress-events": "^1.0.1", + "rabin-wasm": "^0.1.5", + "uint8arraylist": "^2.4.8", + "uint8arrays": "^5.1.0" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/isows": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", + "integrity": "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/it-all": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/it-all/-/it-all-3.0.6.tgz", + "integrity": "sha512-HXZWbxCgQZJfrv5rXvaVeaayXED8nTKx9tj9fpBhmcUJcedVZshMMMqTj0RG2+scGypb9Ut1zd1ifbf3lA8L+Q==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/it-batch": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/it-batch/-/it-batch-3.0.6.tgz", + "integrity": "sha512-pQAAlSvJ4aV6xM/6LRvkPdKSKXxS4my2fGzNUxJyAQ8ccFdxPmK1bUuF5OoeUDkcdrbs8jtsmc4DypCMrGY6sg==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/it-drain": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/it-drain/-/it-drain-3.0.7.tgz", + "integrity": "sha512-vy6S1JKjjHSIFHgBpLpD1zhkCRl3z1zYWUxE14+kAYf+BL9ssWSFImJfhl361IIcwr0ofw8etzg11VqqB+ntUA==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/it-filter": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/it-filter/-/it-filter-3.1.1.tgz", + "integrity": "sha512-TOXmVuaSkxlLp2hXKoMTra0WMZMKVFxE3vSsbIA+PbADNCBAHhjJ/lM31vBOUTddHMO34Ku++vU8T9PLlBxQtg==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "it-peekable": "^3.0.0" + } + }, + "node_modules/it-first": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/it-first/-/it-first-3.0.6.tgz", + "integrity": "sha512-ExIewyK9kXKNAplg2GMeWfgjUcfC1FnUXz/RPfAvIXby+w7U4b3//5Lic0NV03gXT8O/isj5Nmp6KiY0d45pIQ==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/it-merge": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/it-merge/-/it-merge-3.0.5.tgz", + "integrity": "sha512-2l7+mPf85pyRF5pqi0dKcA54E5Jm/2FyY5GsOaN51Ta0ipC7YZ3szuAsH8wOoB6eKY4XsU4k2X+mzPmFBMayEA==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "it-pushable": "^3.2.3" + } + }, + "node_modules/it-parallel-batch": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/it-parallel-batch/-/it-parallel-batch-3.0.6.tgz", + "integrity": "sha512-3wgiQGvMMHy65OXScrtrtmY+bJSF7P6St1AP+BU+SK83fEr8NNk/MrmJKrtB1+MahYX2a8I+pOGKDj8qVtuV0Q==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "it-batch": "^3.0.0" + } + }, + "node_modules/it-peekable": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/it-peekable/-/it-peekable-3.0.5.tgz", + "integrity": "sha512-JWQOGMt6rKiPcY30zUVMR4g6YxkpueTwHVE7CMs/aGqCf4OydM6w+7ZM3PvmO1e0TocjuR4aL8xyZWR46cTqCQ==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/it-pushable": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.2.3.tgz", + "integrity": "sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "p-defer": "^4.0.0" + } + }, + "node_modules/it-stream-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.2.tgz", + "integrity": "sha512-Rz/DEZ6Byn/r9+/SBCuJhpPATDF9D+dz5pbgSUyBsCDtza6wtNATrz/jz1gDyNanC3XdLboriHnOC925bZRBww==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lint-staged": { + "version": "15.2.10", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.10.tgz", + "integrity": "sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==", + "dependencies": { + "chalk": "~5.3.0", + "commander": "~12.1.0", + "debug": "~4.3.6", + "execa": "~8.0.1", + "lilconfig": "~3.1.2", + "listr2": "~8.2.4", + "micromatch": "~4.0.8", + "pidtree": "~0.6.0", + "string-argv": "~0.3.2", + "yaml": "~2.5.0" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/listr2": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.4.tgz", + "integrity": "sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==", + "license": "MIT", + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/loupe": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", + "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.30.13", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.13.tgz", + "integrity": "sha512-8rYBO+MsWkgjDSOvLomYnzhdwEG51olQ4zL5KXnNJWV5MNmrb4rTZdrtkhxjnD/QyZUqR/Z/XDsUs/4ej2nx0g==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/multiformats": { + "version": "13.3.1", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.3.1.tgz", + "integrity": "sha512-QxowxTNwJ3r5RMctoGA5p13w5RbRT2QDkoM+yFlqfLiioBp78nhDjnRLvmSBI9+KAqN4VdgOVWM9c0CHd86m3g==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/murmurhash3js-revisited": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz", + "integrity": "sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ox": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.1.2.tgz", + "integrity": "sha512-ak/8K0Rtphg9vnRJlbOdaX9R7cmxD2MiSthjWGaQdMk3D7hrAlDoM+6Lxn7hN52Za3vrXfZ7enfke/5WjolDww==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "^1.10.1", + "@noble/curves": "^1.6.0", + "@noble/hashes": "^1.5.0", + "@scure/bip32": "^1.5.0", + "@scure/bip39": "^1.4.0", + "abitype": "^1.0.6", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/ox/node_modules/@adraffy/ens-normalize": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz", + "integrity": "sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==", + "license": "MIT" + }, + "node_modules/p-defer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-4.0.1.tgz", + "integrity": "sha512-Mr5KC5efvAK5VUptYEIopP1bakB85k2IWXaRC0rsh1uwn1L6M0LVml8OIQ4Gudg4oyZakf7FmeRLkMMtZW1i5A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.0.1.tgz", + "integrity": "sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^6.1.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.3.tgz", + "integrity": "sha512-UJUyfKbwvr/uZSV6btANfb+0t/mOhKV/KXcCUTp8FcQI+v/0d+wXqH4htrW0E4rR6WiEO/EPvUFiV9D5OI4vlw==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-solidity": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.3.1.tgz", + "integrity": "sha512-MN4OP5I2gHAzHZG1wcuJl0FsLS3c4Cc5494bbg+6oQWBPuEamjwDvmGfFMZ6NFzsh3Efd9UUxeT7ImgjNH4ozA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@solidity-parser/parser": "^0.17.0", + "semver": "^7.5.4", + "solidity-comments-extractor": "^0.0.8" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "prettier": ">=2.3.0" + } + }, + "node_modules/progress-events": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/progress-events/-/progress-events-1.0.1.tgz", + "integrity": "sha512-MOzLIwhpt64KIVN64h1MwdKWiyKFNc/S6BoYKPIVUHFg0/eIEyBulhWCgn678v/4c0ri3FdGuzXymNCv02MUIw==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/protons-runtime": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-5.5.0.tgz", + "integrity": "sha512-EsALjF9QsrEk6gbCx3lmfHxVN0ah7nG3cY7GySD4xf4g8cr7g543zB88Foh897Sr1RQJ9yDCUsoT1i1H/cVUFA==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "uint8-varint": "^2.0.2", + "uint8arraylist": "^2.4.3", + "uint8arrays": "^5.0.1" + } + }, + "node_modules/rabin-wasm": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/rabin-wasm/-/rabin-wasm-0.1.5.tgz", + "integrity": "sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA==", + "license": "MIT", + "dependencies": { + "@assemblyscript/loader": "^0.9.4", + "bl": "^5.0.0", + "debug": "^4.3.1", + "minimist": "^1.2.5", + "node-fetch": "^2.6.1", + "readable-stream": "^3.6.0" + }, + "bin": { + "rabin-wasm": "cli/bin.js" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.27.3.tgz", + "integrity": "sha512-SLsCOnlmGt9VoZ9Ek8yBK8tAdmPHeppkw+Xa7yDlCEhDTvwYei03JlWo1fdc7YTfLZ4tD8riJCUyAgTbszk1fQ==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.27.3", + "@rollup/rollup-android-arm64": "4.27.3", + "@rollup/rollup-darwin-arm64": "4.27.3", + "@rollup/rollup-darwin-x64": "4.27.3", + "@rollup/rollup-freebsd-arm64": "4.27.3", + "@rollup/rollup-freebsd-x64": "4.27.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.27.3", + "@rollup/rollup-linux-arm-musleabihf": "4.27.3", + "@rollup/rollup-linux-arm64-gnu": "4.27.3", + "@rollup/rollup-linux-arm64-musl": "4.27.3", + "@rollup/rollup-linux-powerpc64le-gnu": "4.27.3", + "@rollup/rollup-linux-riscv64-gnu": "4.27.3", + "@rollup/rollup-linux-s390x-gnu": "4.27.3", + "@rollup/rollup-linux-x64-gnu": "4.27.3", + "@rollup/rollup-linux-x64-musl": "4.27.3", + "@rollup/rollup-win32-arm64-msvc": "4.27.3", + "@rollup/rollup-win32-ia32-msvc": "4.27.3", + "@rollup/rollup-win32-x64-msvc": "4.27.3", + "fsevents": "~2.3.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/solidity-comments-extractor": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.8.tgz", + "integrity": "sha512-htM7Vn6LhHreR+EglVMd2s+sZhcXAirB1Zlyrv5zBuTxieCvjfnRpd7iZk75m/u6NOlEyQ94C6TWbBn2cY7w8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sparse-array": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/sparse-array/-/sparse-array-1.3.2.tgz", + "integrity": "sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg==", + "license": "ISC" + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", + "dev": true + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.0.0.tgz", + "integrity": "sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true + }, + "node_modules/tinyexec": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz", + "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==", + "dev": true + }, + "node_modules/tinypool": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", + "dev": true, + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/tsx": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", + "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==", + "dependencies": { + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uint8-varint": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "uint8arraylist": "^2.0.0", + "uint8arrays": "^5.0.0" + } + }, + "node_modules/uint8arraylist": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.4.8.tgz", + "integrity": "sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "uint8arrays": "^5.0.1" + } + }, + "node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.0.0" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/viem": { + "version": "2.21.48", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.21.48.tgz", + "integrity": "sha512-/hBHyG1gdIIuiQv0z9YmzXl5eWJa0UCZGwkeuQzH2Bmg6FIEwZeEcxgiytXZydip+p2wMBFa1jdr7o5O1+mrIg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "dependencies": { + "@noble/curves": "1.6.0", + "@noble/hashes": "1.5.0", + "@scure/bip32": "1.5.0", + "@scure/bip39": "1.4.0", + "abitype": "1.0.6", + "isows": "1.0.6", + "ox": "0.1.2", + "webauthn-p256": "0.0.10", + "ws": "8.18.0" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vite": { + "version": "5.4.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", + "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.5.tgz", + "integrity": "sha512-rd0QIgx74q4S1Rd56XIiL2cYEdyWn13cunYBIuqh9mpmQr7gGS0IxXoP8R6OaZtNQQLyXSWbd4rXKYUbhFpK5w==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.7", + "es-module-lexer": "^1.5.4", + "pathe": "^1.1.2", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/vitest": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.5.tgz", + "integrity": "sha512-P4ljsdpuzRTPI/kbND2sDZ4VmieerR2c9szEZpjc+98Z9ebvnXmM5+0tHEKqYZumXqlvnmfWsjeFOjXVriDG7A==", + "dev": true, + "dependencies": { + "@vitest/expect": "2.1.5", + "@vitest/mocker": "2.1.5", + "@vitest/pretty-format": "^2.1.5", + "@vitest/runner": "2.1.5", + "@vitest/snapshot": "2.1.5", + "@vitest/spy": "2.1.5", + "@vitest/utils": "2.1.5", + "chai": "^5.1.2", + "debug": "^4.3.7", + "expect-type": "^1.1.0", + "magic-string": "^0.30.12", + "pathe": "^1.1.2", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.1", + "tinypool": "^1.0.1", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.1.5", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.1.5", + "@vitest/ui": "2.1.5", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/weald": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/weald/-/weald-1.0.4.tgz", + "integrity": "sha512-+kYTuHonJBwmFhP1Z4YQK/dGi3jAnJGCYhyODFpHK73rbxnp9lnZQj7a2m+WVgn8fXr5bJaxUpF6l8qZpPeNWQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "ms": "^3.0.0-canary.1", + "supports-color": "^9.4.0" + } + }, + "node_modules/weald/node_modules/ms": { + "version": "3.0.0-canary.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-3.0.0-canary.1.tgz", + "integrity": "sha512-kh8ARjh8rMN7Du2igDRO9QJnqCb2xYTJxyQYK7vJJS4TvLLmsbyhiKpSW+t+y26gyOyMd0riphX0GeWKU3ky5g==", + "license": "MIT", + "engines": { + "node": ">=12.13" + } + }, + "node_modules/weald/node_modules/supports-color": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", + "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/webauthn-p256": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/webauthn-p256/-/webauthn-p256-0.0.10.tgz", + "integrity": "sha512-EeYD+gmIT80YkSIDb2iWq0lq2zbHo1CxHlQTeJ+KkCILWpVy3zASH3ByD4bopzfk0uCwXxLqKGLqp2W4O28VFA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "dependencies": { + "@noble/curves": "^1.4.0", + "@noble/hashes": "^1.4.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", + "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/package.json b/package.json index a1bae94ef..1dfa02aae 100644 --- a/package.json +++ b/package.json @@ -25,22 +25,22 @@ }, "homepage": "https://github.com/bgd-labs/aave-proposals-v3#readme", "devDependencies": { - "@types/node": "^20.11.10", + "@types/node": "^22.9.0", "prettier": "3.2.5", "prettier-plugin-solidity": "1.3.1", - "vitest": "^2.0.4" + "vitest": "^2.1.5" }, "dependencies": { - "@bgd-labs/aave-address-book": "4.0.0", - "@bgd-labs/aave-cli": "^1.1.10", - "@bgd-labs/js-utils": "^1.4.2", - "@inquirer/prompts": "^3.3.0", - "@inquirer/testing": "^2.1.13", + "@bgd-labs/aave-address-book": "4.4.0", + "@bgd-labs/aave-cli": "^1.1.11", + "@bgd-labs/js-utils": "^1.4.6", + "@inquirer/prompts": "^7.1.0", + "@inquirer/testing": "^2.1.37", "catapulta-verify": "^1.1.1", "commander": "^12.1.0", "husky": "^8.0.3", - "lint-staged": "^15.2.7", - "tsx": "^4.16.3", + "lint-staged": "^15.2.10", + "tsx": "^4.19.2", "viem": "^2.18.6" }, "lint-staged": { diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 349d360c7..000000000 --- a/yarn.lock +++ /dev/null @@ -1,2213 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@adraffy/ens-normalize@^1.10.1": - version "1.11.0" - resolved "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz" - integrity sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg== - -"@ampproject/remapping@^2.3.0": - version "2.3.0" - resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz" - integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - -"@assemblyscript/loader@^0.9.4": - version "0.9.4" - resolved "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.9.4.tgz" - integrity sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA== - -"@bgd-labs/aave-address-book@4.0.0": - version "4.0.0" - resolved "https://registry.npmjs.org/@bgd-labs/aave-address-book/-/aave-address-book-4.0.0.tgz" - integrity sha512-OCeLg2Q4vL45SVU/nkBETGheYnUbbj1LvCwNR3TeI7MboESIcspoXJbiQWOeyJA6f9Uzo6+k3pa/KtK329gMww== - -"@bgd-labs/aave-address-book@^4.2.0": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@bgd-labs/aave-address-book/-/aave-address-book-4.3.1.tgz#c77943b980ba4636989ad72df65ba7d41fb5fd9c" - integrity sha512-Rg5ak/OuXgT6Q0q+CcP4GvutsTVaR6HmSsyHogkjwPgrgApg4d8GxtKHqBj9oXbNHnW5/N7piEGZc8Jd5z7G/Q== - -"@bgd-labs/aave-cli@^1.1.10": - version "1.1.10" - resolved "https://registry.yarnpkg.com/@bgd-labs/aave-cli/-/aave-cli-1.1.10.tgz#4d8084dd0fc0a57f662acd90facc8f03c33aea89" - integrity sha512-ax2qIvbMmOle24GPDqA+syJRB8SOnCOftR7UCfxZ5jT5m0RjR0AWxGGKPILfXAuCwXj0NV5Xi5Zelu2BalBAEA== - dependencies: - "@bgd-labs/aave-address-book" "^4.2.0" - "@bgd-labs/aave-v3-governance-cache" "^1.0.8" - "@bgd-labs/js-utils" "^1.4.2" - "@commander-js/extra-typings" "^11.1.0" - "@inquirer/prompts" "^3.3.2" - blockstore-core "^5.0.2" - chalk "^4.1.2" - commander "^12.1.0" - deepmerge "^4.3.1" - dotenv "^16.4.1" - find-object-paths "^1.1.0" - gray-matter "^4.0.3" - ipfs-unixfs-importer "^15.3.1" - json-bigint "^1.0.0" - viem "^2.21.32" - zod "^3.23.8" - -"@bgd-labs/aave-v3-governance-cache@^1.0.8": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@bgd-labs/aave-v3-governance-cache/-/aave-v3-governance-cache-1.0.8.tgz#7458d11ab87d0e08393220bf85847072911a35bc" - integrity sha512-niaJafgxLQcuzZ13Wo1rO5tJ8f5pE5AdWs+5/PoHMrk5Z+bm5kE59oHbIO2xpg1pCQ7IZmsxXEIIlC2c0+v/Jg== - -"@bgd-labs/js-utils@^1.4.2": - version "1.4.2" - resolved "https://registry.npmjs.org/@bgd-labs/js-utils/-/js-utils-1.4.2.tgz" - integrity sha512-hKiorNIyEApdH1w7laYQ+sGkrCGZTem9kD5Ud7YP/ZKtkoPx12FcTAp+P+JZ42BerPEqzGLZMDRJDB2ZGKeAJw== - dependencies: - "@supercharge/promise-pool" "^3.1.1" - bs58 "^5.0.0" - gray-matter "^4.0.3" - tsx "^4.7.1" - -"@chainsafe/is-ip@^2.0.1": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@chainsafe/is-ip/-/is-ip-2.0.2.tgz#7311e7403f11d8c5cfa48111f56fcecaac37c9f6" - integrity sha512-ndGqEMG1W5WkGagaqOZHpPU172AGdxr+LD15sv3WIUvT5oCFUrG1Y0CW/v2Egwj4JXEvSibaIIIqImsm98y1nA== - -"@chainsafe/netmask@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@chainsafe/netmask/-/netmask-2.0.0.tgz#0d4a75f47919f65011da4327a3845c9661f1038a" - integrity sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg== - dependencies: - "@chainsafe/is-ip" "^2.0.1" - -"@commander-js/extra-typings@^11.1.0": - version "11.1.0" - resolved "https://registry.npmjs.org/@commander-js/extra-typings/-/extra-typings-11.1.0.tgz" - integrity sha512-GuvZ38d23H+7Tz2C9DhzCepivsOsky03s5NI+KCy7ke1FNUvsJ2oO47scQ9YaGGhgjgNW5OYYNSADmbjcSoIhw== - -"@esbuild/aix-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" - integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== - -"@esbuild/android-arm64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.9.tgz#683794bdc3d27222d3eced7b74cad15979548031" - integrity sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ== - -"@esbuild/android-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" - integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== - -"@esbuild/android-arm@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.9.tgz#21a4de41f07b2af47401c601d64dfdefd056c595" - integrity sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA== - -"@esbuild/android-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" - integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== - -"@esbuild/android-x64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.9.tgz#e2d7674bc025ddc8699f0cc76cb97823bb63c252" - integrity sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA== - -"@esbuild/android-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" - integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== - -"@esbuild/darwin-arm64@0.19.9": - version "0.19.9" - resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.9.tgz" - integrity sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw== - -"@esbuild/darwin-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz" - integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== - -"@esbuild/darwin-x64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.9.tgz#8a216c66dcf51addeeb843d8cfaeff712821d12b" - integrity sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ== - -"@esbuild/darwin-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" - integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== - -"@esbuild/freebsd-arm64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.9.tgz#63d4f603e421252c3cd836b18d01545be7c6c440" - integrity sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g== - -"@esbuild/freebsd-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" - integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== - -"@esbuild/freebsd-x64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.9.tgz#a3db52595be65360eae4de1d1fa3c1afd942e1e4" - integrity sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA== - -"@esbuild/freebsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" - integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== - -"@esbuild/linux-arm64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.9.tgz#4ae5811ce9f8d7df5eb9edd9765ea9401a534f13" - integrity sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ== - -"@esbuild/linux-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" - integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== - -"@esbuild/linux-arm@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.9.tgz#9807e92cfd335f46326394805ad488e646e506f2" - integrity sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw== - -"@esbuild/linux-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" - integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== - -"@esbuild/linux-ia32@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.9.tgz#18892c10f3106652b16f9da88a0362dc95ed46c7" - integrity sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q== - -"@esbuild/linux-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" - integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== - -"@esbuild/linux-loong64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.9.tgz#dc2ebf9a125db0a1bba18c2bbfd4fbdcbcaf61c2" - integrity sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA== - -"@esbuild/linux-loong64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" - integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== - -"@esbuild/linux-mips64el@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.9.tgz#4c2f7c5d901015e3faf1563c4a89a50776cb07fd" - integrity sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw== - -"@esbuild/linux-mips64el@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" - integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== - -"@esbuild/linux-ppc64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.9.tgz#8385332713b4e7812869622163784a5633f76fc4" - integrity sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ== - -"@esbuild/linux-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" - integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== - -"@esbuild/linux-riscv64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.9.tgz#23f1db24fa761be311874f32036c06249aa20cba" - integrity sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg== - -"@esbuild/linux-riscv64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" - integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== - -"@esbuild/linux-s390x@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.9.tgz#2dffe497726b897c9f0109e774006e25b33b4fd0" - integrity sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw== - -"@esbuild/linux-s390x@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" - integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== - -"@esbuild/linux-x64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.9.tgz#ceb1d62cd830724ff5b218e5d3172a8bad59420e" - integrity sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A== - -"@esbuild/linux-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" - integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== - -"@esbuild/netbsd-x64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.9.tgz#0cbca65e9ef4d3fc41502d3e055e6f49479a8f18" - integrity sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug== - -"@esbuild/netbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" - integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== - -"@esbuild/openbsd-x64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.9.tgz#1f57adfbee09c743292c6758a3642e875bcad1cf" - integrity sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw== - -"@esbuild/openbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" - integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== - -"@esbuild/sunos-x64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.9.tgz#116be6adbd2c7479edeeb5f6ea0441002ab4cb9c" - integrity sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw== - -"@esbuild/sunos-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" - integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== - -"@esbuild/win32-arm64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.9.tgz#2be22131ab18af4693fd737b161d1ef34de8ca9d" - integrity sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg== - -"@esbuild/win32-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" - integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== - -"@esbuild/win32-ia32@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.9.tgz#e10ead5a55789b167b4225d2469324538768af7c" - integrity sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg== - -"@esbuild/win32-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" - integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== - -"@esbuild/win32-x64@0.19.9": - version "0.19.9" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.9.tgz#b2da6219b603e3fa371a78f53f5361260d0c5585" - integrity sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ== - -"@esbuild/win32-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" - integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== - -"@inquirer/checkbox@^1.5.0": - version "1.5.0" - resolved "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-1.5.0.tgz" - integrity sha512-3cKJkW1vIZAs4NaS0reFsnpAjP0azffYII4I2R7PTI7ZTMg5Y1at4vzXccOH3762b2c2L4drBhpJpf9uiaGNxA== - dependencies: - "@inquirer/core" "^5.1.1" - "@inquirer/type" "^1.1.5" - ansi-escapes "^4.3.2" - chalk "^4.1.2" - figures "^3.2.0" - -"@inquirer/checkbox@^1.5.2": - version "1.5.2" - resolved "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-1.5.2.tgz" - integrity sha512-CifrkgQjDkUkWexmgYYNyB5603HhTHI91vLFeQXh6qrTKiCMVASol01Rs1cv6LP/A2WccZSRlJKZhbaBIs/9ZA== - dependencies: - "@inquirer/core" "^6.0.0" - "@inquirer/type" "^1.1.6" - ansi-escapes "^4.3.2" - chalk "^4.1.2" - figures "^3.2.0" - -"@inquirer/confirm@^2.0.15": - version "2.0.15" - resolved "https://registry.npmjs.org/@inquirer/confirm/-/confirm-2.0.15.tgz" - integrity sha512-hj8Q/z7sQXsF0DSpLQZVDhWYGN6KLM/gNjjqGkpKwBzljbQofGjn0ueHADy4HUY+OqDHmXuwk/bY+tZyIuuB0w== - dependencies: - "@inquirer/core" "^5.1.1" - "@inquirer/type" "^1.1.5" - chalk "^4.1.2" - -"@inquirer/confirm@^2.0.17": - version "2.0.17" - resolved "https://registry.npmjs.org/@inquirer/confirm/-/confirm-2.0.17.tgz" - integrity sha512-EqzhGryzmGpy2aJf6LxJVhndxYmFs+m8cxXzf8nejb1DE3sabf6mUgBcp4J0jAUEiAcYzqmkqRr7LPFh/WdnXA== - dependencies: - "@inquirer/core" "^6.0.0" - "@inquirer/type" "^1.1.6" - chalk "^4.1.2" - -"@inquirer/core@^5.1.1": - version "5.1.1" - resolved "https://registry.npmjs.org/@inquirer/core/-/core-5.1.1.tgz" - integrity sha512-IuJyZQUg75+L5AmopgnzxYrgcU6PJKL0hoIs332G1Gv55CnmZrhG6BzNOeZ5sOsTi1YCGOopw4rYICv74ejMFg== - dependencies: - "@inquirer/type" "^1.1.5" - "@types/mute-stream" "^0.0.4" - "@types/node" "^20.9.0" - "@types/wrap-ansi" "^3.0.0" - ansi-escapes "^4.3.2" - chalk "^4.1.2" - cli-spinners "^2.9.1" - cli-width "^4.1.0" - figures "^3.2.0" - mute-stream "^1.0.0" - run-async "^3.0.0" - signal-exit "^4.1.0" - strip-ansi "^6.0.1" - wrap-ansi "^6.2.0" - -"@inquirer/core@^6.0.0": - version "6.0.0" - resolved "https://registry.npmjs.org/@inquirer/core/-/core-6.0.0.tgz" - integrity sha512-fKi63Khkisgda3ohnskNf5uZJj+zXOaBvOllHsOkdsXRA/ubQLJQrZchFFi57NKbZzkTunXiBMdvWOv71alonw== - dependencies: - "@inquirer/type" "^1.1.6" - "@types/mute-stream" "^0.0.4" - "@types/node" "^20.10.7" - "@types/wrap-ansi" "^3.0.0" - ansi-escapes "^4.3.2" - chalk "^4.1.2" - cli-spinners "^2.9.2" - cli-width "^4.1.0" - figures "^3.2.0" - mute-stream "^1.0.0" - run-async "^3.0.0" - signal-exit "^4.1.0" - strip-ansi "^6.0.1" - wrap-ansi "^6.2.0" - -"@inquirer/editor@^1.2.13": - version "1.2.13" - resolved "https://registry.npmjs.org/@inquirer/editor/-/editor-1.2.13.tgz" - integrity sha512-gBxjqt0B9GLN0j6M/tkEcmcIvB2fo9Cw0f5NRqDTkYyB9AaCzj7qvgG0onQ3GVPbMyMbbP4tWYxrBOaOdKpzNA== - dependencies: - "@inquirer/core" "^5.1.1" - "@inquirer/type" "^1.1.5" - chalk "^4.1.2" - external-editor "^3.1.0" - -"@inquirer/editor@^1.2.15": - version "1.2.15" - resolved "https://registry.npmjs.org/@inquirer/editor/-/editor-1.2.15.tgz" - integrity sha512-gQ77Ls09x5vKLVNMH9q/7xvYPT6sIs5f7URksw+a2iJZ0j48tVS6crLqm2ugG33tgXHIwiEqkytY60Zyh5GkJQ== - dependencies: - "@inquirer/core" "^6.0.0" - "@inquirer/type" "^1.1.6" - chalk "^4.1.2" - external-editor "^3.1.0" - -"@inquirer/expand@^1.1.14": - version "1.1.14" - resolved "https://registry.npmjs.org/@inquirer/expand/-/expand-1.1.14.tgz" - integrity sha512-yS6fJ8jZYAsxdxuw2c8XTFMTvMR1NxZAw3LxDaFnqh7BZ++wTQ6rSp/2gGJhMacdZ85osb+tHxjVgx7F+ilv5g== - dependencies: - "@inquirer/core" "^5.1.1" - "@inquirer/type" "^1.1.5" - chalk "^4.1.2" - figures "^3.2.0" - -"@inquirer/expand@^1.1.16": - version "1.1.16" - resolved "https://registry.npmjs.org/@inquirer/expand/-/expand-1.1.16.tgz" - integrity sha512-TGLU9egcuo+s7PxphKUCnJnpCIVY32/EwPCLLuu+gTvYiD8hZgx8Z2niNQD36sa6xcfpdLY6xXDBiL/+g1r2XQ== - dependencies: - "@inquirer/core" "^6.0.0" - "@inquirer/type" "^1.1.6" - chalk "^4.1.2" - figures "^3.2.0" - -"@inquirer/input@^1.2.14": - version "1.2.14" - resolved "https://registry.npmjs.org/@inquirer/input/-/input-1.2.14.tgz" - integrity sha512-tISLGpUKXixIQue7jypNEShrdzJoLvEvZOJ4QRsw5XTfrIYfoWFqAjMQLerGs9CzR86yAI89JR6snHmKwnNddw== - dependencies: - "@inquirer/core" "^5.1.1" - "@inquirer/type" "^1.1.5" - chalk "^4.1.2" - -"@inquirer/input@^1.2.16": - version "1.2.16" - resolved "https://registry.npmjs.org/@inquirer/input/-/input-1.2.16.tgz" - integrity sha512-Ou0LaSWvj1ni+egnyQ+NBtfM1885UwhRCMtsRt2bBO47DoC1dwtCa+ZUNgrxlnCHHF0IXsbQHYtIIjFGAavI4g== - dependencies: - "@inquirer/core" "^6.0.0" - "@inquirer/type" "^1.1.6" - chalk "^4.1.2" - -"@inquirer/password@^1.1.14": - version "1.1.14" - resolved "https://registry.npmjs.org/@inquirer/password/-/password-1.1.14.tgz" - integrity sha512-vL2BFxfMo8EvuGuZYlryiyAB3XsgtbxOcFs4H9WI9szAS/VZCAwdVqs8rqEeaAf/GV/eZOghIOYxvD91IsRWSg== - dependencies: - "@inquirer/input" "^1.2.14" - "@inquirer/type" "^1.1.5" - ansi-escapes "^4.3.2" - chalk "^4.1.2" - -"@inquirer/password@^1.1.16": - version "1.1.16" - resolved "https://registry.npmjs.org/@inquirer/password/-/password-1.1.16.tgz" - integrity sha512-aZYZVHLUXZ2gbBot+i+zOJrks1WaiI95lvZCn1sKfcw6MtSSlYC8uDX8sTzQvAsQ8epHoP84UNvAIT0KVGOGqw== - dependencies: - "@inquirer/core" "^6.0.0" - "@inquirer/type" "^1.1.6" - ansi-escapes "^4.3.2" - chalk "^4.1.2" - -"@inquirer/prompts@^3.3.0": - version "3.3.0" - resolved "https://registry.npmjs.org/@inquirer/prompts/-/prompts-3.3.0.tgz" - integrity sha512-BBCqdSnhNs+WziSIo4f/RNDu6HAj4R/Q5nMgJb5MNPFX8sJGCvj9BoALdmR0HTWXyDS7TO8euKj6W6vtqCQG7A== - dependencies: - "@inquirer/checkbox" "^1.5.0" - "@inquirer/confirm" "^2.0.15" - "@inquirer/core" "^5.1.1" - "@inquirer/editor" "^1.2.13" - "@inquirer/expand" "^1.1.14" - "@inquirer/input" "^1.2.14" - "@inquirer/password" "^1.1.14" - "@inquirer/rawlist" "^1.2.14" - "@inquirer/select" "^1.3.1" - -"@inquirer/prompts@^3.3.2": - version "3.3.2" - resolved "https://registry.npmjs.org/@inquirer/prompts/-/prompts-3.3.2.tgz" - integrity sha512-k52mOMRvTUejrqyF1h8Z07chC+sbaoaUYzzr1KrJXyj7yaX7Nrh0a9vktv8TuocRwIJOQMaj5oZEmkspEcJFYQ== - dependencies: - "@inquirer/checkbox" "^1.5.2" - "@inquirer/confirm" "^2.0.17" - "@inquirer/core" "^6.0.0" - "@inquirer/editor" "^1.2.15" - "@inquirer/expand" "^1.1.16" - "@inquirer/input" "^1.2.16" - "@inquirer/password" "^1.1.16" - "@inquirer/rawlist" "^1.2.16" - "@inquirer/select" "^1.3.3" - -"@inquirer/rawlist@^1.2.14": - version "1.2.14" - resolved "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-1.2.14.tgz" - integrity sha512-xIYmDpYgfz2XGCKubSDLKEvadkIZAKbehHdWF082AyC2I4eHK44RUfXaoOAqnbqItZq4KHXS6jDJ78F2BmQvxg== - dependencies: - "@inquirer/core" "^5.1.1" - "@inquirer/type" "^1.1.5" - chalk "^4.1.2" - -"@inquirer/rawlist@^1.2.16": - version "1.2.16" - resolved "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-1.2.16.tgz" - integrity sha512-pZ6TRg2qMwZAOZAV6TvghCtkr53dGnK29GMNQ3vMZXSNguvGqtOVc4j/h1T8kqGJFagjyfBZhUPGwNS55O5qPQ== - dependencies: - "@inquirer/core" "^6.0.0" - "@inquirer/type" "^1.1.6" - chalk "^4.1.2" - -"@inquirer/select@^1.3.1": - version "1.3.1" - resolved "https://registry.npmjs.org/@inquirer/select/-/select-1.3.1.tgz" - integrity sha512-EgOPHv7XOHEqiBwBJTyiMg9r57ySyW4oyYCumGp+pGyOaXQaLb2kTnccWI6NFd9HSi5kDJhF7YjA+3RfMQJ2JQ== - dependencies: - "@inquirer/core" "^5.1.1" - "@inquirer/type" "^1.1.5" - ansi-escapes "^4.3.2" - chalk "^4.1.2" - figures "^3.2.0" - -"@inquirer/select@^1.3.3": - version "1.3.3" - resolved "https://registry.npmjs.org/@inquirer/select/-/select-1.3.3.tgz" - integrity sha512-RzlRISXWqIKEf83FDC9ZtJ3JvuK1l7aGpretf41BCWYrvla2wU8W8MTRNMiPrPJ+1SIqrRC1nZdZ60hD9hRXLg== - dependencies: - "@inquirer/core" "^6.0.0" - "@inquirer/type" "^1.1.6" - ansi-escapes "^4.3.2" - chalk "^4.1.2" - figures "^3.2.0" - -"@inquirer/testing@^2.1.13": - version "2.1.13" - resolved "https://registry.npmjs.org/@inquirer/testing/-/testing-2.1.13.tgz" - integrity sha512-q0r3k9Gog9RJYkcsBzi4DLN9ZKApxLKddAbdRBTITOdmTiTqiTnFHgvWsXdSd+1xkRk5F/7rgiJgo0hW4xLaPQ== - dependencies: - "@inquirer/type" "^1.2.1" - "@types/mute-stream" "^0.0.4" - "@types/node" "^20.11.26" - ansi-escapes "^4.3.2" - mute-stream "^1.0.0" - strip-ansi "^6.0.1" - -"@inquirer/type@^1.1.5": - version "1.1.5" - resolved "https://registry.npmjs.org/@inquirer/type/-/type-1.1.5.tgz" - integrity sha512-wmwHvHozpPo4IZkkNtbYenem/0wnfI6hvOcGKmPEa0DwuaH5XUQzFqy6OpEpjEegZMhYIk8HDYITI16BPLtrRA== - -"@inquirer/type@^1.1.6": - version "1.1.6" - resolved "https://registry.npmjs.org/@inquirer/type/-/type-1.1.6.tgz" - integrity sha512-OCKOpn0CrFDslR8s3who7hlr823zXTb1iShGCaaWgEJFfkIV0T9aLZV2QGnOuU78IrsPYLkr3oKx9dZwwCH3Rw== - -"@inquirer/type@^1.2.1": - version "1.2.1" - resolved "https://registry.npmjs.org/@inquirer/type/-/type-1.2.1.tgz" - integrity sha512-xwMfkPAxeo8Ji/IxfUSqzRi0/+F2GIqJmpc5/thelgMGsjNZcjDDRBO9TLXT1s/hdx/mK5QbVIvgoLIFgXhTMQ== - -"@ipld/dag-pb@^4.1.2": - version "4.1.3" - resolved "https://registry.yarnpkg.com/@ipld/dag-pb/-/dag-pb-4.1.3.tgz#b572d7978fa548a3a9219f566a80884189261858" - integrity sha512-ueULCaaSCcD+dQga6nKiRr+RSeVgdiYiEPKVUu5iQMNYDN+9osd0KpR3UDd9uQQ+6RWuv9L34SchfEwj7YIbOA== - dependencies: - multiformats "^13.1.0" - -"@jridgewell/gen-mapping@^0.3.5": - version "0.3.5" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz" - integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== - dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": - version "1.5.0" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz" - integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== - -"@jridgewell/trace-mapping@^0.3.24": - version "0.3.25" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@leichtgewicht/ip-codec@^2.0.1": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" - integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== - -"@libp2p/interface@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@libp2p/interface/-/interface-2.2.0.tgz#8718c29a0cf8c82b00d2ff9b140bcec9185578a2" - integrity sha512-Pn3P5ixDggBjDyuULT0GvwdgD3JA426OqZ0e521mI7ysS+/M9Z9fp4Qcy8JrkJ45bLmIi9cgrNrefuU/Zu+bAQ== - dependencies: - "@multiformats/multiaddr" "^12.2.3" - it-pushable "^3.2.3" - it-stream-types "^2.0.1" - multiformats "^13.1.0" - progress-events "^1.0.0" - uint8arraylist "^2.4.8" - -"@libp2p/logger@^5.0.1": - version "5.1.3" - resolved "https://registry.yarnpkg.com/@libp2p/logger/-/logger-5.1.3.tgz#fca69a5de0b3a80cfc1ec039bb76f30e9e26eab7" - integrity sha512-NUVWEWGbXlBDgDE5ntdm51+ZICmaKYI8mor6KrlPeB1WXDyIFxRWIBw6uzt+HgprQJWzLTojeUEGv6OPsj95Dg== - dependencies: - "@libp2p/interface" "^2.2.0" - "@multiformats/multiaddr" "^12.2.3" - interface-datastore "^8.3.0" - multiformats "^13.1.0" - weald "^1.0.2" - -"@multiformats/dns@^1.0.3": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@multiformats/dns/-/dns-1.0.6.tgz#b8c7de11459a02a5f4e609d35d3cdb95cb6ad152" - integrity sha512-nt/5UqjMPtyvkG9BQYdJ4GfLK3nMqGpFZOzf4hAmIa0sJh2LlS9YKXZ4FgwBDsaHvzZqR/rUFIywIc7pkHNNuw== - dependencies: - "@types/dns-packet" "^5.6.5" - buffer "^6.0.3" - dns-packet "^5.6.1" - hashlru "^2.3.0" - p-queue "^8.0.1" - progress-events "^1.0.0" - uint8arrays "^5.0.2" - -"@multiformats/multiaddr@^12.2.3": - version "12.3.1" - resolved "https://registry.yarnpkg.com/@multiformats/multiaddr/-/multiaddr-12.3.1.tgz#953ceb4ae3b39125b7b2c721230ea7b398cf49fe" - integrity sha512-yoGODQY4nIj41ENJClucS8FtBoe8w682bzbKldEQr9lSlfdHqAsRC+vpJAOBpiMwPps1tHua4kxrDmvprdhoDQ== - dependencies: - "@chainsafe/is-ip" "^2.0.1" - "@chainsafe/netmask" "^2.0.0" - "@multiformats/dns" "^1.0.3" - multiformats "^13.0.0" - uint8-varint "^2.0.1" - uint8arrays "^5.0.0" - -"@multiformats/murmur3@^2.1.8": - version "2.1.8" - resolved "https://registry.yarnpkg.com/@multiformats/murmur3/-/murmur3-2.1.8.tgz#81c1c15b6391109f3febfca4b3205196615a04e9" - integrity sha512-6vId1C46ra3R1sbJUOFCZnsUIveR9oF20yhPmAFxPm0JfrX3/ZRCgP3YDrBzlGoEppOXnA9czHeYc0T9mB6hbA== - dependencies: - multiformats "^13.0.0" - murmurhash3js-revisited "^3.0.0" - -"@noble/curves@1.6.0", "@noble/curves@^1.4.0", "@noble/curves@^1.6.0", "@noble/curves@~1.6.0": - version "1.6.0" - resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.6.0.tgz" - integrity sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ== - dependencies: - "@noble/hashes" "1.5.0" - -"@noble/hashes@1.5.0", "@noble/hashes@^1.4.0", "@noble/hashes@^1.5.0", "@noble/hashes@~1.5.0": - version "1.5.0" - resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz" - integrity sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA== - -"@rollup/rollup-android-arm-eabi@4.9.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.0.tgz#0437b27edd7095d0b6d5db99d13af8157d7c58b0" - integrity sha512-+1ge/xmaJpm1KVBuIH38Z94zj9fBD+hp+/5WLaHgyY8XLq1ibxk/zj6dTXaqM2cAbYKq8jYlhHd6k05If1W5xA== - -"@rollup/rollup-android-arm64@4.9.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.0.tgz#d4c14ef9e45d5c46b8d1f611ab8124a611d5be5b" - integrity sha512-im6hUEyQ7ZfoZdNvtwgEJvBWZYauC9KVKq1w58LG2Zfz6zMd8gRrbN+xCVoqA2hv/v6fm9lp5LFGJ3za8EQH3A== - -"@rollup/rollup-darwin-arm64@4.9.0": - version "4.9.0" - resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.0.tgz" - integrity sha512-u7aTMskN6Dmg1lCT0QJ+tINRt+ntUrvVkhbPfFz4bCwRZvjItx2nJtwJnJRlKMMaQCHRjrNqHRDYvE4mBm3DlQ== - -"@rollup/rollup-darwin-x64@4.9.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.0.tgz#626d7786fe7c10b2e8533ad981b4a791fd72b9d0" - integrity sha512-8FvEl3w2ExmpcOmX5RJD0yqXcVSOqAJJUJ29Lca29Ik+3zPS1yFimr2fr5JSZ4Z5gt8/d7WqycpgkX9nocijSw== - -"@rollup/rollup-linux-arm-gnueabihf@4.9.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.0.tgz#57ece7bb1b7659a3ea2ace580a63b8f92b3161f1" - integrity sha512-lHoKYaRwd4gge+IpqJHCY+8Vc3hhdJfU6ukFnnrJasEBUvVlydP8PuwndbWfGkdgSvZhHfSEw6urrlBj0TSSfg== - -"@rollup/rollup-linux-arm64-gnu@4.9.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.0.tgz#345b276b814a5377344adc5780c4dfb7cd0e8ba9" - integrity sha512-JbEPfhndYeWHfOSeh4DOFvNXrj7ls9S/2omijVsao+LBPTPayT1uKcK3dHW3MwDJ7KO11t9m2cVTqXnTKpeaiw== - -"@rollup/rollup-linux-arm64-musl@4.9.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.0.tgz#61cc6516e6e92e2205ea1d0ac30326379b0563c8" - integrity sha512-ahqcSXLlcV2XUBM3/f/C6cRoh7NxYA/W7Yzuv4bDU1YscTFw7ay4LmD7l6OS8EMhTNvcrWGkEettL1Bhjf+B+w== - -"@rollup/rollup-linux-riscv64-gnu@4.9.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.0.tgz#e9add70ddca7bd6f685ec447ae83eb3be552f211" - integrity sha512-uwvOYNtLw8gVtrExKhdFsYHA/kotURUmZYlinH2VcQxNCQJeJXnkmWgw2hI9Xgzhgu7J9QvWiq9TtTVwWMDa+w== - -"@rollup/rollup-linux-x64-gnu@4.9.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.0.tgz#ece153613f0cf2c864dbfc2076c579da8abd51a9" - integrity sha512-m6pkSwcZZD2LCFHZX/zW2aLIISyzWLU3hrLLzQKMI12+OLEzgruTovAxY5sCZJkipklaZqPy/2bEEBNjp+Y7xg== - -"@rollup/rollup-linux-x64-musl@4.9.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.0.tgz#2d2dbdf5fbf2c19d1f3d31b8a7850b57f5799037" - integrity sha512-VFAC1RDRSbU3iOF98X42KaVicAfKf0m0OvIu8dbnqhTe26Kh6Ym9JrDulz7Hbk7/9zGc41JkV02g+p3BivOdAg== - -"@rollup/rollup-win32-arm64-msvc@4.9.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.0.tgz#bf2dbad350376e46cb77fab408bb398ad5f3648d" - integrity sha512-9jPgMvTKXARz4inw6jezMLA2ihDBvgIU9Ml01hjdVpOcMKyxFBJrn83KVQINnbeqDv0+HdO1c09hgZ8N0s820Q== - -"@rollup/rollup-win32-ia32-msvc@4.9.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.0.tgz#5c26b07f74f4054f3ecf202550100496ed2e73f3" - integrity sha512-WE4pT2kTXQN2bAv40Uog0AsV7/s9nT9HBWXAou8+++MBCnY51QS02KYtm6dQxxosKi1VIz/wZIrTQO5UP2EW+Q== - -"@rollup/rollup-win32-x64-msvc@4.9.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.0.tgz#4ea610e0c40a07a8afa2977cbf80507f41c2271c" - integrity sha512-aPP5Q5AqNGuT0tnuEkK/g4mnt3ZhheiXrDIiSVIHN9mcN21OyXDVbEMqmXPE7e2OplNLDkcvV+ZoGJa2ZImFgw== - -"@scure/base@~1.1.7", "@scure/base@~1.1.8": - version "1.1.9" - resolved "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz" - integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== - -"@scure/bip32@1.5.0", "@scure/bip32@^1.5.0": - version "1.5.0" - resolved "https://registry.npmjs.org/@scure/bip32/-/bip32-1.5.0.tgz" - integrity sha512-8EnFYkqEQdnkuGBVpCzKxyIwDCBLDVj3oiX0EKUFre/tOjL/Hqba1D6n/8RcmaQy4f95qQFrO2A8Sr6ybh4NRw== - dependencies: - "@noble/curves" "~1.6.0" - "@noble/hashes" "~1.5.0" - "@scure/base" "~1.1.7" - -"@scure/bip39@1.4.0", "@scure/bip39@^1.4.0": - version "1.4.0" - resolved "https://registry.npmjs.org/@scure/bip39/-/bip39-1.4.0.tgz" - integrity sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw== - dependencies: - "@noble/hashes" "~1.5.0" - "@scure/base" "~1.1.8" - -"@solidity-parser/parser@^0.17.0": - version "0.17.0" - resolved "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.17.0.tgz" - integrity sha512-Nko8R0/kUo391jsEHHxrGM07QFdnPGvlmox4rmH0kNiNAashItAilhy4Mv4pK5gQmW5f4sXAF58fwJbmlkGcVw== - -"@supercharge/promise-pool@^3.1.1": - version "3.1.1" - resolved "https://registry.npmjs.org/@supercharge/promise-pool/-/promise-pool-3.1.1.tgz" - integrity sha512-TgCm6jVqMPv+OgD5uBNND/CkCwNDdXPQlcprtnXsWSBpTCy0q5CI6vRj+jsUiXE1xeRaKIX4UeaYJqzZBL92sg== - -"@types/dns-packet@^5.6.5": - version "5.6.5" - resolved "https://registry.yarnpkg.com/@types/dns-packet/-/dns-packet-5.6.5.tgz#49fc29a40f5d30227ed028fa1ee82601d3745e15" - integrity sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q== - dependencies: - "@types/node" "*" - -"@types/estree@^1.0.0": - version "1.0.5" - resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz" - integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== - -"@types/mute-stream@^0.0.4": - version "0.0.4" - resolved "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz" - integrity sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow== - dependencies: - "@types/node" "*" - -"@types/node@*", "@types/node@^20.10.7", "@types/node@^20.11.10", "@types/node@^20.9.0": - version "20.11.10" - resolved "https://registry.npmjs.org/@types/node/-/node-20.11.10.tgz" - integrity sha512-rZEfe/hJSGYmdfX9tvcPMYeYPW2sNl50nsw4jZmRcaG0HIAb0WYEpsB05GOb53vjqpyE9GUhlDQ4jLSoB5q9kg== - dependencies: - undici-types "~5.26.4" - -"@types/node@^20.11.26": - version "20.11.30" - resolved "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz" - integrity sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw== - dependencies: - undici-types "~5.26.4" - -"@types/wrap-ansi@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz" - integrity sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g== - -"@vitest/expect@2.0.4": - version "2.0.4" - resolved "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.4.tgz" - integrity sha512-39jr5EguIoanChvBqe34I8m1hJFI4+jxvdOpD7gslZrVQBKhh8H9eD7J/LJX4zakrw23W+dITQTDqdt43xVcJw== - dependencies: - "@vitest/spy" "2.0.4" - "@vitest/utils" "2.0.4" - chai "^5.1.1" - tinyrainbow "^1.2.0" - -"@vitest/pretty-format@2.0.4", "@vitest/pretty-format@^2.0.4": - version "2.0.4" - resolved "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.4.tgz" - integrity sha512-RYZl31STbNGqf4l2eQM1nvKPXE0NhC6Eq0suTTePc4mtMQ1Fn8qZmjV4emZdEdG2NOWGKSCrHZjmTqDCDoeFBw== - dependencies: - tinyrainbow "^1.2.0" - -"@vitest/runner@2.0.4": - version "2.0.4" - resolved "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.4.tgz" - integrity sha512-Gk+9Su/2H2zNfNdeJR124gZckd5st4YoSuhF1Rebi37qTXKnqYyFCd9KP4vl2cQHbtuVKjfEKrNJxHHCW8thbQ== - dependencies: - "@vitest/utils" "2.0.4" - pathe "^1.1.2" - -"@vitest/snapshot@2.0.4": - version "2.0.4" - resolved "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.4.tgz" - integrity sha512-or6Mzoz/pD7xTvuJMFYEtso1vJo1S5u6zBTinfl+7smGUhqybn6VjzCDMhmTyVOFWwkCMuNjmNNxnyXPgKDoPw== - dependencies: - "@vitest/pretty-format" "2.0.4" - magic-string "^0.30.10" - pathe "^1.1.2" - -"@vitest/spy@2.0.4": - version "2.0.4" - resolved "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.4.tgz" - integrity sha512-uTXU56TNoYrTohb+6CseP8IqNwlNdtPwEO0AWl+5j7NelS6x0xZZtP0bDWaLvOfUbaYwhhWp1guzXUxkC7mW7Q== - dependencies: - tinyspy "^3.0.0" - -"@vitest/utils@2.0.4": - version "2.0.4" - resolved "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.4.tgz" - integrity sha512-Zc75QuuoJhOBnlo99ZVUkJIuq4Oj0zAkrQ2VzCqNCx6wAwViHEh5Fnp4fiJTE9rA+sAoXRf00Z9xGgfEzV6fzQ== - dependencies: - "@vitest/pretty-format" "2.0.4" - estree-walker "^3.0.3" - loupe "^3.1.1" - tinyrainbow "^1.2.0" - -abitype@1.0.6, abitype@^1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/abitype/-/abitype-1.0.6.tgz" - integrity sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A== - -ansi-escapes@^4.3.2: - version "4.3.2" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-escapes@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz" - integrity sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw== - dependencies: - environment "^1.0.0" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^6.0.0, ansi-styles@^6.2.1: - version "6.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -assertion-error@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz" - integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== - -base-x@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz" - integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -bignumber.js@^9.0.0: - version "9.1.2" - resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz" - integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== - -bl@^5.0.0: - version "5.1.0" - resolved "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz" - integrity sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ== - dependencies: - buffer "^6.0.3" - inherits "^2.0.4" - readable-stream "^3.4.0" - -blockstore-core@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/blockstore-core/-/blockstore-core-5.0.2.tgz#c29e00bdbae121d31b5fed50e64afa549237ec9a" - integrity sha512-y7/BHdYLO3YCpJMg6Ue7b4Oz4FT1HWSZoHHdlsaJTsvoE8XieXb6kUCB9UkkUBDw2x4neRDwlgYBpyK77+Ro2Q== - dependencies: - "@libp2p/logger" "^5.0.1" - interface-blockstore "^5.0.0" - interface-store "^6.0.0" - it-drain "^3.0.7" - it-filter "^3.1.1" - it-merge "^3.0.5" - it-pushable "^3.2.3" - multiformats "^13.2.3" - -braces@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -bs58@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz" - integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== - dependencies: - base-x "^4.0.0" - -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -cac@^6.7.14: - version "6.7.14" - resolved "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz" - integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== - -catapulta-verify@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/catapulta-verify/-/catapulta-verify-1.1.1.tgz" - integrity sha512-VZ9pQpno1bjjZ/+7d1AbPWkOhYcZdNSova5Y1L9jj8ftdimv3JrwDTg9i0fs4I8/A/sRXK7AUb1pmL3016Cykw== - -chai@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz" - integrity sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA== - dependencies: - assertion-error "^2.0.1" - check-error "^2.1.1" - deep-eql "^5.0.1" - loupe "^3.1.0" - pathval "^2.0.0" - -chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@~5.3.0: - version "5.3.0" - resolved "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz" - integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -check-error@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz" - integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== - -cli-cursor@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz" - integrity sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw== - dependencies: - restore-cursor "^5.0.0" - -cli-spinners@^2.9.1, cli-spinners@^2.9.2: - version "2.9.2" - resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz" - integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== - -cli-truncate@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz" - integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== - dependencies: - slice-ansi "^5.0.0" - string-width "^7.0.0" - -cli-width@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz" - integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colorette@^2.0.20: - version "2.0.20" - resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - -commander@^12.1.0, commander@~12.1.0: - version "12.1.0" - resolved "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz" - integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== - -cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -debug@^4.3.1, debug@^4.3.5, debug@~4.3.4: - version "4.3.6" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz" - integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== - dependencies: - ms "2.1.2" - -deep-eql@^5.0.1: - version "5.0.2" - resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz" - integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== - -deepmerge@^4.3.1: - version "4.3.1" - resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -dns-packet@^5.6.1: - version "5.6.1" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" - integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== - dependencies: - "@leichtgewicht/ip-codec" "^2.0.1" - -dotenv@^16.4.1: - version "16.4.1" - resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.4.1.tgz" - integrity sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ== - -emoji-regex@^10.3.0: - version "10.3.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz" - integrity sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -environment@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz" - integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== - -esbuild@^0.19.3: - version "0.19.9" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.19.9.tgz" - integrity sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg== - optionalDependencies: - "@esbuild/android-arm" "0.19.9" - "@esbuild/android-arm64" "0.19.9" - "@esbuild/android-x64" "0.19.9" - "@esbuild/darwin-arm64" "0.19.9" - "@esbuild/darwin-x64" "0.19.9" - "@esbuild/freebsd-arm64" "0.19.9" - "@esbuild/freebsd-x64" "0.19.9" - "@esbuild/linux-arm" "0.19.9" - "@esbuild/linux-arm64" "0.19.9" - "@esbuild/linux-ia32" "0.19.9" - "@esbuild/linux-loong64" "0.19.9" - "@esbuild/linux-mips64el" "0.19.9" - "@esbuild/linux-ppc64" "0.19.9" - "@esbuild/linux-riscv64" "0.19.9" - "@esbuild/linux-s390x" "0.19.9" - "@esbuild/linux-x64" "0.19.9" - "@esbuild/netbsd-x64" "0.19.9" - "@esbuild/openbsd-x64" "0.19.9" - "@esbuild/sunos-x64" "0.19.9" - "@esbuild/win32-arm64" "0.19.9" - "@esbuild/win32-ia32" "0.19.9" - "@esbuild/win32-x64" "0.19.9" - -esbuild@~0.21.5: - version "0.21.5" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz" - integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== - optionalDependencies: - "@esbuild/aix-ppc64" "0.21.5" - "@esbuild/android-arm" "0.21.5" - "@esbuild/android-arm64" "0.21.5" - "@esbuild/android-x64" "0.21.5" - "@esbuild/darwin-arm64" "0.21.5" - "@esbuild/darwin-x64" "0.21.5" - "@esbuild/freebsd-arm64" "0.21.5" - "@esbuild/freebsd-x64" "0.21.5" - "@esbuild/linux-arm" "0.21.5" - "@esbuild/linux-arm64" "0.21.5" - "@esbuild/linux-ia32" "0.21.5" - "@esbuild/linux-loong64" "0.21.5" - "@esbuild/linux-mips64el" "0.21.5" - "@esbuild/linux-ppc64" "0.21.5" - "@esbuild/linux-riscv64" "0.21.5" - "@esbuild/linux-s390x" "0.21.5" - "@esbuild/linux-x64" "0.21.5" - "@esbuild/netbsd-x64" "0.21.5" - "@esbuild/openbsd-x64" "0.21.5" - "@esbuild/sunos-x64" "0.21.5" - "@esbuild/win32-arm64" "0.21.5" - "@esbuild/win32-ia32" "0.21.5" - "@esbuild/win32-x64" "0.21.5" - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -estree-walker@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz" - integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== - dependencies: - "@types/estree" "^1.0.0" - -eventemitter3@5.0.1, eventemitter3@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz" - integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== - -execa@^8.0.1, execa@~8.0.1: - version "8.0.1" - resolved "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz" - integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^8.0.1" - human-signals "^5.0.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^4.1.0" - strip-final-newline "^3.0.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== - dependencies: - is-extendable "^0.1.0" - -external-editor@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -figures@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -find-object-paths@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/find-object-paths/-/find-object-paths-1.1.0.tgz" - integrity sha512-UJvfPQibLUOrXl76PJ49cYbXJPsU1lYX6Pw7mHVW+ahaGx6kVHiozNIQriDc/EOlSvkDa6L9GyTFXPYQsa6sGA== - -fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -get-east-asian-width@^1.0.0: - version "1.2.0" - resolved "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz" - integrity sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA== - -get-func-name@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz" - integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== - -get-stream@^8.0.1: - version "8.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz" - integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== - -get-tsconfig@^4.7.5: - version "4.7.6" - resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz" - integrity sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA== - dependencies: - resolve-pkg-maps "^1.0.0" - -gray-matter@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz" - integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== - dependencies: - js-yaml "^3.13.1" - kind-of "^6.0.2" - section-matter "^1.0.0" - strip-bom-string "^1.0.0" - -hamt-sharding@^3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/hamt-sharding/-/hamt-sharding-3.0.6.tgz#3643107a3021af66ac95684aec87b196add5ba57" - integrity sha512-nZeamxfymIWLpVcAN0CRrb7uVq3hCOGj9IcL6NMA6VVCVWqj+h9Jo/SmaWuS92AEDf1thmHsM5D5c70hM3j2Tg== - dependencies: - sparse-array "^1.3.1" - uint8arrays "^5.0.1" - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -hashlru@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/hashlru/-/hashlru-2.3.0.tgz#5dc15928b3f6961a2056416bb3a4910216fdfb51" - integrity sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A== - -human-signals@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz" - integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== - -husky@^8.0.3: - version "8.0.3" - resolved "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz" - integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== - -iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -inherits@^2.0.3, inherits@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -interface-blockstore@^5.0.0, interface-blockstore@^5.3.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/interface-blockstore/-/interface-blockstore-5.3.1.tgz#03f511431be2b8b04a536eaae8effe4565ea6536" - integrity sha512-nhgrQnz6yUQEqxTFLhlOBurQOy5lWlwCpgFmZ3GTObTVTQS9RZjK/JTozY6ty9uz2lZs7VFJSqwjWAltorJ4Vw== - dependencies: - interface-store "^6.0.0" - multiformats "^13.2.3" - -interface-datastore@^8.3.0: - version "8.3.1" - resolved "https://registry.yarnpkg.com/interface-datastore/-/interface-datastore-8.3.1.tgz#c793f990c5cf078a24a8a2ded13f7e2099a2a282" - integrity sha512-3r0ETmHIi6HmvM5sc09QQiCD3gUfwtEM/AAChOyAd/UAKT69uk8LXfTSUBufbUIO/dU65Vj8nb9O6QjwW8vDSQ== - dependencies: - interface-store "^6.0.0" - uint8arrays "^5.1.0" - -interface-store@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/interface-store/-/interface-store-6.0.2.tgz#1746a1ee07634f7678b3aa778738b79e3f75c909" - integrity sha512-KSFCXtBlNoG0hzwNa0RmhHtrdhzexp+S+UY2s0rWTBJyfdEIgn6i6Zl9otVqrcFYbYrneBT7hbmHQ8gE0C3umA== - -ipfs-unixfs-importer@^15.3.1: - version "15.3.1" - resolved "https://registry.yarnpkg.com/ipfs-unixfs-importer/-/ipfs-unixfs-importer-15.3.1.tgz#93cf3bad77e3fff7ee25b4ba822c1a0d2fd56b6e" - integrity sha512-wHCTBqNsZXLJZ9/GSr7Msb3FDXD5yXF20Y9sKyUbbqNjbvaXs3n3h1+NM/5+WrgESHfwRcJIlJtaOKafL8Ymdg== - dependencies: - "@ipld/dag-pb" "^4.1.2" - "@multiformats/murmur3" "^2.1.8" - hamt-sharding "^3.0.6" - interface-blockstore "^5.3.0" - interface-store "^6.0.0" - ipfs-unixfs "^11.0.0" - it-all "^3.0.6" - it-batch "^3.0.6" - it-first "^3.0.6" - it-parallel-batch "^3.0.6" - multiformats "^13.2.3" - progress-events "^1.0.1" - rabin-wasm "^0.1.5" - uint8arraylist "^2.4.8" - uint8arrays "^5.1.0" - -ipfs-unixfs@^11.0.0: - version "11.2.0" - resolved "https://registry.yarnpkg.com/ipfs-unixfs/-/ipfs-unixfs-11.2.0.tgz#a7f3d1f9bce29033f273bda124a0eb8bc0c752f6" - integrity sha512-J8FN1qM5nfrDo8sQKQwfj0+brTg1uBfZK2vY9hxci33lcl3BFrsELS9+1+4q/8tO1ASKfxZO8W3Pi2O4sVX2Lg== - dependencies: - protons-runtime "^5.5.0" - uint8arraylist "^2.4.8" - -is-extendable@^0.1.0: - version "0.1.1" - resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-fullwidth-code-point@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz" - integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== - -is-fullwidth-code-point@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz" - integrity sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA== - dependencies: - get-east-asian-width "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isows@1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz" - integrity sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw== - -it-all@^3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/it-all/-/it-all-3.0.6.tgz#30a4f922ae9ca0945b0f720d3478ae6f5b6707ab" - integrity sha512-HXZWbxCgQZJfrv5rXvaVeaayXED8nTKx9tj9fpBhmcUJcedVZshMMMqTj0RG2+scGypb9Ut1zd1ifbf3lA8L+Q== - -it-batch@^3.0.0, it-batch@^3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/it-batch/-/it-batch-3.0.6.tgz#0bcda35bf1c600e821c6d5f4d2446fe85a26ab1d" - integrity sha512-pQAAlSvJ4aV6xM/6LRvkPdKSKXxS4my2fGzNUxJyAQ8ccFdxPmK1bUuF5OoeUDkcdrbs8jtsmc4DypCMrGY6sg== - -it-drain@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/it-drain/-/it-drain-3.0.7.tgz#671a5d0220802c5bce9e68fc2b07088540fbc674" - integrity sha512-vy6S1JKjjHSIFHgBpLpD1zhkCRl3z1zYWUxE14+kAYf+BL9ssWSFImJfhl361IIcwr0ofw8etzg11VqqB+ntUA== - -it-filter@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/it-filter/-/it-filter-3.1.1.tgz#d9f55ecb26200baca41e5e330e5808b3afdfa7b7" - integrity sha512-TOXmVuaSkxlLp2hXKoMTra0WMZMKVFxE3vSsbIA+PbADNCBAHhjJ/lM31vBOUTddHMO34Ku++vU8T9PLlBxQtg== - dependencies: - it-peekable "^3.0.0" - -it-first@^3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/it-first/-/it-first-3.0.6.tgz#f532f0f36fe9bf0c291e0162b9d3375d59fe8f05" - integrity sha512-ExIewyK9kXKNAplg2GMeWfgjUcfC1FnUXz/RPfAvIXby+w7U4b3//5Lic0NV03gXT8O/isj5Nmp6KiY0d45pIQ== - -it-merge@^3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/it-merge/-/it-merge-3.0.5.tgz#2b0d1d07c825b9d20c4c2889aab8e07322fd803e" - integrity sha512-2l7+mPf85pyRF5pqi0dKcA54E5Jm/2FyY5GsOaN51Ta0ipC7YZ3szuAsH8wOoB6eKY4XsU4k2X+mzPmFBMayEA== - dependencies: - it-pushable "^3.2.3" - -it-parallel-batch@^3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/it-parallel-batch/-/it-parallel-batch-3.0.6.tgz#61487fdaca03cc34c648b3432f59e82e0c805172" - integrity sha512-3wgiQGvMMHy65OXScrtrtmY+bJSF7P6St1AP+BU+SK83fEr8NNk/MrmJKrtB1+MahYX2a8I+pOGKDj8qVtuV0Q== - dependencies: - it-batch "^3.0.0" - -it-peekable@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/it-peekable/-/it-peekable-3.0.5.tgz#63b0c750e27e2ba0c1db6d6a3496b7ef51a6547d" - integrity sha512-JWQOGMt6rKiPcY30zUVMR4g6YxkpueTwHVE7CMs/aGqCf4OydM6w+7ZM3PvmO1e0TocjuR4aL8xyZWR46cTqCQ== - -it-pushable@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/it-pushable/-/it-pushable-3.2.3.tgz#e2b80aed90cfbcd54b620c0a0785e546d4e5f334" - integrity sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg== - dependencies: - p-defer "^4.0.0" - -it-stream-types@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/it-stream-types/-/it-stream-types-2.0.2.tgz#60bbace90096796b4e6cc3bfab99cf9f2b86c152" - integrity sha512-Rz/DEZ6Byn/r9+/SBCuJhpPATDF9D+dz5pbgSUyBsCDtza6wtNATrz/jz1gDyNanC3XdLboriHnOC925bZRBww== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -json-bigint@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz" - integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== - dependencies: - bignumber.js "^9.0.0" - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -lilconfig@~3.1.1: - version "3.1.2" - resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz" - integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== - -lint-staged@^15.2.7: - version "15.2.7" - resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.7.tgz" - integrity sha512-+FdVbbCZ+yoh7E/RosSdqKJyUM2OEjTciH0TFNkawKgvFp1zbGlEC39RADg+xKBG1R4mhoH2j85myBQZ5wR+lw== - dependencies: - chalk "~5.3.0" - commander "~12.1.0" - debug "~4.3.4" - execa "~8.0.1" - lilconfig "~3.1.1" - listr2 "~8.2.1" - micromatch "~4.0.7" - pidtree "~0.6.0" - string-argv "~0.3.2" - yaml "~2.4.2" - -listr2@~8.2.1: - version "8.2.4" - resolved "https://registry.npmjs.org/listr2/-/listr2-8.2.4.tgz" - integrity sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g== - dependencies: - cli-truncate "^4.0.0" - colorette "^2.0.20" - eventemitter3 "^5.0.1" - log-update "^6.1.0" - rfdc "^1.4.1" - wrap-ansi "^9.0.0" - -log-update@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz" - integrity sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w== - dependencies: - ansi-escapes "^7.0.0" - cli-cursor "^5.0.0" - slice-ansi "^7.1.0" - strip-ansi "^7.1.0" - wrap-ansi "^9.0.0" - -loupe@^3.1.0, loupe@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz" - integrity sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw== - dependencies: - get-func-name "^2.0.1" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -magic-string@^0.30.10: - version "0.30.11" - resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz" - integrity sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -micromatch@~4.0.7: - version "4.0.7" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz" - integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - -mimic-function@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz" - integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== - -minimist@^1.2.5: - version "1.2.8" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^3.0.0-canary.1: - version "3.0.0-canary.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-3.0.0-canary.1.tgz#c7b34fbce381492fd0b345d1cf56e14d67b77b80" - integrity sha512-kh8ARjh8rMN7Du2igDRO9QJnqCb2xYTJxyQYK7vJJS4TvLLmsbyhiKpSW+t+y26gyOyMd0riphX0GeWKU3ky5g== - -multiformats@^13.0.0, multiformats@^13.1.0, multiformats@^13.2.3: - version "13.3.1" - resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-13.3.1.tgz#ea30d134b5697dcf2036ac819a17948f8a1775be" - integrity sha512-QxowxTNwJ3r5RMctoGA5p13w5RbRT2QDkoM+yFlqfLiioBp78nhDjnRLvmSBI9+KAqN4VdgOVWM9c0CHd86m3g== - -murmurhash3js-revisited@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz" - integrity sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g== - -mute-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz" - integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== - -nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== - -node-fetch@^2.6.1: - version "2.7.0" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -npm-run-path@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz" - integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== - dependencies: - path-key "^4.0.0" - -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - -onetime@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz" - integrity sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ== - dependencies: - mimic-function "^5.0.0" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -ox@0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/ox/-/ox-0.1.2.tgz" - integrity sha512-ak/8K0Rtphg9vnRJlbOdaX9R7cmxD2MiSthjWGaQdMk3D7hrAlDoM+6Lxn7hN52Za3vrXfZ7enfke/5WjolDww== - dependencies: - "@adraffy/ens-normalize" "^1.10.1" - "@noble/curves" "^1.6.0" - "@noble/hashes" "^1.5.0" - "@scure/bip32" "^1.5.0" - "@scure/bip39" "^1.4.0" - abitype "^1.0.6" - eventemitter3 "5.0.1" - -p-defer@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-4.0.1.tgz#d12c6d41420785ed0d162dbd86b71ba490f7f99e" - integrity sha512-Mr5KC5efvAK5VUptYEIopP1bakB85k2IWXaRC0rsh1uwn1L6M0LVml8OIQ4Gudg4oyZakf7FmeRLkMMtZW1i5A== - -p-queue@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-8.0.1.tgz#718b7f83836922ef213ddec263ff4223ce70bef8" - integrity sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA== - dependencies: - eventemitter3 "^5.0.1" - p-timeout "^6.1.2" - -p-timeout@^6.1.2: - version "6.1.3" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-6.1.3.tgz#9635160c4e10c7b4c3db45b7d5d26f911d9fd853" - integrity sha512-UJUyfKbwvr/uZSV6btANfb+0t/mOhKV/KXcCUTp8FcQI+v/0d+wXqH4htrW0E4rR6WiEO/EPvUFiV9D5OI4vlw== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - -pathe@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz" - integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== - -pathval@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz" - integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pidtree@~0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz" - integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== - -postcss@^8.4.32: - version "8.4.32" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz" - integrity sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -prettier-plugin-solidity@1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.3.1.tgz" - integrity sha512-MN4OP5I2gHAzHZG1wcuJl0FsLS3c4Cc5494bbg+6oQWBPuEamjwDvmGfFMZ6NFzsh3Efd9UUxeT7ImgjNH4ozA== - dependencies: - "@solidity-parser/parser" "^0.17.0" - semver "^7.5.4" - solidity-comments-extractor "^0.0.8" - -prettier@3.2.5: - version "3.2.5" - resolved "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz" - integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== - -progress-events@^1.0.0, progress-events@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/progress-events/-/progress-events-1.0.1.tgz#693b6d4153f08c1418ae3cd5fcad8596c91db7e8" - integrity sha512-MOzLIwhpt64KIVN64h1MwdKWiyKFNc/S6BoYKPIVUHFg0/eIEyBulhWCgn678v/4c0ri3FdGuzXymNCv02MUIw== - -protons-runtime@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/protons-runtime/-/protons-runtime-5.5.0.tgz#ea06d9ef843aad77ea5de3e1ebafa81b58c24570" - integrity sha512-EsALjF9QsrEk6gbCx3lmfHxVN0ah7nG3cY7GySD4xf4g8cr7g543zB88Foh897Sr1RQJ9yDCUsoT1i1H/cVUFA== - dependencies: - uint8-varint "^2.0.2" - uint8arraylist "^2.4.3" - uint8arrays "^5.0.1" - -rabin-wasm@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/rabin-wasm/-/rabin-wasm-0.1.5.tgz#5b625ca007d6a2cbc1456c78ae71d550addbc9c9" - integrity sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA== - dependencies: - "@assemblyscript/loader" "^0.9.4" - bl "^5.0.0" - debug "^4.3.1" - minimist "^1.2.5" - node-fetch "^2.6.1" - readable-stream "^3.6.0" - -readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.2" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -resolve-pkg-maps@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz" - integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== - -restore-cursor@^5.0.0: - version "5.1.0" - resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz" - integrity sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA== - dependencies: - onetime "^7.0.0" - signal-exit "^4.1.0" - -rfdc@^1.4.1: - version "1.4.1" - resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz" - integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== - -rollup@^4.2.0: - version "4.9.0" - resolved "https://registry.npmjs.org/rollup/-/rollup-4.9.0.tgz" - integrity sha512-bUHW/9N21z64gw8s6tP4c88P382Bq/L5uZDowHlHx6s/QWpjJXivIAbEw6LZthgSvlEizZBfLC4OAvWe7aoF7A== - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.9.0" - "@rollup/rollup-android-arm64" "4.9.0" - "@rollup/rollup-darwin-arm64" "4.9.0" - "@rollup/rollup-darwin-x64" "4.9.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.9.0" - "@rollup/rollup-linux-arm64-gnu" "4.9.0" - "@rollup/rollup-linux-arm64-musl" "4.9.0" - "@rollup/rollup-linux-riscv64-gnu" "4.9.0" - "@rollup/rollup-linux-x64-gnu" "4.9.0" - "@rollup/rollup-linux-x64-musl" "4.9.0" - "@rollup/rollup-win32-arm64-msvc" "4.9.0" - "@rollup/rollup-win32-ia32-msvc" "4.9.0" - "@rollup/rollup-win32-x64-msvc" "4.9.0" - fsevents "~2.3.2" - -run-async@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz" - integrity sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q== - -safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -section-matter@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz" - integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== - dependencies: - extend-shallow "^2.0.1" - kind-of "^6.0.0" - -semver@^7.5.4: - version "7.6.0" - resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -siginfo@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz" - integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== - -signal-exit@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -slice-ansi@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz" - integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== - dependencies: - ansi-styles "^6.0.0" - is-fullwidth-code-point "^4.0.0" - -slice-ansi@^7.1.0: - version "7.1.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz" - integrity sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg== - dependencies: - ansi-styles "^6.2.1" - is-fullwidth-code-point "^5.0.0" - -solidity-comments-extractor@^0.0.8: - version "0.0.8" - resolved "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.8.tgz" - integrity sha512-htM7Vn6LhHreR+EglVMd2s+sZhcXAirB1Zlyrv5zBuTxieCvjfnRpd7iZk75m/u6NOlEyQ94C6TWbBn2cY7w8g== - -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - -sparse-array@^1.3.1: - version "1.3.2" - resolved "https://registry.npmjs.org/sparse-array/-/sparse-array-1.3.2.tgz" - integrity sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stackback@0.0.2: - version "0.0.2" - resolved "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz" - integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== - -std-env@^3.7.0: - version "3.7.0" - resolved "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz" - integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== - -string-argv@~0.3.2: - version "0.3.2" - resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz" - integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== - -string-width@^4.1.0: - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/string-width/-/string-width-7.0.0.tgz" - integrity sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw== - dependencies: - emoji-regex "^10.3.0" - get-east-asian-width "^1.0.0" - strip-ansi "^7.1.0" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.1.0: - version "7.1.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-bom-string@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz" - integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== - -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^9.4.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.4.0.tgz#17bfcf686288f531db3dea3215510621ccb55954" - integrity sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw== - -tinybench@^2.8.0: - version "2.8.0" - resolved "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz" - integrity sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw== - -tinypool@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/tinypool/-/tinypool-1.0.0.tgz" - integrity sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ== - -tinyrainbow@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz" - integrity sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ== - -tinyspy@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.0.tgz" - integrity sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA== - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -tsx@^4.16.3, tsx@^4.7.1: - version "4.16.3" - resolved "https://registry.npmjs.org/tsx/-/tsx-4.16.3.tgz" - integrity sha512-MP8AEUxVnboD2rCC6kDLxnpDBNWN9k3BSVU/0/nNxgm70bPBnfn+yCKcnOsIVPQwdkbKYoFOlKjjWZWJ2XCXUg== - dependencies: - esbuild "~0.21.5" - get-tsconfig "^4.7.5" - optionalDependencies: - fsevents "~2.3.3" - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -uint8-varint@^2.0.1, uint8-varint@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/uint8-varint/-/uint8-varint-2.0.4.tgz#85be52b3849eb30f2c3640a2df8a14364180affb" - integrity sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw== - dependencies: - uint8arraylist "^2.0.0" - uint8arrays "^5.0.0" - -uint8arraylist@^2.0.0, uint8arraylist@^2.4.3, uint8arraylist@^2.4.8: - version "2.4.8" - resolved "https://registry.yarnpkg.com/uint8arraylist/-/uint8arraylist-2.4.8.tgz#5a4d17f4defd77799cb38e93fd5db0f0dceddc12" - integrity sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ== - dependencies: - uint8arrays "^5.0.1" - -uint8arrays@^5.0.0, uint8arrays@^5.0.1, uint8arrays@^5.0.2, uint8arrays@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-5.1.0.tgz#14047c9bdf825d025b7391299436e5e50e7270f1" - integrity sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww== - dependencies: - multiformats "^13.0.0" - -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -util-deprecate@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -viem@^2.18.6, viem@^2.21.32: - version "2.21.44" - resolved "https://registry.yarnpkg.com/viem/-/viem-2.21.44.tgz#793600a6afa8c0c1d62b4b819d036f833f623195" - integrity sha512-oyLTCt7OQUetQN2m9KPNgSA//MzpnQLABAyglPKh+fAypU8cTT/hC5UyLQvaYt4WPg6dkbKOxfsahV4739pu9w== - dependencies: - "@noble/curves" "1.6.0" - "@noble/hashes" "1.5.0" - "@scure/bip32" "1.5.0" - "@scure/bip39" "1.4.0" - abitype "1.0.6" - isows "1.0.6" - ox "0.1.2" - webauthn-p256 "0.0.10" - ws "8.18.0" - -vite-node@2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/vite-node/-/vite-node-2.0.4.tgz" - integrity sha512-ZpJVkxcakYtig5iakNeL7N3trufe3M6vGuzYAr4GsbCTwobDeyPJpE4cjDhhPluv8OvQCFzu2LWp6GkoKRITXA== - dependencies: - cac "^6.7.14" - debug "^4.3.5" - pathe "^1.1.2" - tinyrainbow "^1.2.0" - vite "^5.0.0" - -vite@^5.0.0: - version "5.0.8" - resolved "https://registry.npmjs.org/vite/-/vite-5.0.8.tgz" - integrity sha512-jYMALd8aeqR3yS9xlHd0OzQJndS9fH5ylVgWdB+pxTwxLKdO1pgC5Dlb398BUxpfaBxa4M9oT7j1g503Gaj5IQ== - dependencies: - esbuild "^0.19.3" - postcss "^8.4.32" - rollup "^4.2.0" - optionalDependencies: - fsevents "~2.3.3" - -vitest@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/vitest/-/vitest-2.0.4.tgz" - integrity sha512-luNLDpfsnxw5QSW4bISPe6tkxVvv5wn2BBs/PuDRkhXZ319doZyLOBr1sjfB5yCEpTiU7xCAdViM8TNVGPwoog== - dependencies: - "@ampproject/remapping" "^2.3.0" - "@vitest/expect" "2.0.4" - "@vitest/pretty-format" "^2.0.4" - "@vitest/runner" "2.0.4" - "@vitest/snapshot" "2.0.4" - "@vitest/spy" "2.0.4" - "@vitest/utils" "2.0.4" - chai "^5.1.1" - debug "^4.3.5" - execa "^8.0.1" - magic-string "^0.30.10" - pathe "^1.1.2" - std-env "^3.7.0" - tinybench "^2.8.0" - tinypool "^1.0.0" - tinyrainbow "^1.2.0" - vite "^5.0.0" - vite-node "2.0.4" - why-is-node-running "^2.3.0" - -weald@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/weald/-/weald-1.0.4.tgz#8858cf9186869deba58357ae10cf26eaada80bb0" - integrity sha512-+kYTuHonJBwmFhP1Z4YQK/dGi3jAnJGCYhyODFpHK73rbxnp9lnZQj7a2m+WVgn8fXr5bJaxUpF6l8qZpPeNWQ== - dependencies: - ms "^3.0.0-canary.1" - supports-color "^9.4.0" - -webauthn-p256@0.0.10: - version "0.0.10" - resolved "https://registry.npmjs.org/webauthn-p256/-/webauthn-p256-0.0.10.tgz" - integrity sha512-EeYD+gmIT80YkSIDb2iWq0lq2zbHo1CxHlQTeJ+KkCILWpVy3zASH3ByD4bopzfk0uCwXxLqKGLqp2W4O28VFA== - dependencies: - "@noble/curves" "^1.4.0" - "@noble/hashes" "^1.4.0" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -why-is-node-running@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz" - integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== - dependencies: - siginfo "^2.0.0" - stackback "0.0.2" - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^9.0.0: - version "9.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz" - integrity sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== - dependencies: - ansi-styles "^6.2.1" - string-width "^7.0.0" - strip-ansi "^7.1.0" - -ws@8.18.0: - version "8.18.0" - resolved "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz" - integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@~2.4.2: - version "2.4.5" - resolved "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz" - integrity sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg== - -zod@^3.23.8: - version "3.23.8" - resolved "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz" - integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== From b61496d1b5e891fab556611d37b8060cce805d32 Mon Sep 17 00:00:00 2001 From: Lukas Date: Sun, 24 Nov 2024 20:36:08 +0100 Subject: [PATCH 23/35] chore: update tooling (#527) **BREAKING CHANGES**: - updates to a new version of **catapulta-verify** which relies on etherscan api v2 and generalizes the routescan verification. Please add a `ETHERSCAN_API_KEY` without any network suffix to your `.env`. This new version should be more reliable and support a bigger set of networks. - new version of origin and `aave-cli`. Please run `npm i` to update. The new version will no longer generate IRs inside `.assets/`, but instead inline an image link, which in theory could also be embedded in aips. --- ...a040db3fc4a88618783a9156e7fb51928e1ede.svg | 1 - ...dc42930b2b94af37ef869d012c4734aedb52e6.svg | 1 - ...fe490affc1bc77fe6675127b18e9aeeb4b1404.svg | 1 - ...cfb1e84443509c42e21db9e4320c00e1db6098.svg | 1 - ...99e5ae4f4fd5b0d2565edd912a160acb2d0b78.svg | 1 - ...e6ba583d4d35e38cb678120492b2b4d52d19ea.svg | 1 - ...a0fb636d34a35d35ce67919bc0d7d2e36d3839.svg | 1 - ...1fbd79406b4b3a8c64ec79ef429f7c422d0387.svg | 1 - ...b02c78bc8b99547929074a8d98940dc76ac4e3.svg | 1 - ...7c21391c0b67eb1236e3875c882cd6115a3758.svg | 1 - ...9d5ba5e949c7896bc79e7fdd98872cb43375b0.svg | 1 - ...a3707c0ded91bbfde8953567853db55452a227.svg | 1 - ...d5ff798c0771402486c6f1ca63f2a1868d80d9.svg | 1 - ...30aea0d7ed061d9d9b0eeecb2e4835c7844ba5.svg | 1 - ...20a9e881eaa3f3def4916e47e0c330b34ab151.svg | 1 - ...7a3ee47355f466dc627787f8cd371573621162.svg | 1 - ...f72276d32ba1eeba45953b23c84ea37048e299.svg | 1 - ...bd5b9335471c83b44949206c9b2186657b836f.svg | 1 - ...92a6663aeee25254a2740f3a545f211faeacbf.svg | 1 - ...455cedf818a43aba043e71714721fd1e844501.svg | 1 - ...cdb567a41d55d63ab2bb1326ea702df0bfacf4.svg | 1 - ...c797fb2b1f421fa40a6d9a0028d1f78db71dc0.svg | 1 - ...e454df22dbd82f0c1929bc14104d54c7081a49.svg | 1 - ...3d4c8affcd41504dffeb1e9750d8e5357e2775.svg | 1 - ...a25c38caec024924773d1a5c7c63ab45c4eecf.svg | 1 - ...c705464b3515a654de9893168a1b1321feccb4.svg | 1 - ...cd89f015c573a55ccf57593f88a74f7b8bc050.svg | 1 - ...784d12784a084406c3794fbe177e93da4c3479.svg | 1 - ...faa118ed690be4e95fae01b8535036cda67e3d.svg | 1 - ...a0275265838d424840d721917e0a4e3a5d8044.svg | 1 - ...33ca939f6fc30c2fd799aaa6f59b0521c19e9f.svg | 1 - ...29e34ea67f12eea11bf5403763207eeab38cff.svg | 1 - ...77de9f9a155f6a0e47e0443845a3c9de5f6b84.svg | 1 - ...b223a18f5aad36d9f6087d1d468b4dd5ba56a1.svg | 1 - ...d51b9f960b17304a3bdcaf8922d3ae84b3c30f.svg | 1 - ...edb30554ccb68f317b952113777790df5ca547.svg | 1 - ...c7eef36a7e70a1f1b35633097516fe5e21508b.svg | 1 - ...2b4dc8236ac87f8058f121d86de1d99e029c5c.svg | 1 - ...6ebf3fa05cf980f374598b56757dbc5cae3662.svg | 1 - ...79e1c7a3e943262824d4f683059c85d91a233d.svg | 1 - .env.example | 34 +++++++++------ .github/workflows/comment.yml | 3 +- .github/workflows/test.yml | 1 - README.md | 9 ++-- ...eFactorUpdatesMidOctober_20241004_after.md | 12 +++--- ...bitrum_GHOCCIP150Upgrade_20241021_after.md | 2 - ...trum_GHOStewardV2Upgrade_20241007_after.md | 5 +++ ...eFactorUpdatesMidOctober_20241004_after.md | 2 - ...rum_UpdateLegacyGuardian_20241016_after.md | 2 - ...che_UpdateLegacyGuardian_20241016_after.md | 2 - ...WstETHToAaveV3OnBNBChain_20241030_after.md | 8 ++-- ..._IncreaseCbBTCSupplyCaps_20241004_after.md | 2 - ...eFactorUpdatesMidOctober_20241004_after.md | 2 - ...ase_UpdateLegacyGuardian_20241016_after.md | 2 - ..._AutomatedAGRSActivation_20241108_after.md | 14 ------ ...3MainnetAndLidoInstances_20241108_after.md | 6 +-- ...boardEzETHToLidoInstance_20241021_after.md | 2 +- ...tETHSlope1UoptimalUpdate_20241001_after.md | 4 +- ...V3Ethereum_AaveBGDPhase4_20241025_after.md | 14 ------ ...ateToMatchSkySavingsRate_20241022_after.md | 4 +- ...hereum_GHOCCIP150Upgrade_20241021_after.md | 2 - ...reum_GHOStewardV2Upgrade_20241007_after.md | 5 +++ ..._IncreaseCbBTCSupplyCaps_20241004_after.md | 2 - ...ateToMatchSkySavingsRate_20241016_after.md | 4 +- ...3MainnetAndLidoInstances_20241108_after.md | 4 +- ...ardRsETHToAaveV3Ethereum_20241104_after.md | 8 ++-- ...nUpdateIncentiveCampaign_20241031_after.md | 14 ------ ...ationModeOnAaveV3Mainnet_20241105_after.md | 14 ------ ...eum_UpdateLegacyGuardian_20241016_after.md | 2 - ...owRateUpdateMainInstance_20241024_after.md | 14 ------ ...eFactorUpdatesMidOctober_20241004_after.md | 2 - ...sis_UpdateLegacyGuardian_20241016_after.md | 2 - ...eFactorUpdatesMidOctober_20241004_after.md | 2 - ...ism_UpdateLegacyGuardian_20241016_after.md | 2 - ...eFactorUpdatesMidOctober_20241004_after.md | 2 - ...gon_UpdateLegacyGuardian_20241016_after.md | 2 - ...oll_UpdateLegacyGuardian_20241016_after.md | 2 - lib/aave-helpers | 2 +- package-lock.json | 43 +++++++++++-------- package.json | 6 +-- ...3Arbitrum_GHOStewardV2Upgrade_20241007.sol | 14 +++--- ...rbitrum_GHOStewardV2Upgrade_20241007.t.sol | 9 ++-- ...eV3Arbitrum_GHOCCIP150Upgrade_20241021.sol | 8 ++-- ...eV3Ethereum_GHOCCIP150Upgrade_20241021.sol | 8 ++-- src/interfaces/ILegacyProxyAdmin.sol | 16 +++++++ 85 files changed, 127 insertions(+), 232 deletions(-) delete mode 100644 .assets/02a040db3fc4a88618783a9156e7fb51928e1ede.svg delete mode 100644 .assets/03dc42930b2b94af37ef869d012c4734aedb52e6.svg delete mode 100644 .assets/0afe490affc1bc77fe6675127b18e9aeeb4b1404.svg delete mode 100644 .assets/0fcfb1e84443509c42e21db9e4320c00e1db6098.svg delete mode 100644 .assets/1899e5ae4f4fd5b0d2565edd912a160acb2d0b78.svg delete mode 100644 .assets/18e6ba583d4d35e38cb678120492b2b4d52d19ea.svg delete mode 100644 .assets/1aa0fb636d34a35d35ce67919bc0d7d2e36d3839.svg delete mode 100644 .assets/1c1fbd79406b4b3a8c64ec79ef429f7c422d0387.svg delete mode 100644 .assets/20b02c78bc8b99547929074a8d98940dc76ac4e3.svg delete mode 100644 .assets/237c21391c0b67eb1236e3875c882cd6115a3758.svg delete mode 100644 .assets/2e9d5ba5e949c7896bc79e7fdd98872cb43375b0.svg delete mode 100644 .assets/39a3707c0ded91bbfde8953567853db55452a227.svg delete mode 100644 .assets/39d5ff798c0771402486c6f1ca63f2a1868d80d9.svg delete mode 100644 .assets/3b30aea0d7ed061d9d9b0eeecb2e4835c7844ba5.svg delete mode 100644 .assets/4820a9e881eaa3f3def4916e47e0c330b34ab151.svg delete mode 100644 .assets/4f7a3ee47355f466dc627787f8cd371573621162.svg delete mode 100644 .assets/59f72276d32ba1eeba45953b23c84ea37048e299.svg delete mode 100644 .assets/5dbd5b9335471c83b44949206c9b2186657b836f.svg delete mode 100644 .assets/5e92a6663aeee25254a2740f3a545f211faeacbf.svg delete mode 100644 .assets/5f455cedf818a43aba043e71714721fd1e844501.svg delete mode 100644 .assets/75cdb567a41d55d63ab2bb1326ea702df0bfacf4.svg delete mode 100644 .assets/7bc797fb2b1f421fa40a6d9a0028d1f78db71dc0.svg delete mode 100644 .assets/7ee454df22dbd82f0c1929bc14104d54c7081a49.svg delete mode 100644 .assets/873d4c8affcd41504dffeb1e9750d8e5357e2775.svg delete mode 100644 .assets/8aa25c38caec024924773d1a5c7c63ab45c4eecf.svg delete mode 100644 .assets/8fc705464b3515a654de9893168a1b1321feccb4.svg delete mode 100644 .assets/92cd89f015c573a55ccf57593f88a74f7b8bc050.svg delete mode 100644 .assets/9c784d12784a084406c3794fbe177e93da4c3479.svg delete mode 100644 .assets/a4faa118ed690be4e95fae01b8535036cda67e3d.svg delete mode 100644 .assets/a9a0275265838d424840d721917e0a4e3a5d8044.svg delete mode 100644 .assets/ac33ca939f6fc30c2fd799aaa6f59b0521c19e9f.svg delete mode 100644 .assets/c229e34ea67f12eea11bf5403763207eeab38cff.svg delete mode 100644 .assets/c277de9f9a155f6a0e47e0443845a3c9de5f6b84.svg delete mode 100644 .assets/ceb223a18f5aad36d9f6087d1d468b4dd5ba56a1.svg delete mode 100644 .assets/d8d51b9f960b17304a3bdcaf8922d3ae84b3c30f.svg delete mode 100644 .assets/dcedb30554ccb68f317b952113777790df5ca547.svg delete mode 100644 .assets/e6c7eef36a7e70a1f1b35633097516fe5e21508b.svg delete mode 100644 .assets/ec2b4dc8236ac87f8058f121d86de1d99e029c5c.svg delete mode 100644 .assets/fb6ebf3fa05cf980f374598b56757dbc5cae3662.svg delete mode 100644 .assets/fe79e1c7a3e943262824d4f683059c85d91a233d.svg create mode 100644 diffs/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_before_AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_after.md create mode 100644 diffs/AaveV3Ethereum_GHOStewardV2Upgrade_20241007_before_AaveV3Ethereum_GHOStewardV2Upgrade_20241007_after.md create mode 100644 src/interfaces/ILegacyProxyAdmin.sol diff --git a/.assets/02a040db3fc4a88618783a9156e7fb51928e1ede.svg b/.assets/02a040db3fc4a88618783a9156e7fb51928e1ede.svg deleted file mode 100644 index db81caacb..000000000 --- a/.assets/02a040db3fc4a88618783a9156e7fb51928e1ede.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%20%40%60%80%Optimal utilization 90%Optimal utilization 90% \ No newline at end of file diff --git a/.assets/03dc42930b2b94af37ef869d012c4734aedb52e6.svg b/.assets/03dc42930b2b94af37ef869d012c4734aedb52e6.svg deleted file mode 100644 index 95de9c4ed..000000000 --- a/.assets/03dc42930b2b94af37ef869d012c4734aedb52e6.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%100%200%300%Optimal utilization 30%Optimal utilization 30% \ No newline at end of file diff --git a/.assets/0afe490affc1bc77fe6675127b18e9aeeb4b1404.svg b/.assets/0afe490affc1bc77fe6675127b18e9aeeb4b1404.svg deleted file mode 100644 index 85a5bf372..000000000 --- a/.assets/0afe490affc1bc77fe6675127b18e9aeeb4b1404.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%20%40%60%80%Optimal utilization 90%Optimal utilization 90% \ No newline at end of file diff --git a/.assets/0fcfb1e84443509c42e21db9e4320c00e1db6098.svg b/.assets/0fcfb1e84443509c42e21db9e4320c00e1db6098.svg deleted file mode 100644 index 5283877c6..000000000 --- a/.assets/0fcfb1e84443509c42e21db9e4320c00e1db6098.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 80%Optimal utilization 80% \ No newline at end of file diff --git a/.assets/1899e5ae4f4fd5b0d2565edd912a160acb2d0b78.svg b/.assets/1899e5ae4f4fd5b0d2565edd912a160acb2d0b78.svg deleted file mode 100644 index de0657eb7..000000000 --- a/.assets/1899e5ae4f4fd5b0d2565edd912a160acb2d0b78.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%20%40%60%80%Optimal utilization 80%Optimal utilization 80% \ No newline at end of file diff --git a/.assets/18e6ba583d4d35e38cb678120492b2b4d52d19ea.svg b/.assets/18e6ba583d4d35e38cb678120492b2b4d52d19ea.svg deleted file mode 100644 index db81caacb..000000000 --- a/.assets/18e6ba583d4d35e38cb678120492b2b4d52d19ea.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%20%40%60%80%Optimal utilization 90%Optimal utilization 90% \ No newline at end of file diff --git a/.assets/1aa0fb636d34a35d35ce67919bc0d7d2e36d3839.svg b/.assets/1aa0fb636d34a35d35ce67919bc0d7d2e36d3839.svg deleted file mode 100644 index f05c3fb39..000000000 --- a/.assets/1aa0fb636d34a35d35ce67919bc0d7d2e36d3839.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 90%Optimal utilization 90% \ No newline at end of file diff --git a/.assets/1c1fbd79406b4b3a8c64ec79ef429f7c422d0387.svg b/.assets/1c1fbd79406b4b3a8c64ec79ef429f7c422d0387.svg deleted file mode 100644 index d003381d1..000000000 --- a/.assets/1c1fbd79406b4b3a8c64ec79ef429f7c422d0387.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%Optimal utilization 90%Optimal utilization 90% \ No newline at end of file diff --git a/.assets/20b02c78bc8b99547929074a8d98940dc76ac4e3.svg b/.assets/20b02c78bc8b99547929074a8d98940dc76ac4e3.svg deleted file mode 100644 index bb652b1a0..000000000 --- a/.assets/20b02c78bc8b99547929074a8d98940dc76ac4e3.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 45%Optimal utilization 45% \ No newline at end of file diff --git a/.assets/237c21391c0b67eb1236e3875c882cd6115a3758.svg b/.assets/237c21391c0b67eb1236e3875c882cd6115a3758.svg deleted file mode 100644 index f1b68a17b..000000000 --- a/.assets/237c21391c0b67eb1236e3875c882cd6115a3758.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 92%Optimal utilization 92% \ No newline at end of file diff --git a/.assets/2e9d5ba5e949c7896bc79e7fdd98872cb43375b0.svg b/.assets/2e9d5ba5e949c7896bc79e7fdd98872cb43375b0.svg deleted file mode 100644 index c752baefc..000000000 --- a/.assets/2e9d5ba5e949c7896bc79e7fdd98872cb43375b0.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%2%4%Optimal utilization 99%Optimal utilization 99% \ No newline at end of file diff --git a/.assets/39a3707c0ded91bbfde8953567853db55452a227.svg b/.assets/39a3707c0ded91bbfde8953567853db55452a227.svg deleted file mode 100644 index 01584d9c0..000000000 --- a/.assets/39a3707c0ded91bbfde8953567853db55452a227.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 80%Optimal utilization 80% \ No newline at end of file diff --git a/.assets/39d5ff798c0771402486c6f1ca63f2a1868d80d9.svg b/.assets/39d5ff798c0771402486c6f1ca63f2a1868d80d9.svg deleted file mode 100644 index df2260094..000000000 --- a/.assets/39d5ff798c0771402486c6f1ca63f2a1868d80d9.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%100%200%300%Optimal utilization 45%Optimal utilization 45% \ No newline at end of file diff --git a/.assets/3b30aea0d7ed061d9d9b0eeecb2e4835c7844ba5.svg b/.assets/3b30aea0d7ed061d9d9b0eeecb2e4835c7844ba5.svg deleted file mode 100644 index 3c15ce1a6..000000000 --- a/.assets/3b30aea0d7ed061d9d9b0eeecb2e4835c7844ba5.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%100%200%300%Optimal utilization 45%Optimal utilization 45% \ No newline at end of file diff --git a/.assets/4820a9e881eaa3f3def4916e47e0c330b34ab151.svg b/.assets/4820a9e881eaa3f3def4916e47e0c330b34ab151.svg deleted file mode 100644 index 403a5e0f3..000000000 --- a/.assets/4820a9e881eaa3f3def4916e47e0c330b34ab151.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 80%Optimal utilization 80% \ No newline at end of file diff --git a/.assets/4f7a3ee47355f466dc627787f8cd371573621162.svg b/.assets/4f7a3ee47355f466dc627787f8cd371573621162.svg deleted file mode 100644 index 0bd7d00f7..000000000 --- a/.assets/4f7a3ee47355f466dc627787f8cd371573621162.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 92%Optimal utilization 92% \ No newline at end of file diff --git a/.assets/59f72276d32ba1eeba45953b23c84ea37048e299.svg b/.assets/59f72276d32ba1eeba45953b23c84ea37048e299.svg deleted file mode 100644 index f3e37f8aa..000000000 --- a/.assets/59f72276d32ba1eeba45953b23c84ea37048e299.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 92%Optimal utilization 92% \ No newline at end of file diff --git a/.assets/5dbd5b9335471c83b44949206c9b2186657b836f.svg b/.assets/5dbd5b9335471c83b44949206c9b2186657b836f.svg deleted file mode 100644 index d348fb2d6..000000000 --- a/.assets/5dbd5b9335471c83b44949206c9b2186657b836f.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 80%Optimal utilization 80% \ No newline at end of file diff --git a/.assets/5e92a6663aeee25254a2740f3a545f211faeacbf.svg b/.assets/5e92a6663aeee25254a2740f3a545f211faeacbf.svg deleted file mode 100644 index 5e7903832..000000000 --- a/.assets/5e92a6663aeee25254a2740f3a545f211faeacbf.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 80%Optimal utilization 80% \ No newline at end of file diff --git a/.assets/5f455cedf818a43aba043e71714721fd1e844501.svg b/.assets/5f455cedf818a43aba043e71714721fd1e844501.svg deleted file mode 100644 index 5dff1554b..000000000 --- a/.assets/5f455cedf818a43aba043e71714721fd1e844501.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%100%200%300%Optimal utilization 45%Optimal utilization 45% \ No newline at end of file diff --git a/.assets/75cdb567a41d55d63ab2bb1326ea702df0bfacf4.svg b/.assets/75cdb567a41d55d63ab2bb1326ea702df0bfacf4.svg deleted file mode 100644 index 0bd7d00f7..000000000 --- a/.assets/75cdb567a41d55d63ab2bb1326ea702df0bfacf4.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 92%Optimal utilization 92% \ No newline at end of file diff --git a/.assets/7bc797fb2b1f421fa40a6d9a0028d1f78db71dc0.svg b/.assets/7bc797fb2b1f421fa40a6d9a0028d1f78db71dc0.svg deleted file mode 100644 index e673fbc39..000000000 --- a/.assets/7bc797fb2b1f421fa40a6d9a0028d1f78db71dc0.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%20%40%60%80%Optimal utilization 92%Optimal utilization 92% \ No newline at end of file diff --git a/.assets/7ee454df22dbd82f0c1929bc14104d54c7081a49.svg b/.assets/7ee454df22dbd82f0c1929bc14104d54c7081a49.svg deleted file mode 100644 index 3c15ce1a6..000000000 --- a/.assets/7ee454df22dbd82f0c1929bc14104d54c7081a49.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%100%200%300%Optimal utilization 45%Optimal utilization 45% \ No newline at end of file diff --git a/.assets/873d4c8affcd41504dffeb1e9750d8e5357e2775.svg b/.assets/873d4c8affcd41504dffeb1e9750d8e5357e2775.svg deleted file mode 100644 index fc56a2cce..000000000 --- a/.assets/873d4c8affcd41504dffeb1e9750d8e5357e2775.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 90%Optimal utilization 90% \ No newline at end of file diff --git a/.assets/8aa25c38caec024924773d1a5c7c63ab45c4eecf.svg b/.assets/8aa25c38caec024924773d1a5c7c63ab45c4eecf.svg deleted file mode 100644 index 5283877c6..000000000 --- a/.assets/8aa25c38caec024924773d1a5c7c63ab45c4eecf.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 80%Optimal utilization 80% \ No newline at end of file diff --git a/.assets/8fc705464b3515a654de9893168a1b1321feccb4.svg b/.assets/8fc705464b3515a654de9893168a1b1321feccb4.svg deleted file mode 100644 index 5212f2d4a..000000000 --- a/.assets/8fc705464b3515a654de9893168a1b1321feccb4.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 45%Optimal utilization 45% \ No newline at end of file diff --git a/.assets/92cd89f015c573a55ccf57593f88a74f7b8bc050.svg b/.assets/92cd89f015c573a55ccf57593f88a74f7b8bc050.svg deleted file mode 100644 index e673fbc39..000000000 --- a/.assets/92cd89f015c573a55ccf57593f88a74f7b8bc050.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%20%40%60%80%Optimal utilization 92%Optimal utilization 92% \ No newline at end of file diff --git a/.assets/9c784d12784a084406c3794fbe177e93da4c3479.svg b/.assets/9c784d12784a084406c3794fbe177e93da4c3479.svg deleted file mode 100644 index 081891402..000000000 --- a/.assets/9c784d12784a084406c3794fbe177e93da4c3479.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%20%40%60%80%Optimal utilization 90%Optimal utilization 90% \ No newline at end of file diff --git a/.assets/a4faa118ed690be4e95fae01b8535036cda67e3d.svg b/.assets/a4faa118ed690be4e95fae01b8535036cda67e3d.svg deleted file mode 100644 index 93fde991f..000000000 --- a/.assets/a4faa118ed690be4e95fae01b8535036cda67e3d.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%150%200%Optimal utilization 80%Optimal utilization 80% \ No newline at end of file diff --git a/.assets/a9a0275265838d424840d721917e0a4e3a5d8044.svg b/.assets/a9a0275265838d424840d721917e0a4e3a5d8044.svg deleted file mode 100644 index 6af590b85..000000000 --- a/.assets/a9a0275265838d424840d721917e0a4e3a5d8044.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 90%Optimal utilization 90% \ No newline at end of file diff --git a/.assets/ac33ca939f6fc30c2fd799aaa6f59b0521c19e9f.svg b/.assets/ac33ca939f6fc30c2fd799aaa6f59b0521c19e9f.svg deleted file mode 100644 index 3c15ce1a6..000000000 --- a/.assets/ac33ca939f6fc30c2fd799aaa6f59b0521c19e9f.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%100%200%300%Optimal utilization 45%Optimal utilization 45% \ No newline at end of file diff --git a/.assets/c229e34ea67f12eea11bf5403763207eeab38cff.svg b/.assets/c229e34ea67f12eea11bf5403763207eeab38cff.svg deleted file mode 100644 index 771e3e22e..000000000 --- a/.assets/c229e34ea67f12eea11bf5403763207eeab38cff.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%20%40%60%80%Optimal utilization 90%Optimal utilization 90% \ No newline at end of file diff --git a/.assets/c277de9f9a155f6a0e47e0443845a3c9de5f6b84.svg b/.assets/c277de9f9a155f6a0e47e0443845a3c9de5f6b84.svg deleted file mode 100644 index 5212f2d4a..000000000 --- a/.assets/c277de9f9a155f6a0e47e0443845a3c9de5f6b84.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 45%Optimal utilization 45% \ No newline at end of file diff --git a/.assets/ceb223a18f5aad36d9f6087d1d468b4dd5ba56a1.svg b/.assets/ceb223a18f5aad36d9f6087d1d468b4dd5ba56a1.svg deleted file mode 100644 index 95de9c4ed..000000000 --- a/.assets/ceb223a18f5aad36d9f6087d1d468b4dd5ba56a1.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%100%200%300%Optimal utilization 30%Optimal utilization 30% \ No newline at end of file diff --git a/.assets/d8d51b9f960b17304a3bdcaf8922d3ae84b3c30f.svg b/.assets/d8d51b9f960b17304a3bdcaf8922d3ae84b3c30f.svg deleted file mode 100644 index ad84fcb3b..000000000 --- a/.assets/d8d51b9f960b17304a3bdcaf8922d3ae84b3c30f.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 80%Optimal utilization 80% \ No newline at end of file diff --git a/.assets/dcedb30554ccb68f317b952113777790df5ca547.svg b/.assets/dcedb30554ccb68f317b952113777790df5ca547.svg deleted file mode 100644 index b5810667c..000000000 --- a/.assets/dcedb30554ccb68f317b952113777790df5ca547.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%20%40%60%80%Optimal utilization 92%Optimal utilization 92% \ No newline at end of file diff --git a/.assets/e6c7eef36a7e70a1f1b35633097516fe5e21508b.svg b/.assets/e6c7eef36a7e70a1f1b35633097516fe5e21508b.svg deleted file mode 100644 index 6af590b85..000000000 --- a/.assets/e6c7eef36a7e70a1f1b35633097516fe5e21508b.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 90%Optimal utilization 90% \ No newline at end of file diff --git a/.assets/ec2b4dc8236ac87f8058f121d86de1d99e029c5c.svg b/.assets/ec2b4dc8236ac87f8058f121d86de1d99e029c5c.svg deleted file mode 100644 index f9bccbdd6..000000000 --- a/.assets/ec2b4dc8236ac87f8058f121d86de1d99e029c5c.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%100%200%300%Optimal utilization 70%Optimal utilization 70% \ No newline at end of file diff --git a/.assets/fb6ebf3fa05cf980f374598b56757dbc5cae3662.svg b/.assets/fb6ebf3fa05cf980f374598b56757dbc5cae3662.svg deleted file mode 100644 index df2260094..000000000 --- a/.assets/fb6ebf3fa05cf980f374598b56757dbc5cae3662.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%100%200%300%Optimal utilization 45%Optimal utilization 45% \ No newline at end of file diff --git a/.assets/fe79e1c7a3e943262824d4f683059c85d91a233d.svg b/.assets/fe79e1c7a3e943262824d4f683059c85d91a233d.svg deleted file mode 100644 index 5dff1554b..000000000 --- a/.assets/fe79e1c7a3e943262824d4f683059c85d91a233d.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%100%200%300%Optimal utilization 45%Optimal utilization 45% \ No newline at end of file diff --git a/.env.example b/.env.example index b437ac105..f74cb4e5d 100644 --- a/.env.example +++ b/.env.example @@ -6,22 +6,25 @@ LEDGER_SENDER= PRIVATE_KEY= # Test rpc_endpoints -RPC_MAINNET=https://eth.llamarpc.com -RPC_AVALANCHE=https://api.avax.network/ext/bc/C/rpc -RPC_OPTIMISM=https://optimism.llamarpc.com -RPC_POLYGON=https://polygon.llamarpc.com -RPC_ARBITRUM=https://arbitrum.llamarpc.com -RPC_FANTOM=https://rpc.ftm.tools -RPC_HARMONY=https://api.harmony.one -RPC_METIS=https://andromeda.metis.io/?owner=1088 -RPC_BASE=https://base.llamarpc.com -RPC_ZKEVM=https://zkevm-rpc.com -RPC_GNOSIS=https://rpc.ankr.com/gnosis -RPC_BNB=https://binance.llamarpc.com -RPC_SCROLL=https://rpc.scroll.io -RPC_ZKSYNC=https://mainnet.era.zksync.io +# To generate RPCs based on you api keys, you can use +# export ALCHEMY_API_KEY=yourAlchemyKey && npx @bgd-labs/rpc-env +RPC_MAINNET= +RPC_AVALANCHE= +RPC_OPTIMISM= +RPC_POLYGON= +RPC_ARBITRUM= +RPC_FANTOM= +RPC_HARMONY= +RPC_METIS= +RPC_BASE= +RPC_ZKEVM= +RPC_GNOSIS= +RPC_BNB= +RPC_SCROLL= +RPC_ZKSYNC= # Etherscan api keys for verification & download utils +# Dedicated api keys for each chain are required when using foundry verification ETHERSCAN_API_KEY_MAINNET= ETHERSCAN_API_KEY_POLYGON= ETHERSCAN_API_KEY_AVALANCHE= @@ -35,6 +38,9 @@ ETHERSCAN_API_KEY_BNB= ETHERSCAN_API_KEY_SCROLL= ETHERESCAN_API_KEY_ZKSYNC= +# Catapulta verify uses etherscan v2 api, therefore adding a single api key is good enough +ETHERSCAN_API_KEY= + # Simulation/fork creation TENDERLY_ACCESS_TOKEN= TENDERLY_ACCOUNT= diff --git a/.github/workflows/comment.yml b/.github/workflows/comment.yml index 0a8a422fd..2117aea36 100644 --- a/.github/workflows/comment.yml +++ b/.github/workflows/comment.yml @@ -9,4 +9,5 @@ on: jobs: test: uses: bgd-labs/github-workflows/.github/workflows/comment.yml@main - secrets: inherit + secrets: + READ_ONLY_PAT: ${{ secrets.READ_ONLY_PAT }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 79a3f5ee9..204fcb2b7 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -65,4 +65,3 @@ jobs: test-js: uses: bgd-labs/github-workflows/.github/workflows/test-node.yml@main - secrets: inherit diff --git a/README.md b/README.md index b4d97c1e1..0a7f58d80 100644 --- a/README.md +++ b/README.md @@ -107,7 +107,8 @@ If for whatever reason verification fails, there's a good chance the error is on To retry a specific verification you can follow the following steps: 1. copy verify.example.json to verify.json -2. replace the `chain` with the appropriate chainId -3. replace the `hash` with the transaction hash of the deployment transaction (make sure it's the deployment transaction, not the one registering the payload on the payloadscontroller) -4. run `FOUNDRY_PROFILE= forge build --force` -5. run `FOUNDRY_PROFILE= npx catapulta-verify -b verify.json` +2. enter an `ETHERSCAN_API_KEY` in your `.env` +3. replace the `chain` with the appropriate chainId +4. replace the `hash` with the transaction hash of the deployment transaction (make sure it's the deployment transaction, not the one registering the payload on the payloadscontroller) +5. run `FOUNDRY_PROFILE= forge build --force` +6. run `FOUNDRY_PROFILE= npx catapulta-verify -b verify.json` diff --git a/diffs/AaveV2Polygon_ReserveFactorUpdatesMidOctober_20241004_before_AaveV2Polygon_ReserveFactorUpdatesMidOctober_20241004_after.md b/diffs/AaveV2Polygon_ReserveFactorUpdatesMidOctober_20241004_before_AaveV2Polygon_ReserveFactorUpdatesMidOctober_20241004_after.md index bc459294d..48e216798 100644 --- a/diffs/AaveV2Polygon_ReserveFactorUpdatesMidOctober_20241004_before_AaveV2Polygon_ReserveFactorUpdatesMidOctober_20241004_after.md +++ b/diffs/AaveV2Polygon_ReserveFactorUpdatesMidOctober_20241004_before_AaveV2Polygon_ReserveFactorUpdatesMidOctober_20241004_after.md @@ -8,7 +8,7 @@ | --- | --- | --- | | interestRateStrategy | [0x79715aB77F637C95a8c28804F56f98946B332851](https://polygonscan.com/address/0x79715aB77F637C95a8c28804F56f98946B332851) | [0xAF5917cFc2F376eCD6c4df91C9AC5965Beaf5AfA](https://polygonscan.com/address/0xAF5917cFc2F376eCD6c4df91C9AC5965Beaf5AfA) | | variableRateSlope1 | 11.25 % | 12 % | -| interestRate | ![before](/.assets/6915e7063266167ef15bdb78b210c78b61a3ee71.svg) | ![after](/.assets/677bb3d52a3dee35bd995572dcfcda026d303815.svg) | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=112500000000000000000000000&variableRateSlope2=1340000000000000000000000000&optimalUsageRatio=480000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=undefined) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=120000000000000000000000000&variableRateSlope2=1340000000000000000000000000&optimalUsageRatio=480000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=undefined) | #### WBTC ([0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6](https://polygonscan.com/address/0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6)) @@ -16,7 +16,7 @@ | --- | --- | --- | | interestRateStrategy | [0xbbEA829b9E104733Cf69b6e96E7Ff810cBcfae38](https://polygonscan.com/address/0xbbEA829b9E104733Cf69b6e96E7Ff810cBcfae38) | [0x3465528BE493a61629234C259b62b9539817d8e7](https://polygonscan.com/address/0x3465528BE493a61629234C259b62b9539817d8e7) | | variableRateSlope1 | 9.25 % | 10 % | -| interestRate | ![before](/.assets/6650d384c2b8469b66743178da45ac5b7d37de2c.svg) | ![after](/.assets/6efc2be6d186d0f9ec95cd884ac9775e328507e7.svg) | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=92500000000000000000000000&variableRateSlope2=1340000000000000000000000000&optimalUsageRatio=370000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=undefined) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=100000000000000000000000000&variableRateSlope2=1340000000000000000000000000&optimalUsageRatio=370000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=undefined) | #### USDC ([0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174](https://polygonscan.com/address/0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174)) @@ -24,7 +24,7 @@ | --- | --- | --- | | interestRateStrategy | [0xf98258ea0C095157c2c390E9f6d914847d7fbACf](https://polygonscan.com/address/0xf98258ea0C095157c2c390E9f6d914847d7fbACf) | [0x4309B0d719a0Dfb526EE9C0E58b77635B2971cC4](https://polygonscan.com/address/0x4309B0d719a0Dfb526EE9C0E58b77635B2971cC4) | | variableRateSlope1 | 14.25 % | 15 % | -| interestRate | ![before](/.assets/dfecd97a09cb209cb661ea90b029bd58db92a066.svg) | ![after](/.assets/b747c0090de2cc213d7d5ef6dc8d35034bd6fabe.svg) | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=142500000000000000000000000&variableRateSlope2=1340000000000000000000000000&optimalUsageRatio=770000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=undefined) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=150000000000000000000000000&variableRateSlope2=1340000000000000000000000000&optimalUsageRatio=770000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=undefined) | #### WETH ([0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619](https://polygonscan.com/address/0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619)) @@ -32,7 +32,7 @@ | --- | --- | --- | | interestRateStrategy | [0x9C9f4C39952848FBA513d44B356c7855F504B1cd](https://polygonscan.com/address/0x9C9f4C39952848FBA513d44B356c7855F504B1cd) | [0xd141820D89840C9A3b0AE46c041D70B98F15928F](https://polygonscan.com/address/0xd141820D89840C9A3b0AE46c041D70B98F15928F) | | variableRateSlope1 | 9.25 % | 10 % | -| interestRate | ![before](/.assets/6f7a87524bb74b6a49faabc68d32cf5bb1e16899.svg) | ![after](/.assets/6975d921b3c041277e54308467fc64285fc75196.svg) | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=92500000000000000000000000&variableRateSlope2=1340000000000000000000000000&optimalUsageRatio=400000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=undefined) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=100000000000000000000000000&variableRateSlope2=1340000000000000000000000000&optimalUsageRatio=400000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=undefined) | #### DAI ([0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063](https://polygonscan.com/address/0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063)) @@ -40,7 +40,7 @@ | --- | --- | --- | | interestRateStrategy | [0x5c9B09Bb260BCa51f4C5476013eE5949F2C4f397](https://polygonscan.com/address/0x5c9B09Bb260BCa51f4C5476013eE5949F2C4f397) | [0xDa6b70b725404A0c6bb116B1584fb88Eb7d7ED6d](https://polygonscan.com/address/0xDa6b70b725404A0c6bb116B1584fb88Eb7d7ED6d) | | variableRateSlope1 | 14.25 % | 15 % | -| interestRate | ![before](/.assets/1cc370116b8869617805acb375f6e4ea0388878c.svg) | ![after](/.assets/fe8490c89960dd4c0d4597cb152f4ce0485c673c.svg) | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=142500000000000000000000000&variableRateSlope2=1340000000000000000000000000&optimalUsageRatio=710000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=undefined) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=150000000000000000000000000&variableRateSlope2=1340000000000000000000000000&optimalUsageRatio=710000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=undefined) | #### USDT ([0xc2132D05D31c914a87C6611C10748AEb04B58e8F](https://polygonscan.com/address/0xc2132D05D31c914a87C6611C10748AEb04B58e8F)) @@ -48,7 +48,7 @@ | --- | --- | --- | | interestRateStrategy | [0xDC220F1d8EA6910BDBbb48c4AdFb7cE565500D08](https://polygonscan.com/address/0xDC220F1d8EA6910BDBbb48c4AdFb7cE565500D08) | [0xAb85FD7DCBFdD40e822321DAc4D5fD3cf08b2542](https://polygonscan.com/address/0xAb85FD7DCBFdD40e822321DAc4D5fD3cf08b2542) | | variableRateSlope1 | 14.25 % | 15 % | -| interestRate | ![before](/.assets/97e2d5a39dbc577e317098062838a03c4c79b1a5.svg) | ![after](/.assets/91fc38e72a46271f6e68f56fa46bf6c3060ae70a.svg) | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=142500000000000000000000000&variableRateSlope2=1340000000000000000000000000&optimalUsageRatio=520000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=undefined) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=150000000000000000000000000&variableRateSlope2=1340000000000000000000000000&optimalUsageRatio=520000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=undefined) | ## Raw diff diff --git a/diffs/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021_before_AaveV3Arbitrum_GHOCCIP150Upgrade_20241021_after.md b/diffs/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021_before_AaveV3Arbitrum_GHOCCIP150Upgrade_20241021_after.md index dbd03dce4..c15d3e2bc 100644 --- a/diffs/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021_before_AaveV3Arbitrum_GHOCCIP150Upgrade_20241021_after.md +++ b/diffs/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021_before_AaveV3Arbitrum_GHOCCIP150Upgrade_20241021_after.md @@ -1,5 +1,3 @@ -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_before_AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_after.md b/diffs/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_before_AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_before_AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3Arbitrum_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Arbitrum_ReserveFactorUpdatesMidOctober_20241004_after.md b/diffs/AaveV3Arbitrum_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Arbitrum_ReserveFactorUpdatesMidOctober_20241004_after.md index fc7691ef3..b2c9dd2af 100644 --- a/diffs/AaveV3Arbitrum_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Arbitrum_ReserveFactorUpdatesMidOctober_20241004_after.md +++ b/diffs/AaveV3Arbitrum_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Arbitrum_ReserveFactorUpdatesMidOctober_20241004_after.md @@ -9,8 +9,6 @@ | reserveFactor | 45 % [4500] | 50 % [5000] | -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3Arbitrum_UpdateLegacyGuardian_20241016_before_AaveV3Arbitrum_UpdateLegacyGuardian_20241016_after.md b/diffs/AaveV3Arbitrum_UpdateLegacyGuardian_20241016_before_AaveV3Arbitrum_UpdateLegacyGuardian_20241016_after.md index dbd03dce4..c15d3e2bc 100644 --- a/diffs/AaveV3Arbitrum_UpdateLegacyGuardian_20241016_before_AaveV3Arbitrum_UpdateLegacyGuardian_20241016_after.md +++ b/diffs/AaveV3Arbitrum_UpdateLegacyGuardian_20241016_before_AaveV3Arbitrum_UpdateLegacyGuardian_20241016_after.md @@ -1,5 +1,3 @@ -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3Avalanche_UpdateLegacyGuardian_20241016_before_AaveV3Avalanche_UpdateLegacyGuardian_20241016_after.md b/diffs/AaveV3Avalanche_UpdateLegacyGuardian_20241016_before_AaveV3Avalanche_UpdateLegacyGuardian_20241016_after.md index dbd03dce4..c15d3e2bc 100644 --- a/diffs/AaveV3Avalanche_UpdateLegacyGuardian_20241016_before_AaveV3Avalanche_UpdateLegacyGuardian_20241016_after.md +++ b/diffs/AaveV3Avalanche_UpdateLegacyGuardian_20241016_before_AaveV3Avalanche_UpdateLegacyGuardian_20241016_after.md @@ -1,5 +1,3 @@ -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3BNB_OnboardWstETHToAaveV3OnBNBChain_20241030_before_AaveV3BNB_OnboardWstETHToAaveV3OnBNBChain_20241030_after.md b/diffs/AaveV3BNB_OnboardWstETHToAaveV3OnBNBChain_20241030_before_AaveV3BNB_OnboardWstETHToAaveV3OnBNBChain_20241030_after.md index 0e55ef15c..6c56cc6f8 100644 --- a/diffs/AaveV3BNB_OnboardWstETHToAaveV3OnBNBChain_20241030_before_AaveV3BNB_OnboardWstETHToAaveV3OnBNBChain_20241030_after.md +++ b/diffs/AaveV3BNB_OnboardWstETHToAaveV3OnBNBChain_20241030_before_AaveV3BNB_OnboardWstETHToAaveV3OnBNBChain_20241030_after.md @@ -70,8 +70,8 @@ "1": { "from": null, "to": { - "borrowableBitmap": 8, - "collateralBitmap": 128, + "borrowableBitmap": "8", + "collateralBitmap": "128", "eModeCategory": 1, "label": "ETH-Correlated", "liquidationBonus": 10100, @@ -108,7 +108,7 @@ "oracle": "0xc1377B4cdF9116bf7b3d7F72A4f8A7Be8506cE80", "oracleDecimals": 8, "oracleDescription": "Capped wstETH / stETH(ETH) / USD", - "oracleLatestAnswer": 317984965150, + "oracleLatestAnswer": "317984965150", "reserveFactor": 1500, "supplyCap": 1900, "symbol": "wstETH", @@ -128,7 +128,7 @@ "from": null, "to": { "address": "0x86AB1C62A8bf868E1b3E1ab87d587Aba6fbCbDC5", - "baseVariableBorrowRate": 0, + "baseVariableBorrowRate": "0", "maxVariableBorrowRate": "3070000000000000000000000000", "optimalUsageRatio": "450000000000000000000000000", "variableRateSlope1": "70000000000000000000000000", diff --git a/diffs/AaveV3Base_IncreaseCbBTCSupplyCaps_20241004_before_AaveV3Base_IncreaseCbBTCSupplyCaps_20241004_after.md b/diffs/AaveV3Base_IncreaseCbBTCSupplyCaps_20241004_before_AaveV3Base_IncreaseCbBTCSupplyCaps_20241004_after.md index 33437d01f..a1f2f6cc1 100644 --- a/diffs/AaveV3Base_IncreaseCbBTCSupplyCaps_20241004_before_AaveV3Base_IncreaseCbBTCSupplyCaps_20241004_after.md +++ b/diffs/AaveV3Base_IncreaseCbBTCSupplyCaps_20241004_before_AaveV3Base_IncreaseCbBTCSupplyCaps_20241004_after.md @@ -9,8 +9,6 @@ | supplyCap | 1,600 cbBTC | 5,000 cbBTC | -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3Base_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Base_ReserveFactorUpdatesMidOctober_20241004_after.md b/diffs/AaveV3Base_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Base_ReserveFactorUpdatesMidOctober_20241004_after.md index 7389a694c..999a5886b 100644 --- a/diffs/AaveV3Base_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Base_ReserveFactorUpdatesMidOctober_20241004_after.md +++ b/diffs/AaveV3Base_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Base_ReserveFactorUpdatesMidOctober_20241004_after.md @@ -9,8 +9,6 @@ | reserveFactor | 45 % [4500] | 50 % [5000] | -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3Base_UpdateLegacyGuardian_20241016_before_AaveV3Base_UpdateLegacyGuardian_20241016_after.md b/diffs/AaveV3Base_UpdateLegacyGuardian_20241016_before_AaveV3Base_UpdateLegacyGuardian_20241016_after.md index dbd03dce4..c15d3e2bc 100644 --- a/diffs/AaveV3Base_UpdateLegacyGuardian_20241016_before_AaveV3Base_UpdateLegacyGuardian_20241016_after.md +++ b/diffs/AaveV3Base_UpdateLegacyGuardian_20241016_before_AaveV3Base_UpdateLegacyGuardian_20241016_after.md @@ -1,5 +1,3 @@ -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3EthereumLido_AutomatedAGRSActivation_20241108_before_AaveV3EthereumLido_AutomatedAGRSActivation_20241108_after.md b/diffs/AaveV3EthereumLido_AutomatedAGRSActivation_20241108_before_AaveV3EthereumLido_AutomatedAGRSActivation_20241108_after.md index 2f4674aba..c15d3e2bc 100644 --- a/diffs/AaveV3EthereumLido_AutomatedAGRSActivation_20241108_before_AaveV3EthereumLido_AutomatedAGRSActivation_20241108_after.md +++ b/diffs/AaveV3EthereumLido_AutomatedAGRSActivation_20241108_before_AaveV3EthereumLido_AutomatedAGRSActivation_20241108_after.md @@ -1,17 +1,3 @@ -## Emodes changed - -### EMode: ETH correlated(id: 1) - - - -### EMode: LRT Stablecoins main(id: 2) - - - -### EMode: LRT wstETH main(id: 3) - - - ## Raw diff ```json diff --git a/diffs/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_before_AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_after.md b/diffs/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_before_AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_after.md index 5979e8c64..8e0549235 100644 --- a/diffs/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_before_AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_after.md +++ b/diffs/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_before_AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_after.md @@ -82,8 +82,8 @@ "4": { "from": null, "to": { - "borrowableBitmap": 12, - "collateralBitmap": 32, + "borrowableBitmap": "12", + "collateralBitmap": "32", "eModeCategory": 4, "label": "sUSDe Stablecoins", "liquidationBonus": 10300, @@ -120,7 +120,7 @@ "oracle": "0xb37aE8aBa6C0C1Bf2c509fc06E11aa4AF29B665A", "oracleDecimals": 8, "oracleDescription": "Capped sUSDe / USDe / USD", - "oracleLatestAnswer": 111869905, + "oracleLatestAnswer": "111869905", "reserveFactor": 1000, "supplyCap": 20000000, "symbol": "sUSDe", diff --git a/diffs/AaveV3EthereumLido_OnboardEzETHToLidoInstance_20241021_before_AaveV3EthereumLido_OnboardEzETHToLidoInstance_20241021_after.md b/diffs/AaveV3EthereumLido_OnboardEzETHToLidoInstance_20241021_before_AaveV3EthereumLido_OnboardEzETHToLidoInstance_20241021_after.md index 01f3b66ad..b715bb394 100644 --- a/diffs/AaveV3EthereumLido_OnboardEzETHToLidoInstance_20241021_before_AaveV3EthereumLido_OnboardEzETHToLidoInstance_20241021_after.md +++ b/diffs/AaveV3EthereumLido_OnboardEzETHToLidoInstance_20241021_before_AaveV3EthereumLido_OnboardEzETHToLidoInstance_20241021_after.md @@ -45,7 +45,7 @@ | baseVariableBorrowRate | 0 % | | variableRateSlope1 | 7 % | | variableRateSlope2 | 300 % | -| interestRate | ![ir](/.assets/3b30aea0d7ed061d9d9b0eeecb2e4835c7844ba5.svg) | +| interestRate | ![ir](https://dash.onaave.com/api/static?variableRateSlope1=70000000000000000000000000&variableRateSlope2=3000000000000000000000000000&optimalUsageRatio=450000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=3070000000000000000000000000) | ### Reserves altered diff --git a/diffs/AaveV3EthereumLido_WstETHSlope1UoptimalUpdate_20241001_before_AaveV3EthereumLido_WstETHSlope1UoptimalUpdate_20241001_after.md b/diffs/AaveV3EthereumLido_WstETHSlope1UoptimalUpdate_20241001_before_AaveV3EthereumLido_WstETHSlope1UoptimalUpdate_20241001_after.md index c6c884901..e3fd63400 100644 --- a/diffs/AaveV3EthereumLido_WstETHSlope1UoptimalUpdate_20241001_before_AaveV3EthereumLido_WstETHSlope1UoptimalUpdate_20241001_after.md +++ b/diffs/AaveV3EthereumLido_WstETHSlope1UoptimalUpdate_20241001_before_AaveV3EthereumLido_WstETHSlope1UoptimalUpdate_20241001_after.md @@ -9,9 +9,7 @@ | optimalUsageRatio | 45 % | 80 % | | maxVariableBorrowRate | 88.5 % | 87.25 % | | variableRateSlope1 | 3.5 % | 2.25 % | -| interestRate | ![before](/.assets/20b02c78bc8b99547929074a8d98940dc76ac4e3.svg) | ![after](/.assets/76125e3a0b338875aa6ae2af0ba3fb1ee003880c.svg) | - -## Emodes changes +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=35000000000000000000000000&variableRateSlope2=850000000000000000000000000&optimalUsageRatio=450000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=885000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=22500000000000000000000000&variableRateSlope2=850000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=872500000000000000000000000) | ## Raw diff diff --git a/diffs/AaveV3Ethereum_AaveBGDPhase4_20241025_before_AaveV3Ethereum_AaveBGDPhase4_20241025_after.md b/diffs/AaveV3Ethereum_AaveBGDPhase4_20241025_before_AaveV3Ethereum_AaveBGDPhase4_20241025_after.md index e03f15bf7..c15d3e2bc 100644 --- a/diffs/AaveV3Ethereum_AaveBGDPhase4_20241025_before_AaveV3Ethereum_AaveBGDPhase4_20241025_after.md +++ b/diffs/AaveV3Ethereum_AaveBGDPhase4_20241025_before_AaveV3Ethereum_AaveBGDPhase4_20241025_after.md @@ -1,17 +1,3 @@ -## Emodes changed - -### EMode: ETH correlated(id: 1) - -| description | value before | value after | -| --- | --- | --- | -| eMode.label (unchanged) | ETH correlated | ETH correlated | -| eMode.ltv (unchanged) | 93 % | 93 % | -| eMode.liquidationThreshold (unchanged) | 95 % | 95 % | -| eMode.liquidationBonus (unchanged) | 1 % | 1 % | -| eMode.borrowableBitmap (unchanged) | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | -| eMode.collateralBitmap (unchanged) | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | - - ## Raw diff ```json diff --git a/diffs/AaveV3Ethereum_FixUSDSBorrowRateToMatchSkySavingsRate_20241022_before_AaveV3Ethereum_FixUSDSBorrowRateToMatchSkySavingsRate_20241022_after.md b/diffs/AaveV3Ethereum_FixUSDSBorrowRateToMatchSkySavingsRate_20241022_before_AaveV3Ethereum_FixUSDSBorrowRateToMatchSkySavingsRate_20241022_after.md index 4cab64c25..0e62b2dfe 100644 --- a/diffs/AaveV3Ethereum_FixUSDSBorrowRateToMatchSkySavingsRate_20241022_before_AaveV3Ethereum_FixUSDSBorrowRateToMatchSkySavingsRate_20241022_after.md +++ b/diffs/AaveV3Ethereum_FixUSDSBorrowRateToMatchSkySavingsRate_20241022_before_AaveV3Ethereum_FixUSDSBorrowRateToMatchSkySavingsRate_20241022_after.md @@ -8,9 +8,7 @@ | --- | --- | --- | | maxVariableBorrowRate | 87.5 % | 82 % | | variableRateSlope1 | 6.25 % | 0.75 % | -| interestRate | ![before](/.assets/59f72276d32ba1eeba45953b23c84ea37048e299.svg) | ![after](/.assets/237c21391c0b67eb1236e3875c882cd6115a3758.svg) | - -## Emodes changes +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=62500000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=62500000000000000000000000&maxVariableBorrowRate=875000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=7500000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=62500000000000000000000000&maxVariableBorrowRate=820000000000000000000000000) | ## Raw diff diff --git a/diffs/AaveV3Ethereum_GHOCCIP150Upgrade_20241021_before_AaveV3Ethereum_GHOCCIP150Upgrade_20241021_after.md b/diffs/AaveV3Ethereum_GHOCCIP150Upgrade_20241021_before_AaveV3Ethereum_GHOCCIP150Upgrade_20241021_after.md index dbd03dce4..c15d3e2bc 100644 --- a/diffs/AaveV3Ethereum_GHOCCIP150Upgrade_20241021_before_AaveV3Ethereum_GHOCCIP150Upgrade_20241021_after.md +++ b/diffs/AaveV3Ethereum_GHOCCIP150Upgrade_20241021_before_AaveV3Ethereum_GHOCCIP150Upgrade_20241021_after.md @@ -1,5 +1,3 @@ -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3Ethereum_GHOStewardV2Upgrade_20241007_before_AaveV3Ethereum_GHOStewardV2Upgrade_20241007_after.md b/diffs/AaveV3Ethereum_GHOStewardV2Upgrade_20241007_before_AaveV3Ethereum_GHOStewardV2Upgrade_20241007_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Ethereum_GHOStewardV2Upgrade_20241007_before_AaveV3Ethereum_GHOStewardV2Upgrade_20241007_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3Ethereum_IncreaseCbBTCSupplyCaps_20241004_before_AaveV3Ethereum_IncreaseCbBTCSupplyCaps_20241004_after.md b/diffs/AaveV3Ethereum_IncreaseCbBTCSupplyCaps_20241004_before_AaveV3Ethereum_IncreaseCbBTCSupplyCaps_20241004_after.md index c55e14fa2..8643d8700 100644 --- a/diffs/AaveV3Ethereum_IncreaseCbBTCSupplyCaps_20241004_before_AaveV3Ethereum_IncreaseCbBTCSupplyCaps_20241004_after.md +++ b/diffs/AaveV3Ethereum_IncreaseCbBTCSupplyCaps_20241004_before_AaveV3Ethereum_IncreaseCbBTCSupplyCaps_20241004_after.md @@ -9,8 +9,6 @@ | supplyCap | 2,400 cbBTC | 10,000 cbBTC | -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3Ethereum_IncreaseUSDSBorrowRateToMatchSkySavingsRate_20241016_before_AaveV3Ethereum_IncreaseUSDSBorrowRateToMatchSkySavingsRate_20241016_after.md b/diffs/AaveV3Ethereum_IncreaseUSDSBorrowRateToMatchSkySavingsRate_20241016_before_AaveV3Ethereum_IncreaseUSDSBorrowRateToMatchSkySavingsRate_20241016_after.md index 7c5412604..cc8aa0613 100644 --- a/diffs/AaveV3Ethereum_IncreaseUSDSBorrowRateToMatchSkySavingsRate_20241016_before_AaveV3Ethereum_IncreaseUSDSBorrowRateToMatchSkySavingsRate_20241016_after.md +++ b/diffs/AaveV3Ethereum_IncreaseUSDSBorrowRateToMatchSkySavingsRate_20241016_before_AaveV3Ethereum_IncreaseUSDSBorrowRateToMatchSkySavingsRate_20241016_after.md @@ -8,9 +8,7 @@ | --- | --- | --- | | maxVariableBorrowRate | 82 % | 87.5 % | | baseVariableBorrowRate | 0.75 % | 6.25 % | -| interestRate | ![before](/.assets/75cdb567a41d55d63ab2bb1326ea702df0bfacf4.svg) | ![after](/.assets/59f72276d32ba1eeba45953b23c84ea37048e299.svg) | - -## Emodes changes +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=62500000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=7500000000000000000000000&maxVariableBorrowRate=820000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=62500000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=62500000000000000000000000&maxVariableBorrowRate=875000000000000000000000000) | ## Raw diff diff --git a/diffs/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_before_AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_after.md b/diffs/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_before_AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_after.md index afe196a77..daf380ea9 100644 --- a/diffs/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_before_AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_after.md +++ b/diffs/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_before_AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_after.md @@ -35,8 +35,8 @@ "2": { "from": null, "to": { - "borrowableBitmap": 34359738376, - "collateralBitmap": 4294967296, + "borrowableBitmap": "34359738376", + "collateralBitmap": "4294967296", "eModeCategory": 2, "label": "sUSDe Stablecoins", "liquidationBonus": 10300, diff --git a/diffs/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104_before_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104_after.md b/diffs/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104_before_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104_after.md index 9fc486351..3ac08f174 100644 --- a/diffs/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104_before_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104_after.md +++ b/diffs/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104_before_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104_after.md @@ -90,8 +90,8 @@ "3": { "from": null, "to": { - "borrowableBitmap": 2147483650, - "collateralBitmap": 68719476736, + "borrowableBitmap": "2147483650", + "collateralBitmap": "68719476736", "eModeCategory": 3, "label": "rsETH LST main", "liquidationBonus": 10100, @@ -140,7 +140,7 @@ "oracle": "0x47F52B2e43D0386cF161e001835b03Ad49889e3b", "oracleDecimals": 8, "oracleDescription": "Capped rsETH / ETH / USD", - "oracleLatestAnswer": 289203476952, + "oracleLatestAnswer": "289203476952", "reserveFactor": 1500, "supplyCap": 19000, "symbol": "rsETH", @@ -160,7 +160,7 @@ "from": null, "to": { "address": "0x9ec6F08190DeA04A54f8Afc53Db96134e5E3FdFB", - "baseVariableBorrowRate": 0, + "baseVariableBorrowRate": "0", "maxVariableBorrowRate": "3070000000000000000000000000", "optimalUsageRatio": "450000000000000000000000000", "variableRateSlope1": "70000000000000000000000000", diff --git a/diffs/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031_before_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031_after.md b/diffs/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031_before_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031_after.md index f4b947cf4..e648600fb 100644 --- a/diffs/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031_before_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031_after.md +++ b/diffs/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031_before_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031_after.md @@ -14,20 +14,6 @@ | liquidationProtocolFee | 0 % [0] | 10 % [1000] | -## Emodes changed - -### EMode: ETH correlated(id: 1) - -| description | value before | value after | -| --- | --- | --- | -| eMode.label (unchanged) | ETH correlated | ETH correlated | -| eMode.ltv (unchanged) | 93 % | 93 % | -| eMode.liquidationThreshold (unchanged) | 95 % | 95 % | -| eMode.liquidationBonus (unchanged) | 1 % | 1 % | -| eMode.borrowableBitmap (unchanged) | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | -| eMode.collateralBitmap (unchanged) | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | - - ## Raw diff ```json diff --git a/diffs/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105_before_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105_after.md b/diffs/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105_before_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105_after.md index e45f17043..dda218d41 100644 --- a/diffs/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105_before_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105_after.md +++ b/diffs/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105_before_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105_after.md @@ -9,20 +9,6 @@ | debtCeiling | 10,000,000 $ [1000000000] | 0 $ [0] | -## Emodes changed - -### EMode: ETH correlated(id: 1) - -| description | value before | value after | -| --- | --- | --- | -| eMode.label (unchanged) | ETH correlated | ETH correlated | -| eMode.ltv (unchanged) | 93 % | 93 % | -| eMode.liquidationThreshold (unchanged) | 95 % | 95 % | -| eMode.liquidationBonus (unchanged) | 1 % | 1 % | -| eMode.borrowableBitmap (unchanged) | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | -| eMode.collateralBitmap (unchanged) | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | - - ## Raw diff ```json diff --git a/diffs/AaveV3Ethereum_UpdateLegacyGuardian_20241016_before_AaveV3Ethereum_UpdateLegacyGuardian_20241016_after.md b/diffs/AaveV3Ethereum_UpdateLegacyGuardian_20241016_before_AaveV3Ethereum_UpdateLegacyGuardian_20241016_after.md index dbd03dce4..c15d3e2bc 100644 --- a/diffs/AaveV3Ethereum_UpdateLegacyGuardian_20241016_before_AaveV3Ethereum_UpdateLegacyGuardian_20241016_after.md +++ b/diffs/AaveV3Ethereum_UpdateLegacyGuardian_20241016_before_AaveV3Ethereum_UpdateLegacyGuardian_20241016_after.md @@ -1,5 +1,3 @@ -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024_before_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024_after.md b/diffs/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024_before_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024_after.md index 935241fdd..168d90d77 100644 --- a/diffs/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024_before_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024_after.md +++ b/diffs/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024_before_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024_after.md @@ -11,20 +11,6 @@ | variableRateSlope1 | 4.5 % | 2 % | | interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=45000000000000000000000000&variableRateSlope2=800000000000000000000000000&optimalUsageRatio=450000000000000000000000000&baseVariableBorrowRate=2500000000000000000000000&maxVariableBorrowRate=847500000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=20000000000000000000000000&variableRateSlope2=800000000000000000000000000&optimalUsageRatio=450000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=820000000000000000000000000) | -## Emodes changed - -### EMode: ETH correlated(id: 1) - -| description | value before | value after | -| --- | --- | --- | -| eMode.label (unchanged) | ETH correlated | ETH correlated | -| eMode.ltv (unchanged) | 93 % | 93 % | -| eMode.liquidationThreshold (unchanged) | 95 % | 95 % | -| eMode.liquidationBonus (unchanged) | 1 % | 1 % | -| eMode.borrowableBitmap (unchanged) | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | -| eMode.collateralBitmap (unchanged) | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | - - ## Raw diff ```json diff --git a/diffs/AaveV3Gnosis_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Gnosis_ReserveFactorUpdatesMidOctober_20241004_after.md b/diffs/AaveV3Gnosis_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Gnosis_ReserveFactorUpdatesMidOctober_20241004_after.md index e394c69e5..9801e3828 100644 --- a/diffs/AaveV3Gnosis_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Gnosis_ReserveFactorUpdatesMidOctober_20241004_after.md +++ b/diffs/AaveV3Gnosis_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Gnosis_ReserveFactorUpdatesMidOctober_20241004_after.md @@ -9,8 +9,6 @@ | reserveFactor | 20 % [2000] | 25 % [2500] | -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3Gnosis_UpdateLegacyGuardian_20241016_before_AaveV3Gnosis_UpdateLegacyGuardian_20241016_after.md b/diffs/AaveV3Gnosis_UpdateLegacyGuardian_20241016_before_AaveV3Gnosis_UpdateLegacyGuardian_20241016_after.md index dbd03dce4..c15d3e2bc 100644 --- a/diffs/AaveV3Gnosis_UpdateLegacyGuardian_20241016_before_AaveV3Gnosis_UpdateLegacyGuardian_20241016_after.md +++ b/diffs/AaveV3Gnosis_UpdateLegacyGuardian_20241016_before_AaveV3Gnosis_UpdateLegacyGuardian_20241016_after.md @@ -1,5 +1,3 @@ -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3Optimism_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Optimism_ReserveFactorUpdatesMidOctober_20241004_after.md b/diffs/AaveV3Optimism_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Optimism_ReserveFactorUpdatesMidOctober_20241004_after.md index 980195bc0..06fb9593b 100644 --- a/diffs/AaveV3Optimism_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Optimism_ReserveFactorUpdatesMidOctober_20241004_after.md +++ b/diffs/AaveV3Optimism_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Optimism_ReserveFactorUpdatesMidOctober_20241004_after.md @@ -9,8 +9,6 @@ | reserveFactor | 45 % [4500] | 50 % [5000] | -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3Optimism_UpdateLegacyGuardian_20241016_before_AaveV3Optimism_UpdateLegacyGuardian_20241016_after.md b/diffs/AaveV3Optimism_UpdateLegacyGuardian_20241016_before_AaveV3Optimism_UpdateLegacyGuardian_20241016_after.md index dbd03dce4..c15d3e2bc 100644 --- a/diffs/AaveV3Optimism_UpdateLegacyGuardian_20241016_before_AaveV3Optimism_UpdateLegacyGuardian_20241016_after.md +++ b/diffs/AaveV3Optimism_UpdateLegacyGuardian_20241016_before_AaveV3Optimism_UpdateLegacyGuardian_20241016_after.md @@ -1,5 +1,3 @@ -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3Polygon_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Polygon_ReserveFactorUpdatesMidOctober_20241004_after.md b/diffs/AaveV3Polygon_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Polygon_ReserveFactorUpdatesMidOctober_20241004_after.md index 3090391ec..dedef70e1 100644 --- a/diffs/AaveV3Polygon_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Polygon_ReserveFactorUpdatesMidOctober_20241004_after.md +++ b/diffs/AaveV3Polygon_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Polygon_ReserveFactorUpdatesMidOctober_20241004_after.md @@ -9,8 +9,6 @@ | reserveFactor | 45 % [4500] | 50 % [5000] | -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3Polygon_UpdateLegacyGuardian_20241016_before_AaveV3Polygon_UpdateLegacyGuardian_20241016_after.md b/diffs/AaveV3Polygon_UpdateLegacyGuardian_20241016_before_AaveV3Polygon_UpdateLegacyGuardian_20241016_after.md index dbd03dce4..c15d3e2bc 100644 --- a/diffs/AaveV3Polygon_UpdateLegacyGuardian_20241016_before_AaveV3Polygon_UpdateLegacyGuardian_20241016_after.md +++ b/diffs/AaveV3Polygon_UpdateLegacyGuardian_20241016_before_AaveV3Polygon_UpdateLegacyGuardian_20241016_after.md @@ -1,5 +1,3 @@ -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3Scroll_UpdateLegacyGuardian_20241016_before_AaveV3Scroll_UpdateLegacyGuardian_20241016_after.md b/diffs/AaveV3Scroll_UpdateLegacyGuardian_20241016_before_AaveV3Scroll_UpdateLegacyGuardian_20241016_after.md index dbd03dce4..c15d3e2bc 100644 --- a/diffs/AaveV3Scroll_UpdateLegacyGuardian_20241016_before_AaveV3Scroll_UpdateLegacyGuardian_20241016_after.md +++ b/diffs/AaveV3Scroll_UpdateLegacyGuardian_20241016_before_AaveV3Scroll_UpdateLegacyGuardian_20241016_after.md @@ -1,5 +1,3 @@ -## Emodes changes - ## Raw diff ```json diff --git a/lib/aave-helpers b/lib/aave-helpers index dfe93027d..f9e12a124 160000 --- a/lib/aave-helpers +++ b/lib/aave-helpers @@ -1 +1 @@ -Subproject commit dfe93027dc822f45e368e2fbe9129e6a037a06e5 +Subproject commit f9e12a12450f4293ef2e602eaafadebdfa087dbb diff --git a/package-lock.json b/package-lock.json index 690a8b47c..049874659 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,12 +9,12 @@ "version": "1.0.0", "license": "MIT", "dependencies": { - "@bgd-labs/aave-address-book": "4.4.0", - "@bgd-labs/aave-cli": "^1.1.11", + "@bgd-labs/aave-address-book": "4.6.0", + "@bgd-labs/aave-cli": "^1.1.12", "@bgd-labs/js-utils": "^1.4.6", "@inquirer/prompts": "^7.1.0", "@inquirer/testing": "^2.1.37", - "catapulta-verify": "^1.1.1", + "catapulta-verify": "^1.2.1", "commander": "^12.1.0", "husky": "^8.0.3", "lint-staged": "^15.2.10", @@ -38,18 +38,19 @@ "license": "Apache-2.0" }, "node_modules/@bgd-labs/aave-address-book": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@bgd-labs/aave-address-book/-/aave-address-book-4.4.0.tgz", - "integrity": "sha512-wEWhdTpqy6PwB3Dc772nX1lF1dQr9qmnmKJHcYKpP/VFBYztxunoZS/c26iKH4SP/DRXwDnMbZcnRkebC73bDA==" + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@bgd-labs/aave-address-book/-/aave-address-book-4.6.0.tgz", + "integrity": "sha512-1YgjwdgxOpvABDtYzSS1J4PU/ntI7pOzKUzoOcbxD91sUVm/VA+3AJFOY8aM3M/Q8VFQY/XKaseGTBfUtALHKQ==" }, "node_modules/@bgd-labs/aave-cli": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@bgd-labs/aave-cli/-/aave-cli-1.1.11.tgz", - "integrity": "sha512-EUo+ZkcB4Eep/U0CMHBkHXw6BKFzhxsd7PV/ZdKco4IpsVRM68O73CqoIbe0vgo9B4yPwIaop7YqX1DhcwdLqg==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@bgd-labs/aave-cli/-/aave-cli-1.1.12.tgz", + "integrity": "sha512-PuxWcdmNmNjVHP9hzZpJ6LYyM6MViJCQQ7U4yEPjiAGQ0mQ9aJIfAq5EpNds6r4OmmxufZ+Ely6f8QkIrDXDdA==", "dependencies": { - "@bgd-labs/aave-address-book": "^4.4.0", + "@bgd-labs/aave-address-book": "^4.5.1", "@bgd-labs/aave-v3-governance-cache": "^1.0.8", "@bgd-labs/js-utils": "^1.4.6", + "@bgd-labs/rpc-env": "^2.1.1", "@commander-js/extra-typings": "^12.1.0", "@inquirer/prompts": "^7.1.0", "blockstore-core": "^5.0.2", @@ -94,6 +95,14 @@ "viem": "^2.0.3" } }, + "node_modules/@bgd-labs/rpc-env": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@bgd-labs/rpc-env/-/rpc-env-2.1.2.tgz", + "integrity": "sha512-xY6cjC55ZUhsAGt4LynzG7DT8MWSeDZJ3opCK2AIkPn2dQrqvMPTkeodbyaUyV59AK3Qy8aiFmNCeHqF+aPnvQ==", + "bin": { + "rpc-env": "dist/cli.js" + } + }, "node_modules/@chainsafe/is-ip": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@chainsafe/is-ip/-/is-ip-2.0.2.tgz", @@ -1452,15 +1461,14 @@ } }, "node_modules/catapulta-verify": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/catapulta-verify/-/catapulta-verify-1.1.1.tgz", - "integrity": "sha512-VZ9pQpno1bjjZ/+7d1AbPWkOhYcZdNSova5Y1L9jj8ftdimv3JrwDTg9i0fs4I8/A/sRXK7AUb1pmL3016Cykw==", - "license": "MIT", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/catapulta-verify/-/catapulta-verify-1.2.1.tgz", + "integrity": "sha512-yXJ0/WV/3w6WLrVUoe2maEqPlGDyCwQ9oIk2vUiw+kfEG7zMlFzSQB8xf7sAo8kUKk/fwaMEn9AQrb84Ubae4Q==", + "dependencies": { + "@bgd-labs/rpc-env": "^2.0.1" + }, "bin": { "catapulta-verify": "out/index.mjs" - }, - "peerDependencies": { - "typescript": "^5.0.0" } }, "node_modules/chai": { @@ -3304,6 +3312,7 @@ "version": "5.6.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "optional": true, "peer": true, "bin": { "tsc": "bin/tsc", diff --git a/package.json b/package.json index 1dfa02aae..c4be0353f 100644 --- a/package.json +++ b/package.json @@ -31,12 +31,12 @@ "vitest": "^2.1.5" }, "dependencies": { - "@bgd-labs/aave-address-book": "4.4.0", - "@bgd-labs/aave-cli": "^1.1.11", + "@bgd-labs/aave-address-book": "4.6.0", + "@bgd-labs/aave-cli": "^1.1.12", "@bgd-labs/js-utils": "^1.4.6", "@inquirer/prompts": "^7.1.0", "@inquirer/testing": "^2.1.37", - "catapulta-verify": "^1.1.1", + "catapulta-verify": "^1.2.1", "commander": "^12.1.0", "husky": "^8.0.3", "lint-staged": "^15.2.10", diff --git a/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007.sol b/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007.sol index f9bd1e496..05d4c64a1 100644 --- a/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007.sol +++ b/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007.sol @@ -4,14 +4,14 @@ pragma solidity ^0.8.0; import {AaveV3Arbitrum, AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol'; import {IACLManager} from 'aave-address-book/AaveV3.sol'; import {MiscArbitrum} from 'aave-address-book/MiscArbitrum.sol'; -import {ProxyAdmin} from 'solidity-utils/contracts/transparent-proxy/ProxyAdmin.sol'; -import {TransparentUpgradeableProxy} from 'solidity-utils/contracts/transparent-proxy/TransparentUpgradeableProxy.sol'; import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; import {IAccessControl} from '@openzeppelin/contracts/access/IAccessControl.sol'; +import {ITransparentUpgradeableProxy} from 'solidity-utils/contracts/transparent-proxy/TransparentUpgradeableProxy.sol'; -import {IGhoBucketSteward} from 'src/interfaces/IGhoBucketSteward.sol'; -import {IGhoToken} from 'src/interfaces/IGhoToken.sol'; -import {IUpgradeableLockReleaseTokenPool} from 'src/interfaces/ccip/IUpgradeableLockReleaseTokenPool.sol'; +import {IGhoBucketSteward} from '../interfaces/IGhoBucketSteward.sol'; +import {IGhoToken} from '../interfaces/IGhoToken.sol'; +import {IUpgradeableLockReleaseTokenPool} from '../interfaces/ccip/IUpgradeableLockReleaseTokenPool.sol'; +import {ILegacyProxyAdmin} from '../interfaces/ILegacyProxyAdmin.sol'; /** * @title GHO Steward v2 Upgrade @@ -34,8 +34,8 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007 is IProposalGenericExecutor function execute() external { // New CCIP Token Pool - ProxyAdmin(MiscArbitrum.PROXY_ADMIN).upgrade( - TransparentUpgradeableProxy(payable(MiscArbitrum.GHO_CCIP_TOKEN_POOL)), + ILegacyProxyAdmin(MiscArbitrum.PROXY_ADMIN).upgrade( + ITransparentUpgradeableProxy(payable(MiscArbitrum.GHO_CCIP_TOKEN_POOL)), NEW_CCIP_POOL_IMPL ); diff --git a/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007.t.sol b/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007.t.sol index a323ba406..4a75b0b0a 100644 --- a/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007.t.sol +++ b/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007.t.sol @@ -1,12 +1,13 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; +import {ProxyHelpers} from 'aave-v3-origin-tests/utils/ProxyHelpers.sol'; import {AaveV3Arbitrum, AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol'; import {MiscArbitrum} from 'aave-address-book/MiscArbitrum.sol'; import {GovernanceV3Arbitrum} from 'aave-address-book/GovernanceV3Arbitrum.sol'; import {IACLManager, IDefaultInterestRateStrategyV2} from 'aave-address-book/AaveV3.sol'; import {IAccessControl} from '@openzeppelin/contracts/access/IAccessControl.sol'; -import {TransparentUpgradeableProxy} from 'solidity-utils/contracts/transparent-proxy/TransparentUpgradeableProxy.sol'; +import {ITransparentUpgradeableProxy} from 'solidity-utils/contracts/transparent-proxy/TransparentUpgradeableProxy.sol'; import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; import {AaveV3Arbitrum_GHOStewardV2Upgrade_20241007} from './AaveV3Arbitrum_GHOStewardV2Upgrade_20241007.sol'; @@ -57,8 +58,10 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase executePayload(vm, address(proposal)); vm.prank(MiscArbitrum.PROXY_ADMIN); - address impl = TransparentUpgradeableProxy(payable(MiscArbitrum.GHO_CCIP_TOKEN_POOL)) - .implementation(); + address impl = ProxyHelpers.getInitializableAdminUpgradeabilityProxyImplementation( + vm, + MiscArbitrum.GHO_CCIP_TOKEN_POOL + ); IUpgradeableLockReleaseTokenPool poolTokenImpl = IUpgradeableLockReleaseTokenPool( proposal.NEW_CCIP_POOL_IMPL() diff --git a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.sol b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.sol index 7daeb4d52..9a7995270 100644 --- a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.sol +++ b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.sol @@ -1,12 +1,12 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {TransparentUpgradeableProxy} from 'solidity-utils/contracts/transparent-proxy/TransparentUpgradeableProxy.sol'; -import {ProxyAdmin} from 'solidity-utils/contracts/transparent-proxy/ProxyAdmin.sol'; +import {ITransparentUpgradeableProxy} from 'solidity-utils/contracts/transparent-proxy/TransparentUpgradeableProxy.sol'; import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; import {MiscArbitrum} from 'aave-address-book/MiscArbitrum.sol'; import {IUpgradeableBurnMintTokenPool} from 'src/interfaces/ccip/IUpgradeableBurnMintTokenPool.sol'; import {IRateLimiter} from 'src/interfaces/ccip/IRateLimiter.sol'; +import {ILegacyProxyAdmin} from '../interfaces/ILegacyProxyAdmin.sol'; /** * @title GHO CCIP 1.50 Upgrade @@ -32,8 +32,8 @@ contract AaveV3Arbitrum_GHOCCIP150Upgrade_20241021 is IProposalGenericExecutor { MiscArbitrum.GHO_CCIP_TOKEN_POOL ); - ProxyAdmin(MiscArbitrum.PROXY_ADMIN).upgrade( - TransparentUpgradeableProxy(payable(address(tokenPoolProxy))), + ILegacyProxyAdmin(MiscArbitrum.PROXY_ADMIN).upgrade( + ITransparentUpgradeableProxy(payable(address(tokenPoolProxy))), TOKEN_POOL_IMPL ); diff --git a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.sol b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.sol index 7d6a405fe..06aab31f0 100644 --- a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.sol +++ b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.sol @@ -1,12 +1,12 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {TransparentUpgradeableProxy} from 'solidity-utils/contracts/transparent-proxy/TransparentUpgradeableProxy.sol'; -import {ProxyAdmin} from 'solidity-utils/contracts/transparent-proxy/ProxyAdmin.sol'; +import {ITransparentUpgradeableProxy} from 'solidity-utils/contracts/transparent-proxy/TransparentUpgradeableProxy.sol'; import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; import {IUpgradeableLockReleaseTokenPool} from 'src/interfaces/ccip/IUpgradeableLockReleaseTokenPool.sol'; import {IRateLimiter} from 'src/interfaces/ccip/IRateLimiter.sol'; +import {ILegacyProxyAdmin} from '../interfaces/ILegacyProxyAdmin.sol'; /** * @title GHO CCIP 1.50 Upgrade @@ -32,8 +32,8 @@ contract AaveV3Ethereum_GHOCCIP150Upgrade_20241021 is IProposalGenericExecutor { MiscEthereum.GHO_CCIP_TOKEN_POOL ); - ProxyAdmin(MiscEthereum.PROXY_ADMIN).upgrade( - TransparentUpgradeableProxy(payable(address(tokenPoolProxy))), + ILegacyProxyAdmin(MiscEthereum.PROXY_ADMIN).upgrade( + ITransparentUpgradeableProxy(address(tokenPoolProxy)), TOKEN_POOL_IMPL ); diff --git a/src/interfaces/ILegacyProxyAdmin.sol b/src/interfaces/ILegacyProxyAdmin.sol new file mode 100644 index 000000000..927876afd --- /dev/null +++ b/src/interfaces/ILegacyProxyAdmin.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {ITransparentUpgradeableProxy} from 'solidity-utils/contracts/transparent-proxy/TransparentUpgradeableProxy.sol'; + +interface ILegacyProxyAdmin { + function changeProxyAdmin(ITransparentUpgradeableProxy proxy, address newAdmin) external; + + function upgrade(ITransparentUpgradeableProxy proxy, address implementation) external; + + function upgradeAndCall( + ITransparentUpgradeableProxy proxy, + address implementation, + bytes memory data + ) external; +} From 573248b67bdb04edb811598f463edce077d03a4b Mon Sep 17 00:00:00 2001 From: Alice <121383428+Rozengarden@users.noreply.github.com> Date: Tue, 26 Nov 2024 14:18:28 +0100 Subject: [PATCH 24/35] feat: add USDT to sUSDS stablecoin e-mode (#535) Co-authored-by: Harsh Pandey Co-authored-by: Lukas Co-authored-by: marczeller --- ...um_EnableSUSDeUSDTLiquid_20241125_after.md | 36 +++++++++++ ...thereum_EnableSUSDeUSDTLiquid_20241125.sol | 33 ++++++++++ ...ereum_EnableSUSDeUSDTLiquid_20241125.t.sol | 32 ++++++++++ .../EnableSUSDeUSDTLiquid.md | 31 ++++++++++ .../EnableSUSDeUSDTLiquid_20241125.s.sol | 60 +++++++++++++++++++ .../config.ts | 29 +++++++++ 6 files changed, 221 insertions(+) create mode 100644 diffs/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125_before_AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125_after.md create mode 100644 src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125.sol create mode 100644 src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125.t.sol create mode 100644 src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/EnableSUSDeUSDTLiquid.md create mode 100644 src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/EnableSUSDeUSDTLiquid_20241125.s.sol create mode 100644 src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/config.ts diff --git a/diffs/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125_before_AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125_after.md b/diffs/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125_before_AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125_after.md new file mode 100644 index 000000000..7599f4449 --- /dev/null +++ b/diffs/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125_before_AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125_after.md @@ -0,0 +1,36 @@ +## Emodes changed + +### EMode: ETH correlated(id: 1) + + + +### EMode: sUSDe Stablecoins(id: 2) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label (unchanged) | sUSDe Stablecoins | sUSDe Stablecoins | +| eMode.ltv (unchanged) | 90 % | 90 % | +| eMode.liquidationThreshold (unchanged) | 92 % | 92 % | +| eMode.liquidationBonus (unchanged) | 3 % | 3 % | +| eMode.borrowableBitmap | USDC, USDS | USDC, USDT, USDS | +| eMode.collateralBitmap (unchanged) | sUSDe | sUSDe | + + +### EMode: rsETH LST main(id: 3) + + + +## Raw diff + +```json +{ + "eModes": { + "2": { + "borrowableBitmap": { + "from": "34359738376", + "to": "34359738632" + } + } + } +} +``` \ No newline at end of file diff --git a/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125.sol b/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125.sol new file mode 100644 index 000000000..b1f28317e --- /dev/null +++ b/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumAssets, AaveV3EthereumEModes} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV3PayloadEthereum} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereum.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title Enable sUSDe/USDT Liquid + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-enable-susde-usdt-liquid-e-mode-on-core-instance/19939 + */ +contract AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125 is AaveV3PayloadEthereum { + function assetsEModeUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.AssetEModeUpdate[] memory) + { + IAaveV3ConfigEngine.AssetEModeUpdate[] + memory assetEModeUpdates = new IAaveV3ConfigEngine.AssetEModeUpdate[](1); + + assetEModeUpdates[0] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3EthereumAssets.USDT_UNDERLYING, + eModeCategory: AaveV3EthereumEModes.SUSDE_STABLECOINS, + borrowable: EngineFlags.ENABLED, + collateral: EngineFlags.DISABLED + }); + + return assetEModeUpdates; + } +} diff --git a/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125.t.sol b/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125.t.sol new file mode 100644 index 000000000..3c9880cf2 --- /dev/null +++ b/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125.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_EnableSUSDeUSDTLiquid_20241125} from './AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125.sol'; + +/** + * @dev Test for AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125.t.sol -vv + */ +contract AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125_Test is ProtocolV3TestBase { + AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21271611); + proposal = new AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125', + AaveV3Ethereum.POOL, + address(proposal) + ); + } +} diff --git a/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/EnableSUSDeUSDTLiquid.md b/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/EnableSUSDeUSDTLiquid.md new file mode 100644 index 000000000..e80817674 --- /dev/null +++ b/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/EnableSUSDeUSDTLiquid.md @@ -0,0 +1,31 @@ +--- +title: "Enable sUSDe/USDT Liquid E-Mode on Core Instance" +author: "Aave Chan Initiative" +discussions: "https://governance.aave.com/t/arfc-enable-susde-usdt-liquid-e-mode-on-core-instance/19939" +snapshot: "Direct-to-AIP" +--- + +## Simple Summary + +This proposal aims to enable sUSDe/USDT liquid E-Mode for the Core Instance. By implementing this change, we seek to enhance capital efficiency for borrowers using sUSDe as collateral, specifically for borrowing USDT. This is a Direct to AIP Proposal. + +## Motivation + +sUSDe has demonstrated significant usage as collateral for borrowing stablecoins and to increase borrowing options we now look to enable E-Mode for USDT borrows against sUSDe. + +By implementing this proposal, we aim to optimize the use of sUSDe within the Aave ecosystem, attracting more liquidity and providing more options for both borrowers and lenders. + +## Specification + +USDT on the Core instance will be added to the sUSDe stablecoin E-Mode + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125.t.sol) +- Snapshot: Direct-to-AIP +- [Discussion](https://governance.aave.com/t/arfc-enable-susde-usdt-liquid-e-mode-on-core-instance/19939) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/EnableSUSDeUSDTLiquid_20241125.s.sol b/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/EnableSUSDeUSDTLiquid_20241125.s.sol new file mode 100644 index 000000000..03c35fb57 --- /dev/null +++ b/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/EnableSUSDeUSDTLiquid_20241125.s.sol @@ -0,0 +1,60 @@ +// 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_EnableSUSDeUSDTLiquid_20241125} from './AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/EnableSUSDeUSDTLiquid_20241125.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/EnableSUSDeUSDTLiquid_20241125.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125).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/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/EnableSUSDeUSDTLiquid_20241125.s.sol:CreateProposal chain=mainnet + */ +contract CreateProposal is EthereumScript { + function run() external { + // create payloads + PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](1); + + // compose actions for validation + IPayloadsControllerCore.ExecutionAction[] + memory actionsEthereum = new IPayloadsControllerCore.ExecutionAction[](1); + actionsEthereum[0] = GovV3Helpers.buildAction( + type(AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/EnableSUSDeUSDTLiquid.md' + ) + ); + } +} diff --git a/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/config.ts b/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/config.ts new file mode 100644 index 000000000..904276f82 --- /dev/null +++ b/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/config.ts @@ -0,0 +1,29 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + author: 'Aave Chan Initiative', + pools: ['AaveV3Ethereum'], + title: 'Enable sUSDe/USDT Liquid', + shortName: 'EnableSUSDeUSDTLiquid', + date: '20241125', + discussion: + 'https://governance.aave.com/t/arfc-enable-susde-usdt-liquid-e-mode-on-core-instance/19939', + snapshot: 'Direct-to-AIP', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Ethereum: { + configs: { + EMODES_ASSETS: [ + { + asset: 'USDT', + eModeCategory: 'AaveV3EthereumEModes.SUSDE_STABLECOINS', + collateral: 'DISABLED', + borrowable: 'ENABLED', + }, + ], + }, + cache: {blockNumber: 21266484}, + }, + }, +}; From 0fc1b392ced8a638ae687b31d96b73a5a7018b2f Mon Sep 17 00:00:00 2001 From: Cache bot Date: Tue, 26 Nov 2024 13:18:51 +0000 Subject: [PATCH 25/35] fix(cache): automated cache update [skip ci] --- .../EnableSUSDeUSDTLiquid.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/EnableSUSDeUSDTLiquid.md b/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/EnableSUSDeUSDTLiquid.md index e80817674..1fb7375e6 100644 --- a/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/EnableSUSDeUSDTLiquid.md +++ b/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/EnableSUSDeUSDTLiquid.md @@ -21,8 +21,8 @@ USDT on the Core instance will be added to the sUSDe stablecoin E-Mode ## References -- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125.sol) -- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125.t.sol) +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/573248b67bdb04edb811598f463edce077d03a4b/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/573248b67bdb04edb811598f463edce077d03a4b/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125.t.sol) - Snapshot: Direct-to-AIP - [Discussion](https://governance.aave.com/t/arfc-enable-susde-usdt-liquid-e-mode-on-core-instance/19939) From bc6cb8c2474e2ca9a09e757e07269139f2295eb6 Mon Sep 17 00:00:00 2001 From: Alice <121383428+Rozengarden@users.noreply.github.com> Date: Wed, 27 Nov 2024 13:34:45 +0100 Subject: [PATCH 26/35] feat: CL recommendation on WBTC Uopt & RF (#532) --- ...actorAndUOptimalIncrease_20241120_after.md | 44 +++++ ...actorAndUOptimalIncrease_20241120_after.md | 44 +++++ ...actorAndUOptimalIncrease_20241120_after.md | 44 +++++ ...actorAndUOptimalIncrease_20241120_after.md | 48 ++++++ ...erveFactorAndUOptimalIncrease_20241120.sol | 55 +++++++ ...veFactorAndUOptimalIncrease_20241120.t.sol | 32 ++++ ...erveFactorAndUOptimalIncrease_20241120.sol | 55 +++++++ ...veFactorAndUOptimalIncrease_20241120.t.sol | 32 ++++ ...erveFactorAndUOptimalIncrease_20241120.sol | 55 +++++++ ...veFactorAndUOptimalIncrease_20241120.t.sol | 32 ++++ ...erveFactorAndUOptimalIncrease_20241120.sol | 55 +++++++ ...veFactorAndUOptimalIncrease_20241120.t.sol | 32 ++++ .../WBTCReserveFactorAndUOptimalIncrease.md | 70 ++++++++ ...veFactorAndUOptimalIncrease_20241120.s.sol | 150 ++++++++++++++++++ .../config.ts | 120 ++++++++++++++ 15 files changed, 868 insertions(+) create mode 100644 diffs/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120_before_AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120_after.md create mode 100644 diffs/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120_before_AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120_after.md create mode 100644 diffs/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120_before_AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120_after.md create mode 100644 diffs/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120_before_AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120_after.md create mode 100644 src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120.sol create mode 100644 src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol create mode 100644 src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120.sol create mode 100644 src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol create mode 100644 src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120.sol create mode 100644 src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol create mode 100644 src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120.sol create mode 100644 src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol create mode 100644 src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/WBTCReserveFactorAndUOptimalIncrease.md create mode 100644 src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/WBTCReserveFactorAndUOptimalIncrease_20241120.s.sol create mode 100644 src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/config.ts diff --git a/diffs/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120_before_AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120_after.md b/diffs/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120_before_AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120_after.md new file mode 100644 index 000000000..9d00eda70 --- /dev/null +++ b/diffs/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120_before_AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120_after.md @@ -0,0 +1,44 @@ +## Reserve changes + +### Reserves altered + +#### WBTC ([0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f](https://arbiscan.io/address/0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f)) + +| description | value before | value after | +| --- | --- | --- | +| reserveFactor | 20 % [2000] | 50 % [5000] | +| optimalUsageRatio | 45 % | 80 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=40000000000000000000000000&variableRateSlope2=3000000000000000000000000000&optimalUsageRatio=450000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=3040000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=40000000000000000000000000&variableRateSlope2=3000000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=3040000000000000000000000000) | + +## Emodes changed + +### EMode: Stablecoins(id: 1) + + + +### EMode: ETH correlated(id: 2) + + + +## Raw diff + +```json +{ + "reserves": { + "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f": { + "reserveFactor": { + "from": 2000, + "to": 5000 + } + } + }, + "strategies": { + "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f": { + "optimalUsageRatio": { + "from": "450000000000000000000000000", + "to": "800000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120_before_AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120_after.md b/diffs/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120_before_AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120_after.md new file mode 100644 index 000000000..495604a7a --- /dev/null +++ b/diffs/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120_before_AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120_after.md @@ -0,0 +1,44 @@ +## Reserve changes + +### Reserves altered + +#### WBTC ([0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599](https://etherscan.io/address/0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599)) + +| description | value before | value after | +| --- | --- | --- | +| reserveFactor | 20 % [2000] | 50 % [5000] | +| optimalUsageRatio | 45 % | 80 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=40000000000000000000000000&variableRateSlope2=3000000000000000000000000000&optimalUsageRatio=450000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=3040000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=40000000000000000000000000&variableRateSlope2=3000000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=3040000000000000000000000000) | + +## Emodes changed + +### EMode: ETH correlated(id: 1) + + + +### EMode: sUSDe Stablecoins(id: 2) + + + +## Raw diff + +```json +{ + "reserves": { + "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599": { + "reserveFactor": { + "from": 2000, + "to": 5000 + } + } + }, + "strategies": { + "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599": { + "optimalUsageRatio": { + "from": "450000000000000000000000000", + "to": "800000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120_before_AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120_after.md b/diffs/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120_before_AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120_after.md new file mode 100644 index 000000000..31c026ce8 --- /dev/null +++ b/diffs/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120_before_AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120_after.md @@ -0,0 +1,44 @@ +## Reserve changes + +### Reserves altered + +#### WBTC ([0x68f180fcCe6836688e9084f035309E29Bf0A2095](https://optimistic.etherscan.io/address/0x68f180fcCe6836688e9084f035309E29Bf0A2095)) + +| description | value before | value after | +| --- | --- | --- | +| reserveFactor | 20 % [2000] | 50 % [5000] | +| optimalUsageRatio | 45 % | 80 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=40000000000000000000000000&variableRateSlope2=3000000000000000000000000000&optimalUsageRatio=450000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=3040000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=40000000000000000000000000&variableRateSlope2=3000000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=3040000000000000000000000000) | + +## Emodes changed + +### EMode: Stablecoins(id: 1) + + + +### EMode: ETH correlated(id: 2) + + + +## Raw diff + +```json +{ + "reserves": { + "0x68f180fcCe6836688e9084f035309E29Bf0A2095": { + "reserveFactor": { + "from": 2000, + "to": 5000 + } + } + }, + "strategies": { + "0x68f180fcCe6836688e9084f035309E29Bf0A2095": { + "optimalUsageRatio": { + "from": "450000000000000000000000000", + "to": "800000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120_before_AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120_after.md b/diffs/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120_before_AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120_after.md new file mode 100644 index 000000000..d8df55857 --- /dev/null +++ b/diffs/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120_before_AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120_after.md @@ -0,0 +1,48 @@ +## Reserve changes + +### Reserves altered + +#### WBTC ([0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6](https://polygonscan.com/address/0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6)) + +| description | value before | value after | +| --- | --- | --- | +| reserveFactor | 20 % [2000] | 50 % [5000] | +| optimalUsageRatio | 45 % | 80 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=40000000000000000000000000&variableRateSlope2=3000000000000000000000000000&optimalUsageRatio=450000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=3040000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=40000000000000000000000000&variableRateSlope2=3000000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=3040000000000000000000000000) | + +## Emodes changed + +### EMode: Stablecoins(id: 1) + + + +### EMode: MATIC correlated(id: 2) + + + +### EMode: ETH correlated(id: 3) + + + +## Raw diff + +```json +{ + "reserves": { + "0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6": { + "reserveFactor": { + "from": 2000, + "to": 5000 + } + } + }, + "strategies": { + "0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6": { + "optimalUsageRatio": { + "from": "450000000000000000000000000", + "to": "800000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120.sol b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120.sol new file mode 100644 index 000000000..d3b3ed565 --- /dev/null +++ b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol'; +import {AaveV3PayloadArbitrum} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadArbitrum.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title WBTC Reserve Factor and UOptimal Increase + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-chaos-labs-risk-parameter-updates-wbtc-reserve-factor-and-uoptimal-increase-10-25-24/19596 + */ +contract AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120 is AaveV3PayloadArbitrum { + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV3ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](1); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3ArbitrumAssets.WBTC_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: 80_00, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: EngineFlags.KEEP_CURRENT, + variableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); + + return rateStrategies; + } + function borrowsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.BorrowUpdate[] memory) + { + IAaveV3ConfigEngine.BorrowUpdate[] + memory borrowUpdates = new IAaveV3ConfigEngine.BorrowUpdate[](1); + + borrowUpdates[0] = IAaveV3ConfigEngine.BorrowUpdate({ + asset: AaveV3ArbitrumAssets.WBTC_UNDERLYING, + enabledToBorrow: EngineFlags.KEEP_CURRENT, + flashloanable: EngineFlags.KEEP_CURRENT, + borrowableInIsolation: EngineFlags.KEEP_CURRENT, + withSiloedBorrowing: EngineFlags.KEEP_CURRENT, + reserveFactor: 50_00 + }); + + return borrowUpdates; + } +} diff --git a/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol new file mode 100644 index 000000000..0cd53b7e8 --- /dev/null +++ b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Arbitrum} from 'aave-address-book/AaveV3Arbitrum.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120} from './AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120.sol'; + +/** + * @dev Test for AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120 + * command: FOUNDRY_PROFILE=arbitrum forge test --match-path=src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol -vv + */ +contract AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120_Test is ProtocolV3TestBase { + AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('arbitrum'), 276532623); + proposal = new AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120', + AaveV3Arbitrum.POOL, + address(proposal) + ); + } +} diff --git a/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120.sol b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120.sol new file mode 100644 index 000000000..9d7f154f4 --- /dev/null +++ b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120.sol @@ -0,0 +1,55 @@ +// 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 {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title WBTC Reserve Factor and UOptimal Increase + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-chaos-labs-risk-parameter-updates-wbtc-reserve-factor-and-uoptimal-increase-10-25-24/19596 + */ +contract AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120 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.WBTC_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: 80_00, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: EngineFlags.KEEP_CURRENT, + variableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); + + return rateStrategies; + } + function borrowsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.BorrowUpdate[] memory) + { + IAaveV3ConfigEngine.BorrowUpdate[] + memory borrowUpdates = new IAaveV3ConfigEngine.BorrowUpdate[](1); + + borrowUpdates[0] = IAaveV3ConfigEngine.BorrowUpdate({ + asset: AaveV3EthereumAssets.WBTC_UNDERLYING, + enabledToBorrow: EngineFlags.KEEP_CURRENT, + flashloanable: EngineFlags.KEEP_CURRENT, + borrowableInIsolation: EngineFlags.KEEP_CURRENT, + withSiloedBorrowing: EngineFlags.KEEP_CURRENT, + reserveFactor: 50_00 + }); + + return borrowUpdates; + } +} diff --git a/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol new file mode 100644 index 000000000..dffa5e34f --- /dev/null +++ b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120.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_WBTCReserveFactorAndUOptimalIncrease_20241120} from './AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120.sol'; + +/** + * @dev Test for AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol -vv + */ +contract AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120_Test is ProtocolV3TestBase { + AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21230828); + proposal = new AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120', + AaveV3Ethereum.POOL, + address(proposal) + ); + } +} diff --git a/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120.sol b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120.sol new file mode 100644 index 000000000..eca72f78b --- /dev/null +++ b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3OptimismAssets} from 'aave-address-book/AaveV3Optimism.sol'; +import {AaveV3PayloadOptimism} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadOptimism.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title WBTC Reserve Factor and UOptimal Increase + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-chaos-labs-risk-parameter-updates-wbtc-reserve-factor-and-uoptimal-increase-10-25-24/19596 + */ +contract AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120 is AaveV3PayloadOptimism { + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV3ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](1); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3OptimismAssets.WBTC_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: 80_00, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: EngineFlags.KEEP_CURRENT, + variableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); + + return rateStrategies; + } + function borrowsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.BorrowUpdate[] memory) + { + IAaveV3ConfigEngine.BorrowUpdate[] + memory borrowUpdates = new IAaveV3ConfigEngine.BorrowUpdate[](1); + + borrowUpdates[0] = IAaveV3ConfigEngine.BorrowUpdate({ + asset: AaveV3OptimismAssets.WBTC_UNDERLYING, + enabledToBorrow: EngineFlags.KEEP_CURRENT, + flashloanable: EngineFlags.KEEP_CURRENT, + borrowableInIsolation: EngineFlags.KEEP_CURRENT, + withSiloedBorrowing: EngineFlags.KEEP_CURRENT, + reserveFactor: 50_00 + }); + + return borrowUpdates; + } +} diff --git a/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol new file mode 100644 index 000000000..9618bdb8b --- /dev/null +++ b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Optimism} from 'aave-address-book/AaveV3Optimism.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120} from './AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120.sol'; + +/** + * @dev Test for AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120 + * command: FOUNDRY_PROFILE=optimism forge test --match-path=src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol -vv + */ +contract AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120_Test is ProtocolV3TestBase { + AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('optimism'), 128264864); + proposal = new AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120', + AaveV3Optimism.POOL, + address(proposal) + ); + } +} diff --git a/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120.sol b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120.sol new file mode 100644 index 000000000..f09b57e05 --- /dev/null +++ b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3PolygonAssets} from 'aave-address-book/AaveV3Polygon.sol'; +import {AaveV3PayloadPolygon} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadPolygon.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title WBTC Reserve Factor and UOptimal Increase + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-chaos-labs-risk-parameter-updates-wbtc-reserve-factor-and-uoptimal-increase-10-25-24/19596 + */ +contract AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120 is AaveV3PayloadPolygon { + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV3ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](1); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3PolygonAssets.WBTC_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: 80_00, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: EngineFlags.KEEP_CURRENT, + variableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); + + return rateStrategies; + } + function borrowsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.BorrowUpdate[] memory) + { + IAaveV3ConfigEngine.BorrowUpdate[] + memory borrowUpdates = new IAaveV3ConfigEngine.BorrowUpdate[](1); + + borrowUpdates[0] = IAaveV3ConfigEngine.BorrowUpdate({ + asset: AaveV3PolygonAssets.WBTC_UNDERLYING, + enabledToBorrow: EngineFlags.KEEP_CURRENT, + flashloanable: EngineFlags.KEEP_CURRENT, + borrowableInIsolation: EngineFlags.KEEP_CURRENT, + withSiloedBorrowing: EngineFlags.KEEP_CURRENT, + reserveFactor: 50_00 + }); + + return borrowUpdates; + } +} diff --git a/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol new file mode 100644 index 000000000..27662e4fd --- /dev/null +++ b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Polygon} from 'aave-address-book/AaveV3Polygon.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120} from './AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120.sol'; + +/** + * @dev Test for AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120 + * command: FOUNDRY_PROFILE=polygon forge test --match-path=src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol -vv + */ +contract AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120_Test is ProtocolV3TestBase { + AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('polygon'), 64525193); + proposal = new AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120', + AaveV3Polygon.POOL, + address(proposal) + ); + } +} diff --git a/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/WBTCReserveFactorAndUOptimalIncrease.md b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/WBTCReserveFactorAndUOptimalIncrease.md new file mode 100644 index 000000000..04d596273 --- /dev/null +++ b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/WBTCReserveFactorAndUOptimalIncrease.md @@ -0,0 +1,70 @@ +--- +title: " WBTC Reserve Factor and UOptimal Increase " +author: "Aave Chan Initiative" +discussions: "https://governance.aave.com/t/arfc-chaos-labs-risk-parameter-updates-wbtc-reserve-factor-and-uoptimal-increase-10-25-24/19596" +snapshot: "Direct-to-AIP" +--- + +## Simple Summary + +Chaos Labs recommends adjusting WBTC’s parameters on all Aave V3 instances to increase the Aave DAO revenue while optimizing to meet the demand from yield-bearing BTC collateral assets. In this proposal, we recommend the following changes to WBTC: + +- Increasing the Reserve Factor +- Increasing the UOptimal + +## Motivation + +The incoming addition of BTC correlated E-Modes with the launch of Aave v3.2 Liquid E-Modes, and the increasing popularity of staked, yield-bearing BTC assets is expected to boost the demand for borrowing non-yield-bearing assets like WBTC. + +Given WBTC’s historical use mainly as a collateral asset and its supply being largely unaffected by changes in the supply rate, we see this as an opportunity to significantly boost DAO revenue without adversely impacting WBTC deposits. + +The adjustments to the Reserve Factor and UOptimal are designed to manage this increased demand while ensuring the protocol’s stability and attractiveness. + +### Reserve Factor + +WBTC has historically been an asset predominantly used as collateral, as evidenced by the borrow distribution, where stablecoins represent over 87% of the borrows against WBTC collateral. Additionally, more than 99% of the current WBTC supply is enabled as collateral, further supporting its primary use case within the market. + +As illustrated in the plot below, previous increases in the supply rate for WBTC have not significantly boosted deposits. While the protocol attracted over $2.5B in WBTC, the supply rate never exceeded 0.15%, a minimal and inconsequential yield. This indicates that most WBTC suppliers are largely indifferent to supply rates, using WBTC primarily as collateral rather than for yield generation. + +Given the minimal impact of WBTC’s supply rate on its supply behavior, we propose raising WBTC’s Reserve Factor from 20% to 50%. A similar change was done for weETH shortly after the launch of incentives and it had a positive effect on aligning the users with the market’s main goal. + +This substantial increase is also expected to significantly boost revenue for the Aave protocol, with additional revenue growth anticipated as the introduction of BTC/BTC E-Modes drives further borrow demand for WBTC. + +Chaos Labs will closely monitor the market and user’s behavior and will recommend further adjustments to the Reserve Factor accordingly. + +### UOptimal + +We recommend increasing UOptimal from 45% to 80%. This adjustment will accommodate a higher utilization rate, enabling the market to meet an increase in borrow demand. The current Kink set at 45% is optimal for assets that either lack significant borrow demand or are yield-bearing. However, with the emergence and growth of liquid-staked BTC assets, WBTC transitions from a category of limited borrow demand to one with substantial borrow demand. This shift necessitates the recommended change in UOptimal to better align with the new market dynamics. + +While this adjustment will lead to a further reduction in the supply rate, we anticipate it will not negatively impact WBTC supply. + +### Revenue + +Given the current market’s minimal borrow demand and low supply rates, these changes are unlikely to negatively impact existing users and suppliers. Following the adjustments, the APY for supplying WBTC on Ethereum is expected to decrease from 0.0414% to 0.0146%. In turn, we anticipate that the DAO’s annual revenue from all the WBTC markets will increase by over 40% before the addition of new BTC/BTC E-Modes. + +## Specification + +By implementing these recommendations, Aave adapts itself to the evolving market while improving the DAO’s revenue. As always, Chaos Labs will continue monitoring market conditions closely and recommend additional adjustments to ensure Aave’s safety and efficiency. + +| **Parameter** | **Current Value** | Recommended Value | +| -------------- | ----------------- | ----------------- | +| Reserve Factor | 20% | 50% | +| UOptimal | 45% | 80% | + +We recommend applying the changes to the following V3 deployments: + +- Ethereum - Main +- Optimism +- Arbitrum +- Polygon + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol) +- Snapshot: Direct-to-AIP +- [Discussion](https://governance.aave.com/t/arfc-chaos-labs-risk-parameter-updates-wbtc-reserve-factor-and-uoptimal-increase-10-25-24/19596) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/WBTCReserveFactorAndUOptimalIncrease_20241120.s.sol b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/WBTCReserveFactorAndUOptimalIncrease_20241120.s.sol new file mode 100644 index 000000000..8348caed9 --- /dev/null +++ b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/WBTCReserveFactorAndUOptimalIncrease_20241120.s.sol @@ -0,0 +1,150 @@ +// 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, PolygonScript, OptimismScript, ArbitrumScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120} from './AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120.sol'; +import {AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120} from './AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120.sol'; +import {AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120} from './AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120.sol'; +import {AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120} from './AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/WBTCReserveFactorAndUOptimalIncrease_20241120.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/WBTCReserveFactorAndUOptimalIncrease_20241120.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Polygon + * deploy-command: make deploy-ledger contract=src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/WBTCReserveFactorAndUOptimalIncrease_20241120.s.sol:DeployPolygon chain=polygon + * verify-command: FOUNDRY_PROFILE=polygon npx catapulta-verify -b broadcast/WBTCReserveFactorAndUOptimalIncrease_20241120.s.sol/137/run-latest.json + */ +contract DeployPolygon is PolygonScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Optimism + * deploy-command: make deploy-ledger contract=src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/WBTCReserveFactorAndUOptimalIncrease_20241120.s.sol:DeployOptimism chain=optimism + * verify-command: FOUNDRY_PROFILE=optimism npx catapulta-verify -b broadcast/WBTCReserveFactorAndUOptimalIncrease_20241120.s.sol/10/run-latest.json + */ +contract DeployOptimism is OptimismScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Arbitrum + * deploy-command: make deploy-ledger contract=src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/WBTCReserveFactorAndUOptimalIncrease_20241120.s.sol:DeployArbitrum chain=arbitrum + * verify-command: FOUNDRY_PROFILE=arbitrum npx catapulta-verify -b broadcast/WBTCReserveFactorAndUOptimalIncrease_20241120.s.sol/42161/run-latest.json + */ +contract DeployArbitrum is ArbitrumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120).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/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/WBTCReserveFactorAndUOptimalIncrease_20241120.s.sol:CreateProposal chain=mainnet + */ +contract CreateProposal is EthereumScript { + function run() external { + // create payloads + PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](4); + + // compose actions for validation + IPayloadsControllerCore.ExecutionAction[] + memory actionsEthereum = new IPayloadsControllerCore.ExecutionAction[](1); + actionsEthereum[0] = GovV3Helpers.buildAction( + type(AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsPolygon = new IPayloadsControllerCore.ExecutionAction[](1); + actionsPolygon[0] = GovV3Helpers.buildAction( + type(AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120).creationCode + ); + payloads[1] = GovV3Helpers.buildPolygonPayload(vm, actionsPolygon); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsOptimism = new IPayloadsControllerCore.ExecutionAction[](1); + actionsOptimism[0] = GovV3Helpers.buildAction( + type(AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120).creationCode + ); + payloads[2] = GovV3Helpers.buildOptimismPayload(vm, actionsOptimism); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsArbitrum = new IPayloadsControllerCore.ExecutionAction[](1); + actionsArbitrum[0] = GovV3Helpers.buildAction( + type(AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120).creationCode + ); + payloads[3] = GovV3Helpers.buildArbitrumPayload(vm, actionsArbitrum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/WBTCReserveFactorAndUOptimalIncrease.md' + ) + ); + } +} diff --git a/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/config.ts b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/config.ts new file mode 100644 index 000000000..6e3cf0c90 --- /dev/null +++ b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/config.ts @@ -0,0 +1,120 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + author: 'Aave Chan Initiative', + pools: ['AaveV3Ethereum', 'AaveV3Polygon', 'AaveV3Optimism', 'AaveV3Arbitrum'], + title: ' WBTC Reserve Factor and UOptimal Increase ', + shortName: 'WBTCReserveFactorAndUOptimalIncrease', + date: '20241120', + discussion: + 'https://governance.aave.com/t/arfc-chaos-labs-risk-parameter-updates-wbtc-reserve-factor-and-uoptimal-increase-10-25-24/19596', + snapshot: 'Direct-to-AIP', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Ethereum: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'WBTC', + params: { + optimalUtilizationRate: '80', + baseVariableBorrowRate: '', + variableRateSlope1: '', + variableRateSlope2: '', + }, + }, + ], + BORROWS_UPDATE: [ + { + enabledToBorrow: 'KEEP_CURRENT', + flashloanable: 'KEEP_CURRENT', + borrowableInIsolation: 'KEEP_CURRENT', + withSiloedBorrowing: 'KEEP_CURRENT', + reserveFactor: '50', + asset: 'WBTC', + }, + ], + }, + cache: {blockNumber: 21230828}, + }, + AaveV3Polygon: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'WBTC', + params: { + optimalUtilizationRate: '80', + baseVariableBorrowRate: '', + variableRateSlope1: '', + variableRateSlope2: '', + }, + }, + ], + BORROWS_UPDATE: [ + { + enabledToBorrow: 'KEEP_CURRENT', + flashloanable: 'KEEP_CURRENT', + borrowableInIsolation: 'KEEP_CURRENT', + withSiloedBorrowing: 'KEEP_CURRENT', + reserveFactor: '50', + asset: 'WBTC', + }, + ], + }, + cache: {blockNumber: 64525193}, + }, + AaveV3Optimism: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'WBTC', + params: { + optimalUtilizationRate: '80', + baseVariableBorrowRate: '', + variableRateSlope1: '', + variableRateSlope2: '', + }, + }, + ], + BORROWS_UPDATE: [ + { + enabledToBorrow: 'KEEP_CURRENT', + flashloanable: 'KEEP_CURRENT', + borrowableInIsolation: 'KEEP_CURRENT', + withSiloedBorrowing: 'KEEP_CURRENT', + reserveFactor: '50', + asset: 'WBTC', + }, + ], + }, + cache: {blockNumber: 128264864}, + }, + AaveV3Arbitrum: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'WBTC', + params: { + optimalUtilizationRate: '80', + baseVariableBorrowRate: '', + variableRateSlope1: '', + variableRateSlope2: '', + }, + }, + ], + BORROWS_UPDATE: [ + { + enabledToBorrow: 'KEEP_CURRENT', + flashloanable: 'KEEP_CURRENT', + borrowableInIsolation: 'KEEP_CURRENT', + withSiloedBorrowing: 'KEEP_CURRENT', + reserveFactor: '50', + asset: 'WBTC', + }, + ], + }, + cache: {blockNumber: 276532623}, + }, + }, +}; From 5174eee45451cf3622de6243c8ac63d276382380 Mon Sep 17 00:00:00 2001 From: Cache bot Date: Wed, 27 Nov 2024 12:35:09 +0000 Subject: [PATCH 27/35] fix(cache): automated cache update [skip ci] --- .../WBTCReserveFactorAndUOptimalIncrease.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/WBTCReserveFactorAndUOptimalIncrease.md b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/WBTCReserveFactorAndUOptimalIncrease.md index 04d596273..86a0d6ddf 100644 --- a/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/WBTCReserveFactorAndUOptimalIncrease.md +++ b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/WBTCReserveFactorAndUOptimalIncrease.md @@ -60,8 +60,8 @@ We recommend applying the changes to the following V3 deployments: ## References -- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120.sol) -- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol) +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/bc6cb8c2474e2ca9a09e757e07269139f2295eb6/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/bc6cb8c2474e2ca9a09e757e07269139f2295eb6/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/bc6cb8c2474e2ca9a09e757e07269139f2295eb6/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/bc6cb8c2474e2ca9a09e757e07269139f2295eb6/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/bc6cb8c2474e2ca9a09e757e07269139f2295eb6/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/bc6cb8c2474e2ca9a09e757e07269139f2295eb6/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/bc6cb8c2474e2ca9a09e757e07269139f2295eb6/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/bc6cb8c2474e2ca9a09e757e07269139f2295eb6/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol) - Snapshot: Direct-to-AIP - [Discussion](https://governance.aave.com/t/arfc-chaos-labs-risk-parameter-updates-wbtc-reserve-factor-and-uoptimal-increase-10-25-24/19596) From e2930ccf4ebec53708aec1b09e430430c701a24e Mon Sep 17 00:00:00 2001 From: MartinGbz Date: Thu, 28 Nov 2024 12:49:22 +0100 Subject: [PATCH 28/35] =?UTF-8?q?=E2=9C=A8=20Update=20USDS=20BR=20(#536)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: USDS BR update * 🔧 switch from 2 to 3% of increase * 🐛 fix issue md * Update src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/USDSBorrowRateUpdateOnCoreAndPrimeInstances.md Co-authored-by: Lukas * 🐛 remove susde freeze * 🐛 remove freeze from config file * fix: remove "Pause sUSDe" part in md Co-authored-by: Harsh Pandey * fix: increase rate number update in md Co-authored-by: Harsh Pandey * ♻️ prettify md --------- Co-authored-by: Rozengarden Co-authored-by: Lukas Co-authored-by: Harsh Pandey --- ...eOnCoreAndPrimeInstances_20241122_after.md | 30 ++++++++ ...eOnCoreAndPrimeInstances_20241122_after.md | 30 ++++++++ ...UpdateOnCoreAndPrimeInstances_20241122.sol | 37 ++++++++++ ...dateOnCoreAndPrimeInstances_20241122.t.sol | 34 ++++++++++ ...UpdateOnCoreAndPrimeInstances_20241122.sol | 37 ++++++++++ ...dateOnCoreAndPrimeInstances_20241122.t.sol | 34 ++++++++++ ...BorrowRateUpdateOnCoreAndPrimeInstances.md | 63 +++++++++++++++++ ...dateOnCoreAndPrimeInstances_20241122.s.sol | 68 +++++++++++++++++++ .../config.ts | 49 +++++++++++++ 9 files changed, 382 insertions(+) create mode 100644 diffs/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_before_AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_after.md create mode 100644 diffs/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_before_AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_after.md create mode 100644 src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.sol create mode 100644 src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.t.sol create mode 100644 src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.sol create mode 100644 src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.t.sol create mode 100644 src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/USDSBorrowRateUpdateOnCoreAndPrimeInstances.md create mode 100644 src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.s.sol create mode 100644 src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/config.ts diff --git a/diffs/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_before_AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_after.md b/diffs/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_before_AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_after.md new file mode 100644 index 000000000..cf884f873 --- /dev/null +++ b/diffs/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_before_AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_after.md @@ -0,0 +1,30 @@ +## Reserve changes + +### Reserves altered + +#### USDS ([0xdC035D45d973E3EC169d2276DDab16f1e407384F](https://etherscan.io/address/0xdC035D45d973E3EC169d2276DDab16f1e407384F)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 82 % | 85 % | +| variableRateSlope1 | 6.25 % | 9.25 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=62500000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=7500000000000000000000000&maxVariableBorrowRate=820000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=92500000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=7500000000000000000000000&maxVariableBorrowRate=850000000000000000000000000) | + +## Raw diff + +```json +{ + "strategies": { + "0xdC035D45d973E3EC169d2276DDab16f1e407384F": { + "maxVariableBorrowRate": { + "from": "820000000000000000000000000", + "to": "850000000000000000000000000" + }, + "variableRateSlope1": { + "from": "62500000000000000000000000", + "to": "92500000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_before_AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_after.md b/diffs/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_before_AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_after.md new file mode 100644 index 000000000..7a2fc85c1 --- /dev/null +++ b/diffs/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_before_AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_after.md @@ -0,0 +1,30 @@ +## Reserve changes + +### Reserves altered + +#### USDS ([0xdC035D45d973E3EC169d2276DDab16f1e407384F](https://etherscan.io/address/0xdC035D45d973E3EC169d2276DDab16f1e407384F)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 82 % | 85 % | +| baseVariableBorrowRate | 6.25 % | 9.25 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=7500000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=62500000000000000000000000&maxVariableBorrowRate=820000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=7500000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=92500000000000000000000000&maxVariableBorrowRate=850000000000000000000000000) | + +## Raw diff + +```json +{ + "strategies": { + "0xdC035D45d973E3EC169d2276DDab16f1e407384F": { + "baseVariableBorrowRate": { + "from": "62500000000000000000000000", + "to": "92500000000000000000000000" + }, + "maxVariableBorrowRate": { + "from": "820000000000000000000000000", + "to": "850000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.sol b/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.sol new file mode 100644 index 000000000..1066a1d33 --- /dev/null +++ b/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumLido, AaveV3EthereumLidoAssets} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {AaveV3PayloadEthereumLido} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereumLido.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title USDS borrow rate update on Core and Prime Instances + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-usds-borrow-rate-update-on-core-and-prime-instances/19901 + */ +contract AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122 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.USDS_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 9_25, + variableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); + + return rateStrategies; + } +} diff --git a/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.t.sol b/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.t.sol new file mode 100644 index 000000000..838e759f4 --- /dev/null +++ b/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.t.sol @@ -0,0 +1,34 @@ +// 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_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122} from './AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.sol'; + +/** + * @dev Test for AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.t.sol -vv + */ +contract AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_Test is + ProtocolV3TestBase +{ + AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21243125); + proposal = new AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122', + AaveV3EthereumLido.POOL, + address(proposal) + ); + } +} diff --git a/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.sol b/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.sol new file mode 100644 index 000000000..0032bb748 --- /dev/null +++ b/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.sol @@ -0,0 +1,37 @@ +// 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 {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title USDS borrow rate update on Core and Prime Instances + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-usds-borrow-rate-update-on-core-and-prime-instances/19901 + */ +contract AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122 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.USDS_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: 9_25, + variableRateSlope1: EngineFlags.KEEP_CURRENT, + variableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); + + return rateStrategies; + } +} diff --git a/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.t.sol b/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.t.sol new file mode 100644 index 000000000..87e76f1c7 --- /dev/null +++ b/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.t.sol @@ -0,0 +1,34 @@ +// 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_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122} from './AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.sol'; + +/** + * @dev Test for AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.t.sol -vv + */ +contract AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_Test is + ProtocolV3TestBase +{ + AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21243091); + proposal = new AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122', + AaveV3Ethereum.POOL, + address(proposal) + ); + } +} diff --git a/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/USDSBorrowRateUpdateOnCoreAndPrimeInstances.md b/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/USDSBorrowRateUpdateOnCoreAndPrimeInstances.md new file mode 100644 index 000000000..0c08da1a9 --- /dev/null +++ b/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/USDSBorrowRateUpdateOnCoreAndPrimeInstances.md @@ -0,0 +1,63 @@ +--- +title: "USDS borrow rate update on Core and Prime Instances" +author: "Aave Chan Initiative" +discussions: "https://governance.aave.com/t/arfc-usds-borrow-rate-update-on-core-and-prime-instances/19901" +--- + +## Simple Summary + +This proposal recommends increasing the USDS Core Instance Base Rate (currently at 6.25%) and Slope1 (currently at 6.25%) on Prime Market. + +Raising USDS borrowing rates ensures the SSR remains competitive, attracting demand while discouraging excessive borrowing at unsustainable levels. + +We also propose pausing sUSDe operations in the Prime instance to focus on scaling USDS liquidity in the Core Market, where there is significant demand. + +This is a Direct to AIP Proposal. + +## Motivation + +Recent observations in the market have highlighted issues stemming from **sUSDe** in the Prime instance: + +1. **sUSDe’s Impact on USDS Borrow Rate**:The presence of sUSDe is driving up the USDS Borrow Rate, creating pressure in the Prime Instance. The high rates pose a risk of cascading rebalances, particularly: + +- wstETH collateral migrates to Spark for USDS liquidity. +- ezETH loopers exit due to spiking wstETH borrow rates. +- Resulting in a significant outflow of AUM from the market. + +2. **Mismatch Between Liquidity and Risk**: + +- The liquidity needs of sUSDe are not being met effectively, leading to imbalance. +- The market is unable to accommodate the current sUSDe scale without affecting overall stability. + +While at same time there is substantial **Untapped Demand in the Core Instance**: + +- The substantial demand in the Core Instance presents an opportunity to scale USDS aggressively while mitigating risk. + +## Specification + +### 1. **Increase USDS Base Rate 3% on Core Instance and 3% Slope1 on Prime Instance** + +- Adjusting the borrow rate is a necessary step to manage the borrowing cost dynamics and balance the market risk posed by sUSDe. +- This adjustment should be implemented across both the Prime and Core Instances. + +| **Parameter** | **Current** | **Proposed** | **Change** | +| -------------- | ----------- | ------------ | ---------- | +| _Prime Market_ | | | | +| Base | 0.75% | 0.75% | No change | +| Slope1 | 6.25% | 9.25% | +3% | +| Slope2 | 75% | 75% | No change | +| _Core Market_ | | | | +| Base | 6.25% | 9.25% | +3% | +| Slope1 | 0.75% | 0.75% | No change | +| Slope2 | 75% | 75% | No change | + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.t.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.t.sol) +- Snapshot : Direct-to-AIP +- [Discussion](https://governance.aave.com/t/arfc-usds-borrow-rate-update-on-core-and-prime-instances/19901) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.s.sol b/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.s.sol new file mode 100644 index 000000000..bc72b3daa --- /dev/null +++ b/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.s.sol @@ -0,0 +1,68 @@ +// 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_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122} from './AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.sol'; +import {AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122} from './AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122).creationCode + ); + address payload1 = GovV3Helpers.deployDeterministic( + type(AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122).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/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.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_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122).creationCode + ); + actionsEthereum[1] = GovV3Helpers.buildAction( + type(AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/USDSBorrowRateUpdateOnCoreAndPrimeInstances.md' + ) + ); + } +} diff --git a/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/config.ts b/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/config.ts new file mode 100644 index 000000000..f6572ea03 --- /dev/null +++ b/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/config.ts @@ -0,0 +1,49 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + configFile: 'src/20241122_Multi_IncreaseUSDSCoreAndPrimeInstanceBaseRateTo825/config.ts', + author: 'Aave Chan Initiative', + pools: ['AaveV3Ethereum', 'AaveV3EthereumLido'], + title: 'USDS borrow rate update on Core and Prime Instances', + shortName: 'USDSBorrowRateUpdateOnCoreAndPrimeInstances', + date: '20241122', + discussion: + 'https://governance.aave.com/t/arfc-usds-borrow-rate-update-on-core-and-prime-instances/19901', + snapshot: 'Direct-to-AIP', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Ethereum: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'USDS', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '9.25', + variableRateSlope1: '', + variableRateSlope2: '', + }, + }, + ], + }, + cache: {blockNumber: 21243091}, + }, + AaveV3EthereumLido: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'USDS', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '9.25', + variableRateSlope2: '', + }, + }, + ], + }, + cache: {blockNumber: 21243125}, + }, + }, +}; From 12438ce7d367daf14b7bd9b836a8bcad8f7b0a6f Mon Sep 17 00:00:00 2001 From: Cache bot Date: Thu, 28 Nov 2024 11:49:45 +0000 Subject: [PATCH 29/35] fix(cache): automated cache update [skip ci] --- .../USDSBorrowRateUpdateOnCoreAndPrimeInstances.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/USDSBorrowRateUpdateOnCoreAndPrimeInstances.md b/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/USDSBorrowRateUpdateOnCoreAndPrimeInstances.md index 0c08da1a9..c4d8653e6 100644 --- a/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/USDSBorrowRateUpdateOnCoreAndPrimeInstances.md +++ b/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/USDSBorrowRateUpdateOnCoreAndPrimeInstances.md @@ -53,8 +53,8 @@ While at same time there is substantial **Untapped Demand in the Core Instance** ## References -- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.sol) -- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.t.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.t.sol) +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/e2930ccf4ebec53708aec1b09e430430c701a24e/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/e2930ccf4ebec53708aec1b09e430430c701a24e/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/e2930ccf4ebec53708aec1b09e430430c701a24e/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.t.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/e2930ccf4ebec53708aec1b09e430430c701a24e/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.t.sol) - Snapshot : Direct-to-AIP - [Discussion](https://governance.aave.com/t/arfc-usds-borrow-rate-update-on-core-and-prime-instances/19901) From b537d861c6636003e985d83f1f622346ea62c1ac Mon Sep 17 00:00:00 2001 From: Alice <121383428+Rozengarden@users.noreply.github.com> Date: Thu, 28 Nov 2024 16:28:20 +0100 Subject: [PATCH 30/35] Aavechan/dhedge flashborrower (#538) --- ...ProtocolToFlashBorrowers_20241118_after.md | 5 + ...ProtocolToFlashBorrowers_20241118_after.md | 5 + ...ProtocolToFlashBorrowers_20241118_after.md | 5 + ...ProtocolToFlashBorrowers_20241118_after.md | 5 + generator/templates/aip.template.ts | 21 ++- ...HEDGEProtocolToFlashBorrowers_20241118.sol | 20 +++ ...DGEProtocolToFlashBorrowers_20241118.t.sol | 43 +++++ ...HEDGEProtocolToFlashBorrowers_20241118.sol | 20 +++ ...DGEProtocolToFlashBorrowers_20241118.t.sol | 43 +++++ ...HEDGEProtocolToFlashBorrowers_20241118.sol | 20 +++ ...DGEProtocolToFlashBorrowers_20241118.t.sol | 43 +++++ ...HEDGEProtocolToFlashBorrowers_20241118.sol | 21 +++ ...DGEProtocolToFlashBorrowers_20241118.t.sol | 42 +++++ .../AddDHEDGEProtocolToFlashBorrowers.md | 89 +++++++++++ ...DGEProtocolToFlashBorrowers_20241118.s.sol | 150 ++++++++++++++++++ .../FlashBorrowersData.sol | 74 +++++++++ .../config.ts | 31 ++++ 17 files changed, 631 insertions(+), 6 deletions(-) create mode 100644 diffs/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118_before_AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118_after.md create mode 100644 diffs/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118_before_AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118_after.md create mode 100644 diffs/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118_before_AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118_after.md create mode 100644 diffs/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118_before_AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118_after.md create mode 100644 src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118.sol create mode 100644 src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol create mode 100644 src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118.sol create mode 100644 src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol create mode 100644 src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118.sol create mode 100644 src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol create mode 100644 src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118.sol create mode 100644 src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol create mode 100644 src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AddDHEDGEProtocolToFlashBorrowers.md create mode 100644 src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AddDHEDGEProtocolToFlashBorrowers_20241118.s.sol create mode 100644 src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/FlashBorrowersData.sol create mode 100644 src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/config.ts diff --git a/diffs/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118_before_AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118_after.md b/diffs/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118_before_AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118_before_AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118_before_AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118_after.md b/diffs/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118_before_AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118_before_AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118_before_AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118_after.md b/diffs/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118_before_AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118_before_AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118_before_AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118_after.md b/diffs/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118_before_AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118_before_AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/generator/templates/aip.template.ts b/generator/templates/aip.template.ts index 41b90fcf6..d1b907e68 100644 --- a/generator/templates/aip.template.ts +++ b/generator/templates/aip.template.ts @@ -3,10 +3,14 @@ import {Options, PoolConfigs, PoolIdentifier} from '../types'; export function generateAIP(options: Options, configs: PoolConfigs) { return `--- -title: ${`"${options.title}"` || 'TODO'} -author: ${`"${options.author}"` || 'TODO'} -discussions: ${`"${options.discussion}"` || 'TODO'}${ - options.snapshot ? `\nsnapshot: "${options.snapshot}"\n` : '' +title: ${options.title ? `"${options.title}"` : 'TODO'} +author: ${options.author ? `"${options.author}"` : 'TODO'} +discussions: ${options.discussion ? `"${options.discussion}"` : 'TODO'}${ + options.snapshot + ? options.snapshot.toLowerCase() != 'direct-to-aip' + ? `\nsnapshot: "${options.snapshot}"\n` + : '' + : '\nsnapshot: TODO' } --- @@ -42,8 +46,13 @@ ${Object.keys(configs) options, )}/${generateContractName(options, pool)}.t.sol)`, ) - .join(', ')} -- [Snapshot](${options.snapshot || 'TODO'}) + .join(', ')}${ + options.snapshot + ? options.snapshot.toLowerCase() != 'direct-to-aip' + ? `\n- [Snapshot](${options.snapshot})` + : '\n- Snapshot: Direct-to-AIP' + : '\n[Snapshot](TODO)' + } - [Discussion](${options.discussion || 'TODO'}) ## Copyright diff --git a/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118.sol b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118.sol new file mode 100644 index 000000000..14d665288 --- /dev/null +++ b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Arbitrum} from 'aave-address-book/AaveV3Arbitrum.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {FlashBorrowersDataArbitrum} from './FlashBorrowersData.sol'; +/** + * @title Add dHEDGE Protocol to flashBorrowers + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-add-dhedge-protocol-to-flashborrowers/19547 + */ +contract AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118 is IProposalGenericExecutor { + function execute() external { + address[] memory flashBorrowers = FlashBorrowersDataArbitrum.getFlashBorrowers(); + for (uint i = 0; i < flashBorrowers.length; i++) { + AaveV3Arbitrum.ACL_MANAGER.addFlashBorrower(flashBorrowers[i]); + } + } +} diff --git a/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol new file mode 100644 index 000000000..709dafaa5 --- /dev/null +++ b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3Arbitrum} from 'aave-address-book/AaveV3Arbitrum.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118} from './AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118.sol'; +import {FlashBorrowersDataArbitrum} from './FlashBorrowersData.sol'; + +/** + * @dev Test for AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118 + * command: FOUNDRY_PROFILE=arbitrum forge test --match-path=src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol -vv + */ +contract AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118_Test is ProtocolV3TestBase { + AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('arbitrum'), 275871816); + proposal = new AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118', + AaveV3Arbitrum.POOL, + address(proposal) + ); + } + + function test_isFlashBorrower() external { + GovV3Helpers.executePayload(vm, address(proposal)); + address[] memory flashBorrowers = FlashBorrowersDataArbitrum.getFlashBorrowers(); + for (uint i = 0; i < flashBorrowers.length; i++) { + bool isFlashBorrower = AaveV3Arbitrum.ACL_MANAGER.isFlashBorrower(flashBorrowers[i]); + assertEq(isFlashBorrower, true); + } + } +} diff --git a/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118.sol b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118.sol new file mode 100644 index 000000000..79aba8f78 --- /dev/null +++ b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Base} from 'aave-address-book/AaveV3Base.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {FlashBorrowersDataBase} from './FlashBorrowersData.sol'; +/** + * @title Add dHEDGE Protocol to flashBorrowers + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-add-dhedge-protocol-to-flashborrowers/19547 + */ +contract AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118 is IProposalGenericExecutor { + function execute() external { + address[] memory flashBorrowers = FlashBorrowersDataBase.getFlashBorrowers(); + for (uint i = 0; i < flashBorrowers.length; i++) { + AaveV3Base.ACL_MANAGER.addFlashBorrower(flashBorrowers[i]); + } + } +} diff --git a/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol new file mode 100644 index 000000000..596795ced --- /dev/null +++ b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3Base} from 'aave-address-book/AaveV3Base.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118} from './AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118.sol'; +import {FlashBorrowersDataBase} from './FlashBorrowersData.sol'; + +/** + * @dev Test for AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118 + * command: FOUNDRY_PROFILE=base forge test --match-path=src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol -vv + */ +contract AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118_Test is ProtocolV3TestBase { + AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('base'), 22586604); + proposal = new AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118', + AaveV3Base.POOL, + address(proposal) + ); + } + + function test_isFlashBorrower() external { + GovV3Helpers.executePayload(vm, address(proposal)); + address[] memory flashBorrowers = FlashBorrowersDataBase.getFlashBorrowers(); + for (uint i = 0; i < flashBorrowers.length; i++) { + bool isFlashBorrower = AaveV3Base.ACL_MANAGER.isFlashBorrower(flashBorrowers[i]); + assertEq(isFlashBorrower, true); + } + } +} diff --git a/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118.sol b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118.sol new file mode 100644 index 000000000..b0c5b6e51 --- /dev/null +++ b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Optimism} from 'aave-address-book/AaveV3Optimism.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {FlashBorrowersDataOptimism} from './FlashBorrowersData.sol'; +/** + * @title Add dHEDGE Protocol to flashBorrowers + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-add-dhedge-protocol-to-flashborrowers/19547 + */ +contract AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118 is IProposalGenericExecutor { + function execute() external { + address[] memory flashBorrowers = FlashBorrowersDataOptimism.getFlashBorrowers(); + for (uint i = 0; i < flashBorrowers.length; i++) { + AaveV3Optimism.ACL_MANAGER.addFlashBorrower(flashBorrowers[i]); + } + } +} diff --git a/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol new file mode 100644 index 000000000..f4ceca7d7 --- /dev/null +++ b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3Optimism} from 'aave-address-book/AaveV3Optimism.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118} from './AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118.sol'; +import {FlashBorrowersDataOptimism} from './FlashBorrowersData.sol'; + +/** + * @dev Test for AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118 + * command: FOUNDRY_PROFILE=optimism forge test --match-path=src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol -vv + */ +contract AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118_Test is ProtocolV3TestBase { + AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('optimism'), 128181628); + proposal = new AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118', + AaveV3Optimism.POOL, + address(proposal) + ); + } + + function test_isFlashBorrower() external { + GovV3Helpers.executePayload(vm, address(proposal)); + address[] memory flashBorrowers = FlashBorrowersDataOptimism.getFlashBorrowers(); + for (uint i = 0; i < flashBorrowers.length; i++) { + bool isFlashBorrower = AaveV3Optimism.ACL_MANAGER.isFlashBorrower(flashBorrowers[i]); + assertEq(isFlashBorrower, true); + } + } +} diff --git a/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118.sol b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118.sol new file mode 100644 index 000000000..d50c79044 --- /dev/null +++ b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Polygon} from 'aave-address-book/AaveV3Polygon.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; + +import {FlashBorrowersDataPolygon} from './FlashBorrowersData.sol'; +/** + * @title Add dHEDGE Protocol to flashBorrowers + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-add-dhedge-protocol-to-flashborrowers/19547 + */ +contract AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118 is IProposalGenericExecutor { + function execute() external { + address[] memory flashBorrowers = FlashBorrowersDataPolygon.getFlashBorrowers(); + for (uint i = 0; i < flashBorrowers.length; i++) { + AaveV3Polygon.ACL_MANAGER.addFlashBorrower(flashBorrowers[i]); + } + } +} diff --git a/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol new file mode 100644 index 000000000..ad76e8433 --- /dev/null +++ b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3Polygon} from 'aave-address-book/AaveV3Polygon.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118} from './AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118.sol'; +import {FlashBorrowersDataPolygon} from './FlashBorrowersData.sol'; +/** + * @dev Test for AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118 + * command: FOUNDRY_PROFILE=polygon forge test --match-path=src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol -vv + */ +contract AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118_Test is ProtocolV3TestBase { + AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('polygon'), 64447789); + proposal = new AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118', + AaveV3Polygon.POOL, + address(proposal) + ); + } + + function test_isFlashBorrower() external { + GovV3Helpers.executePayload(vm, address(proposal)); + address[] memory flashBorrowers = FlashBorrowersDataPolygon.getFlashBorrowers(); + for (uint i = 0; i < flashBorrowers.length; i++) { + bool isFlashBorrower = AaveV3Polygon.ACL_MANAGER.isFlashBorrower(flashBorrowers[i]); + assertEq(isFlashBorrower, true); + } + } +} diff --git a/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AddDHEDGEProtocolToFlashBorrowers.md b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AddDHEDGEProtocolToFlashBorrowers.md new file mode 100644 index 000000000..228779968 --- /dev/null +++ b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AddDHEDGEProtocolToFlashBorrowers.md @@ -0,0 +1,89 @@ +--- +title: "Add dHEDGE Protocol to flashBorrowers" +author: "Aave Chan Initiative" +discussions: "https://governance.aave.com/t/arfc-add-dhedge-protocol-to-flashborrowers/19547" +--- + +## Simple Summary + +The following proposal plans to add dHEDGE Protocol as a whitelisted actor of the Flashborrowers of Aave V3 on Base, Polygon, Arbitrum, and Optimism liquidity pools. + +## Motivation + +If this proposal is implemented, all flashLoan fees for dHEGDE Protocol using Aave would be waived. + +dHEDGE is a tokenized vault protocol that allows users to build, manage, and automate vault strategies. dHEDGE has many vaults that currently use AAVE V3, most notably Toros Finance Leverge tokens. + +[dHEDGE Protocol](https://dhedge.org/)[Toros Finance](https://toros.finance/) + +Given [[ARFC] Add Contango Protocol, CIAN Protocol and Index Coop to flashBorrowers on Aave v3](https://governance.aave.com/t/arfc-add-contango-protocol-cian-protocol-and-index-coop-to-flashborrowers-on-aave-v3/16478) passed [Snapshot](https://snapshot.org/#/aave.eth/proposal/0x09bb9e7cffc974d330d82ce7a0b0502b573d6f3b4f839ea15d6629613901e96d) with 595k votes in favour, this proposal intends to utilize the Direct-to-AIP proposes to whitelisted permissions on dHEDGE Protocol. + +## Specification + +Whitelist dHEDGE Protocol as part of FlashBorrowers of Aave V3 on Base, Polygon, Arbitrum & Optimism liquidity pools. + +This proposal aims to implement a single AIP, utilizing four similar payloads (one for each network), which will call addFlashBorrower() on the ACL_MANAGER contract for the followings addresses. + +**Optimism** + +- [0x83d1fa384ec44c2769a3562ede372484f26e141b](https://optimistic.etherscan.io/address/0x83d1fa384ec44c2769a3562ede372484f26e141b) +- [0x32ad28356ef70adc3ec051d8aacdeeaa10135296](https://optimistic.etherscan.io/address/0x32ad28356ef70adc3ec051d8aacdeeaa10135296) +- [0xb03818de4992388260b62259361778cf98485dfe](https://optimistic.etherscan.io/address/0xb03818de4992388260b62259361778cf98485dfe) +- [0x11b55966527ff030ca9c7b1c548b4be5e7eaee6d](https://optimistic.etherscan.io/address/0x11b55966527ff030ca9c7b1c548b4be5e7eaee6d) +- [0xcacb5a722a36cff6baeb359e21c098a4acbffdfa](https://optimistic.etherscan.io/address/0xcacb5a722a36cff6baeb359e21c098a4acbffdfa) +- [0x9573c7b691cdcebbfa9d655181f291799dfb7cf5](https://optimistic.etherscan.io/address/0x9573c7b691cdcebbfa9d655181f291799dfb7cf5) +- [0x32b1d1bfd4b3b0cb9ff2dcd9dac757aa64d4cb69](https://optimistic.etherscan.io/address/0x32b1d1bfd4b3b0cb9ff2dcd9dac757aa64d4cb69) +- [0x7d3c9c6566375d7ad6e89169ca5c01b5edc15364](https://optimistic.etherscan.io/address/0x7d3c9c6566375d7ad6e89169ca5c01b5edc15364) +- [0xcc7d6ed524760539311ed0cdb41d0852b4eb77eb](https://optimistic.etherscan.io/address/0xcc7d6ed524760539311ed0cdb41d0852b4eb77eb) +- [0xb9243c495117343981ec9f8aa2abffee54396fc0](https://optimistic.etherscan.io/address/0xb9243c495117343981ec9f8aa2abffee54396fc0) +- [0x1ec50880101022c11530a069690f5446d1464592](https://optimistic.etherscan.io/address/0x1ec50880101022c11530a069690f5446d1464592) +- [0x49bf093277bf4dde49c48c6aa55a3bda3eedef68](https://optimistic.etherscan.io/address/0x49bf093277bf4dde49c48c6aa55a3bda3eedef68) +- [0xb2cfb909e8657c0ec44d3dd898c1053b87804755](https://optimistic.etherscan.io/address/0xb2cfb909e8657c0ec44d3dd898c1053b87804755) +- [0x59babc14dd73761e38e5bda171b2298dc14da92d](https://optimistic.etherscan.io/address/0x59babc14dd73761e38e5bda171b2298dc14da92d) + +**Arbitrum** + +- [0x27d8fdb0251b48d8edd1ad7bedf553cf99abe7b0](https://arbiscan.io/address/0x27d8fdb0251b48d8edd1ad7bedf553cf99abe7b0) +- [0xe3254397f5d9c0b69917ebb49b49e103367b406f](https://arbiscan.io/address/0xe3254397f5d9c0b69917ebb49b49e103367b406f) +- [0xad38255febd566809ae387d5be66ecd287947cb9](https://arbiscan.io/address/0xad38255febd566809ae387d5be66ecd287947cb9) +- [0x40d30b13666c55b1f41ee11645b5ea3ea2ca31f8](https://arbiscan.io/address/0x40d30b13666c55b1f41ee11645b5ea3ea2ca31f8) +- [0x696f6d66c2da2aa4a400a4317eec8da88f7a378c](https://arbiscan.io/address/0x696f6d66c2da2aa4a400a4317eec8da88f7a378c) +- [0xf715724abba480d4d45f4cb52bef5ce5e3513ccc](https://arbiscan.io/address/0xf715724abba480d4d45f4cb52bef5ce5e3513ccc) +- [0xe9b5260d99d283ff887859c569baf8ad1bd12aac](https://arbiscan.io/address/0xe9b5260d99d283ff887859c569baf8ad1bd12aac) +- [0x43da9b0ab53242c55a9ff9c722ffc2a373d639c7](https://arbiscan.io/address/0x43da9b0ab53242c55a9ff9c722ffc2a373d639c7) +- [0x678569fc403ea2ba46b549a4d0e15e883d7cadf5](https://arbiscan.io/address/0x678569fc403ea2ba46b549a4d0e15e883d7cadf5) +- [0xc3198eb5102fb3335c0e911ef1da4bc07e403dd1](https://arbiscan.io/address/0xc3198eb5102fb3335c0e911ef1da4bc07e403dd1) +- [0xddd6b1f34e12c0230ab23cbd4514560b24438514](https://arbiscan.io/address/0xddd6b1f34e12c0230ab23cbd4514560b24438514) + +**Base** + +- [0xa672e882acbb96486393d43e0efdab5ebebddc1d](https://basescan.io/address/0xa672e882acbb96486393d43e0efdab5ebebddc1d) +- [0x15e2f06138aed58ca2a6afb5a1333bbc5f728f80](https://basescan.io/address/0x15e2f06138aed58ca2a6afb5a1333bbc5f728f80) +- [0xba5f6a0d2ac21a3fec7a6c40facd23407aa84663](https://basescan.io/address/0xba5f6a0d2ac21a3fec7a6c40facd23407aa84663) +- [0xc1e02884af4a283ca25ab63c45360d220d69da52](https://basescan.io/address/0xc1e02884af4a283ca25ab63c45360d220d69da52) +- [0x1c980456751ae40315ff73caac0843be643321be](https://basescan.io/address/0x1c980456751ae40315ff73caac0843be643321be) +- [0xede61eefa4850b459e3b09fe6d8d371480d6ff00](https://basescan.io/address/0xede61eefa4850b459e3b09fe6d8d371480d6ff00) +- [0x53a4716a8f7dbc9543ebf9cd711952033cc64d43](https://basescan.io/address/0x53a4716a8f7dbc9543ebf9cd711952033cc64d43) +- [0xd2f23773bf5e2d59f6bb925c2232f6e83f3f79e0](https://basescan.io/address/0xd2f23773bf5e2d59f6bb925c2232f6e83f3f79e0) +- [0x9e0501537723c71250307f5b1a8ee60e167d21c9](https://basescan.io/address/0x9e0501537723c71250307f5b1a8ee60e167d21c9) +- [0xcaf08bf08d0c87e2c74dd9ebec9c776037bd7e8e](https://basescan.io/address/0xcaf08bf08d0c87e2c74dd9ebec9c776037bd7e8e) + +**Polygon** + +- [0x86c3dd18baf4370495d9228b58fd959771285c55](https://polygonscan.io/address/0x86c3dd18baf4370495d9228b58fd959771285c55) +- [0xdb88ab5b485b38edbeef866314f9e49d095bce39](https://polygonscan.io/address/0xdb88ab5b485b38edbeef866314f9e49d095bce39) +- [0x79d2aefe6a21b26b024d9341a51f6b7897852499](https://polygonscan.io/address/0x79d2aefe6a21b26b024d9341a51f6b7897852499) +- [0x460b60565cb73845d56564384ab84bf84c13e47d](https://polygonscan.io/address/0x460b60565cb73845d56564384ab84bf84c13e47d) + +This AIP grants permission to whitelist any dHEDGE Protocol contract for all use cases, such as leveraged positions, EMODE, debt and collateral swaps, with one exception: no smart-contract that migrates a position outside of the Aave ecosystem is eligible for whitelisting. + +## References + +- Implementation: [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118.sol) +- Tests: [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol) +- Snapshot: Direct-to-AIP +- [Discussion](https://governance.aave.com/t/arfc-add-dhedge-protocol-to-flashborrowers/19547) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AddDHEDGEProtocolToFlashBorrowers_20241118.s.sol b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AddDHEDGEProtocolToFlashBorrowers_20241118.s.sol new file mode 100644 index 000000000..a87a69c19 --- /dev/null +++ b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AddDHEDGEProtocolToFlashBorrowers_20241118.s.sol @@ -0,0 +1,150 @@ +// 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, PolygonScript, OptimismScript, ArbitrumScript, BaseScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118} from './AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118.sol'; +import {AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118} from './AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118.sol'; +import {AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118} from './AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118.sol'; +import {AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118} from './AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118.sol'; + +/** + * @dev Deploy Polygon + * deploy-command: make deploy-ledger contract=src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AddDHEDGEProtocolToFlashBorrowers_20241118.s.sol:DeployPolygon chain=polygon + * verify-command: FOUNDRY_PROFILE=polygon npx catapulta-verify -b broadcast/AddDHEDGEProtocolToFlashBorrowers_20241118.s.sol/137/run-latest.json + */ +contract DeployPolygon is PolygonScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Optimism + * deploy-command: make deploy-ledger contract=src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AddDHEDGEProtocolToFlashBorrowers_20241118.s.sol:DeployOptimism chain=optimism + * verify-command: FOUNDRY_PROFILE=optimism npx catapulta-verify -b broadcast/AddDHEDGEProtocolToFlashBorrowers_20241118.s.sol/10/run-latest.json + */ +contract DeployOptimism is OptimismScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Arbitrum + * deploy-command: make deploy-ledger contract=src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AddDHEDGEProtocolToFlashBorrowers_20241118.s.sol:DeployArbitrum chain=arbitrum + * verify-command: FOUNDRY_PROFILE=arbitrum npx catapulta-verify -b broadcast/AddDHEDGEProtocolToFlashBorrowers_20241118.s.sol/42161/run-latest.json + */ +contract DeployArbitrum is ArbitrumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Base + * deploy-command: make deploy-ledger contract=src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AddDHEDGEProtocolToFlashBorrowers_20241118.s.sol:DeployBase chain=base + * verify-command: FOUNDRY_PROFILE=base npx catapulta-verify -b broadcast/AddDHEDGEProtocolToFlashBorrowers_20241118.s.sol/8453/run-latest.json + */ +contract DeployBase is BaseScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118).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/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AddDHEDGEProtocolToFlashBorrowers_20241118.s.sol:CreateProposal chain=mainnet + */ +contract CreateProposal is EthereumScript { + function run() external { + // create payloads + PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](4); + + // compose actions for validation + IPayloadsControllerCore.ExecutionAction[] + memory actionsPolygon = new IPayloadsControllerCore.ExecutionAction[](1); + actionsPolygon[0] = GovV3Helpers.buildAction( + type(AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118).creationCode + ); + payloads[0] = GovV3Helpers.buildPolygonPayload(vm, actionsPolygon); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsOptimism = new IPayloadsControllerCore.ExecutionAction[](1); + actionsOptimism[0] = GovV3Helpers.buildAction( + type(AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118).creationCode + ); + payloads[1] = GovV3Helpers.buildOptimismPayload(vm, actionsOptimism); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsArbitrum = new IPayloadsControllerCore.ExecutionAction[](1); + actionsArbitrum[0] = GovV3Helpers.buildAction( + type(AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118).creationCode + ); + payloads[2] = GovV3Helpers.buildArbitrumPayload(vm, actionsArbitrum); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsBase = new IPayloadsControllerCore.ExecutionAction[](1); + actionsBase[0] = GovV3Helpers.buildAction( + type(AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118).creationCode + ); + payloads[3] = GovV3Helpers.buildBasePayload(vm, actionsBase); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AddDHEDGEProtocolToFlashBorrowers.md' + ) + ); + } +} diff --git a/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/FlashBorrowersData.sol b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/FlashBorrowersData.sol new file mode 100644 index 000000000..d7fc0231d --- /dev/null +++ b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/FlashBorrowersData.sol @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +library FlashBorrowersDataArbitrum { + function getFlashBorrowers() internal pure returns (address[] memory) { + address[] memory flashBorrowers = new address[](11); + flashBorrowers[0] = 0x27D8FDb0251B48D8EdD1Ad7bEDf553cF99AbE7B0; + flashBorrowers[1] = 0xe3254397f5D9C0B69917EBb49B49e103367B406f; + flashBorrowers[2] = 0xaD38255fEbd566809aE387d5bE66ECD287947cb9; + flashBorrowers[3] = 0x40d30B13666c55B1F41eE11645B5ea3Ea2CA31f8; + flashBorrowers[4] = 0x696f6d66C2da2AA4A400a4317EEC8da88f7A378c; + flashBorrowers[5] = 0xF715724abba480D4D45f4cb52BEF5ce5E3513CCC; + flashBorrowers[6] = 0xe9b5260D99d283ff887859C569bAF8aD1bd12AAc; + flashBorrowers[7] = 0x43DA9b0aB53242c55A9Ff9c722FfC2a373D639c7; + flashBorrowers[8] = 0x678569FC403EA2BA46B549a4D0E15E883D7cAdF5; + flashBorrowers[9] = 0xc3198eb5102fB3335C0E911eF1DA4BC07e403Dd1; + flashBorrowers[10] = 0xDDd6b1f34e12C0230ab23cbd4514560b24438514; + + return flashBorrowers; + } +} + +library FlashBorrowersDataBase { + function getFlashBorrowers() internal pure returns (address[] memory) { + address[] memory flashBorrowers = new address[](10); + flashBorrowers[0] = 0xA672e882aCBB96486393D43E0efdab5EBEbDDC1d; + flashBorrowers[1] = 0x15E2F06138aed58ca2A6AfB5A1333bBC5f728f80; + flashBorrowers[2] = 0xbA5F6A0D2AC21a3feC7a6C40FACd23407AA84663; + flashBorrowers[3] = 0xC1E02884AF4A283cA25ab63C45360d220d69DA52; + flashBorrowers[4] = 0x1c980456751AE40315Ff73CaaC0843Be643321Be; + flashBorrowers[5] = 0xeDE61eefa4850b459E3B09Fe6d8d371480D6fF00; + flashBorrowers[6] = 0x53a4716a8f7DBC9543ebf9cd711952033cC64d43; + flashBorrowers[7] = 0xd2f23773bF5e2d59F6bB925c2232F6e83f3f79e0; + flashBorrowers[8] = 0x9e0501537723c71250307F5B1A8eE60e167D21C9; + flashBorrowers[9] = 0xCAF08BF08D0c87e2c74dd9EBEC9C776037bD7e8E; + + return flashBorrowers; + } +} + +library FlashBorrowersDataOptimism { + function getFlashBorrowers() internal pure returns (address[] memory) { + address[] memory flashBorrowers = new address[](14); + flashBorrowers[0] = 0x83d1Fa384EC44C2769A3562EDe372484f26E141B; + flashBorrowers[1] = 0x32Ad28356EF70adC3EC051D8AAcdEEaA10135296; + flashBorrowers[2] = 0xB03818de4992388260b62259361778CF98485dFE; + flashBorrowers[3] = 0x11b55966527FF030ca9c7B1c548B4bE5e7EaEe6D; + flashBorrowers[4] = 0xcACb5A722a36cFf6bAeB359e21C098a4ACbffDfa; + flashBorrowers[5] = 0x9573c7b691cDcEbBFa9D655181f291799dfB7Cf5; + flashBorrowers[6] = 0x32b1D1bFd4B3b0CB9FF2DcD9DAc757aA64d4cb69; + flashBorrowers[7] = 0x7D3c9C6566375d7ad6e89169cA5C01B5Edc15364; + flashBorrowers[8] = 0xcC7d6ED524760539311ed0Cdb41D0852b4eb77eb; + flashBorrowers[9] = 0xB9243C495117343981EC9f8AA2ABfFEe54396Fc0; + flashBorrowers[10] = 0x1eC50880101022C11530A069690F5446d1464592; + flashBorrowers[11] = 0x49bF093277Bf4dDe49c48c6AA55A3bDA3eeDEF68; + flashBorrowers[12] = 0xb2cFb909e8657C0EC44D3dD898C1053b87804755; + flashBorrowers[13] = 0x59bAbc14Dd73761e38E5bdA171b2298DC14da92d; + + return flashBorrowers; + } +} + +library FlashBorrowersDataPolygon { + function getFlashBorrowers() internal pure returns (address[] memory) { + address[] memory flashBorrowers = new address[](4); + flashBorrowers[0] = 0x86C3Dd18bAF4370495d9228b58fD959771285C55; + flashBorrowers[1] = 0xdB88AB5b485b38EDbEEf866314F9E49d095BCe39; + flashBorrowers[2] = 0x79D2aeFE6A21b26B024d9341A51f6b7897852499; + flashBorrowers[3] = 0x460b60565cb73845d56564384ab84BF84c13e47D; + + return flashBorrowers; + } +} diff --git a/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/config.ts b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/config.ts new file mode 100644 index 000000000..6addc81da --- /dev/null +++ b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/config.ts @@ -0,0 +1,31 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + author: 'Aave Chan Initiative', + pools: ['AaveV3Polygon', 'AaveV3Optimism', 'AaveV3Arbitrum', 'AaveV3Base'], + title: 'Add dHEDGE Protocol to flashBorrowers', + shortName: 'AddDHEDGEProtocolToFlashBorrowers', + date: '20241118', + discussion: 'https://governance.aave.com/t/arfc-add-dhedge-protocol-to-flashborrowers/19547', + snapshot: 'Direct-to-AIP', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Polygon: { + configs: {FLASH_BORROWER: {address: '0x83d1fa384ec44c2769a3562ede372484f26e141b'}}, + cache: {blockNumber: 64447789}, + }, + AaveV3Optimism: { + configs: {FLASH_BORROWER: {address: '0x83d1fa384ec44c2769a3562ede372484f26e141b'}}, + cache: {blockNumber: 128181628}, + }, + AaveV3Arbitrum: { + configs: {FLASH_BORROWER: {address: '0x27d8fdb0251b48d8edd1ad7bedf553cf99abe7b0'}}, + cache: {blockNumber: 275871816}, + }, + AaveV3Base: { + configs: {FLASH_BORROWER: {address: '0xa672e882acbb96486393d43e0efdab5ebebddc1d'}}, + cache: {blockNumber: 22586604}, + }, + }, +}; From b8486f523a354a41646de203315051809ef0a61b Mon Sep 17 00:00:00 2001 From: Cache bot Date: Thu, 28 Nov 2024 15:28:46 +0000 Subject: [PATCH 31/35] fix(cache): automated cache update [skip ci] --- .../AddDHEDGEProtocolToFlashBorrowers.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AddDHEDGEProtocolToFlashBorrowers.md b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AddDHEDGEProtocolToFlashBorrowers.md index 228779968..03a6073c7 100644 --- a/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AddDHEDGEProtocolToFlashBorrowers.md +++ b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AddDHEDGEProtocolToFlashBorrowers.md @@ -79,8 +79,8 @@ This AIP grants permission to whitelist any dHEDGE Protocol contract for all use ## References -- Implementation: [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118.sol) -- Tests: [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol) +- Implementation: [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/b537d861c6636003e985d83f1f622346ea62c1ac/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/b537d861c6636003e985d83f1f622346ea62c1ac/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/b537d861c6636003e985d83f1f622346ea62c1ac/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/b537d861c6636003e985d83f1f622346ea62c1ac/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118.sol) +- Tests: [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/b537d861c6636003e985d83f1f622346ea62c1ac/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/b537d861c6636003e985d83f1f622346ea62c1ac/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/b537d861c6636003e985d83f1f622346ea62c1ac/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/b537d861c6636003e985d83f1f622346ea62c1ac/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol) - Snapshot: Direct-to-AIP - [Discussion](https://governance.aave.com/t/arfc-add-dhedge-protocol-to-flashborrowers/19547) From 1aab63b1461e28bcf74d70844654b968c4aab1b2 Mon Sep 17 00:00:00 2001 From: Lucas Wong <101302451+LucasWongC@users.noreply.github.com> Date: Thu, 28 Nov 2024 16:01:04 -0500 Subject: [PATCH 32/35] September Funding Update Part A (#531) * implemented main logic * approve gho and weth to merit safe * add md content * removed comment * add swap part * used CollectorUtils and scaledBalanceOf * bugfix on checking event * swap slippage changed * restructured codebase * updated dai slippage * default test on eth and fix md * added underlying check when withdraw from v2 * typo fix * feat: update swapper * testing bugfix on swap * submodule updated * bugfix while rebase * used balanceOf instead of scaledBalanceOf * used aave oracles * used aave address book * updated polygon * feedback fix from bgd * aave-helpers updated * bugfix on rescue part * bugfix on bridge --------- Co-authored-by: efecarranza --- ...temberFundingUpdatePartA_20241113_after.md | 48 ++ ...temberFundingUpdatePartA_20241113_after.md | 66 +++ ...temberFundingUpdatePartA_20241113_after.md | 48 ++ ...temberFundingUpdatePartA_20241113_after.md | 120 +++++ lib/aave-helpers | 2 +- ...3Arbitrum_GHOStewardV2Upgrade_20241007.sol | 7 +- ...rbitrum_GHOStewardV2Upgrade_20241007.t.sol | 43 +- ...3Ethereum_GHOStewardV2Upgrade_20241007.sol | 25 +- ...thereum_GHOStewardV2Upgrade_20241007.t.sol | 79 ++-- ...eV3Arbitrum_GHOCCIP150Upgrade_20241021.sol | 3 +- ...3Arbitrum_GHOCCIP150Upgrade_20241021.t.sol | 8 +- ...AaveV3E2E_GHOCCIP150Upgrade_20241021.t.sol | 8 +- ...eV3Ethereum_GHOCCIP150Upgrade_20241021.sol | 3 +- ...3Ethereum_GHOCCIP150Upgrade_20241021.t.sol | 17 +- ...m_SeptemberFundingUpdatePartA_20241113.sol | 70 +++ ...SeptemberFundingUpdatePartA_20241113.t.sol | 81 ++++ ...m_SeptemberFundingUpdatePartA_20241113.sol | 263 +++++++++++ ...SeptemberFundingUpdatePartA_20241113.t.sol | 444 ++++++++++++++++++ ...m_SeptemberFundingUpdatePartA_20241113.sol | 64 +++ ...SeptemberFundingUpdatePartA_20241113.t.sol | 70 +++ ...n_SeptemberFundingUpdatePartA_20241113.sol | 145 ++++++ ...SeptemberFundingUpdatePartA_20241113.t.sol | 203 ++++++++ .../SeptemberFundingUpdatePartA.md | 70 +++ ...SeptemberFundingUpdatePartA_20241113.s.sol | 150 ++++++ .../config.ts | 19 + 25 files changed, 1960 insertions(+), 96 deletions(-) create mode 100644 diffs/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113_before_AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113_after.md create mode 100644 diffs/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113_before_AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113_after.md create mode 100644 diffs/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113_before_AaveV3Optimism_SeptemberFundingUpdatePartA_20241113_after.md create mode 100644 diffs/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113_before_AaveV3Polygon_SeptemberFundingUpdatePartA_20241113_after.md create mode 100644 src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113.sol create mode 100644 src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113.t.sol create mode 100644 src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113.sol create mode 100644 src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113.t.sol create mode 100644 src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113.sol create mode 100644 src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113.t.sol create mode 100644 src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113.sol create mode 100644 src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113.t.sol create mode 100644 src/20241113_Multi_SeptemberFundingUpdatePartA/SeptemberFundingUpdatePartA.md create mode 100644 src/20241113_Multi_SeptemberFundingUpdatePartA/SeptemberFundingUpdatePartA_20241113.s.sol create mode 100644 src/20241113_Multi_SeptemberFundingUpdatePartA/config.ts diff --git a/diffs/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113_before_AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113_after.md b/diffs/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113_before_AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113_after.md new file mode 100644 index 000000000..5bfdf16e1 --- /dev/null +++ b/diffs/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113_before_AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113_after.md @@ -0,0 +1,48 @@ +## Reserve changes + +### Reserve altered + +#### LUSD ([0x93b346b6BC2548dA6A1E7d98E9a421B42541425b](https://arbiscan.io/address/0x93b346b6BC2548dA6A1E7d98E9a421B42541425b)) + +| description | value before | value after | +| --- | --- | --- | +| aTokenUnderlyingBalance | 106,435.1469 LUSD [106435146991153500610108] | 92,219.4613 LUSD [92219461394279151682363] | +| virtualBalance | 106,434.9878 LUSD [106434987881929276913954] | 92,219.3022 LUSD [92219302285054927986209] | + + +#### USDC ([0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8](https://arbiscan.io/address/0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8)) + +| description | value before | value after | +| --- | --- | --- | +| aTokenUnderlyingBalance | 523,273.5575 USDC [523273557554] | 471,041.9823 USDC [471041982302] | +| virtualBalance | 523,161.0279 USDC [523161027996] | 470,929.4527 USDC [470929452744] | + + +## Raw diff + +```json +{ + "reserves": { + "0x93b346b6BC2548dA6A1E7d98E9a421B42541425b": { + "aTokenUnderlyingBalance": { + "from": "106435146991153500610108", + "to": "92219461394279151682363" + }, + "virtualBalance": { + "from": "106434987881929276913954", + "to": "92219302285054927986209" + } + }, + "0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8": { + "aTokenUnderlyingBalance": { + "from": "523273557554", + "to": "471041982302" + }, + "virtualBalance": { + "from": "523161027996", + "to": "470929452744" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113_before_AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113_after.md b/diffs/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113_before_AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113_after.md new file mode 100644 index 000000000..bc4a04d60 --- /dev/null +++ b/diffs/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113_before_AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113_after.md @@ -0,0 +1,66 @@ +## Reserve changes + +### Reserve altered + +#### DAI ([0x6B175474E89094C44Da98b954EedeAC495271d0F](https://etherscan.io/address/0x6B175474E89094C44Da98b954EedeAC495271d0F)) + +| description | value before | value after | +| --- | --- | --- | +| aTokenUnderlyingBalance | 15,924,528.6233 DAI [15924528623359921994863938] | 15,424,528.6233 DAI [15424528623359921994863938] | +| virtualBalance | 15,924,487.4050 DAI [15924487405080584531407384] | 15,424,487.4050 DAI [15424487405080584531407384] | + + +#### USDC ([0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48](https://etherscan.io/address/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48)) + +| description | value before | value after | +| --- | --- | --- | +| aTokenUnderlyingBalance | 137,192,431.4930 USDC [137192431493016] | 135,942,431.4930 USDC [135942431493016] | +| virtualBalance | 137,186,093.5677 USDC [137186093567742] | 135,936,093.5677 USDC [135936093567742] | + + +#### USDT ([0xdAC17F958D2ee523a2206206994597C13D831ec7](https://etherscan.io/address/0xdAC17F958D2ee523a2206206994597C13D831ec7)) + +| description | value before | value after | +| --- | --- | --- | +| aTokenUnderlyingBalance | 199,667,226.1302 USDT [199667226130261] | 198,417,226.1302 USDT [198417226130261] | +| virtualBalance | 199,666,071.9160 USDT [199666071916049] | 198,416,071.9160 USDT [198416071916049] | + + +## Raw diff + +```json +{ + "reserves": { + "0x6B175474E89094C44Da98b954EedeAC495271d0F": { + "aTokenUnderlyingBalance": { + "from": "15924528623359921994863938", + "to": "15424528623359921994863938" + }, + "virtualBalance": { + "from": "15924487405080584531407384", + "to": "15424487405080584531407384" + } + }, + "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48": { + "aTokenUnderlyingBalance": { + "from": "137192431493016", + "to": "135942431493016" + }, + "virtualBalance": { + "from": "137186093567742", + "to": "135936093567742" + } + }, + "0xdAC17F958D2ee523a2206206994597C13D831ec7": { + "aTokenUnderlyingBalance": { + "from": "199667226130261", + "to": "198417226130261" + }, + "virtualBalance": { + "from": "199666071916049", + "to": "198416071916049" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113_before_AaveV3Optimism_SeptemberFundingUpdatePartA_20241113_after.md b/diffs/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113_before_AaveV3Optimism_SeptemberFundingUpdatePartA_20241113_after.md new file mode 100644 index 000000000..bdcf791a9 --- /dev/null +++ b/diffs/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113_before_AaveV3Optimism_SeptemberFundingUpdatePartA_20241113_after.md @@ -0,0 +1,48 @@ +## Reserve changes + +### Reserve altered + +#### USDC ([0x7F5c764cBc14f9669B88837ca1490cCa17c31607](https://optimistic.etherscan.io/address/0x7F5c764cBc14f9669B88837ca1490cCa17c31607)) + +| description | value before | value after | +| --- | --- | --- | +| aTokenUnderlyingBalance | 546,549.4039 USDC [546549403932] | 495,281.6742 USDC [495281674219] | +| virtualBalance | 546,472.3570 USDC [546472357070] | 495,204.6273 USDC [495204627357] | + + +#### LUSD ([0xc40F949F8a4e094D1b49a23ea9241D289B7b2819](https://optimistic.etherscan.io/address/0xc40F949F8a4e094D1b49a23ea9241D289B7b2819)) + +| description | value before | value after | +| --- | --- | --- | +| aTokenUnderlyingBalance | 50,745.9305 LUSD [50745930580778611947683] | 47,352.8754 LUSD [47352875460535625271531] | +| virtualBalance | 50,745.9305 LUSD [50745930580778611947683] | 47,352.8754 LUSD [47352875460535625271531] | + + +## Raw diff + +```json +{ + "reserves": { + "0x7F5c764cBc14f9669B88837ca1490cCa17c31607": { + "aTokenUnderlyingBalance": { + "from": "546549403932", + "to": "495281674219" + }, + "virtualBalance": { + "from": "546472357070", + "to": "495204627357" + } + }, + "0xc40F949F8a4e094D1b49a23ea9241D289B7b2819": { + "aTokenUnderlyingBalance": { + "from": "50745930580778611947683", + "to": "47352875460535625271531" + }, + "virtualBalance": { + "from": "50745930580778611947683", + "to": "47352875460535625271531" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113_before_AaveV3Polygon_SeptemberFundingUpdatePartA_20241113_after.md b/diffs/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113_before_AaveV3Polygon_SeptemberFundingUpdatePartA_20241113_after.md new file mode 100644 index 000000000..ebf37a9b7 --- /dev/null +++ b/diffs/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113_before_AaveV3Polygon_SeptemberFundingUpdatePartA_20241113_after.md @@ -0,0 +1,120 @@ +## Reserve changes + +### Reserve altered + +#### WPOL ([0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270](https://polygonscan.com/address/0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270)) + +| description | value before | value after | +| --- | --- | --- | +| aTokenUnderlyingBalance | 52,650,750.6758 WPOL [52650750675856200640974187] | 52,667,562.2081 WPOL [52667562208106867321829248] | +| virtualBalance | 52,650,750.6758 WPOL [52650750675856200640974187] | 52,667,562.2081 WPOL [52667562208106867321829248] | + + +#### USDC ([0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174](https://polygonscan.com/address/0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174)) + +| description | value before | value after | +| --- | --- | --- | +| aTokenUnderlyingBalance | 1,707,045.0579 USDC [1707045057954] | 1,609,614.1753 USDC [1609614175343] | +| virtualBalance | 1,706,866.8345 USDC [1706866834534] | 1,609,435.9519 USDC [1609435951923] | + + +#### LINK ([0x53E0bca35eC356BD5ddDFebbD1Fc0fD03FaBad39](https://polygonscan.com/address/0x53E0bca35eC356BD5ddDFebbD1Fc0fD03FaBad39)) + +| description | value before | value after | +| --- | --- | --- | +| aTokenUnderlyingBalance | 760,821.4170 LINK [760821417069511886594222] | 760,872.1296 LINK [760872129635541295966141] | +| virtualBalance | 760,821.4105 LINK [760821410547668237659103] | 760,872.1231 LINK [760872123113697647031022] | + + +#### WETH ([0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619](https://polygonscan.com/address/0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619)) + +| description | value before | value after | +| --- | --- | --- | +| aTokenUnderlyingBalance | 15,758.8942 WETH [15758894219160674399387] | 15,767.0373 WETH [15767037334375620833165] | +| virtualBalance | 15,758.8942 WETH [15758894219160674399387] | 15,767.0373 WETH [15767037334375620833165] | + + +#### DAI ([0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063](https://polygonscan.com/address/0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063)) + +| description | value before | value after | +| --- | --- | --- | +| aTokenUnderlyingBalance | 796,729.9585 DAI [796729958523072652649220] | 1,065,764.4509 DAI [1065764450949738388580093] | +| virtualBalance | 796,569.0625 DAI [796569062545281907932762] | 1,065,603.5549 DAI [1065603554971947643863635] | + + +#### USDT ([0xc2132D05D31c914a87C6611C10748AEb04B58e8F](https://polygonscan.com/address/0xc2132D05D31c914a87C6611C10748AEb04B58e8F)) + +| description | value before | value after | +| --- | --- | --- | +| aTokenUnderlyingBalance | 3,912,929.3134 USDT [3912929313459] | 4,296,001.3224 USDT [4296001322402] | +| virtualBalance | 3,912,857.1847 USDT [3912857184739] | 4,295,929.1936 USDT [4295929193682] | + + +## Raw diff + +```json +{ + "reserves": { + "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270": { + "aTokenUnderlyingBalance": { + "from": "52650750675856200640974187", + "to": "52667562208106867321829248" + }, + "virtualBalance": { + "from": "52650750675856200640974187", + "to": "52667562208106867321829248" + } + }, + "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174": { + "aTokenUnderlyingBalance": { + "from": "1707045057954", + "to": "1609614175343" + }, + "virtualBalance": { + "from": "1706866834534", + "to": "1609435951923" + } + }, + "0x53E0bca35eC356BD5ddDFebbD1Fc0fD03FaBad39": { + "aTokenUnderlyingBalance": { + "from": "760821417069511886594222", + "to": "760872129635541295966141" + }, + "virtualBalance": { + "from": "760821410547668237659103", + "to": "760872123113697647031022" + } + }, + "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619": { + "aTokenUnderlyingBalance": { + "from": "15758894219160674399387", + "to": "15767037334375620833165" + }, + "virtualBalance": { + "from": "15758894219160674399387", + "to": "15767037334375620833165" + } + }, + "0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063": { + "aTokenUnderlyingBalance": { + "from": "796729958523072652649220", + "to": "1065764450949738388580093" + }, + "virtualBalance": { + "from": "796569062545281907932762", + "to": "1065603554971947643863635" + } + }, + "0xc2132D05D31c914a87C6611C10748AEb04B58e8F": { + "aTokenUnderlyingBalance": { + "from": "3912929313459", + "to": "4296001322402" + }, + "virtualBalance": { + "from": "3912857184739", + "to": "4295929193682" + } + } + } +} +``` \ No newline at end of file diff --git a/lib/aave-helpers b/lib/aave-helpers index f9e12a124..796fcfd3c 160000 --- a/lib/aave-helpers +++ b/lib/aave-helpers @@ -1 +1 @@ -Subproject commit f9e12a12450f4293ef2e602eaafadebdfa087dbb +Subproject commit 796fcfd3ccc6793ab32012fa54863d3f02742540 diff --git a/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007.sol b/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007.sol index 05d4c64a1..2129300bc 100644 --- a/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007.sol +++ b/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007.sol @@ -4,6 +4,7 @@ pragma solidity ^0.8.0; import {AaveV3Arbitrum, AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol'; import {IACLManager} from 'aave-address-book/AaveV3.sol'; import {MiscArbitrum} from 'aave-address-book/MiscArbitrum.sol'; +import {GhoArbitrum} from 'aave-address-book/GhoArbitrum.sol'; import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; import {IAccessControl} from '@openzeppelin/contracts/access/IAccessControl.sol'; import {ITransparentUpgradeableProxy} from 'solidity-utils/contracts/transparent-proxy/TransparentUpgradeableProxy.sol'; @@ -35,7 +36,7 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007 is IProposalGenericExecutor function execute() external { // New CCIP Token Pool ILegacyProxyAdmin(MiscArbitrum.PROXY_ADMIN).upgrade( - ITransparentUpgradeableProxy(payable(MiscArbitrum.GHO_CCIP_TOKEN_POOL)), + ITransparentUpgradeableProxy(payable(GhoArbitrum.GHO_CCIP_TOKEN_POOL)), NEW_CCIP_POOL_IMPL ); @@ -46,7 +47,7 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007 is IProposalGenericExecutor ); address[] memory controlledFacilitators = new address[](1); - controlledFacilitators[0] = MiscArbitrum.GHO_CCIP_TOKEN_POOL; + controlledFacilitators[0] = GhoArbitrum.GHO_CCIP_TOKEN_POOL; IGhoBucketSteward(GHO_BUCKET_STEWARD).setControlledFacilitator(controlledFacilitators, true); // Gho Aave Steward @@ -56,7 +57,7 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007 is IProposalGenericExecutor ); // Gho CCIP Steward - IUpgradeableLockReleaseTokenPool(MiscArbitrum.GHO_CCIP_TOKEN_POOL).setRateLimitAdmin( + IUpgradeableLockReleaseTokenPool(GhoArbitrum.GHO_CCIP_TOKEN_POOL).setRateLimitAdmin( GHO_CCIP_STEWARD ); } diff --git a/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007.t.sol b/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007.t.sol index 4a75b0b0a..a52892e64 100644 --- a/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007.t.sol +++ b/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007.t.sol @@ -4,6 +4,7 @@ pragma solidity ^0.8.0; import {ProxyHelpers} from 'aave-v3-origin-tests/utils/ProxyHelpers.sol'; import {AaveV3Arbitrum, AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol'; import {MiscArbitrum} from 'aave-address-book/MiscArbitrum.sol'; +import {GhoArbitrum} from 'aave-address-book/GhoArbitrum.sol'; import {GovernanceV3Arbitrum} from 'aave-address-book/GovernanceV3Arbitrum.sol'; import {IACLManager, IDefaultInterestRateStrategyV2} from 'aave-address-book/AaveV3.sol'; import {IAccessControl} from '@openzeppelin/contracts/access/IAccessControl.sol'; @@ -53,14 +54,14 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase // Gho CCIP Steward vm.expectRevert(); // getRateLimitAdmin doesn't exist yet - IUpgradeableLockReleaseTokenPool(MiscArbitrum.GHO_CCIP_TOKEN_POOL).getRateLimitAdmin(); + IUpgradeableLockReleaseTokenPool(GhoArbitrum.GHO_CCIP_TOKEN_POOL).getRateLimitAdmin(); executePayload(vm, address(proposal)); vm.prank(MiscArbitrum.PROXY_ADMIN); address impl = ProxyHelpers.getInitializableAdminUpgradeabilityProxyImplementation( vm, - MiscArbitrum.GHO_CCIP_TOKEN_POOL + GhoArbitrum.GHO_CCIP_TOKEN_POOL ); IUpgradeableLockReleaseTokenPool poolTokenImpl = IUpgradeableLockReleaseTokenPool( @@ -80,7 +81,7 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase // Proxy cannot be re-initialized vm.expectRevert(); - IUpgradeableLockReleaseTokenPool(MiscArbitrum.GHO_CCIP_TOKEN_POOL).initialize( + IUpgradeableLockReleaseTokenPool(GhoArbitrum.GHO_CCIP_TOKEN_POOL).initialize( owner, list, router @@ -97,7 +98,7 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase assertTrue( IGhoBucketSteward(proposal.GHO_BUCKET_STEWARD()).isControlledFacilitator( - MiscArbitrum.GHO_CCIP_TOKEN_POOL + GhoArbitrum.GHO_CCIP_TOKEN_POOL ) ); @@ -111,7 +112,7 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase ); assertEq( - IUpgradeableLockReleaseTokenPool(MiscArbitrum.GHO_CCIP_TOKEN_POOL).getRateLimitAdmin(), + IUpgradeableLockReleaseTokenPool(GhoArbitrum.GHO_CCIP_TOKEN_POOL).getRateLimitAdmin(), proposal.GHO_CCIP_STEWARD() ); } @@ -120,7 +121,7 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase executePayload(vm, address(proposal)); IUpgradeableLockReleaseTokenPool poolToken = IUpgradeableLockReleaseTokenPool( - MiscArbitrum.GHO_CCIP_TOKEN_POOL + GhoArbitrum.GHO_CCIP_TOKEN_POOL ); assertEq(proposal.GHO_CCIP_STEWARD(), poolToken.getRateLimitAdmin()); @@ -184,15 +185,15 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase executePayload(vm, address(proposal)); (uint256 currentBucketCapacity, ) = IGhoToken(AaveV3ArbitrumAssets.GHO_UNDERLYING) - .getFacilitatorBucket(MiscArbitrum.GHO_CCIP_TOKEN_POOL); + .getFacilitatorBucket(GhoArbitrum.GHO_CCIP_TOKEN_POOL); vm.startPrank(RISK_COUNCIL); uint128 newBucketCapacity = uint128(currentBucketCapacity) + 1; IGhoBucketSteward(proposal.GHO_BUCKET_STEWARD()).updateFacilitatorBucketCapacity( - MiscArbitrum.GHO_CCIP_TOKEN_POOL, + GhoArbitrum.GHO_CCIP_TOKEN_POOL, newBucketCapacity ); (uint256 bucketCapacity, ) = IGhoToken(AaveV3ArbitrumAssets.GHO_UNDERLYING) - .getFacilitatorBucket(MiscArbitrum.GHO_CCIP_TOKEN_POOL); + .getFacilitatorBucket(GhoArbitrum.GHO_CCIP_TOKEN_POOL); assertEq(bucketCapacity, newBucketCapacity); } @@ -219,10 +220,10 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase executePayload(vm, address(proposal)); RateLimiter.TokenBucket memory outboundConfig = IUpgradeableLockReleaseTokenPool( - MiscArbitrum.GHO_CCIP_TOKEN_POOL + GhoArbitrum.GHO_CCIP_TOKEN_POOL ).getCurrentOutboundRateLimiterState(remoteChainSelector); RateLimiter.TokenBucket memory inboundConfig = IUpgradeableLockReleaseTokenPool( - MiscArbitrum.GHO_CCIP_TOKEN_POOL + GhoArbitrum.GHO_CCIP_TOKEN_POOL ).getCurrentInboundRateLimiterState(remoteChainSelector); RateLimiter.Config memory newOutboundConfig = RateLimiter.Config({ @@ -263,9 +264,9 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase }); // Mocking response due to rate limit currently being 0 vm.mockCall( - MiscArbitrum.GHO_CCIP_TOKEN_POOL, + GhoArbitrum.GHO_CCIP_TOKEN_POOL, abi.encodeWithSelector( - IUpgradeableLockReleaseTokenPool(MiscArbitrum.GHO_CCIP_TOKEN_POOL) + IUpgradeableLockReleaseTokenPool(GhoArbitrum.GHO_CCIP_TOKEN_POOL) .getCurrentOutboundRateLimiterState .selector, remoteChainSelector @@ -274,10 +275,10 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase ); RateLimiter.TokenBucket memory outboundConfig = IUpgradeableLockReleaseTokenPool( - MiscArbitrum.GHO_CCIP_TOKEN_POOL + GhoArbitrum.GHO_CCIP_TOKEN_POOL ).getCurrentOutboundRateLimiterState(remoteChainSelector); RateLimiter.TokenBucket memory inboundConfig = IUpgradeableLockReleaseTokenPool( - MiscArbitrum.GHO_CCIP_TOKEN_POOL + GhoArbitrum.GHO_CCIP_TOKEN_POOL ).getCurrentInboundRateLimiterState(remoteChainSelector); RateLimiter.Config memory newOutboundConfig = RateLimiter.Config({ @@ -320,9 +321,9 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase // Mocking response due to rate limit currently being 0 vm.mockCall( - MiscArbitrum.GHO_CCIP_TOKEN_POOL, + GhoArbitrum.GHO_CCIP_TOKEN_POOL, abi.encodeWithSelector( - IUpgradeableLockReleaseTokenPool(MiscArbitrum.GHO_CCIP_TOKEN_POOL) + IUpgradeableLockReleaseTokenPool(GhoArbitrum.GHO_CCIP_TOKEN_POOL) .getCurrentOutboundRateLimiterState .selector, remoteChainSelector @@ -330,9 +331,9 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase abi.encode(mockConfig) ); vm.mockCall( - MiscArbitrum.GHO_CCIP_TOKEN_POOL, + GhoArbitrum.GHO_CCIP_TOKEN_POOL, abi.encodeWithSelector( - IUpgradeableLockReleaseTokenPool(MiscArbitrum.GHO_CCIP_TOKEN_POOL) + IUpgradeableLockReleaseTokenPool(GhoArbitrum.GHO_CCIP_TOKEN_POOL) .getCurrentInboundRateLimiterState .selector, remoteChainSelector @@ -341,10 +342,10 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase ); RateLimiter.TokenBucket memory outboundConfig = IUpgradeableLockReleaseTokenPool( - MiscArbitrum.GHO_CCIP_TOKEN_POOL + GhoArbitrum.GHO_CCIP_TOKEN_POOL ).getCurrentOutboundRateLimiterState(remoteChainSelector); RateLimiter.TokenBucket memory inboundConfig = IUpgradeableLockReleaseTokenPool( - MiscArbitrum.GHO_CCIP_TOKEN_POOL + GhoArbitrum.GHO_CCIP_TOKEN_POOL ).getCurrentInboundRateLimiterState(remoteChainSelector); RateLimiter.Config memory newOutboundConfig = RateLimiter.Config({ diff --git a/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Ethereum_GHOStewardV2Upgrade_20241007.sol b/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Ethereum_GHOStewardV2Upgrade_20241007.sol index df9f71d71..2c66a0607 100644 --- a/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Ethereum_GHOStewardV2Upgrade_20241007.sol +++ b/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Ethereum_GHOStewardV2Upgrade_20241007.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.0; import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {GhoEthereum} from 'aave-address-book/GhoEthereum.sol'; import {IACLManager} from 'aave-address-book/AaveV3.sol'; import {IAccessControl} from '@openzeppelin/contracts/access/IAccessControl.sol'; import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; @@ -43,13 +44,13 @@ contract AaveV3Ethereum_GHOStewardV2Upgrade_20241007 is IProposalGenericExecutor OLD_STEWARD ); - IGsm(MiscEthereum.GSM_USDC).revokeRole( - IGsm(MiscEthereum.GSM_USDC).CONFIGURATOR_ROLE(), + IGsm(GhoEthereum.GSM_USDC).revokeRole( + IGsm(GhoEthereum.GSM_USDC).CONFIGURATOR_ROLE(), OLD_STEWARD ); - IGsm(MiscEthereum.GSM_USDT).revokeRole( - IGsm(MiscEthereum.GSM_USDT).CONFIGURATOR_ROLE(), + IGsm(GhoEthereum.GSM_USDT).revokeRole( + IGsm(GhoEthereum.GSM_USDT).CONFIGURATOR_ROLE(), OLD_STEWARD ); @@ -61,8 +62,8 @@ contract AaveV3Ethereum_GHOStewardV2Upgrade_20241007 is IProposalGenericExecutor address[] memory controlledFacilitators = new address[](3); controlledFacilitators[0] = AaveV3EthereumAssets.GHO_A_TOKEN; - controlledFacilitators[1] = MiscEthereum.GSM_USDC; - controlledFacilitators[2] = MiscEthereum.GSM_USDT; + controlledFacilitators[1] = GhoEthereum.GSM_USDC; + controlledFacilitators[2] = GhoEthereum.GSM_USDT; IGhoBucketSteward(GHO_BUCKET_STEWARD).setControlledFacilitator(controlledFacilitators, true); // Gho Aave Steward @@ -72,20 +73,20 @@ contract AaveV3Ethereum_GHOStewardV2Upgrade_20241007 is IProposalGenericExecutor ); // Gho CCIP Steward - IUpgradeableLockReleaseTokenPool(MiscEthereum.GHO_CCIP_TOKEN_POOL).setRateLimitAdmin( + IUpgradeableLockReleaseTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL).setRateLimitAdmin( GHO_CCIP_STEWARD ); - IUpgradeableLockReleaseTokenPool(MiscEthereum.GHO_CCIP_TOKEN_POOL).setBridgeLimitAdmin( + IUpgradeableLockReleaseTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL).setBridgeLimitAdmin( GHO_CCIP_STEWARD ); // GHO GSM Steward - IGsm(MiscEthereum.GSM_USDC).grantRole( - IGsm(MiscEthereum.GSM_USDC).CONFIGURATOR_ROLE(), + IGsm(GhoEthereum.GSM_USDC).grantRole( + IGsm(GhoEthereum.GSM_USDC).CONFIGURATOR_ROLE(), GHO_GSM_STEWARD ); - IGsm(MiscEthereum.GSM_USDT).grantRole( - IGsm(MiscEthereum.GSM_USDT).CONFIGURATOR_ROLE(), + IGsm(GhoEthereum.GSM_USDT).grantRole( + IGsm(GhoEthereum.GSM_USDT).CONFIGURATOR_ROLE(), GHO_GSM_STEWARD ); } diff --git a/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Ethereum_GHOStewardV2Upgrade_20241007.t.sol b/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Ethereum_GHOStewardV2Upgrade_20241007.t.sol index caa0f16b8..ae5d0fc69 100644 --- a/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Ethereum_GHOStewardV2Upgrade_20241007.t.sol +++ b/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Ethereum_GHOStewardV2Upgrade_20241007.t.sol @@ -4,6 +4,7 @@ pragma solidity ^0.8.0; import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {GhoEthereum} from 'aave-address-book/GhoEthereum.sol'; import {IACLManager, IDefaultInterestRateStrategyV2} from 'aave-address-book/AaveV3.sol'; import {IAccessControl} from '@openzeppelin/contracts/access/IAccessControl.sol'; import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; @@ -50,8 +51,8 @@ contract AaveV3Ethereum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase ); assertEq( - IGsm(MiscEthereum.GSM_USDC).hasRole( - IGsm(MiscEthereum.GSM_USDC).CONFIGURATOR_ROLE(), + IGsm(GhoEthereum.GSM_USDC).hasRole( + IGsm(GhoEthereum.GSM_USDC).CONFIGURATOR_ROLE(), proposal.OLD_STEWARD() ), true, @@ -59,8 +60,8 @@ contract AaveV3Ethereum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase ); assertEq( - IGsm(MiscEthereum.GSM_USDT).hasRole( - IGsm(MiscEthereum.GSM_USDT).CONFIGURATOR_ROLE(), + IGsm(GhoEthereum.GSM_USDT).hasRole( + IGsm(GhoEthereum.GSM_USDT).CONFIGURATOR_ROLE(), proposal.OLD_STEWARD() ), true, @@ -87,25 +88,25 @@ contract AaveV3Ethereum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase // Gho CCIP Steward assertEq( - IUpgradeableLockReleaseTokenPool(MiscEthereum.GHO_CCIP_TOKEN_POOL).getBridgeLimitAdmin(), + IUpgradeableLockReleaseTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL).getBridgeLimitAdmin(), address(0) ); assertEq( - IUpgradeableLockReleaseTokenPool(MiscEthereum.GHO_CCIP_TOKEN_POOL).getRateLimitAdmin(), + IUpgradeableLockReleaseTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL).getRateLimitAdmin(), address(0) ); // GHO GSM Steward assertEq( - IGsm(MiscEthereum.GSM_USDC).hasRole( - IGsm(MiscEthereum.GSM_USDC).CONFIGURATOR_ROLE(), + IGsm(GhoEthereum.GSM_USDC).hasRole( + IGsm(GhoEthereum.GSM_USDC).CONFIGURATOR_ROLE(), proposal.GHO_GSM_STEWARD() ), false ); assertEq( - IGsm(MiscEthereum.GSM_USDT).hasRole( - IGsm(MiscEthereum.GSM_USDT).CONFIGURATOR_ROLE(), + IGsm(GhoEthereum.GSM_USDT).hasRole( + IGsm(GhoEthereum.GSM_USDT).CONFIGURATOR_ROLE(), proposal.GHO_GSM_STEWARD() ), false @@ -124,16 +125,16 @@ contract AaveV3Ethereum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase ); assertEq( - IGsm(MiscEthereum.GSM_USDC).hasRole( - IGsm(MiscEthereum.GSM_USDC).CONFIGURATOR_ROLE(), + IGsm(GhoEthereum.GSM_USDC).hasRole( + IGsm(GhoEthereum.GSM_USDC).CONFIGURATOR_ROLE(), proposal.OLD_STEWARD() ), false ); assertEq( - IGsm(MiscEthereum.GSM_USDT).hasRole( - IGsm(MiscEthereum.GSM_USDT).CONFIGURATOR_ROLE(), + IGsm(GhoEthereum.GSM_USDT).hasRole( + IGsm(GhoEthereum.GSM_USDT).CONFIGURATOR_ROLE(), proposal.OLD_STEWARD() ), false @@ -154,14 +155,10 @@ contract AaveV3Ethereum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase ) ); assertTrue( - IGhoBucketSteward(proposal.GHO_BUCKET_STEWARD()).isControlledFacilitator( - MiscEthereum.GSM_USDC - ) + IGhoBucketSteward(proposal.GHO_BUCKET_STEWARD()).isControlledFacilitator(GhoEthereum.GSM_USDC) ); assertTrue( - IGhoBucketSteward(proposal.GHO_BUCKET_STEWARD()).isControlledFacilitator( - MiscEthereum.GSM_USDT - ) + IGhoBucketSteward(proposal.GHO_BUCKET_STEWARD()).isControlledFacilitator(GhoEthereum.GSM_USDT) ); // Gho Aave Steward @@ -174,25 +171,25 @@ contract AaveV3Ethereum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase ); assertEq( - IUpgradeableLockReleaseTokenPool(MiscEthereum.GHO_CCIP_TOKEN_POOL).getBridgeLimitAdmin(), + IUpgradeableLockReleaseTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL).getBridgeLimitAdmin(), proposal.GHO_CCIP_STEWARD() ); assertEq( - IUpgradeableLockReleaseTokenPool(MiscEthereum.GHO_CCIP_TOKEN_POOL).getRateLimitAdmin(), + IUpgradeableLockReleaseTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL).getRateLimitAdmin(), proposal.GHO_CCIP_STEWARD() ); // GHO GSM Steward assertEq( - IGsm(MiscEthereum.GSM_USDC).hasRole( - IGsm(MiscEthereum.GSM_USDC).CONFIGURATOR_ROLE(), + IGsm(GhoEthereum.GSM_USDC).hasRole( + IGsm(GhoEthereum.GSM_USDC).CONFIGURATOR_ROLE(), proposal.GHO_GSM_STEWARD() ), true ); assertEq( - IGsm(MiscEthereum.GSM_USDT).hasRole( - IGsm(MiscEthereum.GSM_USDT).CONFIGURATOR_ROLE(), + IGsm(GhoEthereum.GSM_USDT).hasRole( + IGsm(GhoEthereum.GSM_USDT).CONFIGURATOR_ROLE(), proposal.GHO_GSM_STEWARD() ), true @@ -289,33 +286,29 @@ contract AaveV3Ethereum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase executePayload(vm, address(proposal)); address[] memory newGsmList = new address[](1); - newGsmList[0] = MiscEthereum.GSM_USDC; + newGsmList[0] = GhoEthereum.GSM_USDC; vm.startPrank(GovernanceV3Ethereum.EXECUTOR_LVL_1); IGhoBucketSteward(proposal.GHO_BUCKET_STEWARD()).setControlledFacilitator(newGsmList, true); assertTrue( - IGhoBucketSteward(proposal.GHO_BUCKET_STEWARD()).isControlledFacilitator( - MiscEthereum.GSM_USDC - ) + IGhoBucketSteward(proposal.GHO_BUCKET_STEWARD()).isControlledFacilitator(GhoEthereum.GSM_USDC) ); IGhoBucketSteward(proposal.GHO_BUCKET_STEWARD()).setControlledFacilitator(newGsmList, false); assertFalse( - IGhoBucketSteward(proposal.GHO_BUCKET_STEWARD()).isControlledFacilitator( - MiscEthereum.GSM_USDC - ) + IGhoBucketSteward(proposal.GHO_BUCKET_STEWARD()).isControlledFacilitator(GhoEthereum.GSM_USDC) ); } function test_ghoCcipSteward_updateBridgeLimit() public { executePayload(vm, address(proposal)); - uint256 oldBridgeLimit = IUpgradeableLockReleaseTokenPool(MiscEthereum.GHO_CCIP_TOKEN_POOL) + uint256 oldBridgeLimit = IUpgradeableLockReleaseTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL) .getBridgeLimit(); uint256 newBridgeLimit = oldBridgeLimit + 1; vm.startPrank(RISK_COUNCIL); IGhoCcipSteward(proposal.GHO_CCIP_STEWARD()).updateBridgeLimit(newBridgeLimit); - uint256 currentBridgeLimit = IUpgradeableLockReleaseTokenPool(MiscEthereum.GHO_CCIP_TOKEN_POOL) + uint256 currentBridgeLimit = IUpgradeableLockReleaseTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL) .getBridgeLimit(); assertEq(currentBridgeLimit, newBridgeLimit); } @@ -324,10 +317,10 @@ contract AaveV3Ethereum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase executePayload(vm, address(proposal)); RateLimiter.TokenBucket memory outboundConfig = IUpgradeableLockReleaseTokenPool( - MiscEthereum.GHO_CCIP_TOKEN_POOL + GhoEthereum.GHO_CCIP_TOKEN_POOL ).getCurrentOutboundRateLimiterState(remoteChainSelector); RateLimiter.TokenBucket memory inboundConfig = IUpgradeableLockReleaseTokenPool( - MiscEthereum.GHO_CCIP_TOKEN_POOL + GhoEthereum.GHO_CCIP_TOKEN_POOL ).getCurrentInboundRateLimiterState(remoteChainSelector); RateLimiter.Config memory newOutboundConfig = RateLimiter.Config({ @@ -361,32 +354,32 @@ contract AaveV3Ethereum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase function test_ghoGsmSteward_pdateExposureCap() public { executePayload(vm, address(proposal)); - uint128 oldExposureCap = IGsm(MiscEthereum.GSM_USDC).getExposureCap(); + uint128 oldExposureCap = IGsm(GhoEthereum.GSM_USDC).getExposureCap(); uint128 newExposureCap = oldExposureCap + 1; vm.startPrank(RISK_COUNCIL); IGsmSteward(proposal.GHO_GSM_STEWARD()).updateGsmExposureCap( - MiscEthereum.GSM_USDC, + GhoEthereum.GSM_USDC, newExposureCap ); - uint128 currentExposureCap = IGsm(MiscEthereum.GSM_USDC).getExposureCap(); + uint128 currentExposureCap = IGsm(GhoEthereum.GSM_USDC).getExposureCap(); assertEq(currentExposureCap, newExposureCap); } function test_ghoGsmSteward_updateGsmBuySellFees() public { executePayload(vm, address(proposal)); - address feeStrategy = IGsm(MiscEthereum.GSM_USDC).getFeeStrategy(); + address feeStrategy = IGsm(GhoEthereum.GSM_USDC).getFeeStrategy(); uint256 buyFee = IGsmFeeStrategy(feeStrategy).getBuyFee(1e4); uint256 sellFee = IGsmFeeStrategy(feeStrategy).getSellFee(1e4); vm.startPrank(RISK_COUNCIL); IGsmSteward(proposal.GHO_GSM_STEWARD()).updateGsmBuySellFees( - MiscEthereum.GSM_USDC, + GhoEthereum.GSM_USDC, buyFee + 1, sellFee ); - address newStrategy = IGsm(MiscEthereum.GSM_USDC).getFeeStrategy(); + address newStrategy = IGsm(GhoEthereum.GSM_USDC).getFeeStrategy(); uint256 newBuyFee = IGsmFeeStrategy(newStrategy).getBuyFee(1e4); assertEq(newBuyFee, buyFee + 1); } diff --git a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.sol b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.sol index 9a7995270..728ba707a 100644 --- a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.sol +++ b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.sol @@ -4,6 +4,7 @@ pragma solidity ^0.8.0; import {ITransparentUpgradeableProxy} from 'solidity-utils/contracts/transparent-proxy/TransparentUpgradeableProxy.sol'; import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; import {MiscArbitrum} from 'aave-address-book/MiscArbitrum.sol'; +import {GhoArbitrum} from 'aave-address-book/GhoArbitrum.sol'; import {IUpgradeableBurnMintTokenPool} from 'src/interfaces/ccip/IUpgradeableBurnMintTokenPool.sol'; import {IRateLimiter} from 'src/interfaces/ccip/IRateLimiter.sol'; import {ILegacyProxyAdmin} from '../interfaces/ILegacyProxyAdmin.sol'; @@ -29,7 +30,7 @@ contract AaveV3Arbitrum_GHOCCIP150Upgrade_20241021 is IProposalGenericExecutor { function execute() external { IUpgradeableBurnMintTokenPool tokenPoolProxy = IUpgradeableBurnMintTokenPool( - MiscArbitrum.GHO_CCIP_TOKEN_POOL + GhoArbitrum.GHO_CCIP_TOKEN_POOL ); ILegacyProxyAdmin(MiscArbitrum.PROXY_ADMIN).upgrade( diff --git a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.t.sol b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.t.sol index 79e12a8d7..73430ce9f 100644 --- a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.t.sol +++ b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.t.sol @@ -5,7 +5,9 @@ import 'forge-std/Test.sol'; import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; import {AaveV3Arbitrum, AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol'; import {MiscArbitrum} from 'aave-address-book/MiscArbitrum.sol'; +import {GhoArbitrum} from 'aave-address-book/GhoArbitrum.sol'; import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {GhoEthereum} from 'aave-address-book/GhoEthereum.sol'; import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; import {IClient} from 'src/interfaces/ccip/IClient.sol'; import {IInternal} from 'src/interfaces/ccip/IInternal.sol'; @@ -63,7 +65,7 @@ contract AaveV3Arbitrum_GHOCCIP150Upgrade_20241021_Test is ProtocolV3TestBase { function setUp() public { vm.createSelectFork(vm.rpcUrl('arbitrum'), 271788784); proposal = new AaveV3Arbitrum_GHOCCIP150Upgrade_20241021(); - ghoTokenPool = IUpgradeableBurnMintTokenPool(MiscArbitrum.GHO_CCIP_TOKEN_POOL); + ghoTokenPool = IUpgradeableBurnMintTokenPool(GhoArbitrum.GHO_CCIP_TOKEN_POOL); proxyPool = IProxyPool(proposal.GHO_CCIP_PROXY_POOL()); _validateConstants(); @@ -356,7 +358,7 @@ contract AaveV3Arbitrum_GHOCCIP150Upgrade_20241021_Test is ProtocolV3TestBase { _getDisabledConfig() ); assertEq(proxyPool.getRemotePool(ETH_CHAIN_SELECTOR), abi.encode(ETH_PROXY_POOL)); - assertEq(proxyPool.getRemoteToken(ETH_CHAIN_SELECTOR), abi.encode(MiscEthereum.GHO_TOKEN)); + assertEq(proxyPool.getRemoteToken(ETH_CHAIN_SELECTOR), abi.encode(GhoEthereum.GHO_TOKEN)); IRouter.OnRamp[] memory onRampUpdates = new IRouter.OnRamp[](1); onRampUpdates[0] = IRouter.OnRamp({ @@ -389,7 +391,7 @@ contract AaveV3Arbitrum_GHOCCIP150Upgrade_20241021_Test is ProtocolV3TestBase { sourceChainSelector: ARB_CHAIN_SELECTOR, feeTokenAmount: feeAmount, originalSender: alice, - destinationToken: MiscEthereum.GHO_TOKEN, + destinationToken: GhoEthereum.GHO_TOKEN, migrated: params.migrated }) ); diff --git a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3E2E_GHOCCIP150Upgrade_20241021.t.sol b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3E2E_GHOCCIP150Upgrade_20241021.t.sol index e64678526..59c873c3e 100644 --- a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3E2E_GHOCCIP150Upgrade_20241021.t.sol +++ b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3E2E_GHOCCIP150Upgrade_20241021.t.sol @@ -4,7 +4,9 @@ pragma solidity ^0.8.0; import 'forge-std/Test.sol'; import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {GhoEthereum} from 'aave-address-book/GhoEthereum.sol'; import {MiscArbitrum} from 'aave-address-book/MiscArbitrum.sol'; +import {GhoArbitrum} from 'aave-address-book/GhoArbitrum.sol'; import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; import {IClient} from 'src/interfaces/ccip/IClient.sol'; import {IInternal} from 'src/interfaces/ccip/IInternal.sol'; @@ -83,7 +85,7 @@ contract AaveV3E2E_GHOCCIP150Upgrade_20241021_Base is ProtocolV3TestBase { vm.selectFork(l1.c.forkId); l1.proposal = new AaveV3Ethereum_GHOCCIP150Upgrade_20241021(); l1.c.proxyPool = IProxyPool(l1.proposal.GHO_CCIP_PROXY_POOL()); - l1.tokenPool = IUpgradeableLockReleaseTokenPool(MiscEthereum.GHO_CCIP_TOKEN_POOL); + l1.tokenPool = IUpgradeableLockReleaseTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL); l1.rateLimitConfig = IRateLimiter.Config({ isEnabled: true, capacity: l1.proposal.CCIP_RATE_LIMIT_CAPACITY(), @@ -101,7 +103,7 @@ contract AaveV3E2E_GHOCCIP150Upgrade_20241021_Base is ProtocolV3TestBase { vm.selectFork(l2.c.forkId); l2.proposal = new AaveV3Arbitrum_GHOCCIP150Upgrade_20241021(); l2.c.proxyPool = IProxyPool(l2.proposal.GHO_CCIP_PROXY_POOL()); - l2.tokenPool = IUpgradeableBurnMintTokenPool(MiscArbitrum.GHO_CCIP_TOKEN_POOL); + l2.tokenPool = IUpgradeableBurnMintTokenPool(GhoArbitrum.GHO_CCIP_TOKEN_POOL); l2.rateLimitConfig = IRateLimiter.Config({ isEnabled: true, capacity: l2.proposal.CCIP_RATE_LIMIT_CAPACITY(), @@ -149,7 +151,7 @@ contract AaveV3E2E_GHOCCIP150Upgrade_20241021_Base is ProtocolV3TestBase { function _validateConfig(bool migrated) internal { vm.selectFork(l1.c.forkId); assertEq(l1.c.chainSelector, 5009297550715157269); - assertEq(address(l1.c.token), MiscEthereum.GHO_TOKEN); + assertEq(address(l1.c.token), GhoEthereum.GHO_TOKEN); assertEq(ITypeAndVersion(address(l1.c.router)).typeAndVersion(), 'Router 1.2.0'); assertEq( ITypeAndVersion(address(l1.c.EVM2EVMOnRamp1_2)).typeAndVersion(), diff --git a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.sol b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.sol index 06aab31f0..ec06e5402 100644 --- a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.sol +++ b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.0; import {ITransparentUpgradeableProxy} from 'solidity-utils/contracts/transparent-proxy/TransparentUpgradeableProxy.sol'; import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {GhoEthereum} from 'aave-address-book/GhoEthereum.sol'; import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; import {IUpgradeableLockReleaseTokenPool} from 'src/interfaces/ccip/IUpgradeableLockReleaseTokenPool.sol'; import {IRateLimiter} from 'src/interfaces/ccip/IRateLimiter.sol'; @@ -29,7 +30,7 @@ contract AaveV3Ethereum_GHOCCIP150Upgrade_20241021 is IProposalGenericExecutor { function execute() external { IUpgradeableLockReleaseTokenPool tokenPoolProxy = IUpgradeableLockReleaseTokenPool( - MiscEthereum.GHO_CCIP_TOKEN_POOL + GhoEthereum.GHO_CCIP_TOKEN_POOL ); ILegacyProxyAdmin(MiscEthereum.PROXY_ADMIN).upgrade( diff --git a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.t.sol b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.t.sol index c9b0b63d8..46f5dae57 100644 --- a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.t.sol +++ b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.t.sol @@ -6,6 +6,7 @@ import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; import {AaveV3Ethereum} from 'aave-address-book/AaveV3Ethereum.sol'; import {AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol'; import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {GhoEthereum} from 'aave-address-book/GhoEthereum.sol'; import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; import {IClient} from 'src/interfaces/ccip/IClient.sol'; import {IInternal} from 'src/interfaces/ccip/IInternal.sol'; @@ -59,7 +60,7 @@ contract AaveV3Ethereum_GHOCCIP150Upgrade_20241021_Test is ProtocolV3TestBase { function setUp() public { vm.createSelectFork(vm.rpcUrl('mainnet'), 21131872); proposal = new AaveV3Ethereum_GHOCCIP150Upgrade_20241021(); - ghoTokenPool = IUpgradeableLockReleaseTokenPool(MiscEthereum.GHO_CCIP_TOKEN_POOL); + ghoTokenPool = IUpgradeableLockReleaseTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL); proxyPool = IProxyPool(proposal.GHO_CCIP_PROXY_POOL()); _validateConstants(); @@ -287,7 +288,7 @@ contract AaveV3Ethereum_GHOCCIP150Upgrade_20241021_Test is ProtocolV3TestBase { executePayload(vm, address(proposal)); // mock previously locked gho - deal(MiscEthereum.GHO_TOKEN, address(ghoTokenPool), amount); + deal(GhoEthereum.GHO_TOKEN, address(ghoTokenPool), amount); // wait for the rate limiter to refill skip(_getInboundRefillTime(amount)); @@ -329,24 +330,24 @@ contract AaveV3Ethereum_GHOCCIP150Upgrade_20241021_Test is ProtocolV3TestBase { vm.prank(proxyPool.owner()); proxyPool.transferOwnership(AaveV3Ethereum.ACL_ADMIN); vm.prank(TOKEN_ADMIN_REGISTRY.owner()); - TOKEN_ADMIN_REGISTRY.transferAdminRole(MiscEthereum.GHO_TOKEN, AaveV3Ethereum.ACL_ADMIN); + TOKEN_ADMIN_REGISTRY.transferAdminRole(GhoEthereum.GHO_TOKEN, AaveV3Ethereum.ACL_ADMIN); // new AIP to accept ownership vm.startPrank(AaveV3Ethereum.ACL_ADMIN); proxyPool.acceptOwnership(); - TOKEN_ADMIN_REGISTRY.acceptAdminRole(MiscEthereum.GHO_TOKEN); + TOKEN_ADMIN_REGISTRY.acceptAdminRole(GhoEthereum.GHO_TOKEN); vm.stopPrank(); assertEq(proxyPool.owner(), AaveV3Ethereum.ACL_ADMIN); assertTrue( - TOKEN_ADMIN_REGISTRY.isAdministrator(MiscEthereum.GHO_TOKEN, AaveV3Ethereum.ACL_ADMIN) + TOKEN_ADMIN_REGISTRY.isAdministrator(GhoEthereum.GHO_TOKEN, AaveV3Ethereum.ACL_ADMIN) ); } function _mockCCIPMigration() private { IRouter router = IRouter(ghoTokenPool.getRouter()); - assertEq(TOKEN_ADMIN_REGISTRY.getPool(MiscEthereum.GHO_TOKEN), address(proxyPool)); + assertEq(TOKEN_ADMIN_REGISTRY.getPool(GhoEthereum.GHO_TOKEN), address(proxyPool)); assertEq(proxyPool.getRouter(), address(router)); @@ -382,7 +383,7 @@ contract AaveV3Ethereum_GHOCCIP150Upgrade_20241021_Test is ProtocolV3TestBase { ) internal returns (IClient.EVM2AnyMessage memory, IInternal.EVM2EVMMessage memory) { IClient.EVM2AnyMessage memory message = CCIPUtils.generateMessage(alice, 1); message.tokenAmounts[0] = IClient.EVMTokenAmount({ - token: MiscEthereum.GHO_TOKEN, + token: GhoEthereum.GHO_TOKEN, amount: params.amount }); @@ -450,7 +451,7 @@ contract AaveV3Ethereum_GHOCCIP150Upgrade_20241021_Test is ProtocolV3TestBase { assertEq(ITypeAndVersion(OFF_RAMP_1_2).typeAndVersion(), 'EVM2EVMOffRamp 1.2.0'); assertEq(ITypeAndVersion(OFF_RAMP_1_5).typeAndVersion(), 'EVM2EVMOffRamp 1.5.0'); - assertEq(GHO_CCIP_STEWARD.GHO_TOKEN(), MiscEthereum.GHO_TOKEN); + assertEq(GHO_CCIP_STEWARD.GHO_TOKEN(), GhoEthereum.GHO_TOKEN); assertEq(GHO_CCIP_STEWARD.GHO_TOKEN_POOL(), address(ghoTokenPool)); assertEq(proxyPool.getPreviousPool(), address(ghoTokenPool)); diff --git a/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113.sol b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113.sol new file mode 100644 index 000000000..314b86f81 --- /dev/null +++ b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol'; +import {AaveV3Arbitrum, AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol'; +import {MiscArbitrum} from 'aave-address-book/MiscArbitrum.sol'; +import {AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {CollectorUtils, ICollector} from 'aave-helpers/src/CollectorUtils.sol'; + +interface IAaveArbEthERC20Bridge { + function bridge(address token, address l1token, address gateway, uint256 amount) external; +} + +/** + * @title September Funding Update - Part A + * @author karpatkey_TokenLogic + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-september-funding-update/19162 + */ +contract AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113 is IProposalGenericExecutor { + using SafeERC20 for IERC20; + using CollectorUtils for ICollector; + + IAaveArbEthERC20Bridge public constant BRIDGE = + IAaveArbEthERC20Bridge(MiscArbitrum.AAVE_ARB_ETH_BRIDGE); + // https://arbiscan.io/address/0x096760F208390250649E3e8763348E783AEF5562 + address public constant USDC_GATEWAY = 0x096760F208390250649E3e8763348E783AEF5562; + // https://arbiscan.io/address/0x09e9222E96E7B4AE2a407B98d48e330053351EEe + address public constant LUSD_GATEWAY = 0x09e9222E96E7B4AE2a407B98d48e330053351EEe; + + function execute() external { + AaveV3Arbitrum.COLLECTOR.withdrawFromV3( + CollectorUtils.IOInput({ + pool: address(AaveV3Arbitrum.POOL), + underlying: AaveV3ArbitrumAssets.USDC_UNDERLYING, + amount: IERC20(AaveV3ArbitrumAssets.USDC_A_TOKEN).balanceOf( + address(AaveV3Arbitrum.COLLECTOR) + ) - 100e6 + }), + address(BRIDGE) + ); + + BRIDGE.bridge( + AaveV3ArbitrumAssets.USDC_UNDERLYING, + AaveV3EthereumAssets.USDC_UNDERLYING, + USDC_GATEWAY, + IERC20(AaveV3ArbitrumAssets.USDC_UNDERLYING).balanceOf(address(BRIDGE)) + ); + + AaveV3Arbitrum.COLLECTOR.withdrawFromV3( + CollectorUtils.IOInput({ + pool: address(AaveV3Arbitrum.POOL), + underlying: AaveV3ArbitrumAssets.LUSD_UNDERLYING, + amount: IERC20(AaveV3ArbitrumAssets.LUSD_A_TOKEN).balanceOf( + address(AaveV3Arbitrum.COLLECTOR) + ) - 1e18 + }), + address(BRIDGE) + ); + + BRIDGE.bridge( + AaveV3ArbitrumAssets.LUSD_UNDERLYING, + AaveV3EthereumAssets.LUSD_UNDERLYING, + LUSD_GATEWAY, + IERC20(AaveV3ArbitrumAssets.LUSD_UNDERLYING).balanceOf(address(BRIDGE)) + ); + } +} diff --git a/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113.t.sol b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113.t.sol new file mode 100644 index 000000000..b429fe6f1 --- /dev/null +++ b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113.t.sol @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3Arbitrum, AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol'; + +import 'forge-std/Test.sol'; +import {stdStorage, StdStorage} from 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113} from './AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113.sol'; + +contract GatewayMock { + function outboundTransfer(address, address, uint256, bytes calldata) external {} +} + +/** + * @dev Test for AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113 + * command: FOUNDRY_PROFILE=arbitrum forge test --match-path=src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113.t.sol -vv + */ +contract AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113_Test is ProtocolV3TestBase { + using stdStorage for StdStorage; + + event Bridge(address indexed token, uint256 amount); + + AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113 internal proposal; + + address internal COLLECTOR = address(AaveV3Arbitrum.COLLECTOR); + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('arbitrum'), 274046247); + proposal = new AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113(); + + GatewayMock mock = new GatewayMock(); + vm.etch(proposal.USDC_GATEWAY(), address(mock).code); + vm.etch(proposal.LUSD_GATEWAY(), address(mock).code); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113', + AaveV3Arbitrum.POOL, + address(proposal) + ); + } + + function test_bridgeUSDC() public { + uint256 collectorAUsdcBalanceBefore = IERC20(AaveV3ArbitrumAssets.USDC_A_TOKEN).balanceOf( + COLLECTOR + ); + + vm.expectEmit(true, false, false, true, address(proposal.BRIDGE())); + emit Bridge(AaveV3ArbitrumAssets.USDC_UNDERLYING, collectorAUsdcBalanceBefore - 100e6); + executePayload(vm, address(proposal)); + + uint256 collectorAUsdcBalanceAfter = IERC20(AaveV3ArbitrumAssets.USDC_A_TOKEN).balanceOf( + COLLECTOR + ); + + assertApproxEqAbs(collectorAUsdcBalanceAfter, 100e6, 5_000e6); + } + + function test_bridgeLUSD() public { + uint256 collectorALusdBalanceBefore = IERC20(AaveV3ArbitrumAssets.LUSD_A_TOKEN).balanceOf( + COLLECTOR + ); + + vm.expectEmit(true, false, false, true, address(proposal.BRIDGE())); + emit Bridge(AaveV3ArbitrumAssets.LUSD_UNDERLYING, collectorALusdBalanceBefore - 1e18); + executePayload(vm, address(proposal)); + + uint256 collectorALusdBalanceAfter = IERC20(AaveV3ArbitrumAssets.LUSD_A_TOKEN).balanceOf( + COLLECTOR + ); + + assertApproxEqAbs(collectorALusdBalanceAfter, 1e18, 2_000e18); + } +} diff --git a/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113.sol b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113.sol new file mode 100644 index 000000000..b4dc753ea --- /dev/null +++ b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113.sol @@ -0,0 +1,263 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol'; +import {ILegacyProxyAdmin} from 'src/interfaces/ILegacyProxyAdmin.sol'; +import {ITransparentUpgradeableProxy} from 'solidity-utils/contracts/transparent-proxy/TransparentUpgradeableProxy.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 {AaveSwapper} from 'aave-helpers/src/swaps/AaveSwapper.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {CollectorUtils, ICollector} from 'aave-helpers/src/CollectorUtils.sol'; + +interface IRescuable { + /** + * @notice Emergency rescue for token stuck on this contract, as failsafe mechanism + * @dev Funds should never remain in this contract more time than during transactions + * @dev Only callable by the owner + * @param token The address of the stuck token to rescue + */ + function rescueTokens(IERC20 token) external; +} + +/** + * @title September Funding Update - Part A + * @author karpatkey_TokenLogic + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-september-funding-update/19162 + */ +contract AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113 is IProposalGenericExecutor { + using SafeERC20 for IERC20; + using CollectorUtils for ICollector; + + // https://etherscan.io/address/0xD80F4cE4Df649d8D6A88cf365f0560Bed9aE688F + address public constant NEW_AAVE_SWAPPER_IMPL = 0xD80F4cE4Df649d8D6A88cf365f0560Bed9aE688F; + + // https://etherscan.io/address/0x6A6FA664D4Fa49a6a780a1D6143f079f8dd7C33d + address public constant DEBT_SWAP_ADAPTER = 0x6A6FA664D4Fa49a6a780a1D6143f079f8dd7C33d; + // https://etherscan.io/address/0x8761e0370f94f68Db8EaA731f4fC581f6AD0Bd68 + address public constant DEBT_SWAP_ADAPTER_V3 = 0x8761e0370f94f68Db8EaA731f4fC581f6AD0Bd68; + // https://etherscan.io/address/0x02e7B8511831B1b02d9018215a0f8f500Ea5c6B3 + address public constant REPAY_WITH_COLLATERAL_ADAPTER = + 0x02e7B8511831B1b02d9018215a0f8f500Ea5c6B3; + + // https://etherscan.io/address/0x818C277dBE886b934e60aa047250A73529E26A99 + address public constant KARPATKEY = 0x818C277dBE886b934e60aa047250A73529E26A99; + uint256 public constant GAS_REBATE_AMOUNT = 0.264 ether; + + // https://etherscan.io/address/0xdeadD8aB03075b7FBA81864202a2f59EE25B312b + address public constant MERIT_SAFE = 0xdeadD8aB03075b7FBA81864202a2f59EE25B312b; + uint256 public constant GHO_ALLOWANCE = 3_000_000 ether; + uint256 public constant WETH_A_ALLOWANCE = 800 ether; + + // https://etherscan.io/address/0x060373D064d0168931dE2AB8DDA7410923d06E88 + address public constant MILKMAN = 0x060373D064d0168931dE2AB8DDA7410923d06E88; + + // https://etherscan.io/address/0xe80a1C615F75AFF7Ed8F08c9F21f9d00982D666c + address public constant PRICE_CHECKER = 0xe80a1C615F75AFF7Ed8F08c9F21f9d00982D666c; + // https://etherscan.io/address/0x3f12643D3f6f874d39C2a4c9f2Cd6f2DbAC877FC + address public constant GHO_USD_FEED = 0x3f12643D3f6f874d39C2a4c9f2Cd6f2DbAC877FC; + uint256 public constant USDC_A_AMOUNT = 1_250_000e6; + uint256 public constant USDT_A_AMOUNT = 1_250_000e6; + uint256 public constant DAI_A_AMOUNT = 500_000e18; + + function execute() external override { + // New AaveSwapper implementation: + ILegacyProxyAdmin(MiscEthereum.PROXY_ADMIN).upgrade( + ITransparentUpgradeableProxy(payable(MiscEthereum.AAVE_SWAPPER)), + NEW_AAVE_SWAPPER_IMPL + ); + + _withdrawAndSwapForGHO(); + _rescueParaswap(); + + AaveV3Ethereum.COLLECTOR.transfer( + AaveV3EthereumAssets.WETH_A_TOKEN, + KARPATKEY, + GAS_REBATE_AMOUNT + ); + + AaveV3Ethereum.COLLECTOR.approve( + AaveV3EthereumAssets.GHO_UNDERLYING, + MERIT_SAFE, + GHO_ALLOWANCE + ); + AaveV3Ethereum.COLLECTOR.approve( + AaveV3EthereumAssets.WETH_A_TOKEN, + MERIT_SAFE, + WETH_A_ALLOWANCE + ); + } + + function _withdrawAndSwapForGHO() internal { + // usdc + AaveV3Ethereum.COLLECTOR.withdrawFromV3( + CollectorUtils.IOInput({ + pool: address(AaveV3Ethereum.POOL), + underlying: AaveV3EthereumAssets.USDC_UNDERLYING, + amount: USDC_A_AMOUNT + }), + address(AaveV3Ethereum.COLLECTOR) + ); + + AaveV3Ethereum.COLLECTOR.swap( + MiscEthereum.AAVE_SWAPPER, + CollectorUtils.SwapInput({ + milkman: MILKMAN, + priceChecker: PRICE_CHECKER, + fromUnderlying: AaveV3EthereumAssets.USDC_UNDERLYING, + toUnderlying: AaveV3EthereumAssets.GHO_UNDERLYING, + fromUnderlyingPriceFeed: AaveV3EthereumAssets.USDC_ORACLE, + toUnderlyingPriceFeed: GHO_USD_FEED, + amount: type(uint256).max, + slippage: 50 + }) + ); + + // usdt + AaveV3Ethereum.COLLECTOR.withdrawFromV3( + CollectorUtils.IOInput({ + pool: address(AaveV3Ethereum.POOL), + underlying: AaveV3EthereumAssets.USDT_UNDERLYING, + amount: USDT_A_AMOUNT + }), + address(AaveV3Ethereum.COLLECTOR) + ); + + AaveV3Ethereum.COLLECTOR.swap( + MiscEthereum.AAVE_SWAPPER, + CollectorUtils.SwapInput({ + milkman: MILKMAN, + priceChecker: PRICE_CHECKER, + fromUnderlying: AaveV3EthereumAssets.USDT_UNDERLYING, + toUnderlying: AaveV3EthereumAssets.GHO_UNDERLYING, + fromUnderlyingPriceFeed: AaveV3EthereumAssets.USDT_ORACLE, + toUnderlyingPriceFeed: GHO_USD_FEED, + amount: type(uint256).max, + slippage: 50 + }) + ); + + // aDai + uint256 aDaiAvailableBalance = IERC20(AaveV2EthereumAssets.DAI_UNDERLYING).balanceOf( + AaveV2EthereumAssets.DAI_A_TOKEN + ); + uint256 aDaiBalance = IERC20(AaveV2EthereumAssets.DAI_A_TOKEN).balanceOf( + address(AaveV2Ethereum.COLLECTOR) + ); + AaveV2Ethereum.COLLECTOR.withdrawFromV2( + CollectorUtils.IOInput({ + pool: address(AaveV2Ethereum.POOL), + underlying: AaveV2EthereumAssets.DAI_UNDERLYING, + amount: (aDaiBalance > aDaiAvailableBalance ? aDaiAvailableBalance : aDaiBalance) - 1e18 + }), + address(AaveV3Ethereum.COLLECTOR) + ); + // aEthDai + AaveV3Ethereum.COLLECTOR.withdrawFromV3( + CollectorUtils.IOInput({ + pool: address(AaveV3Ethereum.POOL), + underlying: AaveV3EthereumAssets.DAI_UNDERLYING, + amount: DAI_A_AMOUNT + }), + address(AaveV3Ethereum.COLLECTOR) + ); + + AaveV3Ethereum.COLLECTOR.swap( + MiscEthereum.AAVE_SWAPPER, + CollectorUtils.SwapInput({ + milkman: MILKMAN, + priceChecker: PRICE_CHECKER, + fromUnderlying: AaveV3EthereumAssets.DAI_UNDERLYING, + toUnderlying: AaveV3EthereumAssets.GHO_UNDERLYING, + fromUnderlyingPriceFeed: AaveV3EthereumAssets.DAI_ORACLE, + toUnderlyingPriceFeed: GHO_USD_FEED, + amount: type(uint256).max, + slippage: 100 + }) + ); + + // aLusd + uint256 aLusdAvailableBalance = IERC20(AaveV2EthereumAssets.LUSD_UNDERLYING).balanceOf( + AaveV2EthereumAssets.LUSD_A_TOKEN + ); + uint256 aLusdBalance = IERC20(AaveV2EthereumAssets.LUSD_A_TOKEN).balanceOf( + address(AaveV2Ethereum.COLLECTOR) + ); + AaveV2Ethereum.COLLECTOR.withdrawFromV2( + CollectorUtils.IOInput({ + pool: address(AaveV2Ethereum.POOL), + underlying: AaveV2EthereumAssets.LUSD_UNDERLYING, + amount: (aLusdBalance > aLusdAvailableBalance ? aLusdAvailableBalance : aLusdBalance) - 1e18 + }), + address(AaveV3Ethereum.COLLECTOR) + ); + + AaveV3Ethereum.COLLECTOR.swap( + MiscEthereum.AAVE_SWAPPER, + CollectorUtils.SwapInput({ + milkman: MILKMAN, + priceChecker: PRICE_CHECKER, + fromUnderlying: AaveV3EthereumAssets.LUSD_UNDERLYING, + toUnderlying: AaveV3EthereumAssets.GHO_UNDERLYING, + fromUnderlyingPriceFeed: AaveV3EthereumAssets.LUSD_ORACLE, + toUnderlyingPriceFeed: GHO_USD_FEED, + amount: type(uint256).max, + slippage: 300 + }) + ); + + // aFrax + uint256 aFraxAvailableBalance = IERC20(AaveV2EthereumAssets.FRAX_UNDERLYING).balanceOf( + AaveV2EthereumAssets.FRAX_A_TOKEN + ); + uint256 aFraxBalance = IERC20(AaveV2EthereumAssets.FRAX_A_TOKEN).balanceOf( + address(AaveV2Ethereum.COLLECTOR) + ); + AaveV2Ethereum.COLLECTOR.withdrawFromV2( + CollectorUtils.IOInput({ + pool: address(AaveV2Ethereum.POOL), + underlying: AaveV2EthereumAssets.FRAX_UNDERLYING, + amount: (aFraxBalance > aFraxAvailableBalance ? aFraxAvailableBalance : aFraxBalance) - 1e18 + }), + address(AaveV3Ethereum.COLLECTOR) + ); + + AaveV3Ethereum.COLLECTOR.swap( + MiscEthereum.AAVE_SWAPPER, + CollectorUtils.SwapInput({ + milkman: MILKMAN, + priceChecker: PRICE_CHECKER, + fromUnderlying: AaveV3EthereumAssets.FRAX_UNDERLYING, + toUnderlying: AaveV3EthereumAssets.GHO_UNDERLYING, + fromUnderlyingPriceFeed: AaveV3EthereumAssets.FRAX_ORACLE, + toUnderlyingPriceFeed: GHO_USD_FEED, + amount: type(uint256).max, + slippage: 500 + }) + ); + } + + function _rescueParaswap() internal { + IRescuable(DEBT_SWAP_ADAPTER).rescueTokens(IERC20(AaveV2EthereumAssets.sUSD_UNDERLYING)); + IRescuable(DEBT_SWAP_ADAPTER).rescueTokens(IERC20(AaveV2EthereumAssets.USDC_UNDERLYING)); + IRescuable(REPAY_WITH_COLLATERAL_ADAPTER).rescueTokens( + IERC20(AaveV3EthereumAssets.GHO_UNDERLYING) + ); + + IERC20(AaveV2EthereumAssets.sUSD_UNDERLYING).transfer( + address(AaveV3Ethereum.COLLECTOR), + IERC20(AaveV2EthereumAssets.sUSD_UNDERLYING).balanceOf(address(this)) + ); + IERC20(AaveV2EthereumAssets.USDC_UNDERLYING).transfer( + address(AaveV3Ethereum.COLLECTOR), + IERC20(AaveV2EthereumAssets.USDC_UNDERLYING).balanceOf(address(this)) + ); + IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).transfer( + address(AaveV3Ethereum.COLLECTOR), + IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(address(this)) + ); + } +} diff --git a/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113.t.sol b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113.t.sol new file mode 100644 index 000000000..cda30514a --- /dev/null +++ b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113.t.sol @@ -0,0 +1,444 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.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 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113} from './AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113.sol'; + +/** + * @dev Test for AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113.t.sol -vv + */ +contract AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113_Test is ProtocolV3TestBase { + event SwapRequested( + address milkman, + address indexed fromToken, + address indexed toToken, + address fromOracle, + address toOracle, + uint256 amount, + address indexed recipient, + uint256 slippage + ); + + AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21262170); + proposal = new AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113', + AaveV3Ethereum.POOL, + address(proposal) + ); + } + + function test_withdrawUsdcAndSwapForGho() public { + uint256 collectorAUsdcBalanceBefore = IERC20(AaveV3EthereumAssets.USDC_A_TOKEN).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + + executePayload(vm, address(proposal)); + + uint256 collectorAUsdcBalanceAfter = IERC20(AaveV3EthereumAssets.USDC_A_TOKEN).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + + assertApproxEqAbs( + collectorAUsdcBalanceAfter, + collectorAUsdcBalanceBefore - proposal.USDC_A_AMOUNT() - 1, + 1, + 'Collector balance after swap' + ); + assertApproxEqAbs( + IERC20(AaveV3EthereumAssets.USDC_UNDERLYING).balanceOf( + 0xA866e48A6ef92e0191358Cb606C99e6187083567 // milkmanInstance contract + ), + proposal.USDC_A_AMOUNT(), + 6_000e6 + ); + } + + function test_withdrawUsdtAndSwapForGho() public { + uint256 collectorAUsdtBalanceBefore = IERC20(AaveV3EthereumAssets.USDT_A_TOKEN).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + + executePayload(vm, address(proposal)); + + uint256 collectorAUsdtBalanceAfter = IERC20(AaveV3EthereumAssets.USDT_A_TOKEN).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + + assertApproxEqAbs( + collectorAUsdtBalanceAfter, + collectorAUsdtBalanceBefore - proposal.USDT_A_AMOUNT() - 1, + 1, + 'Collector balance after swap' + ); + assertApproxEqAbs( + IERC20(AaveV3EthereumAssets.USDT_UNDERLYING).balanceOf( + 0x520A820040199C9f4b4420aE72aa9F8b91171262 // milkmanInstance contract + ), + proposal.USDT_A_AMOUNT(), + 3_500e6 + ); + } + + function test_withdrawDaiAndSwapForGho() public { + uint256 collectorDaiBalanceBefore = IERC20(AaveV3EthereumAssets.DAI_UNDERLYING).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + uint256 collectorADaiBalanceBefore = IERC20(AaveV2EthereumAssets.DAI_A_TOKEN).balanceOf( + address(AaveV2Ethereum.COLLECTOR) + ); + uint256 collectorAEthDaiBalanceBefore = IERC20(AaveV3EthereumAssets.DAI_A_TOKEN).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + + executePayload(vm, address(proposal)); + + uint256 collectorDaiBalanceAfter = IERC20(AaveV3EthereumAssets.DAI_UNDERLYING).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + uint256 collectorADaiBalanceAfter = IERC20(AaveV2EthereumAssets.DAI_A_TOKEN).balanceOf( + address(AaveV2Ethereum.COLLECTOR) + ); + uint256 collectorAEthDaiBalanceAfter = IERC20(AaveV3EthereumAssets.DAI_A_TOKEN).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + + assertEq(collectorDaiBalanceAfter, 0, 'Collector v3 underlying balance after swap'); + assertApproxEqAbs(collectorADaiBalanceAfter, 1e18, 80_000e18); + assertApproxEqAbs( + collectorAEthDaiBalanceAfter, + collectorAEthDaiBalanceBefore - proposal.DAI_A_AMOUNT(), + 50_000e18 + ); + assertApproxEqAbs( + IERC20(AaveV3EthereumAssets.DAI_UNDERLYING).balanceOf( + 0x6F828AF1D84C996DF4be14Ce178DcFC0cb3A4EEf // milkmanInstance contract + ), + collectorDaiBalanceBefore + collectorADaiBalanceBefore + proposal.DAI_A_AMOUNT() - 1e18, + 1e18 + ); + } + + function test_withdrawLusdAndSwapForGho() public { + executePayload(vm, address(proposal)); + + uint256 collectorLusdBalanceAfter = IERC20(AaveV3EthereumAssets.LUSD_UNDERLYING).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + uint256 collectorALusdBalanceAfter = IERC20(AaveV2EthereumAssets.LUSD_A_TOKEN).balanceOf( + address(AaveV2Ethereum.COLLECTOR) + ); + + assertEq(collectorLusdBalanceAfter, 0, 'Collector v3 underlying balance after swap'); + assertEq( + collectorALusdBalanceAfter, + 27626783961961316333562, // dynamic calculated because can't withdraw all due lack of liquidity + 'Collector v2 a token balance after swap' + ); + assertEq( + IERC20(AaveV3EthereumAssets.LUSD_UNDERLYING).balanceOf( + 0xD9d89a3979347934a70D78E1Da8eb5D1f0863ED6 // milkmanInstance contract + ), + 76843009601435302316637, // dynamic calculated because can't withdraw all due lack of liquidity + 'Swapper balance after swap' + ); + } + + function test_withdrawFraxAndSwapForGho() public { + uint256 collectorFraxBalanceBefore = IERC20(AaveV3EthereumAssets.FRAX_UNDERLYING).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + uint256 collectorAFraxBalanceBefore = IERC20(AaveV2EthereumAssets.FRAX_A_TOKEN).balanceOf( + address(AaveV2Ethereum.COLLECTOR) + ); + + executePayload(vm, address(proposal)); + + uint256 collectorFraxBalanceAfter = IERC20(AaveV3EthereumAssets.FRAX_UNDERLYING).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + uint256 collectorAFraxBalanceAfter = IERC20(AaveV2EthereumAssets.FRAX_A_TOKEN).balanceOf( + address(AaveV2Ethereum.COLLECTOR) + ); + + assertEq(collectorFraxBalanceAfter, 0, 'Collector v3 underlying balance after swap'); + assertApproxEqAbs(collectorAFraxBalanceAfter, 1e18, 900e18); + assertEq( + IERC20(AaveV3EthereumAssets.FRAX_UNDERLYING).balanceOf( + 0xfBdaD08dF908C30956AdB380cdC33074A4F37Ee4 // milkmanInstance contract + ), + collectorFraxBalanceBefore + collectorAFraxBalanceBefore - 1e18, + 'Swapper balance after swap' + ); + } + + function test_swapEvents() public { + 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(), + 1255824963385, // Hardcoded as dynamic + address(AaveV3Ethereum.COLLECTOR), + 50 + ); + + 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(), + 1253318999591, // Hardcoded as dynamic + address(AaveV3Ethereum.COLLECTOR), + 50 + ); + + vm.expectEmit(true, true, true, true, MiscEthereum.AAVE_SWAPPER); + emit SwapRequested( + proposal.MILKMAN(), + AaveV3EthereumAssets.DAI_UNDERLYING, + AaveV3EthereumAssets.GHO_UNDERLYING, + AaveV3EthereumAssets.DAI_ORACLE, + proposal.GHO_USD_FEED(), + 1362327582832050751435002, // Hardcoded as dynamic + address(AaveV3Ethereum.COLLECTOR), + 100 + ); + + vm.expectEmit(true, true, true, true, MiscEthereum.AAVE_SWAPPER); + emit SwapRequested( + proposal.MILKMAN(), + AaveV3EthereumAssets.LUSD_UNDERLYING, + AaveV3EthereumAssets.GHO_UNDERLYING, + AaveV3EthereumAssets.LUSD_ORACLE, + proposal.GHO_USD_FEED(), + 76843009601435302316637, // Hardcoded as dynamic + address(AaveV3Ethereum.COLLECTOR), + 300 + ); + + vm.expectEmit(true, true, true, true, MiscEthereum.AAVE_SWAPPER); + emit SwapRequested( + proposal.MILKMAN(), + AaveV2EthereumAssets.FRAX_UNDERLYING, + AaveV3EthereumAssets.GHO_UNDERLYING, + AaveV3EthereumAssets.FRAX_ORACLE, + proposal.GHO_USD_FEED(), + 5725614971954349972007, // Hardcoded as dynamic + address(AaveV3Ethereum.COLLECTOR), + 500 + ); + + executePayload(vm, address(proposal)); + } + + function test_gasRebate() public { + uint256 balanceKpkBefore = IERC20(AaveV3EthereumAssets.WETH_A_TOKEN).balanceOf( + proposal.KARPATKEY() + ); + + executePayload(vm, address(proposal)); + + assertEq( + IERC20(AaveV3EthereumAssets.WETH_A_TOKEN).balanceOf(proposal.KARPATKEY()), + balanceKpkBefore + proposal.GAS_REBATE_AMOUNT() + ); + } + + function test_meritAllowance() public { + executePayload(vm, address(proposal)); + + assertEq( + IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).allowance( + address(AaveV3Ethereum.COLLECTOR), + proposal.MERIT_SAFE() + ), + proposal.GHO_ALLOWANCE() + ); + assertEq( + IERC20(AaveV3EthereumAssets.WETH_A_TOKEN).allowance( + address(AaveV3Ethereum.COLLECTOR), + proposal.MERIT_SAFE() + ), + proposal.WETH_A_ALLOWANCE() + ); + + uint256 ghoBalanceBefore = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf( + proposal.MERIT_SAFE() + ); + uint256 wethBalanceBefore = IERC20(AaveV3EthereumAssets.WETH_A_TOKEN).balanceOf( + proposal.MERIT_SAFE() + ); + + vm.startPrank(proposal.MERIT_SAFE()); + IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).transferFrom( + address(AaveV3Ethereum.COLLECTOR), + proposal.MERIT_SAFE(), + proposal.GHO_ALLOWANCE() + ); + IERC20(AaveV3EthereumAssets.WETH_A_TOKEN).transferFrom( + address(AaveV3Ethereum.COLLECTOR), + proposal.MERIT_SAFE(), + proposal.WETH_A_ALLOWANCE() + ); + vm.stopPrank(); + + uint256 ghoBalanceAfter = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf( + proposal.MERIT_SAFE() + ); + uint256 wethBalanceAfter = IERC20(AaveV3EthereumAssets.WETH_A_TOKEN).balanceOf( + proposal.MERIT_SAFE() + ); + + assertEq(ghoBalanceAfter, ghoBalanceBefore + proposal.GHO_ALLOWANCE()); + assertEq(wethBalanceAfter, wethBalanceBefore + proposal.WETH_A_ALLOWANCE()); + } + + function test_isTokensRescuedV2() external { + uint256 sUSDCollectorInitialBalance = IERC20(AaveV2EthereumAssets.sUSD_UNDERLYING).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + + uint256 sUSDTransferred = IERC20(AaveV2EthereumAssets.sUSD_UNDERLYING).balanceOf( + proposal.DEBT_SWAP_ADAPTER() + ); + uint256 USDCTransferred = IERC20(AaveV2EthereumAssets.USDC_UNDERLYING).balanceOf( + proposal.DEBT_SWAP_ADAPTER() + ); + + executePayload(vm, address(proposal)); + + // AaveV2Ethereum current + assertEq( + IERC20(AaveV2EthereumAssets.sUSD_UNDERLYING).balanceOf(proposal.DEBT_SWAP_ADAPTER()), + 0, + 'Unexpected sUSD_UNDERLYING remaining' + ); + assertEq( + sUSDCollectorInitialBalance + sUSDTransferred, + IERC20(AaveV2EthereumAssets.sUSD_UNDERLYING).balanceOf(address(AaveV3Ethereum.COLLECTOR)), + 'Unexpected sUSD_UNDERLYING final treasury balance' + ); + assertEq( + IERC20(AaveV2EthereumAssets.USDC_UNDERLYING).balanceOf(proposal.DEBT_SWAP_ADAPTER()), + 0, + 'Unexpected USDC_UNDERLYING remaining' + ); + assertEq( + USDCTransferred, + IERC20(AaveV2EthereumAssets.USDC_UNDERLYING).balanceOf(address(AaveV3Ethereum.COLLECTOR)), + 'Unexpected USDC_UNDERLYING final treasury balance' + ); + } + + function test_isTokensRescuedV3() external { + uint256 crvUSDCollectorInitialBalance = IERC20(AaveV3EthereumAssets.crvUSD_UNDERLYING) + .balanceOf(address(AaveV3Ethereum.COLLECTOR)); + uint256 GHOCollectorInitialBalance = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + uint256 rETHCollectorInitialBalance = IERC20(AaveV3EthereumAssets.rETH_UNDERLYING).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + uint256 WBTCCollectorInitialBalance = IERC20(AaveV3EthereumAssets.WBTC_UNDERLYING).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + + uint256 USDTTransferred = IERC20(AaveV3EthereumAssets.USDT_UNDERLYING).balanceOf( + proposal.DEBT_SWAP_ADAPTER_V3() + ); + uint256 crvUSDTransferred = IERC20(AaveV3EthereumAssets.crvUSD_UNDERLYING).balanceOf( + proposal.DEBT_SWAP_ADAPTER_V3() + ); + uint256 GHOTransferred = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf( + proposal.REPAY_WITH_COLLATERAL_ADAPTER() + ); + uint256 rETHTransferred = IERC20(AaveV3EthereumAssets.rETH_UNDERLYING).balanceOf( + proposal.REPAY_WITH_COLLATERAL_ADAPTER() + ); + uint256 WBTCTransferred = IERC20(AaveV3EthereumAssets.WBTC_UNDERLYING).balanceOf( + proposal.REPAY_WITH_COLLATERAL_ADAPTER() + ); + + executePayload(vm, address(proposal)); + + // AaveV3Ethereum current + assertEq( + IERC20(AaveV3EthereumAssets.USDT_UNDERLYING).balanceOf(proposal.DEBT_SWAP_ADAPTER_V3()), + 0, + 'Unexpected USDT_UNDERLYING remaining' + ); + assertEq( + IERC20(AaveV3EthereumAssets.crvUSD_UNDERLYING).balanceOf(proposal.DEBT_SWAP_ADAPTER_V3()), + 0, + 'Unexpected crvUSD_UNDERLYING remaining' + ); + assertEq( + crvUSDCollectorInitialBalance + crvUSDTransferred, + IERC20(AaveV3EthereumAssets.crvUSD_UNDERLYING).balanceOf(address(AaveV3Ethereum.COLLECTOR)), + 'Unexpected crvUSD_UNDERLYING final treasury balance' + ); + assertEq( + IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf( + proposal.REPAY_WITH_COLLATERAL_ADAPTER() + ), + 0, + 'Unexpected GHO_UNDERLYING remaining' + ); + assertEq( + GHOCollectorInitialBalance + GHOTransferred, + IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(address(AaveV3Ethereum.COLLECTOR)), + 'Unexpected GHO_UNDERLYING final treasury balance' + ); + assertEq( + IERC20(AaveV3EthereumAssets.rETH_UNDERLYING).balanceOf( + proposal.REPAY_WITH_COLLATERAL_ADAPTER() + ), + 0, + 'Unexpected rETH_UNDERLYING remaining' + ); + assertEq( + rETHCollectorInitialBalance + rETHTransferred, + IERC20(AaveV3EthereumAssets.rETH_UNDERLYING).balanceOf(address(AaveV3Ethereum.COLLECTOR)), + 'Unexpected rETH_UNDERLYING final treasury balance' + ); + assertEq( + IERC20(AaveV3EthereumAssets.WBTC_UNDERLYING).balanceOf( + proposal.REPAY_WITH_COLLATERAL_ADAPTER() + ), + 0, + 'Unexpected WBTC_UNDERLYING remaining' + ); + assertEq( + WBTCCollectorInitialBalance + WBTCTransferred, + IERC20(AaveV3EthereumAssets.WBTC_UNDERLYING).balanceOf(address(AaveV3Ethereum.COLLECTOR)), + 'Unexpected WBTC_UNDERLYING final treasury balance' + ); + assertEq( + USDTTransferred, + IERC20(AaveV3EthereumAssets.USDT_UNDERLYING).balanceOf(address(AaveV3Ethereum.COLLECTOR)), + 'Unexpected USDT_UNDERLYING final treasury balance' + ); + } +} diff --git a/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113.sol b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113.sol new file mode 100644 index 000000000..04dd0288f --- /dev/null +++ b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {AaveV3Optimism, AaveV3OptimismAssets} from 'aave-address-book/AaveV3Optimism.sol'; +import {AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {MiscOptimism} from 'aave-address-book/MiscOptimism.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol'; +import {CollectorUtils, ICollector} from 'aave-helpers/src/CollectorUtils.sol'; + +interface IAaveOpEthERC20Bridge { + function bridge(address token, address l1Token, uint256 amount) external; +} + +/** + * @title September Funding Update - Part A + * @author karpatkey_TokenLogic + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-september-funding-update/19162 + */ +contract AaveV3Optimism_SeptemberFundingUpdatePartA_20241113 is IProposalGenericExecutor { + using SafeERC20 for IERC20; + using CollectorUtils for ICollector; + + IAaveOpEthERC20Bridge public constant BRIDGE = + IAaveOpEthERC20Bridge(MiscOptimism.AAVE_OPT_ETH_BRIDGE); + + function execute() external override { + AaveV3Optimism.COLLECTOR.withdrawFromV3( + CollectorUtils.IOInput({ + pool: address(AaveV3Optimism.POOL), + underlying: AaveV3OptimismAssets.USDC_UNDERLYING, + amount: IERC20(AaveV3OptimismAssets.USDC_A_TOKEN).balanceOf( + address(AaveV3Optimism.COLLECTOR) + ) - 100e6 + }), + address(BRIDGE) + ); + + BRIDGE.bridge( + AaveV3OptimismAssets.USDC_UNDERLYING, + AaveV3EthereumAssets.USDC_UNDERLYING, + IERC20(AaveV3OptimismAssets.USDC_UNDERLYING).balanceOf(address(BRIDGE)) + ); + + AaveV3Optimism.COLLECTOR.withdrawFromV3( + CollectorUtils.IOInput({ + pool: address(AaveV3Optimism.POOL), + underlying: AaveV3OptimismAssets.LUSD_UNDERLYING, + amount: IERC20(AaveV3OptimismAssets.LUSD_A_TOKEN).balanceOf( + address(AaveV3Optimism.COLLECTOR) + ) - 1e18 + }), + address(BRIDGE) + ); + + BRIDGE.bridge( + AaveV3OptimismAssets.LUSD_UNDERLYING, + AaveV3EthereumAssets.LUSD_UNDERLYING, + IERC20(AaveV3OptimismAssets.LUSD_UNDERLYING).balanceOf(address(BRIDGE)) + ); + } +} diff --git a/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113.t.sol b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113.t.sol new file mode 100644 index 000000000..bcedaaf9c --- /dev/null +++ b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113.t.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Optimism, AaveV3OptimismAssets} from 'aave-address-book/AaveV3Optimism.sol'; +import {GovernanceV3Optimism} from 'aave-address-book/GovernanceV3Optimism.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Optimism_SeptemberFundingUpdatePartA_20241113} from './AaveV3Optimism_SeptemberFundingUpdatePartA_20241113.sol'; + +/** + * @dev Test for AaveV3Optimism_SeptemberFundingUpdatePartA_20241113 + * command: FOUNDRY_PROFILE=optimism forge test --match-path=src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113.t.sol -vv + */ +contract AaveV3Optimism_SeptemberFundingUpdatePartA_20241113_Test is ProtocolV3TestBase { + event Bridge(address indexed token, uint256 amount); + + AaveV3Optimism_SeptemberFundingUpdatePartA_20241113 internal proposal; + + address internal COLLECTOR = address(AaveV3Optimism.COLLECTOR); + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('optimism'), 127952448); + proposal = new AaveV3Optimism_SeptemberFundingUpdatePartA_20241113(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Optimism_SeptemberFundingUpdatePartA_20241113', + AaveV3Optimism.POOL, + address(proposal) + ); + } + + function test_bridgeUSDC() public { + uint256 collectorAUsdcBalanceBefore = IERC20(AaveV3OptimismAssets.USDC_A_TOKEN).balanceOf( + COLLECTOR + ); + + vm.expectEmit(true, false, false, true, address(proposal.BRIDGE())); + emit Bridge(AaveV3OptimismAssets.USDC_UNDERLYING, collectorAUsdcBalanceBefore - 100e6); + executePayload(vm, address(proposal)); + + uint256 collectorAUsdcBalanceAfter = IERC20(AaveV3OptimismAssets.USDC_A_TOKEN).balanceOf( + COLLECTOR + ); + + assertApproxEqAbs(collectorAUsdcBalanceAfter, 1e6, 4_500e6); + } + + function test_bridgeLUSD() public { + uint256 collectorALusdBalanceBefore = IERC20(AaveV3OptimismAssets.LUSD_A_TOKEN).balanceOf( + COLLECTOR + ); + + vm.expectEmit(true, false, false, true, address(proposal.BRIDGE())); + emit Bridge(AaveV3OptimismAssets.LUSD_UNDERLYING, collectorALusdBalanceBefore - 1e18 - 1); + executePayload(vm, address(proposal)); + + uint256 collectorALusdBalanceAfter = IERC20(AaveV3OptimismAssets.LUSD_A_TOKEN).balanceOf( + COLLECTOR + ); + + assertApproxEqAbs(collectorALusdBalanceAfter, 1e18, 300e18); + } +} diff --git a/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113.sol b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113.sol new file mode 100644 index 000000000..1a0e850f1 --- /dev/null +++ b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113.sol @@ -0,0 +1,145 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {MiscPolygon} from 'aave-address-book/MiscPolygon.sol'; +import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol'; +import {AaveV2Polygon, AaveV2PolygonAssets} from 'aave-address-book/AaveV2Polygon.sol'; +import {AaveV3Polygon, AaveV3PolygonAssets} from 'aave-address-book/AaveV3Polygon.sol'; +import {CollectorUtils, ICollector} from 'aave-helpers/src/CollectorUtils.sol'; + +interface IAavePolEthERC20Bridge { + function bridge(address token, uint256 amount) external; +} + +/** + * @title September Funding Update - Part A + * @author karpatkey_TokenLogic + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-september-funding-update/19162 + */ +contract AaveV3Polygon_SeptemberFundingUpdatePartA_20241113 is IProposalGenericExecutor { + using SafeERC20 for IERC20; + using CollectorUtils for ICollector; + + struct Migration { + address underlying; + address aToken; + uint256 leaveBehind; + } + + IAavePolEthERC20Bridge public constant BRIDGE = + IAavePolEthERC20Bridge(MiscPolygon.AAVE_POL_ETH_BRIDGE); + + function execute() external override { + _migrateToken(); + _bridge(); + } + + function _migrateToken() internal { + Migration[] memory migrations = new Migration[](6); + + migrations[0] = Migration({ + underlying: AaveV2PolygonAssets.USDT_UNDERLYING, + aToken: AaveV2PolygonAssets.USDT_A_TOKEN, + leaveBehind: 100 * 10 ** AaveV2PolygonAssets.USDT_DECIMALS + }); + migrations[1] = Migration({ + underlying: AaveV2PolygonAssets.DAI_UNDERLYING, + aToken: AaveV2PolygonAssets.DAI_A_TOKEN, + leaveBehind: 10 ** AaveV2PolygonAssets.DAI_DECIMALS + }); + migrations[2] = Migration({ + underlying: AaveV2PolygonAssets.WPOL_UNDERLYING, + aToken: AaveV2PolygonAssets.WPOL_A_TOKEN, + leaveBehind: 10 ** AaveV2PolygonAssets.WPOL_DECIMALS + }); + migrations[3] = Migration({ + underlying: AaveV2PolygonAssets.WETH_UNDERLYING, + aToken: AaveV2PolygonAssets.WETH_A_TOKEN, + leaveBehind: 10 ** AaveV2PolygonAssets.WETH_DECIMALS + }); + migrations[4] = Migration({ + underlying: AaveV2PolygonAssets.WBTC_UNDERLYING, + aToken: AaveV2PolygonAssets.WBTC_A_TOKEN, + leaveBehind: 10 ** AaveV2PolygonAssets.WBTC_DECIMALS + }); + migrations[5] = Migration({ + underlying: AaveV2PolygonAssets.LINK_UNDERLYING, + aToken: AaveV2PolygonAssets.LINK_A_TOKEN, + leaveBehind: 10 ** AaveV2PolygonAssets.LINK_DECIMALS + }); + + for (uint256 i = 0; i < 6; ) { + uint256 aTokenBalance = IERC20(migrations[i].aToken).balanceOf( + address(AaveV3Polygon.COLLECTOR) + ); + uint256 aTokenAvailableBalance = IERC20(migrations[i].underlying).balanceOf( + migrations[i].aToken + ); + + aTokenAvailableBalance = aTokenAvailableBalance > aTokenBalance + ? aTokenBalance + : aTokenAvailableBalance; + + if (aTokenAvailableBalance > migrations[i].leaveBehind) { + AaveV3Polygon.COLLECTOR.withdrawFromV2( + CollectorUtils.IOInput({ + pool: address(AaveV2Polygon.POOL), + underlying: migrations[i].underlying, + amount: aTokenAvailableBalance - migrations[i].leaveBehind + }), + address(AaveV3Polygon.COLLECTOR) + ); + + /// deposit + AaveV3Polygon.COLLECTOR.depositToV3( + CollectorUtils.IOInput({ + pool: address(AaveV3Polygon.POOL), + underlying: migrations[i].underlying, + amount: type(uint256).max + }) + ); + } + + unchecked { + ++i; + } + } + } + + function _bridge() internal { + AaveV3Polygon.COLLECTOR.withdrawFromV3( + CollectorUtils.IOInput({ + pool: address(AaveV3Polygon.POOL), + underlying: AaveV3PolygonAssets.USDC_UNDERLYING, + amount: IERC20(AaveV3PolygonAssets.USDC_A_TOKEN).balanceOf( + address(AaveV3Polygon.COLLECTOR) + ) - 100e6 + }), + address(BRIDGE) + ); + + uint256 aUsdcAvailableBalance = IERC20(AaveV2PolygonAssets.USDC_UNDERLYING).balanceOf( + AaveV2PolygonAssets.USDC_A_TOKEN + ); + uint256 aUsdcBalance = IERC20(AaveV2PolygonAssets.USDC_A_TOKEN).balanceOf( + address(AaveV2Polygon.COLLECTOR) + ); + AaveV2Polygon.COLLECTOR.withdrawFromV2( + CollectorUtils.IOInput({ + pool: address(AaveV2Polygon.POOL), + underlying: AaveV2PolygonAssets.USDC_UNDERLYING, + amount: (aUsdcBalance > aUsdcAvailableBalance ? aUsdcAvailableBalance : aUsdcBalance) - + 100e6 + }), + address(BRIDGE) + ); + + BRIDGE.bridge( + AaveV2PolygonAssets.USDC_UNDERLYING, + IERC20(AaveV2PolygonAssets.USDC_UNDERLYING).balanceOf(address(BRIDGE)) + ); + } +} diff --git a/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113.t.sol b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113.t.sol new file mode 100644 index 000000000..ac7033e4b --- /dev/null +++ b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113.t.sol @@ -0,0 +1,203 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Polygon, AaveV3PolygonAssets} from 'aave-address-book/AaveV3Polygon.sol'; +import {AaveV2Polygon, AaveV2PolygonAssets} from 'aave-address-book/AaveV2Polygon.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {MiscPolygon} from 'aave-address-book/MiscPolygon.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {AaveV3Polygon_SeptemberFundingUpdatePartA_20241113} from './AaveV3Polygon_SeptemberFundingUpdatePartA_20241113.sol'; + +/** + * @dev Test for AaveV3Polygon_SeptemberFundingUpdatePartA_20241113 + * command: FOUNDRY_PROFILE=polygon forge test --match-path=src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113.t.sol -vv + */ +contract AaveV3Polygon_SeptemberFundingUpdatePartA_20241113_Test is ProtocolV3TestBase { + event Bridge(address token, uint256 amount); + event Transfer(address from, address to, uint256 amount); + + AaveV3Polygon_SeptemberFundingUpdatePartA_20241113 internal proposal; + + address internal COLLECTOR = address(AaveV3Polygon.COLLECTOR); + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('polygon'), 64236044); + proposal = new AaveV3Polygon_SeptemberFundingUpdatePartA_20241113(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Polygon_SeptemberFundingUpdatePartA_20241113', + AaveV3Polygon.POOL, + address(proposal) + ); + } + + function test_migrate_USDT() public { + uint256 collectorUsdtV2BalanceBefore = IERC20(AaveV2PolygonAssets.USDT_A_TOKEN).balanceOf( + COLLECTOR + ); + uint256 collectorUsdtV3BalanceBefore = IERC20(AaveV3PolygonAssets.USDT_A_TOKEN).balanceOf( + COLLECTOR + ); + + executePayload(vm, address(proposal)); + + uint256 collectorUsdtV2BalanceAfter = IERC20(AaveV2PolygonAssets.USDT_A_TOKEN).balanceOf( + COLLECTOR + ); + uint256 collectorUsdtV3BalanceAfter = IERC20(AaveV3PolygonAssets.USDT_A_TOKEN).balanceOf( + COLLECTOR + ); + + assertApproxEqAbs(collectorUsdtV2BalanceAfter, 1e6, 45_000e6); + assertApproxEqAbs( + collectorUsdtV3BalanceAfter, + collectorUsdtV3BalanceBefore + collectorUsdtV2BalanceBefore, + 45_000e6 + ); + } + + function test_migrate_DAI() public { + uint256 collectorDaiV2BalanceBefore = IERC20(AaveV2PolygonAssets.DAI_A_TOKEN).balanceOf( + COLLECTOR + ); + uint256 collectorDaiV3BalanceBefore = IERC20(AaveV3PolygonAssets.DAI_A_TOKEN).balanceOf( + COLLECTOR + ); + + executePayload(vm, address(proposal)); + + uint256 collectorDaiV2BalanceAfter = IERC20(AaveV2PolygonAssets.DAI_A_TOKEN).balanceOf( + COLLECTOR + ); + uint256 collectorDaiV3BalanceAfter = IERC20(AaveV3PolygonAssets.DAI_A_TOKEN).balanceOf( + COLLECTOR + ); + + assertApproxEqAbs(collectorDaiV2BalanceAfter, 1e18, 19_000e18); + assertApproxEqAbs( + collectorDaiV3BalanceAfter, + collectorDaiV3BalanceBefore + collectorDaiV2BalanceBefore, + 26_000e18 + ); + } + + function test_migrate_WPOL() public { + uint256 collectorWPolV2BalanceBefore = IERC20(AaveV2PolygonAssets.WPOL_A_TOKEN).balanceOf( + COLLECTOR + ); + uint256 collectorWPolV3BalanceBefore = IERC20(AaveV3PolygonAssets.WPOL_A_TOKEN).balanceOf( + COLLECTOR + ); + + executePayload(vm, address(proposal)); + + uint256 collectorWPolV2BalanceAfter = IERC20(AaveV2PolygonAssets.WPOL_A_TOKEN).balanceOf( + COLLECTOR + ); + uint256 collectorWPolV3BalanceAfter = IERC20(AaveV3PolygonAssets.WPOL_A_TOKEN).balanceOf( + COLLECTOR + ); + + assertApproxEqAbs(collectorWPolV2BalanceAfter, 1e18, 400e18); + assertApproxEqAbs( + collectorWPolV3BalanceAfter, + collectorWPolV3BalanceBefore + collectorWPolV2BalanceBefore, + 5_000e18 + ); + } + + function test_migrate_WETH() public { + uint256 collectorWEthV2BalanceBefore = IERC20(AaveV2PolygonAssets.WETH_A_TOKEN).balanceOf( + COLLECTOR + ); + uint256 collectorWEthV3BalanceBefore = IERC20(AaveV3PolygonAssets.WETH_A_TOKEN).balanceOf( + COLLECTOR + ); + + executePayload(vm, address(proposal)); + + uint256 collectorWEthV2BalanceAfter = IERC20(AaveV2PolygonAssets.WETH_A_TOKEN).balanceOf( + COLLECTOR + ); + uint256 collectorWEthV3BalanceAfter = IERC20(AaveV3PolygonAssets.WETH_A_TOKEN).balanceOf( + COLLECTOR + ); + + assertApproxEqAbs(collectorWEthV2BalanceAfter, 1e18, 1e18); + assertApproxEqAbs( + collectorWEthV3BalanceAfter, + collectorWEthV3BalanceBefore + collectorWEthV2BalanceBefore, + 3e18 + ); + } + + function test_migrate_WBTC() public { + uint256 collectorWBtcV2BalanceBefore = IERC20(AaveV2PolygonAssets.WBTC_A_TOKEN).balanceOf( + COLLECTOR + ); + uint256 collectorWBtcV3BalanceBefore = IERC20(AaveV3PolygonAssets.WBTC_A_TOKEN).balanceOf( + COLLECTOR + ); + + executePayload(vm, address(proposal)); + + uint256 collectorWBtcV2BalanceAfter = IERC20(AaveV2PolygonAssets.WBTC_A_TOKEN).balanceOf( + COLLECTOR + ); + uint256 collectorWBtcV3BalanceAfter = IERC20(AaveV3PolygonAssets.WBTC_A_TOKEN).balanceOf( + COLLECTOR + ); + + // doesn't migrated because balance is below than unit + assertEq(collectorWBtcV2BalanceBefore, collectorWBtcV2BalanceAfter); + assertEq(collectorWBtcV3BalanceAfter, collectorWBtcV3BalanceBefore); + } + + function test_migrate_LINK() public { + uint256 collectorLinkV2BalanceBefore = IERC20(AaveV2PolygonAssets.LINK_A_TOKEN).balanceOf( + COLLECTOR + ); + uint256 collectorLinkV3BalanceBefore = IERC20(AaveV3PolygonAssets.LINK_A_TOKEN).balanceOf( + COLLECTOR + ); + + executePayload(vm, address(proposal)); + + uint256 collectorLinkV2BalanceAfter = IERC20(AaveV2PolygonAssets.LINK_A_TOKEN).balanceOf( + COLLECTOR + ); + uint256 collectorLinkV3BalanceAfter = IERC20(AaveV3PolygonAssets.LINK_A_TOKEN).balanceOf( + COLLECTOR + ); + + assertApproxEqAbs(collectorLinkV2BalanceAfter, 1e18, 1e18); + assertApproxEqAbs( + collectorLinkV3BalanceAfter, + collectorLinkV3BalanceBefore + collectorLinkV2BalanceBefore, + 45e18 + ); + } + + function test_bridge() public { + vm.expectEmit(true, false, false, true, MiscPolygon.AAVE_POL_ETH_BRIDGE); + emit Bridge(AaveV3PolygonAssets.USDC_UNDERLYING, 287195325014); // dynamically calculated + executePayload(vm, address(proposal)); + + uint256 collectorAUsdcV2BalanceAfter = IERC20(AaveV2PolygonAssets.USDC_A_TOKEN).balanceOf( + COLLECTOR + ); + uint256 collectorAUsdcV3BalanceAfter = IERC20(AaveV3PolygonAssets.USDC_A_TOKEN).balanceOf( + COLLECTOR + ); + + assertApproxEqAbs(collectorAUsdcV2BalanceAfter, 1e6, 15_000e6); + assertApproxEqAbs(collectorAUsdcV3BalanceAfter, 1e6, 10_000e6); + } +} diff --git a/src/20241113_Multi_SeptemberFundingUpdatePartA/SeptemberFundingUpdatePartA.md b/src/20241113_Multi_SeptemberFundingUpdatePartA/SeptemberFundingUpdatePartA.md new file mode 100644 index 000000000..667361cab --- /dev/null +++ b/src/20241113_Multi_SeptemberFundingUpdatePartA/SeptemberFundingUpdatePartA.md @@ -0,0 +1,70 @@ +--- +title: "September Funding Update - Part A" +author: "karpatkey_TokenLogic" +discussions: "https://governance.aave.com/t/arfc-september-funding-update/19162" +snapshot: "Direct-to-AIP" +--- + +## Simple Summary + +This AIP will migrate funds from Aave v2 to v3 on Polygon, withdraw funds from Polygon, Arbitrum and Optimism to Ethereum, rescue Paraswap funds. This AIP also executes for reimbursing for the [funding of Guardian signers](https://governance.aave.com/t/arfc-renewal-of-aave-guardian-2024/17523/32), and create allowances to the Merit and Ahab. + +## Motivation + +As part of our ongoing Treasury asset rebalancing, this proposal when implemented will continue the migration of assets from v2 instances of Aave to v3. In response to recent events, funds currently locked in the Paraswap adapter contracts will be send to the DAOs Treasury. Due to size of these holding, this will only be performed on Polygon, Optimism, Ethereum and Arbitrum where this proposal is already intending updating the DAOs holdings. + +## Specification + +### Migrate the following assets from Aave v2 to v3 Polygon. + +amUSDT (All-100x10^6) +amDAI (All-1.0x10^18) +amWMATIC (All-1.0x10^18) +amWETH (All-1.0x10^18) +amWBTC (All-1.0x10^8) +amLINK (All-1.0x10^18) + +### Transfer the following assets to Ethereum. + +| Polygon | Arbitrum | Optimism | +| ----------------------- | ------------------------ | ------------------------ | +| amUSDC.e (All-100x10^6) | aArbUSDC (All-100x10^6) | aOptUSDC (All-100x10^6) | +| aPolUSDC (All-100x10^6) | aArbLUSD (All-1.0x10^18) | aOptLUSD (All-1.0x10^18) | + +### Rescue Paraswap Funds + +Rescue funds held in the Paraswap adapter contracts and send back to Treasury in line with this [PR 454](https://github.com/bgd-labs/aave-proposals-v3/pull/454) on Ethereum. + +### Gas Rebate + +Transfer 0.264 ETH to 0x818C277dBE886b934e60aa047250A73529E26A99 (karpatkey) reimbursing for the [funding of Guardian signers](https://governance.aave.com/t/arfc-renewal-of-aave-guardian-2024/17523/32). + +### Swap funds to GHO + +| Ethereum | +| :--------------------: | +| aUSDC (1.25M) | +| aUSDT (1.25M) | +| DAI (All) | +| aDAI (All-1.0x10^-18) | +| aEthDAI (0.5M) | +| aLUSD (All-1.0x10^-18) | +| LUSD (All) | +| FRAX (All) | +| aFRAX (All-1.0x10^-18) | + +### Merit + Ahab Programs + +Create allowances to the Merit and Ahab, 3M GHO and 800 aEthWETH from Aave v3 Ethereum: +SAFE: 0xdeadD8aB03075b7FBA81864202a2f59EE25B312b + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113.t.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113.t.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113.t.sol) +- Snapshot: Direct-to-AIP +- [Discussion](https://governance.aave.com/t/arfc-september-funding-update/19162) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241113_Multi_SeptemberFundingUpdatePartA/SeptemberFundingUpdatePartA_20241113.s.sol b/src/20241113_Multi_SeptemberFundingUpdatePartA/SeptemberFundingUpdatePartA_20241113.s.sol new file mode 100644 index 000000000..4815c6cb4 --- /dev/null +++ b/src/20241113_Multi_SeptemberFundingUpdatePartA/SeptemberFundingUpdatePartA_20241113.s.sol @@ -0,0 +1,150 @@ +// 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, PolygonScript, OptimismScript, ArbitrumScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113} from './AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113.sol'; +import {AaveV3Polygon_SeptemberFundingUpdatePartA_20241113} from './AaveV3Polygon_SeptemberFundingUpdatePartA_20241113.sol'; +import {AaveV3Optimism_SeptemberFundingUpdatePartA_20241113} from './AaveV3Optimism_SeptemberFundingUpdatePartA_20241113.sol'; +import {AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113} from './AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241113_Multi_SeptemberFundingUpdatePartA/SeptemberFundingUpdatePartA_20241113.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/SeptemberFundingUpdatePartA_20241113.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Polygon + * deploy-command: make deploy-ledger contract=src/20241113_Multi_SeptemberFundingUpdatePartA/SeptemberFundingUpdatePartA_20241113.s.sol:DeployPolygon chain=polygon + * verify-command: FOUNDRY_PROFILE=polygon npx catapulta-verify -b broadcast/SeptemberFundingUpdatePartA_20241113.s.sol/137/run-latest.json + */ +contract DeployPolygon is PolygonScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Polygon_SeptemberFundingUpdatePartA_20241113).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Optimism + * deploy-command: make deploy-ledger contract=src/20241113_Multi_SeptemberFundingUpdatePartA/SeptemberFundingUpdatePartA_20241113.s.sol:DeployOptimism chain=optimism + * verify-command: FOUNDRY_PROFILE=optimism npx catapulta-verify -b broadcast/SeptemberFundingUpdatePartA_20241113.s.sol/10/run-latest.json + */ +contract DeployOptimism is OptimismScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Optimism_SeptemberFundingUpdatePartA_20241113).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Arbitrum + * deploy-command: make deploy-ledger contract=src/20241113_Multi_SeptemberFundingUpdatePartA/SeptemberFundingUpdatePartA_20241113.s.sol:DeployArbitrum chain=arbitrum + * verify-command: FOUNDRY_PROFILE=arbitrum npx catapulta-verify -b broadcast/SeptemberFundingUpdatePartA_20241113.s.sol/42161/run-latest.json + */ +contract DeployArbitrum is ArbitrumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113).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/20241113_Multi_SeptemberFundingUpdatePartA/SeptemberFundingUpdatePartA_20241113.s.sol:CreateProposal chain=mainnet + */ +contract CreateProposal is EthereumScript { + function run() external { + // create payloads + PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](4); + + // compose actions for validation + IPayloadsControllerCore.ExecutionAction[] + memory actionsEthereum = new IPayloadsControllerCore.ExecutionAction[](1); + actionsEthereum[0] = GovV3Helpers.buildAction( + type(AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsPolygon = new IPayloadsControllerCore.ExecutionAction[](1); + actionsPolygon[0] = GovV3Helpers.buildAction( + type(AaveV3Polygon_SeptemberFundingUpdatePartA_20241113).creationCode + ); + payloads[1] = GovV3Helpers.buildPolygonPayload(vm, actionsPolygon); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsOptimism = new IPayloadsControllerCore.ExecutionAction[](1); + actionsOptimism[0] = GovV3Helpers.buildAction( + type(AaveV3Optimism_SeptemberFundingUpdatePartA_20241113).creationCode + ); + payloads[2] = GovV3Helpers.buildOptimismPayload(vm, actionsOptimism); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsArbitrum = new IPayloadsControllerCore.ExecutionAction[](1); + actionsArbitrum[0] = GovV3Helpers.buildAction( + type(AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113).creationCode + ); + payloads[3] = GovV3Helpers.buildArbitrumPayload(vm, actionsArbitrum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241113_Multi_SeptemberFundingUpdatePartA/SeptemberFundingUpdatePartA.md' + ) + ); + } +} diff --git a/src/20241113_Multi_SeptemberFundingUpdatePartA/config.ts b/src/20241113_Multi_SeptemberFundingUpdatePartA/config.ts new file mode 100644 index 000000000..47ec67131 --- /dev/null +++ b/src/20241113_Multi_SeptemberFundingUpdatePartA/config.ts @@ -0,0 +1,19 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3Ethereum', 'AaveV3Polygon', 'AaveV3Optimism', 'AaveV3Arbitrum'], + title: 'September Funding Update - Part A', + shortName: 'SeptemberFundingUpdatePartA', + date: '20241113', + author: 'karpatkey_TokenLogic', + discussion: 'https://governance.aave.com/t/arfc-september-funding-update/19162', + snapshot: 'Direct-to-AIP', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Ethereum: {configs: {}, cache: {blockNumber: 21179000}}, + AaveV3Polygon: {configs: {}, cache: {blockNumber: 64236044}}, + AaveV3Optimism: {configs: {}, cache: {blockNumber: 127952448}}, + AaveV3Arbitrum: {configs: {}, cache: {blockNumber: 274046247}}, + }, +}; From 61efe16646c9a713bf2b6d7e49da0a6ffb375af3 Mon Sep 17 00:00:00 2001 From: Cache bot Date: Thu, 28 Nov 2024 21:01:27 +0000 Subject: [PATCH 33/35] fix(cache): automated cache update [skip ci] --- .../SeptemberFundingUpdatePartA.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/20241113_Multi_SeptemberFundingUpdatePartA/SeptemberFundingUpdatePartA.md b/src/20241113_Multi_SeptemberFundingUpdatePartA/SeptemberFundingUpdatePartA.md index 667361cab..120f3e3e8 100644 --- a/src/20241113_Multi_SeptemberFundingUpdatePartA/SeptemberFundingUpdatePartA.md +++ b/src/20241113_Multi_SeptemberFundingUpdatePartA/SeptemberFundingUpdatePartA.md @@ -60,8 +60,8 @@ SAFE: 0xdeadD8aB03075b7FBA81864202a2f59EE25B312b ## References -- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113.sol) -- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113.t.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113.t.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113.t.sol) +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/1aab63b1461e28bcf74d70844654b968c4aab1b2/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/1aab63b1461e28bcf74d70844654b968c4aab1b2/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/1aab63b1461e28bcf74d70844654b968c4aab1b2/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/1aab63b1461e28bcf74d70844654b968c4aab1b2/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/1aab63b1461e28bcf74d70844654b968c4aab1b2/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113.t.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/1aab63b1461e28bcf74d70844654b968c4aab1b2/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113.t.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/1aab63b1461e28bcf74d70844654b968c4aab1b2/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/1aab63b1461e28bcf74d70844654b968c4aab1b2/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113.t.sol) - Snapshot: Direct-to-AIP - [Discussion](https://governance.aave.com/t/arfc-september-funding-update/19162) From 09d8dedb7b8d9e81420b018b971106da4bdd34ce Mon Sep 17 00:00:00 2001 From: MartinGbz Date: Mon, 2 Dec 2024 11:45:16 +0100 Subject: [PATCH 34/35] =?UTF-8?q?=E2=9C=A8=20Fluid=20alignment=20(#537)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ✨ add flashborrowers for mainnet, arbitrum and base * ✨ add tokens transfers contract * 🐛 fix all Direct-to-AIP * 🐛 fix issue token transfers contracts * ✨ add diff test md * 📝 add token transfers contracts to md * 🐛 fix constant issue * 📝 fix md bullet points * 📝 remove outdated text from proposal specs * Update src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127.t.sol Co-authored-by: Lukas * Update src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127.t.sol Co-authored-by: Harsh Pandey * 🐛 add contracts to deploy script * fix: actionsEthereum length Co-authored-by: Harsh Pandey * 🐛 fix import issue --------- Co-authored-by: Marc Zeller <21088542+marczeller@users.noreply.github.com> Co-authored-by: Lukas Co-authored-by: Harsh Pandey --- ...3Arbitrum_FluidAlignment_20241127_after.md | 5 + ...aveV3Base_FluidAlignment_20241127_after.md | 5 + ...ereumLido_FluidAlignment_20241127_after.md | 5 + ...3Ethereum_FluidAlignment_20241127_after.md | 5 + ...Alignment_TokenTransfers_20241127_after.md | 5 + ...AaveV3Arbitrum_FluidAlignment_20241127.sol | 18 +++ ...veV3Arbitrum_FluidAlignment_20241127.t.sol | 37 +++++ .../AaveV3Base_FluidAlignment_20241127.sol | 18 +++ .../AaveV3Base_FluidAlignment_20241127.t.sol | 35 +++++ ...V3EthereumLido_FluidAlignment_20241127.sol | 18 +++ ...EthereumLido_FluidAlignment_20241127.t.sol | 41 ++++++ ...AaveV3Ethereum_FluidAlignment_20241127.sol | 18 +++ ...veV3Ethereum_FluidAlignment_20241127.t.sol | 37 +++++ ...FluidAlignment_TokenTransfers_20241127.sol | 37 +++++ ...uidAlignment_TokenTransfers_20241127.t.sol | 56 ++++++++ .../FluidAlignment.md | 46 ++++++ .../FluidAlignment_20241127.s.sol | 133 ++++++++++++++++++ src/20241127_Multi_FluidAlignment/config.ts | 31 ++++ 18 files changed, 550 insertions(+) create mode 100644 diffs/AaveV3Arbitrum_FluidAlignment_20241127_before_AaveV3Arbitrum_FluidAlignment_20241127_after.md create mode 100644 diffs/AaveV3Base_FluidAlignment_20241127_before_AaveV3Base_FluidAlignment_20241127_after.md create mode 100644 diffs/AaveV3EthereumLido_FluidAlignment_20241127_before_AaveV3EthereumLido_FluidAlignment_20241127_after.md create mode 100644 diffs/AaveV3Ethereum_FluidAlignment_20241127_before_AaveV3Ethereum_FluidAlignment_20241127_after.md create mode 100644 diffs/AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127_before_AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127_after.md create mode 100644 src/20241127_Multi_FluidAlignment/AaveV3Arbitrum_FluidAlignment_20241127.sol create mode 100644 src/20241127_Multi_FluidAlignment/AaveV3Arbitrum_FluidAlignment_20241127.t.sol create mode 100644 src/20241127_Multi_FluidAlignment/AaveV3Base_FluidAlignment_20241127.sol create mode 100644 src/20241127_Multi_FluidAlignment/AaveV3Base_FluidAlignment_20241127.t.sol create mode 100644 src/20241127_Multi_FluidAlignment/AaveV3EthereumLido_FluidAlignment_20241127.sol create mode 100644 src/20241127_Multi_FluidAlignment/AaveV3EthereumLido_FluidAlignment_20241127.t.sol create mode 100644 src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_20241127.sol create mode 100644 src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_20241127.t.sol create mode 100644 src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127.sol create mode 100644 src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127.t.sol create mode 100644 src/20241127_Multi_FluidAlignment/FluidAlignment.md create mode 100644 src/20241127_Multi_FluidAlignment/FluidAlignment_20241127.s.sol create mode 100644 src/20241127_Multi_FluidAlignment/config.ts diff --git a/diffs/AaveV3Arbitrum_FluidAlignment_20241127_before_AaveV3Arbitrum_FluidAlignment_20241127_after.md b/diffs/AaveV3Arbitrum_FluidAlignment_20241127_before_AaveV3Arbitrum_FluidAlignment_20241127_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Arbitrum_FluidAlignment_20241127_before_AaveV3Arbitrum_FluidAlignment_20241127_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3Base_FluidAlignment_20241127_before_AaveV3Base_FluidAlignment_20241127_after.md b/diffs/AaveV3Base_FluidAlignment_20241127_before_AaveV3Base_FluidAlignment_20241127_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Base_FluidAlignment_20241127_before_AaveV3Base_FluidAlignment_20241127_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3EthereumLido_FluidAlignment_20241127_before_AaveV3EthereumLido_FluidAlignment_20241127_after.md b/diffs/AaveV3EthereumLido_FluidAlignment_20241127_before_AaveV3EthereumLido_FluidAlignment_20241127_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3EthereumLido_FluidAlignment_20241127_before_AaveV3EthereumLido_FluidAlignment_20241127_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3Ethereum_FluidAlignment_20241127_before_AaveV3Ethereum_FluidAlignment_20241127_after.md b/diffs/AaveV3Ethereum_FluidAlignment_20241127_before_AaveV3Ethereum_FluidAlignment_20241127_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Ethereum_FluidAlignment_20241127_before_AaveV3Ethereum_FluidAlignment_20241127_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127_before_AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127_after.md b/diffs/AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127_before_AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127_before_AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/src/20241127_Multi_FluidAlignment/AaveV3Arbitrum_FluidAlignment_20241127.sol b/src/20241127_Multi_FluidAlignment/AaveV3Arbitrum_FluidAlignment_20241127.sol new file mode 100644 index 000000000..b5bcde2f6 --- /dev/null +++ b/src/20241127_Multi_FluidAlignment/AaveV3Arbitrum_FluidAlignment_20241127.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Arbitrum} from 'aave-address-book/AaveV3Arbitrum.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +/** + * @title Fluid Alignment + * @author ACI + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-fluid-alignment-with-inst-purchase/19921 + */ +contract AaveV3Arbitrum_FluidAlignment_20241127 is IProposalGenericExecutor { + address public constant NEW_FLASH_BORROWER = 0x352423e2fA5D5c99343d371C9e3bC56C87723Cc7; + + function execute() external { + AaveV3Arbitrum.ACL_MANAGER.addFlashBorrower(NEW_FLASH_BORROWER); + } +} diff --git a/src/20241127_Multi_FluidAlignment/AaveV3Arbitrum_FluidAlignment_20241127.t.sol b/src/20241127_Multi_FluidAlignment/AaveV3Arbitrum_FluidAlignment_20241127.t.sol new file mode 100644 index 000000000..873d04ed5 --- /dev/null +++ b/src/20241127_Multi_FluidAlignment/AaveV3Arbitrum_FluidAlignment_20241127.t.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3Arbitrum} from 'aave-address-book/AaveV3Arbitrum.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Arbitrum_FluidAlignment_20241127} from './AaveV3Arbitrum_FluidAlignment_20241127.sol'; + +/** + * @dev Test for AaveV3Arbitrum_FluidAlignment_20241127 + * command: FOUNDRY_PROFILE=arbitrum forge test --match-path=src/20241127_Multi_FluidAlignment/AaveV3Arbitrum_FluidAlignment_20241127.t.sol -vv + */ +contract AaveV3Arbitrum_FluidAlignment_20241127_Test is ProtocolV3TestBase { + AaveV3Arbitrum_FluidAlignment_20241127 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('arbitrum'), 278916313); + proposal = new AaveV3Arbitrum_FluidAlignment_20241127(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest('AaveV3Arbitrum_FluidAlignment_20241127', AaveV3Arbitrum.POOL, address(proposal)); + } + + function test_isFlashBorrower() external { + GovV3Helpers.executePayload(vm, address(proposal)); + bool isFlashBorrower = AaveV3Arbitrum.ACL_MANAGER.isFlashBorrower( + proposal.NEW_FLASH_BORROWER() + ); + assertEq(isFlashBorrower, true); + } +} diff --git a/src/20241127_Multi_FluidAlignment/AaveV3Base_FluidAlignment_20241127.sol b/src/20241127_Multi_FluidAlignment/AaveV3Base_FluidAlignment_20241127.sol new file mode 100644 index 000000000..fd80ded8a --- /dev/null +++ b/src/20241127_Multi_FluidAlignment/AaveV3Base_FluidAlignment_20241127.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Base} from 'aave-address-book/AaveV3Base.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +/** + * @title Fluid Alignment + * @author ACI + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-fluid-alignment-with-inst-purchase/19921 + */ +contract AaveV3Base_FluidAlignment_20241127 is IProposalGenericExecutor { + address public constant NEW_FLASH_BORROWER = 0x352423e2fA5D5c99343d371C9e3bC56C87723Cc7; + + function execute() external { + AaveV3Base.ACL_MANAGER.addFlashBorrower(NEW_FLASH_BORROWER); + } +} diff --git a/src/20241127_Multi_FluidAlignment/AaveV3Base_FluidAlignment_20241127.t.sol b/src/20241127_Multi_FluidAlignment/AaveV3Base_FluidAlignment_20241127.t.sol new file mode 100644 index 000000000..fdaaef9e7 --- /dev/null +++ b/src/20241127_Multi_FluidAlignment/AaveV3Base_FluidAlignment_20241127.t.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3Base} from 'aave-address-book/AaveV3Base.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Base_FluidAlignment_20241127} from './AaveV3Base_FluidAlignment_20241127.sol'; + +/** + * @dev Test for AaveV3Base_FluidAlignment_20241127 + * command: FOUNDRY_PROFILE=base forge test --match-path=src/20241127_Multi_FluidAlignment/AaveV3Base_FluidAlignment_20241127.t.sol -vv + */ +contract AaveV3Base_FluidAlignment_20241127_Test is ProtocolV3TestBase { + AaveV3Base_FluidAlignment_20241127 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('base'), 22969399); + proposal = new AaveV3Base_FluidAlignment_20241127(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest('AaveV3Base_FluidAlignment_20241127', AaveV3Base.POOL, address(proposal)); + } + + function test_isFlashBorrower() external { + GovV3Helpers.executePayload(vm, address(proposal)); + bool isFlashBorrower = AaveV3Base.ACL_MANAGER.isFlashBorrower(proposal.NEW_FLASH_BORROWER()); + assertEq(isFlashBorrower, true); + } +} diff --git a/src/20241127_Multi_FluidAlignment/AaveV3EthereumLido_FluidAlignment_20241127.sol b/src/20241127_Multi_FluidAlignment/AaveV3EthereumLido_FluidAlignment_20241127.sol new file mode 100644 index 000000000..1a0189b06 --- /dev/null +++ b/src/20241127_Multi_FluidAlignment/AaveV3EthereumLido_FluidAlignment_20241127.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumLido} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +/** + * @title Fluid Alignment + * @author ACI + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-fluid-alignment-with-inst-purchase/19921 + */ +contract AaveV3EthereumLido_FluidAlignment_20241127 is IProposalGenericExecutor { + address public constant NEW_FLASH_BORROWER = 0x352423e2fA5D5c99343d371C9e3bC56C87723Cc7; + + function execute() external { + AaveV3EthereumLido.ACL_MANAGER.addFlashBorrower(NEW_FLASH_BORROWER); + } +} diff --git a/src/20241127_Multi_FluidAlignment/AaveV3EthereumLido_FluidAlignment_20241127.t.sol b/src/20241127_Multi_FluidAlignment/AaveV3EthereumLido_FluidAlignment_20241127.t.sol new file mode 100644 index 000000000..a8e294583 --- /dev/null +++ b/src/20241127_Multi_FluidAlignment/AaveV3EthereumLido_FluidAlignment_20241127.t.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3EthereumLido} from 'aave-address-book/AaveV3EthereumLido.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3EthereumLido_FluidAlignment_20241127} from './AaveV3EthereumLido_FluidAlignment_20241127.sol'; + +/** + * @dev Test for AaveV3EthereumLido_FluidAlignment_20241127 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241127_Multi_FluidAlignment/AaveV3EthereumLido_FluidAlignment_20241127.t.sol -vv + */ +contract AaveV3EthereumLido_FluidAlignment_20241127_Test is ProtocolV3TestBase { + AaveV3EthereumLido_FluidAlignment_20241127 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21280540); + proposal = new AaveV3EthereumLido_FluidAlignment_20241127(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3EthereumLido_FluidAlignment_20241127', + AaveV3EthereumLido.POOL, + address(proposal) + ); + } + + function test_isFlashBorrower() external { + GovV3Helpers.executePayload(vm, address(proposal)); + bool isFlashBorrower = AaveV3EthereumLido.ACL_MANAGER.isFlashBorrower( + proposal.NEW_FLASH_BORROWER() + ); + assertEq(isFlashBorrower, true); + } +} diff --git a/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_20241127.sol b/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_20241127.sol new file mode 100644 index 000000000..22162c0b9 --- /dev/null +++ b/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_20241127.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Ethereum} from 'aave-address-book/AaveV3Ethereum.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +/** + * @title Fluid Alignment + * @author ACI + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-fluid-alignment-with-inst-purchase/19921 + */ +contract AaveV3Ethereum_FluidAlignment_20241127 is IProposalGenericExecutor { + address public constant NEW_FLASH_BORROWER = 0x352423e2fA5D5c99343d371C9e3bC56C87723Cc7; + + function execute() external { + AaveV3Ethereum.ACL_MANAGER.addFlashBorrower(NEW_FLASH_BORROWER); + } +} diff --git a/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_20241127.t.sol b/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_20241127.t.sol new file mode 100644 index 000000000..117e0ad2c --- /dev/null +++ b/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_20241127.t.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3Ethereum} from 'aave-address-book/AaveV3Ethereum.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Ethereum_FluidAlignment_20241127} from './AaveV3Ethereum_FluidAlignment_20241127.sol'; + +/** + * @dev Test for AaveV3Ethereum_FluidAlignment_20241127 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_20241127.t.sol -vv + */ +contract AaveV3Ethereum_FluidAlignment_20241127_Test is ProtocolV3TestBase { + AaveV3Ethereum_FluidAlignment_20241127 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21280537); + proposal = new AaveV3Ethereum_FluidAlignment_20241127(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest('AaveV3Ethereum_FluidAlignment_20241127', AaveV3Ethereum.POOL, address(proposal)); + } + + function test_isFlashBorrower() external { + GovV3Helpers.executePayload(vm, address(proposal)); + bool isFlashBorrower = AaveV3Ethereum.ACL_MANAGER.isFlashBorrower( + proposal.NEW_FLASH_BORROWER() + ); + assertEq(isFlashBorrower, true); + } +} diff --git a/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127.sol b/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127.sol new file mode 100644 index 000000000..c02e31153 --- /dev/null +++ b/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +/** + * @title Fluid Alignment + * @author ACI + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-fluid-alignment-with-inst-purchase/19921 + */ +contract AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127 is IProposalGenericExecutor { + address public constant INST_TOKEN = 0x6f40d4A6237C257fff2dB00FA0510DeEECd303eb; + + address public constant INSTADAPP_TREASURY = 0x28849D2b63fA8D361e5fc15cB8aBB13019884d09; + + uint256 public constant INST_AMOUNT = 1_145_000 ether; // 1.145M + + uint256 public constant GHO_AMOUNT = 4_000_000 ether; // 4M + + function execute() external { + // Pull INST to collector + IERC20(INST_TOKEN).transferFrom( + INSTADAPP_TREASURY, + address(AaveV3Ethereum.COLLECTOR), + INST_AMOUNT + ); + + // Send GHO to Instadapp Treasury + AaveV3Ethereum.COLLECTOR.transfer( + AaveV3EthereumAssets.GHO_UNDERLYING, + INSTADAPP_TREASURY, + GHO_AMOUNT + ); + } +} diff --git a/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127.t.sol b/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127.t.sol new file mode 100644 index 000000000..3dcb1afa4 --- /dev/null +++ b/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127.t.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127} from './AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; + +/** + * @dev Test for AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127.t.sol -vv + */ +contract AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127_Test is ProtocolV3TestBase { + AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21280537); + proposal = new AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127(); + vm.startPrank(proposal.INSTADAPP_TREASURY()); + IERC20(proposal.INST_TOKEN()).approve(AaveV3Ethereum.ACL_ADMIN, proposal.INST_AMOUNT()); + vm.stopPrank(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127', + AaveV3Ethereum.POOL, + address(proposal) + ); + } + + function test_hasReceivedInst() external { + GovV3Helpers.executePayload(vm, address(proposal)); + uint256 balance = IERC20(proposal.INST_TOKEN()).balanceOf(address(AaveV3Ethereum.COLLECTOR)); + assertEq(balance, proposal.INST_AMOUNT()); + } + + function test_hasSentGho() external { + uint256 balanceBefore = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + GovV3Helpers.executePayload(vm, address(proposal)); + uint256 balanceAfter = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + + assertGt(balanceBefore, balanceAfter); + assertEq(balanceBefore - balanceAfter, proposal.GHO_AMOUNT()); + } +} diff --git a/src/20241127_Multi_FluidAlignment/FluidAlignment.md b/src/20241127_Multi_FluidAlignment/FluidAlignment.md new file mode 100644 index 000000000..545410d5e --- /dev/null +++ b/src/20241127_Multi_FluidAlignment/FluidAlignment.md @@ -0,0 +1,46 @@ +--- +title: "Fluid Alignment" +author: "ACI" +discussions: "https://governance.aave.com/t/arfc-fluid-alignment-with-inst-purchase/19921" +--- + +## Simple Summary + +This ARFC proposes a strategic partnership between Aave DAO and Instadapp through a $4M investment in $INST tokens at a 350M FDV, aiming to strengthen collaboration and alignment between both protocols. + +## Motivation + +Instadapp has been a long-standing partner in the Aave ecosystem, providing valuable infrastructure and user interfaces. Their upcoming tokenomics reform and rebranding present an opportunity for deeper strategic alignment. + +The partnership would benefit both protocols by: + +- Strengthening the relationship between two major DeFi protocols +- Supporting GHO adoption through Fluid integration +- Ensuring priority support for Aave protocol integrations +- Creating mutual value through governance participation + +## Specification + +The proposal includes the following key components: + +Aave DAO will become a launch partner for Instadapp’s new tokenomics and rebranding. The DAO and service providers will implement a strict standard of non-hostility policy regarding Instadapp products and team members in public communications. The DAO will also provision of support and promotion for Instadapp products that leverage the Aave protocol including GHO and Fluid integrations. This will involve priority and tailored support for Instadapp team integrations including the provision of free flashloans to the Instadapp protocol. + +To further alignemnt between the two protocols, we propose a purchase of $4M worth of $INST tokens using GHO (approximately 1% of total supply at 350M FDV) + +With these tokens Aave DAO will allocate up to 1/3 of acquired INST tokens to support GHO pairs on Fluid via Merit. The rest of the tokens will be set to a one-year vesting period for with delegation to Aave Protocol Embassy for active participation in Fluid governance. + +Considering the time sensitive nature of the transaction, this proposal can proceed in a direct-to-AIP vote that will allow for the following: + +- Allocation of $4m GHO from the treasury for purchase of $INST tokens. +- AIP to whitelist InstaDapp to flash loans + +## References + +- Implementation: [AaveV3Ethereum Tokens Transfers](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127.sol), [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_20241127.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241127_Multi_FluidAlignment/AaveV3EthereumLido_FluidAlignment_20241127.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241127_Multi_FluidAlignment/AaveV3Arbitrum_FluidAlignment_20241127.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241127_Multi_FluidAlignment/AaveV3Base_FluidAlignment_20241127.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_20241127.t.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241127_Multi_FluidAlignment/AaveV3EthereumLido_FluidAlignment_20241127.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241127_Multi_FluidAlignment/AaveV3Arbitrum_FluidAlignment_20241127.t.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241127_Multi_FluidAlignment/AaveV3Base_FluidAlignment_20241127.t.sol) +- Snapshot: Direct-to-AIP +- [Discussion](https://governance.aave.com/t/arfc-fluid-alignment-with-inst-purchase/19921) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241127_Multi_FluidAlignment/FluidAlignment_20241127.s.sol b/src/20241127_Multi_FluidAlignment/FluidAlignment_20241127.s.sol new file mode 100644 index 000000000..cb2dbb57e --- /dev/null +++ b/src/20241127_Multi_FluidAlignment/FluidAlignment_20241127.s.sol @@ -0,0 +1,133 @@ +// 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, ArbitrumScript, BaseScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Ethereum_FluidAlignment_20241127} from './AaveV3Ethereum_FluidAlignment_20241127.sol'; +import {AaveV3EthereumLido_FluidAlignment_20241127} from './AaveV3EthereumLido_FluidAlignment_20241127.sol'; +import {AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127} from './AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127.sol'; +import {AaveV3Arbitrum_FluidAlignment_20241127} from './AaveV3Arbitrum_FluidAlignment_20241127.sol'; +import {AaveV3Base_FluidAlignment_20241127} from './AaveV3Base_FluidAlignment_20241127.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241127_Multi_FluidAlignment/FluidAlignment_20241127.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/FluidAlignment_20241127.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_FluidAlignment_20241127).creationCode + ); + address payload1 = GovV3Helpers.deployDeterministic( + type(AaveV3EthereumLido_FluidAlignment_20241127).creationCode + ); + address payload2 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](2); + actions[0] = GovV3Helpers.buildAction(payload0); + actions[1] = GovV3Helpers.buildAction(payload1); + actions[2] = GovV3Helpers.buildAction(payload2); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Arbitrum + * deploy-command: make deploy-ledger contract=src/20241127_Multi_FluidAlignment/FluidAlignment_20241127.s.sol:DeployArbitrum chain=arbitrum + * verify-command: FOUNDRY_PROFILE=arbitrum npx catapulta-verify -b broadcast/FluidAlignment_20241127.s.sol/42161/run-latest.json + */ +contract DeployArbitrum is ArbitrumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Arbitrum_FluidAlignment_20241127).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Base + * deploy-command: make deploy-ledger contract=src/20241127_Multi_FluidAlignment/FluidAlignment_20241127.s.sol:DeployBase chain=base + * verify-command: FOUNDRY_PROFILE=base npx catapulta-verify -b broadcast/FluidAlignment_20241127.s.sol/8453/run-latest.json + */ +contract DeployBase is BaseScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Base_FluidAlignment_20241127).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/20241127_Multi_FluidAlignment/FluidAlignment_20241127.s.sol:CreateProposal chain=mainnet + */ +contract CreateProposal is EthereumScript { + function run() external { + // create payloads + PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](3); + + // compose actions for validation + IPayloadsControllerCore.ExecutionAction[] + memory actionsEthereum = new IPayloadsControllerCore.ExecutionAction[](3); + actionsEthereum[0] = GovV3Helpers.buildAction( + type(AaveV3Ethereum_FluidAlignment_20241127).creationCode + ); + actionsEthereum[1] = GovV3Helpers.buildAction( + type(AaveV3EthereumLido_FluidAlignment_20241127).creationCode + ); + actionsEthereum[2] = GovV3Helpers.buildAction( + type(AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsArbitrum = new IPayloadsControllerCore.ExecutionAction[](1); + actionsArbitrum[0] = GovV3Helpers.buildAction( + type(AaveV3Arbitrum_FluidAlignment_20241127).creationCode + ); + payloads[1] = GovV3Helpers.buildArbitrumPayload(vm, actionsArbitrum); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsBase = new IPayloadsControllerCore.ExecutionAction[](1); + actionsBase[0] = GovV3Helpers.buildAction( + type(AaveV3Base_FluidAlignment_20241127).creationCode + ); + payloads[2] = GovV3Helpers.buildBasePayload(vm, actionsBase); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile(vm, 'src/20241127_Multi_FluidAlignment/FluidAlignment.md') + ); + } +} diff --git a/src/20241127_Multi_FluidAlignment/config.ts b/src/20241127_Multi_FluidAlignment/config.ts new file mode 100644 index 000000000..e27bd118a --- /dev/null +++ b/src/20241127_Multi_FluidAlignment/config.ts @@ -0,0 +1,31 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3Ethereum', 'AaveV3EthereumLido', 'AaveV3Arbitrum', 'AaveV3Base'], + title: 'Fluid Alignment', + shortName: 'FluidAlignment', + date: '20241127', + author: 'ACI', + discussion: 'https://governance.aave.com/t/arfc-fluid-alignment-with-inst-purchase/19921', + snapshot: '', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Ethereum: { + configs: {FLASH_BORROWER: {address: '0x352423e2fA5D5c99343d371C9e3bC56C87723Cc7'}}, + cache: {blockNumber: 21280537}, + }, + AaveV3EthereumLido: { + configs: {FLASH_BORROWER: {address: '0x352423e2fA5D5c99343d371C9e3bC56C87723Cc7'}}, + cache: {blockNumber: 21280540}, + }, + AaveV3Arbitrum: { + configs: {FLASH_BORROWER: {address: '0x352423e2fA5D5c99343d371C9e3bC56C87723Cc7'}}, + cache: {blockNumber: 278916313}, + }, + AaveV3Base: { + configs: {FLASH_BORROWER: {address: '0x352423e2fA5D5c99343d371C9e3bC56C87723Cc7'}}, + cache: {blockNumber: 22969399}, + }, + }, +}; From a01d44973273f70bf0ac7175a68f0620f5d233ac Mon Sep 17 00:00:00 2001 From: Cache bot Date: Mon, 2 Dec 2024 10:45:45 +0000 Subject: [PATCH 35/35] fix(cache): automated cache update [skip ci] --- src/20241127_Multi_FluidAlignment/FluidAlignment.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/20241127_Multi_FluidAlignment/FluidAlignment.md b/src/20241127_Multi_FluidAlignment/FluidAlignment.md index 545410d5e..8cdd45934 100644 --- a/src/20241127_Multi_FluidAlignment/FluidAlignment.md +++ b/src/20241127_Multi_FluidAlignment/FluidAlignment.md @@ -36,8 +36,8 @@ Considering the time sensitive nature of the transaction, this proposal can proc ## References -- Implementation: [AaveV3Ethereum Tokens Transfers](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127.sol), [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_20241127.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241127_Multi_FluidAlignment/AaveV3EthereumLido_FluidAlignment_20241127.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241127_Multi_FluidAlignment/AaveV3Arbitrum_FluidAlignment_20241127.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241127_Multi_FluidAlignment/AaveV3Base_FluidAlignment_20241127.sol) -- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_20241127.t.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241127_Multi_FluidAlignment/AaveV3EthereumLido_FluidAlignment_20241127.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241127_Multi_FluidAlignment/AaveV3Arbitrum_FluidAlignment_20241127.t.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20241127_Multi_FluidAlignment/AaveV3Base_FluidAlignment_20241127.t.sol) +- Implementation: [AaveV3Ethereum Tokens Transfers](https://github.com/bgd-labs/aave-proposals-v3/blob/09d8dedb7b8d9e81420b018b971106da4bdd34ce/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127.sol), [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/09d8dedb7b8d9e81420b018b971106da4bdd34ce/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_20241127.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/09d8dedb7b8d9e81420b018b971106da4bdd34ce/src/20241127_Multi_FluidAlignment/AaveV3EthereumLido_FluidAlignment_20241127.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/09d8dedb7b8d9e81420b018b971106da4bdd34ce/src/20241127_Multi_FluidAlignment/AaveV3Arbitrum_FluidAlignment_20241127.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/09d8dedb7b8d9e81420b018b971106da4bdd34ce/src/20241127_Multi_FluidAlignment/AaveV3Base_FluidAlignment_20241127.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/09d8dedb7b8d9e81420b018b971106da4bdd34ce/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_20241127.t.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/09d8dedb7b8d9e81420b018b971106da4bdd34ce/src/20241127_Multi_FluidAlignment/AaveV3EthereumLido_FluidAlignment_20241127.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/09d8dedb7b8d9e81420b018b971106da4bdd34ce/src/20241127_Multi_FluidAlignment/AaveV3Arbitrum_FluidAlignment_20241127.t.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/09d8dedb7b8d9e81420b018b971106da4bdd34ce/src/20241127_Multi_FluidAlignment/AaveV3Base_FluidAlignment_20241127.t.sol) - Snapshot: Direct-to-AIP - [Discussion](https://governance.aave.com/t/arfc-fluid-alignment-with-inst-purchase/19921)