From 5575a65361d55a5571b32f42f9bc1cd47a055884 Mon Sep 17 00:00:00 2001 From: efecarranza Date: Tue, 11 Nov 2025 17:47:14 -0300 Subject: [PATCH 1/2] feat: november funding --- ...NB_NovemberFundingUpdate_20251110_after.md | 52 ++++ ...sm_NovemberFundingUpdate_20251110_after.md | 98 ++++++++ ...on_NovemberFundingUpdate_20251110_after.md | 142 +++++++++++ ...ic_NovemberFundingUpdate_20251110_after.md | 32 +++ ...veV3BNB_NovemberFundingUpdate_20251110.sol | 40 ++++ ...V3BNB_NovemberFundingUpdate_20251110.t.sol | 100 ++++++++ ...thereum_NovemberFundingUpdate_20251110.sol | 193 +++++++++++++++ ...ereum_NovemberFundingUpdate_20251110.t.sol | 161 +++++++++++++ ...ptimism_NovemberFundingUpdate_20251110.sol | 49 ++++ ...imism_NovemberFundingUpdate_20251110.t.sol | 81 +++++++ ...Polygon_NovemberFundingUpdate_20251110.sol | 117 +++++++++ ...lygon_NovemberFundingUpdate_20251110.t.sol | 172 ++++++++++++++ ...V3Sonic_NovemberFundingUpdate_20251110.sol | 26 ++ ...Sonic_NovemberFundingUpdate_20251110.t.sol | 56 +++++ .../NovemberFundingUpdate.md | 122 ++++++++++ .../NovemberFundingUpdate_20251110.s.sol | 223 ++++++++++++++++++ .../config.ts | 28 +++ 17 files changed, 1692 insertions(+) create mode 100644 diffs/AaveV3BNB_NovemberFundingUpdate_20251110_before_AaveV3BNB_NovemberFundingUpdate_20251110_after.md create mode 100644 diffs/AaveV3Optimism_NovemberFundingUpdate_20251110_before_AaveV3Optimism_NovemberFundingUpdate_20251110_after.md create mode 100644 diffs/AaveV3Polygon_NovemberFundingUpdate_20251110_before_AaveV3Polygon_NovemberFundingUpdate_20251110_after.md create mode 100644 diffs/AaveV3Sonic_NovemberFundingUpdate_20251110_before_AaveV3Sonic_NovemberFundingUpdate_20251110_after.md create mode 100644 src/20251110_Multi_NovemberFundingUpdate/AaveV3BNB_NovemberFundingUpdate_20251110.sol create mode 100644 src/20251110_Multi_NovemberFundingUpdate/AaveV3BNB_NovemberFundingUpdate_20251110.t.sol create mode 100644 src/20251110_Multi_NovemberFundingUpdate/AaveV3Ethereum_NovemberFundingUpdate_20251110.sol create mode 100644 src/20251110_Multi_NovemberFundingUpdate/AaveV3Ethereum_NovemberFundingUpdate_20251110.t.sol create mode 100644 src/20251110_Multi_NovemberFundingUpdate/AaveV3Optimism_NovemberFundingUpdate_20251110.sol create mode 100644 src/20251110_Multi_NovemberFundingUpdate/AaveV3Optimism_NovemberFundingUpdate_20251110.t.sol create mode 100644 src/20251110_Multi_NovemberFundingUpdate/AaveV3Polygon_NovemberFundingUpdate_20251110.sol create mode 100644 src/20251110_Multi_NovemberFundingUpdate/AaveV3Polygon_NovemberFundingUpdate_20251110.t.sol create mode 100644 src/20251110_Multi_NovemberFundingUpdate/AaveV3Sonic_NovemberFundingUpdate_20251110.sol create mode 100644 src/20251110_Multi_NovemberFundingUpdate/AaveV3Sonic_NovemberFundingUpdate_20251110.t.sol create mode 100644 src/20251110_Multi_NovemberFundingUpdate/NovemberFundingUpdate.md create mode 100644 src/20251110_Multi_NovemberFundingUpdate/NovemberFundingUpdate_20251110.s.sol create mode 100644 src/20251110_Multi_NovemberFundingUpdate/config.ts diff --git a/diffs/AaveV3BNB_NovemberFundingUpdate_20251110_before_AaveV3BNB_NovemberFundingUpdate_20251110_after.md b/diffs/AaveV3BNB_NovemberFundingUpdate_20251110_before_AaveV3BNB_NovemberFundingUpdate_20251110_after.md new file mode 100644 index 000000000..5e5f4bae2 --- /dev/null +++ b/diffs/AaveV3BNB_NovemberFundingUpdate_20251110_before_AaveV3BNB_NovemberFundingUpdate_20251110_after.md @@ -0,0 +1,52 @@ +## Raw diff + +```json +{ + "raw": { + "0x2170ed0880ac9a755fd29b2688956bd959f933f8": { + "label": "AaveV3BNB.ASSETS.ETH.UNDERLYING", + "balanceDiff": null, + "stateDiff": { + "0xbcd37c6560e5eccc92cfd0a9e4e4664a2a23aaea3205e7f3f9c082f8552632b8": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x00000000000000000000000000000000000000000000000176b344f2a78c0000" + } + } + }, + "0x55d398326f99059ff775485246999027b3197955": { + "label": "AaveV3BNB.ASSETS.USDT.UNDERLYING", + "balanceDiff": null, + "stateDiff": { + "0xbcd37c6560e5eccc92cfd0a9e4e4664a2a23aaea3205e7f3f9c082f8552632b8": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000000000000000000000004465dd7640a7e3e00000" + } + } + }, + "0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": { + "label": "AaveV3BNB.ASSETS.USDC.UNDERLYING", + "balanceDiff": null, + "stateDiff": { + "0xbcd37c6560e5eccc92cfd0a9e4e4664a2a23aaea3205e7f3f9c082f8552632b8": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000000000000000000000001a0bd7e67e11f6e00000" + } + } + }, + "0xe5ef2dd06755a97e975f7e282f828224f2c3e627": { + "label": "GovernanceV3BNB.PAYLOADS_CONTROLLER", + "balanceDiff": null, + "stateDiff": { + "0x308b08755ec965f49e4d58d22ebbf80dc425791b553f8567a173e85e1abb76c3": { + "previousValue": "0x0069122d3f000000000002000000000000000000000000000000000000000000", + "newValue": "0x0069122d3f000000000003000000000000000000000000000000000000000000" + }, + "0x308b08755ec965f49e4d58d22ebbf80dc425791b553f8567a173e85e1abb76c4": { + "previousValue": "0x000000000000000000093a80000000000000694051c000000000000000000000", + "newValue": "0x000000000000000000093a80000000000000694051c000000000000069122d40" + } + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Optimism_NovemberFundingUpdate_20251110_before_AaveV3Optimism_NovemberFundingUpdate_20251110_after.md b/diffs/AaveV3Optimism_NovemberFundingUpdate_20251110_before_AaveV3Optimism_NovemberFundingUpdate_20251110_after.md new file mode 100644 index 000000000..49b30c01b --- /dev/null +++ b/diffs/AaveV3Optimism_NovemberFundingUpdate_20251110_before_AaveV3Optimism_NovemberFundingUpdate_20251110_after.md @@ -0,0 +1,98 @@ +## Raw diff + +```json +{ + "raw": { + "0x0e1a3af1f9cc76a62ed31ededca291e63632e7c4": { + "label": "GovernanceV3Optimism.PAYLOADS_CONTROLLER", + "balanceDiff": null, + "stateDiff": { + "0xca1941ffd2876354dca11a76468fb85895321380bff6312dcbd61b110f22031e": { + "previousValue": "0x0069122d3c000000000002000000000000000000000000000000000000000000", + "newValue": "0x0069122d3c000000000003000000000000000000000000000000000000000000" + }, + "0xca1941ffd2876354dca11a76468fb85895321380bff6312dcbd61b110f22031f": { + "previousValue": "0x000000000000000000093a80000000000000694051bd00000000000000000000", + "newValue": "0x000000000000000000093a80000000000000694051bd00000000000069122d3d" + } + } + }, + "0x4200000000000000000000000000000000000006": { + "label": "AaveV3Optimism.ASSETS.WETH.UNDERLYING", + "balanceDiff": null, + "stateDiff": { + "0x1990b8a5b4e9db7894b9ec1bdce8978b740841e2670175030710fc18d62f7cd4": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + "0x80f087e010df8aae14d01296cfb6e6bcda4724f1a1c7894b10c956355406f974": { + "previousValue": "0x000000000000000000000000000000000000000000000000055be290ce8db450", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + "0xd88f56d46729340cb70c65cb7b086181ef4f348d3f59e18662523129018b4a3e": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000000000000000000000000000055be290ce8db450" + }, + "0xe4af955e91d13bf1550beb9173b8786007931f16ca20b06578f08d63c3138406": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + } + }, + "0x4200000000000000000000000000000000000007": { + "label": null, + "balanceDiff": null, + "stateDiff": { + "0x00000000000000000000000000000000000000000000000000000000000000cd": { + "previousValue": "0x00000000000000000000000000000000000000000000000000000000000074f9", + "newValue": "0x00000000000000000000000000000000000000000000000000000000000074fa" + } + } + }, + "0x4200000000000000000000000000000000000010": { + "label": null, + "balanceDiff": null, + "stateDiff": { + "0x7a0b91b083e25cc05b0d71c34d4f59c7ee3679005be7e9dc68a341c1dea8c557": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000000000000000000000000000055be290ce8db450" + } + } + }, + "0x4200000000000000000000000000000000000016": { + "label": null, + "balanceDiff": null, + "stateDiff": { + "0x0000000000000000000000000000000000000000000000000000000000000001": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000007509", + "newValue": "0x000000000000000000000000000000000000000000000000000000000000750a" + }, + "0x84e216084d86302523b0ddf2c711a51b5b46ecaef88108fe293e13eb1b21e123": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + } + } + }, + "0x92bac115d89ca17fd02ed9357ceca32842acb4c2": { + "label": null, + "balanceDiff": null, + "stateDiff": { + "0x52a4b996c6a936f6861f619f421edf04ef515c8a41541c139e7204104df9f373": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000849710f9df58" + } + } + }, + "0xdfa2d3a0d32f870d87f8a0d7aa6b9cdeb7bc5adb": { + "label": null, + "balanceDiff": null, + "stateDiff": { + "0x0000000000000000000000000000000000000000000000000000000000000003": { + "previousValue": "0x0000000000000000000000002f4942c15196a050f83001b781f345b00d345ff7", + "newValue": "0x000000000000000000000000b2289e329d2f85f1ed31adbb30ea345278f21bcf" + } + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Polygon_NovemberFundingUpdate_20251110_before_AaveV3Polygon_NovemberFundingUpdate_20251110_after.md b/diffs/AaveV3Polygon_NovemberFundingUpdate_20251110_before_AaveV3Polygon_NovemberFundingUpdate_20251110_after.md new file mode 100644 index 000000000..0303a4941 --- /dev/null +++ b/diffs/AaveV3Polygon_NovemberFundingUpdate_20251110_before_AaveV3Polygon_NovemberFundingUpdate_20251110_after.md @@ -0,0 +1,142 @@ +## Raw diff + +```json +{ + "raw": { + "0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270": { + "label": "AaveV2Polygon.ASSETS.WPOL.UNDERLYING, AaveV3Polygon.ASSETS.WPOL.UNDERLYING", + "balanceDiff": null, + "stateDiff": { + "0xea56154baea060d6028cf26ed80c85acd2bf39268d3696d9996c1f28313a1bf7": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000000000000000000000001c965d5aa35866600000" + } + } + }, + "0x1bfd67037b42cf73acf2047067bd4f2c47d9bfd6": { + "label": "AaveV2Polygon.ASSETS.WBTC.UNDERLYING, AaveV3Polygon.ASSETS.WBTC.UNDERLYING", + "balanceDiff": null, + "stateDiff": { + "0x0000000000000000000000000000000000000000000000000000000000000002": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000003a69b061de", + "newValue": "0x0000000000000000000000000000000000000000000000000000003a69a704af" + }, + "0x404c34bd0414065c85c501e22c28753c400c01908285c9c107c0af3f1e3ecd1d": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000095d2f", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + "0x5f68812dcd82c1e957747b26a90603dd5e99daf1ec7fd57c73b20605b8654764": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + } + }, + "0x2791bca1f2de4661ed88a30c99a7a9449aa84174": { + "label": "AaveV2Polygon.ASSETS.USDC.UNDERLYING, AaveV3Polygon.ASSETS.USDC.UNDERLYING", + "balanceDiff": null, + "stateDiff": { + "0x0000000000000000000000000000000000000000000000000000000000000002": { + "previousValue": "0x000000000000000000000000000000000000000000000000000216bde146b8c4", + "newValue": "0x000000000000000000000000000000000000000000000000000216bdd19266a0" + }, + "0x404c34bd0414065c85c501e22c28753c400c01908285c9c107c0af3f1e3ecd1d": { + "previousValue": "0x000000000000000000000000000000000000000000000000000000000fb45224", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + "0x5f68812dcd82c1e957747b26a90603dd5e99daf1ec7fd57c73b20605b8654764": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + } + }, + "0x3c499c542cef5e3811e1192ce70d8cc03d5c3359": { + "label": "AaveV3Polygon.ASSETS.USDCn.UNDERLYING", + "balanceDiff": null, + "stateDiff": { + "0x10e262416e9270863d7bc9f0588915fab0171df44c176e006200c710ad029121": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000001e449a9400" + } + } + }, + "0x401b5d0294e23637c18fcc38b1bca814cda2637c": { + "label": "GovernanceV3Polygon.PAYLOADS_CONTROLLER", + "balanceDiff": null, + "stateDiff": { + "0x89296dddcf1fd18ff0a710602fafcfb133676f3567b56cdc06e7cf03be494bbc": { + "previousValue": "0x0069122d39000000000002000000000000000000000000000000000000000000", + "newValue": "0x0069122d39000000000003000000000000000000000000000000000000000000" + }, + "0x89296dddcf1fd18ff0a710602fafcfb133676f3567b56cdc06e7cf03be494bbd": { + "previousValue": "0x000000000000000000093a80000000000000694051ba00000000000000000000", + "newValue": "0x000000000000000000093a80000000000000694051ba00000000000069122d3a" + } + } + }, + "0x7ceb23fd6bc0add59e62ac25578270cff1b9f619": { + "label": "AaveV2Polygon.ASSETS.WETH.UNDERLYING, AaveV3Polygon.ASSETS.WETH.UNDERLYING", + "balanceDiff": null, + "stateDiff": { + "0x0000000000000000000000000000000000000000000000000000000000000002": { + "previousValue": "0x0000000000000000000000000000000000000000000016d0d3e1a3a869bb758d", + "newValue": "0x0000000000000000000000000000000000000000000016d0d11a605919c3ce1c" + }, + "0x404c34bd0414065c85c501e22c28753c400c01908285c9c107c0af3f1e3ecd1d": { + "previousValue": "0x00000000000000000000000000000000000000000000000002c7434f4ff7a771", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + "0x5f68812dcd82c1e957747b26a90603dd5e99daf1ec7fd57c73b20605b8654764": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + } + }, + "0x8f3cf7ad23cd3cadbd9735aff958023239c6a063": { + "label": "AaveV2Polygon.ASSETS.DAI.UNDERLYING, AaveV3Polygon.ASSETS.DAI.UNDERLYING", + "balanceDiff": null, + "stateDiff": { + "0x0000000000000000000000000000000000000000000000000000000000000002": { + "previousValue": "0x000000000000000000000000000000000000000001e2f17020bcd43f9591c88e", + "newValue": "0x000000000000000000000000000000000000000001e2f166c323bab474a4809a" + }, + "0x404c34bd0414065c85c501e22c28753c400c01908285c9c107c0af3f1e3ecd1d": { + "previousValue": "0x0000000000000000000000000000000000000000000000095d99198b20ed47f4", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + "0x5f68812dcd82c1e957747b26a90603dd5e99daf1ec7fd57c73b20605b8654764": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + } + }, + "0xc2132d05d31c914a87c6611c10748aeb04b58e8f": { + "label": "AaveV2Polygon.ASSETS.USDT0.UNDERLYING, AaveV3Polygon.ASSETS.USDT0.UNDERLYING", + "balanceDiff": null, + "stateDiff": { + "0xdc5809139a77f18050f7ab47f12a7c7866864dd63266bc006615a0c223561ab0": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000003339059800" + } + } + }, + "0xd6df932a45c0f255f85145f286ea0b292b21c90b": { + "label": "AaveV2Polygon.ASSETS.AAVE.UNDERLYING, AaveV3Polygon.ASSETS.AAVE.UNDERLYING", + "balanceDiff": null, + "stateDiff": { + "0x0000000000000000000000000000000000000000000000000000000000000002": { + "previousValue": "0x00000000000000000000000000000000000000000000119b04ceb2292945384b", + "newValue": "0x00000000000000000000000000000000000000000000119af11c4fd595d3c293" + }, + "0x404c34bd0414065c85c501e22c28753c400c01908285c9c107c0af3f1e3ecd1d": { + "previousValue": "0x00000000000000000000000000000000000000000000000013b26253937175b8", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + "0x5f68812dcd82c1e957747b26a90603dd5e99daf1ec7fd57c73b20605b8654764": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Sonic_NovemberFundingUpdate_20251110_before_AaveV3Sonic_NovemberFundingUpdate_20251110_after.md b/diffs/AaveV3Sonic_NovemberFundingUpdate_20251110_before_AaveV3Sonic_NovemberFundingUpdate_20251110_after.md new file mode 100644 index 000000000..ef43d2ba9 --- /dev/null +++ b/diffs/AaveV3Sonic_NovemberFundingUpdate_20251110_before_AaveV3Sonic_NovemberFundingUpdate_20251110_after.md @@ -0,0 +1,32 @@ +## Raw diff + +```json +{ + "raw": { + "0x0846c28dd54dea4fd7fb31bcc5eb81673d68c695": { + "label": "GovernanceV3Sonic.PAYLOADS_CONTROLLER", + "balanceDiff": null, + "stateDiff": { + "0x2d72af3c1b2b2956e6f694fb741556d5ca9524373974378cdbec16afa8b84164": { + "previousValue": "0x0069122d40000000000002000000000000000000000000000000000000000000", + "newValue": "0x0069122d40000000000003000000000000000000000000000000000000000000" + }, + "0x2d72af3c1b2b2956e6f694fb741556d5ca9524373974378cdbec16afa8b84165": { + "previousValue": "0x000000000000000000093a80000000000000694051c100000000000000000000", + "newValue": "0x000000000000000000093a80000000000000694051c100000000000069122d41" + } + } + }, + "0x50c42deacd8fc9773493ed674b675be577f2634b": { + "label": "AaveV3Sonic.ASSETS.WETH.UNDERLYING", + "balanceDiff": null, + "stateDiff": { + "0x2be6d62e30e4b3296c8d9d84ca4fe06b9919e3fca92b90e42095db18e22e09a7": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000000000000000000000000000a688906bd8b00000" + } + } + } + } +} +``` \ No newline at end of file diff --git a/src/20251110_Multi_NovemberFundingUpdate/AaveV3BNB_NovemberFundingUpdate_20251110.sol b/src/20251110_Multi_NovemberFundingUpdate/AaveV3BNB_NovemberFundingUpdate_20251110.sol new file mode 100644 index 000000000..fad365d81 --- /dev/null +++ b/src/20251110_Multi_NovemberFundingUpdate/AaveV3BNB_NovemberFundingUpdate_20251110.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from 'openzeppelin-contracts/contracts/token/ERC20/IERC20.sol'; +import {AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV3BNB, AaveV3BNBAssets} from 'aave-address-book/AaveV3BNB.sol'; +import {MiscBNB} from 'aave-address-book/MiscBNB.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; + +/** + * @title November Funding Update + * @author TokenLogic + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/direct-to-aip-november-2025-funding-update/23339 + */ +contract AaveV3BNB_NovemberFundingUpdate_20251110 is IProposalGenericExecutor { + uint256 public constant USDC_AMOUNT = 123_000 ether; + uint256 public constant USDT_AMOUNT = 323_000 ether; + uint256 public constant ETH_AMOUNT = 27 ether; + + function execute() external { + AaveV3BNB.COLLECTOR.approve( + IERC20(AaveV3BNBAssets.USDC_UNDERLYING), + MiscBNB.AFC_SAFE, + USDC_AMOUNT + ); + + AaveV3BNB.COLLECTOR.approve( + IERC20(AaveV3BNBAssets.USDT_UNDERLYING), + MiscBNB.AFC_SAFE, + USDT_AMOUNT + ); + + AaveV3BNB.COLLECTOR.approve( + IERC20(AaveV3BNBAssets.ETH_UNDERLYING), + MiscBNB.AFC_SAFE, + ETH_AMOUNT + ); + } +} diff --git a/src/20251110_Multi_NovemberFundingUpdate/AaveV3BNB_NovemberFundingUpdate_20251110.t.sol b/src/20251110_Multi_NovemberFundingUpdate/AaveV3BNB_NovemberFundingUpdate_20251110.t.sol new file mode 100644 index 000000000..8a844ebee --- /dev/null +++ b/src/20251110_Multi_NovemberFundingUpdate/AaveV3BNB_NovemberFundingUpdate_20251110.t.sol @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from 'openzeppelin-contracts/contracts/token/ERC20/IERC20.sol'; +import {AaveV3BNB, AaveV3BNBAssets} from 'aave-address-book/AaveV3BNB.sol'; +import {MiscBNB} from 'aave-address-book/MiscBNB.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3BNB_NovemberFundingUpdate_20251110} from './AaveV3BNB_NovemberFundingUpdate_20251110.sol'; + +/** + * @dev Test for AaveV3BNB_NovemberFundingUpdate_20251110 + * command: FOUNDRY_PROFILE=test forge test --match-path=src/20251110_Multi_NovemberFundingUpdate/AaveV3BNB_NovemberFundingUpdate_20251110.t.sol -vv + */ +contract AaveV3BNB_NovemberFundingUpdate_20251110_Test is ProtocolV3TestBase { + AaveV3BNB_NovemberFundingUpdate_20251110 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('bnb'), 67730544); + proposal = new AaveV3BNB_NovemberFundingUpdate_20251110(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest('AaveV3BNB_NovemberFundingUpdate_20251110', AaveV3BNB.POOL, address(proposal)); + } + + function test_approvals() public { + assertEq( + IERC20(AaveV3BNBAssets.USDC_UNDERLYING).allowance( + address(AaveV3BNB.COLLECTOR), + MiscBNB.AFC_SAFE + ), + 0 + ); + + assertEq( + IERC20(AaveV3BNBAssets.USDT_UNDERLYING).allowance( + address(AaveV3BNB.COLLECTOR), + MiscBNB.AFC_SAFE + ), + 0 + ); + + assertEq( + IERC20(AaveV3BNBAssets.ETH_UNDERLYING).allowance( + address(AaveV3BNB.COLLECTOR), + MiscBNB.AFC_SAFE + ), + 0 + ); + + executePayload(vm, address(proposal)); + + assertEq( + IERC20(AaveV3BNBAssets.USDC_UNDERLYING).allowance( + address(AaveV3BNB.COLLECTOR), + MiscBNB.AFC_SAFE + ), + proposal.USDC_AMOUNT() + ); + + assertEq( + IERC20(AaveV3BNBAssets.USDT_UNDERLYING).allowance( + address(AaveV3BNB.COLLECTOR), + MiscBNB.AFC_SAFE + ), + proposal.USDT_AMOUNT() + ); + + assertEq( + IERC20(AaveV3BNBAssets.ETH_UNDERLYING).allowance( + address(AaveV3BNB.COLLECTOR), + MiscBNB.AFC_SAFE + ), + proposal.ETH_AMOUNT() + ); + + vm.startPrank(MiscBNB.AFC_SAFE); + IERC20(AaveV3BNBAssets.USDC_UNDERLYING).transferFrom( + address(AaveV3BNB.COLLECTOR), + MiscBNB.AFC_SAFE, + proposal.USDC_AMOUNT() + ); + + IERC20(AaveV3BNBAssets.USDT_UNDERLYING).transferFrom( + address(AaveV3BNB.COLLECTOR), + MiscBNB.AFC_SAFE, + proposal.USDT_AMOUNT() + ); + + IERC20(AaveV3BNBAssets.ETH_UNDERLYING).transferFrom( + address(AaveV3BNB.COLLECTOR), + MiscBNB.AFC_SAFE, + proposal.ETH_AMOUNT() + ); + vm.stopPrank(); + } +} diff --git a/src/20251110_Multi_NovemberFundingUpdate/AaveV3Ethereum_NovemberFundingUpdate_20251110.sol b/src/20251110_Multi_NovemberFundingUpdate/AaveV3Ethereum_NovemberFundingUpdate_20251110.sol new file mode 100644 index 000000000..8040f3416 --- /dev/null +++ b/src/20251110_Multi_NovemberFundingUpdate/AaveV3Ethereum_NovemberFundingUpdate_20251110.sol @@ -0,0 +1,193 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from 'openzeppelin-contracts/contracts/token/ERC20/IERC20.sol'; +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV3EthereumLido, AaveV3EthereumLidoAssets} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; + +interface IMainnetSwapSteward { + function increaseTokenBudget(address token, uint256 budget) external; + function setSwappablePair(address fromToken, address toToken, bool allowed) external; +} + +/** + * @title November Funding Update + * @author TokenLogic + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/direct-to-aip-november-2025-funding-update/23339 + */ +contract AaveV3Ethereum_NovemberFundingUpdate_20251110 is IProposalGenericExecutor { + // https://etherscan.io/address/0x1bab804803159ad84b8854581aa53ac72455614e + address public constant SYND = 0x1bAB804803159aD84b8854581AA53AC72455614E; + uint256 public constant SYND_APPROVAL_AMOUNT = 200_000 ether; + + // https://etherscan.io/address/0xc20059e0317DE91738d13af027DfC4a50781b066 + address public constant SPK = 0xc20059e0317DE91738d13af027DfC4a50781b066; + + // https://etherscan.io/address/0x5aFE3855358E112B5647B952709E6165e1c1eEEe + address public constant SAFE = 0x5aFE3855358E112B5647B952709E6165e1c1eEEe; + + // https://etherscan.io/address/0x455e53CBB86018Ac2B8092FdCd39d8444aFFC3F6 + address public constant POL = 0x455e53CBB86018Ac2B8092FdCd39d8444aFFC3F6; + + // https://etherscan.io/address/0xAAf400e4Bbc38B5E2136C1a36946Bf841A357307 + address public constant AUDITS_SAFE = 0xAAf400e4Bbc38B5E2136C1a36946Bf841A357307; + uint256 public constant AUDITS_GHO_AMOUNT = 1_500_000 ether; + + uint256 public constant MERIT_GHO_AMOUNT = 3_000_000 ether; + + // https://etherscan.io/address/0xAA088dfF3dcF619664094945028d44E779F19894 + address public constant TOKEN_LOGIC = 0xAA088dfF3dcF619664094945028d44E779F19894; + uint256 public constant REIMBURSEMENTS_GHO_AMOUNT = 71_698 ether; + + function execute() external { + _runway(); + _v4Audits(); + _merit(); + _reimbursements(); + _ecosystemReserve(); + _swapPathsAndBudget(); + } + + function _runway() internal { + AaveV3Ethereum.COLLECTOR.approve(IERC20(SYND), MiscEthereum.AFC_SAFE, SYND_APPROVAL_AMOUNT); + + AaveV3Ethereum.COLLECTOR.approve( + IERC20(SPK), + MiscEthereum.AFC_SAFE, + IERC20(SPK).balanceOf(address(AaveV3Ethereum.COLLECTOR)) + ); + + AaveV3Ethereum.COLLECTOR.approve( + IERC20(SAFE), + MiscEthereum.AFC_SAFE, + IERC20(SAFE).balanceOf(address(AaveV3Ethereum.COLLECTOR)) + ); + + AaveV3Ethereum.COLLECTOR.approve( + IERC20(POL), + MiscEthereum.AFC_SAFE, + IERC20(POL).balanceOf(address(AaveV3Ethereum.COLLECTOR)) + ); + } + + function _v4Audits() internal { + AaveV3EthereumLido.COLLECTOR.approve( + IERC20(AaveV3EthereumLidoAssets.GHO_A_TOKEN), + AUDITS_SAFE, + AUDITS_GHO_AMOUNT + ); + } + + function _merit() internal { + AaveV3EthereumLido.COLLECTOR.approve( + IERC20(AaveV3EthereumLidoAssets.GHO_A_TOKEN), + MiscEthereum.MERIT_AHAB_SAFE, + MERIT_GHO_AMOUNT + ); + } + + function _reimbursements() internal { + AaveV3EthereumLido.COLLECTOR.approve( + IERC20(AaveV3EthereumLidoAssets.GHO_A_TOKEN), + TOKEN_LOGIC, + REIMBURSEMENTS_GHO_AMOUNT + ); + } + + function _ecosystemReserve() internal { + AaveV3Ethereum.COLLECTOR.transfer( + IERC20(AaveV3EthereumAssets.AAVE_UNDERLYING), + MiscEthereum.ECOSYSTEM_RESERVE, + IERC20(AaveV3EthereumAssets.AAVE_UNDERLYING).balanceOf(address(AaveV3Ethereum.COLLECTOR)) + ); + } + + function _swapPathsAndBudget() internal { + // To pyUSD + IMainnetSwapSteward(AaveV3Ethereum.COLLECTOR_SWAP_STEWARD).setSwappablePair( + AaveV3EthereumAssets.USDC_UNDERLYING, + AaveV3EthereumAssets.PYUSD_UNDERLYING, + true + ); + IMainnetSwapSteward(AaveV3Ethereum.COLLECTOR_SWAP_STEWARD).setSwappablePair( + AaveV3EthereumAssets.USDT_UNDERLYING, + AaveV3EthereumAssets.PYUSD_UNDERLYING, + true + ); + IMainnetSwapSteward(AaveV3Ethereum.COLLECTOR_SWAP_STEWARD).setSwappablePair( + AaveV3EthereumAssets.GHO_UNDERLYING, + AaveV3EthereumAssets.PYUSD_UNDERLYING, + true + ); + IMainnetSwapSteward(AaveV3Ethereum.COLLECTOR_SWAP_STEWARD).setSwappablePair( + AaveV3EthereumAssets.USDS_UNDERLYING, + AaveV3EthereumAssets.PYUSD_UNDERLYING, + true + ); + IMainnetSwapSteward(AaveV3Ethereum.COLLECTOR_SWAP_STEWARD).setSwappablePair( + AaveV3EthereumAssets.DAI_UNDERLYING, + AaveV3EthereumAssets.PYUSD_UNDERLYING, + true + ); + IMainnetSwapSteward(AaveV3Ethereum.COLLECTOR_SWAP_STEWARD).setSwappablePair( + AaveV3EthereumAssets.LUSD_UNDERLYING, + AaveV3EthereumAssets.PYUSD_UNDERLYING, + true + ); + IMainnetSwapSteward(AaveV3Ethereum.COLLECTOR_SWAP_STEWARD).setSwappablePair( + AaveV3EthereumAssets.USDe_UNDERLYING, + AaveV3EthereumAssets.PYUSD_UNDERLYING, + true + ); + IMainnetSwapSteward(AaveV3Ethereum.COLLECTOR_SWAP_STEWARD).setSwappablePair( + AaveV3EthereumAssets.RLUSD_UNDERLYING, + AaveV3EthereumAssets.PYUSD_UNDERLYING, + true + ); + + // To rlUSD + IMainnetSwapSteward(AaveV3Ethereum.COLLECTOR_SWAP_STEWARD).setSwappablePair( + AaveV3EthereumAssets.USDC_UNDERLYING, + AaveV3EthereumAssets.RLUSD_UNDERLYING, + true + ); + IMainnetSwapSteward(AaveV3Ethereum.COLLECTOR_SWAP_STEWARD).setSwappablePair( + AaveV3EthereumAssets.USDT_UNDERLYING, + AaveV3EthereumAssets.RLUSD_UNDERLYING, + true + ); + IMainnetSwapSteward(AaveV3Ethereum.COLLECTOR_SWAP_STEWARD).setSwappablePair( + AaveV3EthereumAssets.GHO_UNDERLYING, + AaveV3EthereumAssets.RLUSD_UNDERLYING, + true + ); + IMainnetSwapSteward(AaveV3Ethereum.COLLECTOR_SWAP_STEWARD).setSwappablePair( + AaveV3EthereumAssets.USDS_UNDERLYING, + AaveV3EthereumAssets.RLUSD_UNDERLYING, + true + ); + IMainnetSwapSteward(AaveV3Ethereum.COLLECTOR_SWAP_STEWARD).setSwappablePair( + AaveV3EthereumAssets.DAI_UNDERLYING, + AaveV3EthereumAssets.RLUSD_UNDERLYING, + true + ); + IMainnetSwapSteward(AaveV3Ethereum.COLLECTOR_SWAP_STEWARD).setSwappablePair( + AaveV3EthereumAssets.LUSD_UNDERLYING, + AaveV3EthereumAssets.RLUSD_UNDERLYING, + true + ); + IMainnetSwapSteward(AaveV3Ethereum.COLLECTOR_SWAP_STEWARD).setSwappablePair( + AaveV3EthereumAssets.USDe_UNDERLYING, + AaveV3EthereumAssets.RLUSD_UNDERLYING, + true + ); + IMainnetSwapSteward(AaveV3Ethereum.COLLECTOR_SWAP_STEWARD).setSwappablePair( + AaveV3EthereumAssets.PYUSD_UNDERLYING, + AaveV3EthereumAssets.RLUSD_UNDERLYING, + true + ); + } +} diff --git a/src/20251110_Multi_NovemberFundingUpdate/AaveV3Ethereum_NovemberFundingUpdate_20251110.t.sol b/src/20251110_Multi_NovemberFundingUpdate/AaveV3Ethereum_NovemberFundingUpdate_20251110.t.sol new file mode 100644 index 000000000..bf3013a88 --- /dev/null +++ b/src/20251110_Multi_NovemberFundingUpdate/AaveV3Ethereum_NovemberFundingUpdate_20251110.t.sol @@ -0,0 +1,161 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from 'openzeppelin-contracts/contracts/token/ERC20/IERC20.sol'; +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV3EthereumLido, AaveV3EthereumLidoAssets} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Ethereum_NovemberFundingUpdate_20251110} from './AaveV3Ethereum_NovemberFundingUpdate_20251110.sol'; + +/** + * @dev Test for AaveV3Ethereum_NovemberFundingUpdate_20251110 + * command: FOUNDRY_PROFILE=test forge test --match-path=src/20251110_Multi_NovemberFundingUpdate/AaveV3Ethereum_NovemberFundingUpdate_20251110.t.sol -vv + */ +contract AaveV3Ethereum_NovemberFundingUpdate_20251110_Test is ProtocolV3TestBase { + AaveV3Ethereum_NovemberFundingUpdate_20251110 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 23770613); + proposal = new AaveV3Ethereum_NovemberFundingUpdate_20251110(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_NovemberFundingUpdate_20251110', + AaveV3Ethereum.POOL, + address(proposal) + ); + } + + function test_runway() public { + uint256 allowanceSyndBefore = IERC20(proposal.SYND()).allowance( + address(AaveV3Ethereum.COLLECTOR), + MiscEthereum.AFC_SAFE + ); + uint256 allowanceSpkBefore = IERC20(proposal.SPK()).allowance( + address(AaveV3Ethereum.COLLECTOR), + MiscEthereum.AFC_SAFE + ); + uint256 allowanceSafeBefore = IERC20(proposal.SAFE()).allowance( + address(AaveV3Ethereum.COLLECTOR), + MiscEthereum.AFC_SAFE + ); + uint256 allowancePolBefore = IERC20(proposal.POL()).allowance( + address(AaveV3Ethereum.COLLECTOR), + MiscEthereum.AFC_SAFE + ); + assertEq(allowanceSyndBefore, 0); + assertEq(allowanceSpkBefore, 0); + assertEq(allowanceSafeBefore, 0); + assertEq(allowancePolBefore, 0); + + executePayload(vm, address(proposal)); + + uint256 allowanceSyndAfter = IERC20(proposal.SYND()).allowance( + address(AaveV3Ethereum.COLLECTOR), + MiscEthereum.AFC_SAFE + ); + uint256 allowanceSpkAfter = IERC20(proposal.SPK()).allowance( + address(AaveV3Ethereum.COLLECTOR), + MiscEthereum.AFC_SAFE + ); + uint256 allowanceSafeAfter = IERC20(proposal.SAFE()).allowance( + address(AaveV3Ethereum.COLLECTOR), + MiscEthereum.AFC_SAFE + ); + uint256 allowancePolAfter = IERC20(proposal.POL()).allowance( + address(AaveV3Ethereum.COLLECTOR), + MiscEthereum.AFC_SAFE + ); + + assertEq(allowanceSyndAfter, allowanceSyndBefore + proposal.SYND_APPROVAL_AMOUNT()); + assertGt(allowanceSpkAfter, allowanceSpkBefore); + assertGt(allowanceSafeAfter, allowanceSafeBefore); + assertGt(allowancePolAfter, allowancePolBefore); + + vm.startPrank(MiscEthereum.AFC_SAFE); + IERC20(proposal.SYND()).transferFrom( + address(AaveV3Ethereum.COLLECTOR), + MiscEthereum.AFC_SAFE, + proposal.SYND_APPROVAL_AMOUNT() + ); + + IERC20(proposal.SPK()).transferFrom( + address(AaveV3Ethereum.COLLECTOR), + MiscEthereum.AFC_SAFE, + IERC20(proposal.SPK()).balanceOf(address(AaveV3Ethereum.COLLECTOR)) + ); + + IERC20(proposal.SAFE()).transferFrom( + address(AaveV3Ethereum.COLLECTOR), + MiscEthereum.AFC_SAFE, + IERC20(proposal.SAFE()).balanceOf(address(AaveV3Ethereum.COLLECTOR)) + ); + + IERC20(proposal.POL()).transferFrom( + address(AaveV3Ethereum.COLLECTOR), + MiscEthereum.AFC_SAFE, + IERC20(proposal.POL()).balanceOf(address(AaveV3Ethereum.COLLECTOR)) + ); + vm.stopPrank(); + } + + function test_v4Audits() public { + uint256 allowanceBefore = IERC20(AaveV3EthereumLidoAssets.GHO_A_TOKEN).allowance( + address(AaveV3Ethereum.COLLECTOR), + proposal.AUDITS_SAFE() + ); + assertEq(allowanceBefore, 0); + + executePayload(vm, address(proposal)); + + uint256 allowanceAfter = IERC20(AaveV3EthereumLidoAssets.GHO_A_TOKEN).allowance( + address(AaveV3Ethereum.COLLECTOR), + proposal.AUDITS_SAFE() + ); + + assertEq(allowanceAfter, allowanceBefore + proposal.AUDITS_GHO_AMOUNT()); + } + + function test_merit() public { + uint256 allowanceBefore = IERC20(AaveV3EthereumLidoAssets.GHO_A_TOKEN).allowance( + address(AaveV3Ethereum.COLLECTOR), + MiscEthereum.MERIT_AHAB_SAFE + ); + assertEq(allowanceBefore, 0); + + executePayload(vm, address(proposal)); + + uint256 allowanceAfter = IERC20(AaveV3EthereumLidoAssets.GHO_A_TOKEN).allowance( + address(AaveV3Ethereum.COLLECTOR), + MiscEthereum.MERIT_AHAB_SAFE + ); + + assertEq(allowanceAfter, allowanceBefore + proposal.MERIT_GHO_AMOUNT()); + } + + function test_reimbursements() public { + uint256 allowanceBefore = IERC20(AaveV3EthereumLidoAssets.GHO_A_TOKEN).allowance( + address(AaveV3Ethereum.COLLECTOR), + proposal.TOKEN_LOGIC() + ); + assertEq(allowanceBefore, 0); + + executePayload(vm, address(proposal)); + + uint256 allowanceAfter = IERC20(AaveV3EthereumLidoAssets.GHO_A_TOKEN).allowance( + address(AaveV3Ethereum.COLLECTOR), + proposal.TOKEN_LOGIC() + ); + + assertEq(allowanceAfter, allowanceBefore + proposal.REIMBURSEMENTS_GHO_AMOUNT()); + } + + function test_ecosystemReserve() public {} + + function test_swapPaths() public {} +} diff --git a/src/20251110_Multi_NovemberFundingUpdate/AaveV3Optimism_NovemberFundingUpdate_20251110.sol b/src/20251110_Multi_NovemberFundingUpdate/AaveV3Optimism_NovemberFundingUpdate_20251110.sol new file mode 100644 index 000000000..c09c5c488 --- /dev/null +++ b/src/20251110_Multi_NovemberFundingUpdate/AaveV3Optimism_NovemberFundingUpdate_20251110.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from 'openzeppelin-contracts/contracts/token/ERC20/IERC20.sol'; +import {AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV3Optimism, AaveV3OptimismAssets} from 'aave-address-book/AaveV3Optimism.sol'; +import {MiscOptimism} from 'aave-address-book/MiscOptimism.sol'; +import {IAaveOpEthERC20Bridge} from 'aave-helpers/src/bridges/optimism/IAaveOpEthERC20Bridge.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; + +/** + * @title November Funding Update + * @author TokenLogic + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/direct-to-aip-november-2025-funding-update/23339 + */ +contract AaveV3Optimism_NovemberFundingUpdate_20251110 is IProposalGenericExecutor { + uint256 public constant SUSD_AMOUNT = 105_000 ether; + + function execute() external { + _approvals(); + _bridges(); + } + + function _approvals() internal { + AaveV3Optimism.COLLECTOR.approve( + IERC20(AaveV3OptimismAssets.sUSD_UNDERLYING), + MiscOptimism.AFC_SAFE, + IERC20(AaveV3OptimismAssets.sUSD_UNDERLYING).balanceOf(address(AaveV3Optimism.COLLECTOR)) + ); + } + + function _bridges() internal { + /// WETH + uint256 wethBalance = IERC20(AaveV3OptimismAssets.WETH_UNDERLYING).balanceOf( + address(AaveV3Optimism.COLLECTOR) + ); + AaveV3Optimism.COLLECTOR.transfer( + IERC20(AaveV3OptimismAssets.WETH_UNDERLYING), + MiscOptimism.AAVE_OPT_ETH_BRIDGE, + wethBalance + ); + IAaveOpEthERC20Bridge(MiscOptimism.AAVE_OPT_ETH_BRIDGE).bridge( + AaveV3OptimismAssets.WETH_UNDERLYING, + AaveV3EthereumAssets.WETH_UNDERLYING, + wethBalance + ); + } +} diff --git a/src/20251110_Multi_NovemberFundingUpdate/AaveV3Optimism_NovemberFundingUpdate_20251110.t.sol b/src/20251110_Multi_NovemberFundingUpdate/AaveV3Optimism_NovemberFundingUpdate_20251110.t.sol new file mode 100644 index 000000000..7b248e7b9 --- /dev/null +++ b/src/20251110_Multi_NovemberFundingUpdate/AaveV3Optimism_NovemberFundingUpdate_20251110.t.sol @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from 'openzeppelin-contracts/contracts/token/ERC20/IERC20.sol'; +import {AaveV3Optimism, AaveV3OptimismAssets} from 'aave-address-book/AaveV3Optimism.sol'; +import {MiscOptimism} from 'aave-address-book/MiscOptimism.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Optimism_NovemberFundingUpdate_20251110} from './AaveV3Optimism_NovemberFundingUpdate_20251110.sol'; + +/** + * @dev Test for AaveV3Optimism_NovemberFundingUpdate_20251110 + * command: FOUNDRY_PROFILE=test forge test --match-path=src/20251110_Multi_NovemberFundingUpdate/AaveV3Optimism_NovemberFundingUpdate_20251110.t.sol -vv + */ +contract AaveV3Optimism_NovemberFundingUpdate_20251110_Test is ProtocolV3TestBase { + event Bridge(address indexed token, uint256 amount); + + AaveV3Optimism_NovemberFundingUpdate_20251110 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('optimism'), 143600066); + proposal = new AaveV3Optimism_NovemberFundingUpdate_20251110(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Optimism_NovemberFundingUpdate_20251110', + AaveV3Optimism.POOL, + address(proposal) + ); + } + + function test_approvals() public { + assertEq( + IERC20(AaveV3OptimismAssets.sUSD_UNDERLYING).allowance( + address(AaveV3Optimism.COLLECTOR), + MiscOptimism.AFC_SAFE + ), + 0 + ); + + executePayload(vm, address(proposal)); + + assertEq( + IERC20(AaveV3OptimismAssets.sUSD_UNDERLYING).allowance( + address(AaveV3Optimism.COLLECTOR), + MiscOptimism.AFC_SAFE + ), + proposal.SUSD_AMOUNT() + ); + + vm.startPrank(MiscOptimism.AFC_SAFE); + IERC20(AaveV3OptimismAssets.sUSD_UNDERLYING).transferFrom( + address(AaveV3Optimism.COLLECTOR), + MiscOptimism.AFC_SAFE, + proposal.SUSD_AMOUNT() + ); + vm.stopPrank(); + } + + function test_bridges() public { + uint256 wethCollectorBalanceBefore = IERC20(AaveV3OptimismAssets.WETH_UNDERLYING).balanceOf( + address(AaveV3Optimism.COLLECTOR) + ); + + assertGt(wethCollectorBalanceBefore, 0); + + vm.expectEmit(true, true, true, true, MiscOptimism.AAVE_OPT_ETH_BRIDGE); + emit Bridge(AaveV3OptimismAssets.WETH_UNDERLYING, wethCollectorBalanceBefore); + + executePayload(vm, address(proposal)); + + uint256 wethCollectorBalanceAfter = IERC20(AaveV3OptimismAssets.WETH_UNDERLYING).balanceOf( + address(AaveV3Optimism.COLLECTOR) + ); + + assertEq(wethCollectorBalanceAfter, 0); + } +} diff --git a/src/20251110_Multi_NovemberFundingUpdate/AaveV3Polygon_NovemberFundingUpdate_20251110.sol b/src/20251110_Multi_NovemberFundingUpdate/AaveV3Polygon_NovemberFundingUpdate_20251110.sol new file mode 100644 index 000000000..a93d681b0 --- /dev/null +++ b/src/20251110_Multi_NovemberFundingUpdate/AaveV3Polygon_NovemberFundingUpdate_20251110.sol @@ -0,0 +1,117 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from 'openzeppelin-contracts/contracts/token/ERC20/IERC20.sol'; +import {AaveV3Polygon, AaveV3PolygonAssets} from 'aave-address-book/AaveV3Polygon.sol'; +import {MiscPolygon} from 'aave-address-book/MiscPolygon.sol'; +import {IAavePolEthERC20Bridge} from 'aave-helpers/src/bridges/polygon/IAavePolEthERC20Bridge.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; + +/** + * @title November Funding Update + * @author TokenLogic + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/direct-to-aip-november-2025-funding-update/23339 + */ +contract AaveV3Polygon_NovemberFundingUpdate_20251110 is IProposalGenericExecutor { + uint256 public constant USDC_AMOUNT = 130_000e6; + uint256 public constant USDT_AMOUNT = 220_000e6; + uint256 public constant WPOL_AMOUNT = 135_000 ether; + + function execute() external { + _approvals(); + _bridges(); + } + + function _approvals() internal { + AaveV3Polygon.COLLECTOR.approve( + IERC20(AaveV3PolygonAssets.USDCn_UNDERLYING), + MiscPolygon.AFC_SAFE, + USDC_AMOUNT + ); + + AaveV3Polygon.COLLECTOR.approve( + IERC20(AaveV3PolygonAssets.USDT0_UNDERLYING), + MiscPolygon.AFC_SAFE, + USDT_AMOUNT + ); + + AaveV3Polygon.COLLECTOR.approve( + IERC20(AaveV3PolygonAssets.WPOL_UNDERLYING), + MiscPolygon.AFC_SAFE, + WPOL_AMOUNT + ); + } + + function _bridges() internal { + // DAI + uint256 daiBalance = IERC20(AaveV3PolygonAssets.DAI_UNDERLYING).balanceOf( + address(AaveV3Polygon.COLLECTOR) + ); + AaveV3Polygon.COLLECTOR.transfer( + IERC20(AaveV3PolygonAssets.DAI_UNDERLYING), + MiscPolygon.AAVE_POL_ETH_BRIDGE, + daiBalance + ); + IAavePolEthERC20Bridge(MiscPolygon.AAVE_POL_ETH_BRIDGE).bridge( + AaveV3PolygonAssets.DAI_UNDERLYING, + daiBalance + ); + + // USDC + uint256 usdcBalance = IERC20(AaveV3PolygonAssets.USDC_UNDERLYING).balanceOf( + address(AaveV3Polygon.COLLECTOR) + ); + AaveV3Polygon.COLLECTOR.transfer( + IERC20(AaveV3PolygonAssets.USDC_UNDERLYING), + MiscPolygon.AAVE_POL_ETH_BRIDGE, + usdcBalance + ); + IAavePolEthERC20Bridge(MiscPolygon.AAVE_POL_ETH_BRIDGE).bridge( + AaveV3PolygonAssets.USDC_UNDERLYING, + usdcBalance + ); + + /// WBTC + uint256 wbtcBalance = IERC20(AaveV3PolygonAssets.WBTC_UNDERLYING).balanceOf( + address(AaveV3Polygon.COLLECTOR) + ); + AaveV3Polygon.COLLECTOR.transfer( + IERC20(AaveV3PolygonAssets.WBTC_UNDERLYING), + MiscPolygon.AAVE_POL_ETH_BRIDGE, + wbtcBalance + ); + IAavePolEthERC20Bridge(MiscPolygon.AAVE_POL_ETH_BRIDGE).bridge( + AaveV3PolygonAssets.WBTC_UNDERLYING, + wbtcBalance + ); + + /// WETH + uint256 wethBalance = IERC20(AaveV3PolygonAssets.WETH_UNDERLYING).balanceOf( + address(AaveV3Polygon.COLLECTOR) + ); + AaveV3Polygon.COLLECTOR.transfer( + IERC20(AaveV3PolygonAssets.WETH_UNDERLYING), + MiscPolygon.AAVE_POL_ETH_BRIDGE, + wethBalance + ); + IAavePolEthERC20Bridge(MiscPolygon.AAVE_POL_ETH_BRIDGE).bridge( + AaveV3PolygonAssets.WETH_UNDERLYING, + wethBalance + ); + + /// AAVE + uint256 aaveBalance = IERC20(AaveV3PolygonAssets.AAVE_UNDERLYING).balanceOf( + address(AaveV3Polygon.COLLECTOR) + ); + AaveV3Polygon.COLLECTOR.transfer( + IERC20(AaveV3PolygonAssets.AAVE_UNDERLYING), + MiscPolygon.AAVE_POL_ETH_BRIDGE, + aaveBalance + ); + IAavePolEthERC20Bridge(MiscPolygon.AAVE_POL_ETH_BRIDGE).bridge( + AaveV3PolygonAssets.AAVE_UNDERLYING, + aaveBalance + ); + } +} diff --git a/src/20251110_Multi_NovemberFundingUpdate/AaveV3Polygon_NovemberFundingUpdate_20251110.t.sol b/src/20251110_Multi_NovemberFundingUpdate/AaveV3Polygon_NovemberFundingUpdate_20251110.t.sol new file mode 100644 index 000000000..bc8c19caf --- /dev/null +++ b/src/20251110_Multi_NovemberFundingUpdate/AaveV3Polygon_NovemberFundingUpdate_20251110.t.sol @@ -0,0 +1,172 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from 'openzeppelin-contracts/contracts/token/ERC20/IERC20.sol'; +import {AaveV3Polygon, AaveV3PolygonAssets} from 'aave-address-book/AaveV3Polygon.sol'; +import {MiscPolygon} from 'aave-address-book/MiscPolygon.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Polygon_NovemberFundingUpdate_20251110} from './AaveV3Polygon_NovemberFundingUpdate_20251110.sol'; + +/** + * @dev Test for AaveV3Polygon_NovemberFundingUpdate_20251110 + * command: FOUNDRY_PROFILE=test forge test --match-path=src/20251110_Multi_NovemberFundingUpdate/AaveV3Polygon_NovemberFundingUpdate_20251110.t.sol -vv + */ +contract AaveV3Polygon_NovemberFundingUpdate_20251110_Test is ProtocolV3TestBase { + event Bridge(address token, uint256 amount); + + AaveV3Polygon_NovemberFundingUpdate_20251110 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('polygon'), 78847011); + proposal = new AaveV3Polygon_NovemberFundingUpdate_20251110(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Polygon_NovemberFundingUpdate_20251110', + AaveV3Polygon.POOL, + address(proposal) + ); + } + + function test_approvals() public { + assertEq( + IERC20(AaveV3PolygonAssets.USDCn_UNDERLYING).allowance( + address(AaveV3Polygon.COLLECTOR), + MiscPolygon.AFC_SAFE + ), + 0 + ); + + assertEq( + IERC20(AaveV3PolygonAssets.USDT0_UNDERLYING).allowance( + address(AaveV3Polygon.COLLECTOR), + MiscPolygon.AFC_SAFE + ), + 0 + ); + + assertEq( + IERC20(AaveV3PolygonAssets.WPOL_UNDERLYING).allowance( + address(AaveV3Polygon.COLLECTOR), + MiscPolygon.AFC_SAFE + ), + 0 + ); + + executePayload(vm, address(proposal)); + + assertEq( + IERC20(AaveV3PolygonAssets.USDCn_UNDERLYING).allowance( + address(AaveV3Polygon.COLLECTOR), + MiscPolygon.AFC_SAFE + ), + proposal.USDC_AMOUNT() + ); + + assertEq( + IERC20(AaveV3PolygonAssets.USDT0_UNDERLYING).allowance( + address(AaveV3Polygon.COLLECTOR), + MiscPolygon.AFC_SAFE + ), + proposal.USDT_AMOUNT() + ); + + assertEq( + IERC20(AaveV3PolygonAssets.WPOL_UNDERLYING).allowance( + address(AaveV3Polygon.COLLECTOR), + MiscPolygon.AFC_SAFE + ), + proposal.WPOL_AMOUNT() + ); + + vm.startPrank(MiscPolygon.AFC_SAFE); + IERC20(AaveV3PolygonAssets.USDCn_UNDERLYING).transferFrom( + address(AaveV3Polygon.COLLECTOR), + MiscPolygon.AFC_SAFE, + proposal.USDC_AMOUNT() + ); + + IERC20(AaveV3PolygonAssets.USDT0_UNDERLYING).transferFrom( + address(AaveV3Polygon.COLLECTOR), + MiscPolygon.AFC_SAFE, + proposal.USDT_AMOUNT() + ); + + IERC20(AaveV3PolygonAssets.WPOL_UNDERLYING).transferFrom( + address(AaveV3Polygon.COLLECTOR), + MiscPolygon.AFC_SAFE, + proposal.WPOL_AMOUNT() + ); + vm.stopPrank(); + } + + function test_bridges() public { + uint256 daiCollectorBalanceBefore = IERC20(AaveV3PolygonAssets.DAI_UNDERLYING).balanceOf( + address(AaveV3Polygon.COLLECTOR) + ); + + uint256 usdcCollectorBalanceBefore = IERC20(AaveV3PolygonAssets.USDC_UNDERLYING).balanceOf( + address(AaveV3Polygon.COLLECTOR) + ); + + uint256 wbtcCollectorBalanceBefore = IERC20(AaveV3PolygonAssets.WBTC_UNDERLYING).balanceOf( + address(AaveV3Polygon.COLLECTOR) + ); + + uint256 wethCollectorBalanceBefore = IERC20(AaveV3PolygonAssets.WETH_UNDERLYING).balanceOf( + address(AaveV3Polygon.COLLECTOR) + ); + + uint256 aaveCollectorBalanceBefore = IERC20(AaveV3PolygonAssets.AAVE_UNDERLYING).balanceOf( + address(AaveV3Polygon.COLLECTOR) + ); + + assertGt(daiCollectorBalanceBefore, 0); + assertGt(usdcCollectorBalanceBefore, 0); + assertGt(wbtcCollectorBalanceBefore, 0); + assertGt(wethCollectorBalanceBefore, 0); + assertGt(aaveCollectorBalanceBefore, 0); + + vm.expectEmit(true, true, true, true, MiscPolygon.AAVE_POL_ETH_BRIDGE); + emit Bridge(AaveV3PolygonAssets.DAI_UNDERLYING, daiCollectorBalanceBefore); + vm.expectEmit(true, true, true, true, MiscPolygon.AAVE_POL_ETH_BRIDGE); + emit Bridge(AaveV3PolygonAssets.USDC_UNDERLYING, usdcCollectorBalanceBefore); + vm.expectEmit(true, true, true, true, MiscPolygon.AAVE_POL_ETH_BRIDGE); + emit Bridge(AaveV3PolygonAssets.WBTC_UNDERLYING, wbtcCollectorBalanceBefore); + vm.expectEmit(true, true, true, true, MiscPolygon.AAVE_POL_ETH_BRIDGE); + emit Bridge(AaveV3PolygonAssets.WETH_UNDERLYING, wethCollectorBalanceBefore); + vm.expectEmit(true, true, true, true, MiscPolygon.AAVE_POL_ETH_BRIDGE); + emit Bridge(AaveV3PolygonAssets.AAVE_UNDERLYING, aaveCollectorBalanceBefore); + + executePayload(vm, address(proposal)); + + assertEq( + IERC20(AaveV3PolygonAssets.DAI_UNDERLYING).balanceOf(address(AaveV3Polygon.COLLECTOR)), + 0 + ); + + assertEq( + IERC20(AaveV3PolygonAssets.USDC_UNDERLYING).balanceOf(address(AaveV3Polygon.COLLECTOR)), + 0 + ); + + assertEq( + IERC20(AaveV3PolygonAssets.WBTC_UNDERLYING).balanceOf(address(AaveV3Polygon.COLLECTOR)), + 0 + ); + + assertEq( + IERC20(AaveV3PolygonAssets.WETH_UNDERLYING).balanceOf(address(AaveV3Polygon.COLLECTOR)), + 0 + ); + + assertEq( + IERC20(AaveV3PolygonAssets.AAVE_UNDERLYING).balanceOf(address(AaveV3Polygon.COLLECTOR)), + 0 + ); + } +} diff --git a/src/20251110_Multi_NovemberFundingUpdate/AaveV3Sonic_NovemberFundingUpdate_20251110.sol b/src/20251110_Multi_NovemberFundingUpdate/AaveV3Sonic_NovemberFundingUpdate_20251110.sol new file mode 100644 index 000000000..78d9edc11 --- /dev/null +++ b/src/20251110_Multi_NovemberFundingUpdate/AaveV3Sonic_NovemberFundingUpdate_20251110.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from 'openzeppelin-contracts/contracts/token/ERC20/IERC20.sol'; +import {AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV3Sonic, AaveV3SonicAssets} from 'aave-address-book/AaveV3Sonic.sol'; +import {MiscSonic} from 'aave-address-book/MiscSonic.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; + +/** + * @title November Funding Update + * @author TokenLogic + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/direct-to-aip-november-2025-funding-update/23339 + */ +contract AaveV3Sonic_NovemberFundingUpdate_20251110 is IProposalGenericExecutor { + uint256 public constant WETH_AMOUNT = 12 ether; + + function execute() external { + AaveV3Sonic.COLLECTOR.approve( + IERC20(AaveV3SonicAssets.WETH_UNDERLYING), + MiscSonic.AFC_SAFE, + WETH_AMOUNT + ); + } +} diff --git a/src/20251110_Multi_NovemberFundingUpdate/AaveV3Sonic_NovemberFundingUpdate_20251110.t.sol b/src/20251110_Multi_NovemberFundingUpdate/AaveV3Sonic_NovemberFundingUpdate_20251110.t.sol new file mode 100644 index 000000000..6e730e6f8 --- /dev/null +++ b/src/20251110_Multi_NovemberFundingUpdate/AaveV3Sonic_NovemberFundingUpdate_20251110.t.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from 'openzeppelin-contracts/contracts/token/ERC20/IERC20.sol'; +import {AaveV3Sonic, AaveV3SonicAssets} from 'aave-address-book/AaveV3Sonic.sol'; +import {MiscSonic} from 'aave-address-book/MiscSonic.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Sonic_NovemberFundingUpdate_20251110} from './AaveV3Sonic_NovemberFundingUpdate_20251110.sol'; + +/** + * @dev Test for AaveV3Sonic_NovemberFundingUpdate_20251110 + * command: FOUNDRY_PROFILE=test forge test --match-path=src/20251110_Multi_NovemberFundingUpdate/AaveV3Sonic_NovemberFundingUpdate_20251110.t.sol -vv + */ +contract AaveV3Sonic_NovemberFundingUpdate_20251110_Test is ProtocolV3TestBase { + AaveV3Sonic_NovemberFundingUpdate_20251110 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('sonic'), 54766988); + proposal = new AaveV3Sonic_NovemberFundingUpdate_20251110(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest('AaveV3Sonic_NovemberFundingUpdate_20251110', AaveV3Sonic.POOL, address(proposal)); + } + + function test_approvals() public { + assertEq( + IERC20(AaveV3SonicAssets.WETH_UNDERLYING).allowance( + address(AaveV3Sonic.COLLECTOR), + MiscSonic.AFC_SAFE + ), + 0 + ); + + executePayload(vm, address(proposal)); + + assertEq( + IERC20(AaveV3SonicAssets.WETH_UNDERLYING).allowance( + address(AaveV3Sonic.COLLECTOR), + MiscSonic.AFC_SAFE + ), + proposal.WETH_AMOUNT() + ); + + vm.startPrank(MiscSonic.AFC_SAFE); + IERC20(AaveV3SonicAssets.WETH_UNDERLYING).transferFrom( + address(AaveV3Sonic.COLLECTOR), + MiscSonic.AFC_SAFE, + proposal.WETH_AMOUNT() + ); + vm.stopPrank(); + } +} diff --git a/src/20251110_Multi_NovemberFundingUpdate/NovemberFundingUpdate.md b/src/20251110_Multi_NovemberFundingUpdate/NovemberFundingUpdate.md new file mode 100644 index 000000000..650e6cca9 --- /dev/null +++ b/src/20251110_Multi_NovemberFundingUpdate/NovemberFundingUpdate.md @@ -0,0 +1,122 @@ +--- +title: "November Funding Update" +author: "TokenLogic" +discussions: "https://governance.aave.com/t/direct-to-aip-november-2025-funding-update/23339" +--- + +## Simple Summary + +This publication presents the November Funding Update, consisting of the following key activities: + +- Bridge funds to Ethereum; +- Aquire GHO to support runway; +- Consolidate asset holdings; and, +- Create Allowances to support Operations. + +## Motivation + +This publication balances near term operational needs, consolidates assets holdings and extends some Allowances to the MainnetSwapSteward to support optimising the DAOs stablecoin holdings. + +Fund Ongoing Initiatives +As with every funding update, our goal is to ensure that all ongoing initiatives and service provider streams remain adequately funded. Since most activities have now transitioned to GHO, specifically aEthLidoGHO, this update focuses on maintaining sufficient liquidity within the Prime instance. + +To meet upcoming funding requirements, we plan to repurchase 8 million GHO from the market over the next month and deposit it into the Prime instance. This allocation will support existing streams, including ACI, TokenLogic, ALC, Chaos Labs, and LlamaRisk, as well as the upcoming renewal of Certora and BGD contracts, the continuation of the Merit initiative and the payment for Aave v4 audits. + +Bridge Assets to Ethereum +For this cycle, funds held across several networks will be bridged back to Ethereum to continue supporting the DAO’s operational needs. Some assets will be swapped on the respective network prior to being bridged by the AFC, such as sUSD on Optimism.Once received on Ethereum, all assets will be deposited into the Aave Protocol to generate yield and ensure efficient treasury management. + +## Specification + +#### Bridge Assets to Ethereum + +Transfer the following assets to Ethereum via AIP using the bridge adapter contracts. + +| Polygon | Optimism | +| ------- | -------- | +| DAI | wETH | +| USDC.e | | +| WBTC | | +| WETH | | +| AAVE | | + +#### Approvals + +_Polygon_ + +Amount: 130,000 USDCn +Amount: 230,000 USDT +Amount: 135,000 wMATIC +Spender: AFC `0x22740deBa78d5a0c24C58C740e3715ec29de1bFa` +Method: `approve()` above assets on the Aave Collector contract to the AFC address + +_Binance_ + +Amount: 123,000 USDC +Amount: 323,000 USDT +Amount: 27 WETH +Spender: AFC `0x22740deBa78d5a0c24C58C740e3715ec29de1bFa` +Method: `approve()` above assets on the Aave Collector contract to the AFC address + +_Metis_ + +Amount: 58.000 m.USDC +Amount: 55,000 m.USDT +Amount: 19,000 m.DAI +Spender: AFC `0x22740deBa78d5a0c24C58C740e3715ec29de1bFa` +Method: `approve()` above assets on the Aave Collector contract to the AFC address + +_Sonic_ + +Amount: 12 WETH +Spender: AFC `0x22740deBa78d5a0c24C58C740e3715ec29de1bFa` +Method: `approve()` above assets on the Aave Collector contract to the AFC address + +_Optimism_ +To be swapped to USDC, bridged from Optimism to Ethereum and sent to the treasury. + +Amount: 105,000 sUSD +Spender: AFC `0x22740deBa78d5a0c24C58C740e3715ec29de1bFa` +Method: `approve()` above assets on the Aave Collector contract to the AFC address) + +#### Fund Ongoing Initiatives + +_Runway_ + +Amount: 200k SYND +Amount: All SPK +Amount: All SAFE +Amount: All POL +Spender: AFC SAFE `0x22740deBa78d5a0c24C58C740e3715ec29de1bFa` + +_Aave v4 Security Audits_ + +Asset: aEthLidoGHO +Amount: 1.5M +Spender: v4 Audits `0xAAf400e4Bbc38B5E2136C1a36946Bf841A357307` +Method: `approve()` aEthLidoGHO on the Aave Collector contract to the Aave v4 Audits address + +_Reimbursements_ + +Asset: aEthLidoGHO +Amount: 71,698,000 +Spender: TokenLogic `0xAA088dfF3dcF619664094945028d44E779F19894` +Method: `approve()` aEthLidoGHO on the Aave Collector contract to the TokenLogic address. + +_Ecosystem Reserve_ + +Send all AAVE on the collector to the Ecosystem Reserve. + +_Swaps_ + +Approve stablecoins to be swapped to `pyUSD` and `rlUSD`. + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20251110_Multi_NovemberFundingUpdate/AaveV3Ethereum_NovemberFundingUpdate_20251110.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20251110_Multi_NovemberFundingUpdate/AaveV3Polygon_NovemberFundingUpdate_20251110.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20251110_Multi_NovemberFundingUpdate/AaveV3Optimism_NovemberFundingUpdate_20251110.sol), [AaveV3Metis](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20251110_Multi_NovemberFundingUpdate/AaveV3Metis_NovemberFundingUpdate_20251110.sol), [AaveV3BNB](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20251110_Multi_NovemberFundingUpdate/AaveV3BNB_NovemberFundingUpdate_20251110.sol), [AaveV3Sonic](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20251110_Multi_NovemberFundingUpdate/AaveV3Sonic_NovemberFundingUpdate_20251110.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20251110_Multi_NovemberFundingUpdate/AaveV3Ethereum_NovemberFundingUpdate_20251110.t.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20251110_Multi_NovemberFundingUpdate/AaveV3Polygon_NovemberFundingUpdate_20251110.t.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20251110_Multi_NovemberFundingUpdate/AaveV3Optimism_NovemberFundingUpdate_20251110.t.sol), [AaveV3Metis](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20251110_Multi_NovemberFundingUpdate/AaveV3Metis_NovemberFundingUpdate_20251110.t.sol), [AaveV3BNB](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20251110_Multi_NovemberFundingUpdate/AaveV3BNB_NovemberFundingUpdate_20251110.t.sol), [AaveV3Sonic](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20251110_Multi_NovemberFundingUpdate/AaveV3Sonic_NovemberFundingUpdate_20251110.t.sol) +- Snapshot: Direct-to-AIP +- [Discussion](https://governance.aave.com/t/direct-to-aip-november-2025-funding-update/23339) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20251110_Multi_NovemberFundingUpdate/NovemberFundingUpdate_20251110.s.sol b/src/20251110_Multi_NovemberFundingUpdate/NovemberFundingUpdate_20251110.s.sol new file mode 100644 index 000000000..036f1f2af --- /dev/null +++ b/src/20251110_Multi_NovemberFundingUpdate/NovemberFundingUpdate_20251110.s.sol @@ -0,0 +1,223 @@ +// 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, MetisScript, BNBScript, SonicScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Ethereum_NovemberFundingUpdate_20251110} from './AaveV3Ethereum_NovemberFundingUpdate_20251110.sol'; +import {AaveV3Polygon_NovemberFundingUpdate_20251110} from './AaveV3Polygon_NovemberFundingUpdate_20251110.sol'; +import {AaveV3Optimism_NovemberFundingUpdate_20251110} from './AaveV3Optimism_NovemberFundingUpdate_20251110.sol'; +import {AaveV3Metis_NovemberFundingUpdate_20251110} from './AaveV3Metis_NovemberFundingUpdate_20251110.sol'; +import {AaveV3BNB_NovemberFundingUpdate_20251110} from './AaveV3BNB_NovemberFundingUpdate_20251110.sol'; +import {AaveV3Sonic_NovemberFundingUpdate_20251110} from './AaveV3Sonic_NovemberFundingUpdate_20251110.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20251110_Multi_NovemberFundingUpdate/NovemberFundingUpdate_20251110.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=deploy npx catapulta-verify -b broadcast/NovemberFundingUpdate_20251110.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_NovemberFundingUpdate_20251110).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/20251110_Multi_NovemberFundingUpdate/NovemberFundingUpdate_20251110.s.sol:DeployPolygon chain=polygon + * verify-command: FOUNDRY_PROFILE=deploy npx catapulta-verify -b broadcast/NovemberFundingUpdate_20251110.s.sol/137/run-latest.json + */ +contract DeployPolygon is PolygonScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Polygon_NovemberFundingUpdate_20251110).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/20251110_Multi_NovemberFundingUpdate/NovemberFundingUpdate_20251110.s.sol:DeployOptimism chain=optimism + * verify-command: FOUNDRY_PROFILE=deploy npx catapulta-verify -b broadcast/NovemberFundingUpdate_20251110.s.sol/10/run-latest.json + */ +contract DeployOptimism is OptimismScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Optimism_NovemberFundingUpdate_20251110).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/20251110_Multi_NovemberFundingUpdate/NovemberFundingUpdate_20251110.s.sol:DeployMetis chain=metis + * verify-command: FOUNDRY_PROFILE=deploy npx catapulta-verify -b broadcast/NovemberFundingUpdate_20251110.s.sol/1088/run-latest.json + */ +contract DeployMetis is MetisScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Metis_NovemberFundingUpdate_20251110).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/20251110_Multi_NovemberFundingUpdate/NovemberFundingUpdate_20251110.s.sol:DeployBNB chain=bnb + * verify-command: FOUNDRY_PROFILE=deploy npx catapulta-verify -b broadcast/NovemberFundingUpdate_20251110.s.sol/56/run-latest.json + */ +contract DeployBNB is BNBScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3BNB_NovemberFundingUpdate_20251110).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 Sonic + * deploy-command: make deploy-ledger contract=src/20251110_Multi_NovemberFundingUpdate/NovemberFundingUpdate_20251110.s.sol:DeploySonic chain=sonic + * verify-command: FOUNDRY_PROFILE=deploy npx catapulta-verify -b broadcast/NovemberFundingUpdate_20251110.s.sol/146/run-latest.json + */ +contract DeploySonic is SonicScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Sonic_NovemberFundingUpdate_20251110).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/20251110_Multi_NovemberFundingUpdate/NovemberFundingUpdate_20251110.s.sol:CreateProposal chain=mainnet + */ +contract CreateProposal is EthereumScript { + function run() external { + // create payloads + PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](6); + + // compose actions for validation + { + IPayloadsControllerCore.ExecutionAction[] + memory actionsEthereum = new IPayloadsControllerCore.ExecutionAction[](1); + actionsEthereum[0] = GovV3Helpers.buildAction( + type(AaveV3Ethereum_NovemberFundingUpdate_20251110).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + } + + { + IPayloadsControllerCore.ExecutionAction[] + memory actionsPolygon = new IPayloadsControllerCore.ExecutionAction[](1); + actionsPolygon[0] = GovV3Helpers.buildAction( + type(AaveV3Polygon_NovemberFundingUpdate_20251110).creationCode + ); + payloads[1] = GovV3Helpers.buildPolygonPayload(vm, actionsPolygon); + } + + { + IPayloadsControllerCore.ExecutionAction[] + memory actionsOptimism = new IPayloadsControllerCore.ExecutionAction[](1); + actionsOptimism[0] = GovV3Helpers.buildAction( + type(AaveV3Optimism_NovemberFundingUpdate_20251110).creationCode + ); + payloads[2] = GovV3Helpers.buildOptimismPayload(vm, actionsOptimism); + } + + { + IPayloadsControllerCore.ExecutionAction[] + memory actionsMetis = new IPayloadsControllerCore.ExecutionAction[](1); + actionsMetis[0] = GovV3Helpers.buildAction( + type(AaveV3Metis_NovemberFundingUpdate_20251110).creationCode + ); + payloads[3] = GovV3Helpers.buildMetisPayload(vm, actionsMetis); + } + + { + IPayloadsControllerCore.ExecutionAction[] + memory actionsBNB = new IPayloadsControllerCore.ExecutionAction[](1); + actionsBNB[0] = GovV3Helpers.buildAction( + type(AaveV3BNB_NovemberFundingUpdate_20251110).creationCode + ); + payloads[4] = GovV3Helpers.buildBNBPayload(vm, actionsBNB); + } + + { + IPayloadsControllerCore.ExecutionAction[] + memory actionsSonic = new IPayloadsControllerCore.ExecutionAction[](1); + actionsSonic[0] = GovV3Helpers.buildAction( + type(AaveV3Sonic_NovemberFundingUpdate_20251110).creationCode + ); + payloads[5] = GovV3Helpers.buildSonicPayload(vm, actionsSonic); + } + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_AVAX, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20251110_Multi_NovemberFundingUpdate/NovemberFundingUpdate.md' + ) + ); + } +} diff --git a/src/20251110_Multi_NovemberFundingUpdate/config.ts b/src/20251110_Multi_NovemberFundingUpdate/config.ts new file mode 100644 index 000000000..06648151e --- /dev/null +++ b/src/20251110_Multi_NovemberFundingUpdate/config.ts @@ -0,0 +1,28 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: [ + 'AaveV3Ethereum', + 'AaveV3Polygon', + 'AaveV3Optimism', + 'AaveV3Metis', + 'AaveV3BNB', + 'AaveV3Sonic', + ], + title: 'November Funding Update', + shortName: 'NovemberFundingUpdate', + date: '20251110', + author: 'TokenLogic', + discussion: 'https://governance.aave.com/t/direct-to-aip-november-2025-funding-update/23339', + snapshot: 'Direct-to-AIP', + votingNetwork: 'AVALANCHE', + }, + poolOptions: { + AaveV3Ethereum: {configs: {OTHERS: {}}, cache: {blockNumber: 23770613}}, + AaveV3Polygon: {configs: {OTHERS: {}}, cache: {blockNumber: 78847011}}, + AaveV3Optimism: {configs: {OTHERS: {}}, cache: {blockNumber: 143600066}}, + AaveV3Metis: {configs: {OTHERS: {}}, cache: {blockNumber: 21606204}}, + AaveV3BNB: {configs: {OTHERS: {}}, cache: {blockNumber: 67730544}}, + AaveV3Sonic: {configs: {OTHERS: {}}, cache: {blockNumber: 54766988}}, + }, +}; From d4118c9598d2e70f350ca87c989409b78c0bc1d9 Mon Sep 17 00:00:00 2001 From: efecarranza Date: Wed, 12 Nov 2025 15:49:16 -0300 Subject: [PATCH 2/2] feat: add tests and fixes --- ...um_NovemberFundingUpdate_20251110_after.md | 172 ++++++++++++ ...veV3BNB_NovemberFundingUpdate_20251110.sol | 1 - ...thereum_NovemberFundingUpdate_20251110.sol | 55 +++- ...ereum_NovemberFundingUpdate_20251110.t.sol | 265 +++++++++++++++++- ...ptimism_NovemberFundingUpdate_20251110.sol | 2 +- ...Polygon_NovemberFundingUpdate_20251110.sol | 2 +- ...V3Sonic_NovemberFundingUpdate_20251110.sol | 1 - .../NovemberFundingUpdate.md | 18 +- .../NovemberFundingUpdate_20251110.s.sol | 40 +-- 9 files changed, 504 insertions(+), 52 deletions(-) create mode 100644 diffs/AaveV3Ethereum_NovemberFundingUpdate_20251110_before_AaveV3Ethereum_NovemberFundingUpdate_20251110_after.md diff --git a/diffs/AaveV3Ethereum_NovemberFundingUpdate_20251110_before_AaveV3Ethereum_NovemberFundingUpdate_20251110_after.md b/diffs/AaveV3Ethereum_NovemberFundingUpdate_20251110_before_AaveV3Ethereum_NovemberFundingUpdate_20251110_after.md new file mode 100644 index 000000000..202fbaf19 --- /dev/null +++ b/diffs/AaveV3Ethereum_NovemberFundingUpdate_20251110_before_AaveV3Ethereum_NovemberFundingUpdate_20251110_after.md @@ -0,0 +1,172 @@ +## Raw diff + +```json +{ + "raw": { + "0x18efe565a5373f430e2f809b97de30335b3ad96a": { + "label": "AaveV3EthereumLido.ASSETS.GHO.A_TOKEN", + "balanceDiff": null, + "stateDiff": { + "0x3911990350576792b37c6c85e18a679e2335f9d47b7bb4eaa2c98f053978da61": { + "previousValue": "0x0000000000000000000000000000000000000000000000000de0b6b3a736393f", + "newValue": "0x000000000000000000000000000000000000000000027b46536c66c8e3000000" + }, + "0x493d2772c10074adc67c1bfa0c3368974258a53496fca44a66d496d39b008307": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000000000000000000000013da329b6336471800000" + }, + "0xaf64e0677d2cd0fbb2684524612bdc1bb6ace133e9dcf5b09e70b33dd6b72262": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000000000000000000000000f2ec1a157b725080000" + } + } + }, + "0x1bab804803159ad84b8854581aa53ac72455614e": { + "label": null, + "balanceDiff": null, + "stateDiff": { + "0x1d3752e906bd35d7dfefd5e8086064fad83192c9757512d068e6cf9fd1352eba": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000000000000000000000002a5a058fc295ed000000" + } + } + }, + "0x455e53cbb86018ac2b8092fdcd39d8444affc3f6": { + "label": null, + "balanceDiff": null, + "stateDiff": { + "0x1d3752e906bd35d7dfefd5e8086064fad83192c9757512d068e6cf9fd1352eba": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000000000000000000000006868beebf0cd5ab5bcad" + } + } + }, + "0x5afe3855358e112b5647b952709e6165e1c1eeee": { + "label": null, + "balanceDiff": null, + "stateDiff": { + "0x1d3752e906bd35d7dfefd5e8086064fad83192c9757512d068e6cf9fd1352eba": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x00000000000000000000000000000000000000000000011c3cdd8b2c0d022110" + } + } + }, + "0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9": { + "label": "AaveV2Ethereum.ASSETS.AAVE.UNDERLYING, AaveV2EthereumArc.ASSETS.AAVE.UNDERLYING, AaveV3Ethereum.ASSETS.AAVE.UNDERLYING", + "balanceDiff": null, + "stateDiff": { + "0x495a957a79652a5e0fd2a854635df04aeb86fb136127eba37ff9c7b5a260662d": { + "previousValue": "0x0000000000000000000000000000000000000000000002e7b2a25d0c694ea8f9", + "newValue": "0x00000000000000000000000000000000000000000000034a5c354246743309f9" + }, + "0x4aede0a4429093ac1f64f523c180bcf8485d339a34f665e9c638e9e941c7af2c": { + "previousValue": "0x0000000000000000000000000000000000000000000000000001ba51789ca247", + "newValue": "0x0000000000000000000000000000000000000000000000c5532784c58e77d947" + }, + "0xc6d01de327502f6e2c06b8b0eb44b2df34350516a43aa488022a3f7868979e16": { + "previousValue": "0x000000000000000000000000000000000000000000000006895e5c176c9a208c", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + "0xdba270cf93144f932c5cf40be05bbb7dcf1791658c8f00c49e3eee4a7c37a843": { + "previousValue": "0x0000000000003d31f61400000000003d31f6140000005a6d84b8325c1d238c85", + "newValue": "0x0000000000003d31f61400000000003d31f6140000005a740e168e7389bdad11" + } + } + }, + "0xb7d402138cb01bfe97d95181c849379d6ad14d19": { + "label": null, + "balanceDiff": null, + "stateDiff": { + "0x011ae25d881084f93cca01fbd98bce897920a887d6583e56d0db3bbc0420dc63": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0x23df7526b864cce7cc3133ec114f8b6017e625d5a50f62c4ac052634c992df99": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0x2895a1fdcf09d8ec8ffd2ba6dbc9568cd9ec6ef91e1d52137b5a2738c235eefe": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0x405940f752a59194eaf85ee6559bfb22639eb2cac2d8ea3bbf5f487284ef514a": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0x45defed5750d4b4128bf16ddea362805ca0cba5665f38a6d2b9492875714564f": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0x4a904db8532d0fae96fc641976c3ae0600c89e6b8a2ab9d015259e1be2fc246c": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0x5e7b6df9a086df6e076781a6e90c2975aa4bde9ff838a8bf14376fd360230619": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0x5eff22b93f17a55c22b4356bb7ea08910ae8ab81438baddeb2b9d15065a68a60": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0x829c574d23916e2aa87ae99b8da35111601f99e6678cb40fc7275d164b810ad1": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0x866a6b7b12fb90361c316688ceb2f75eb8f4dd5c32a8d02abadb4746e10191f2": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0x88a6077aa199e1b9645d2786c76d4e1323cbc40d18aa24122075ddea9bfcb1ed": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0x8f805c9df90e104ecb62b94d2c9b65ceca53cc6ea0bff8aac397563a95c49430": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0xb857d6b1fdd6ba52140f8ea40487fc7b812801fd40f813bcc9a54eb21f391544": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0xc324636fb12992ce3533626207cdbbd43d9ac4a3e4eb0253fd0df8e0262e825f": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0xc419b2802f7e5fb32fe5c64b14beb8e7399154f85d94368190ae4419712d2c65": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0xc60922bcf5df0fe2c7dbe023ef2cae6474493dde319f6260eb40b8e7d2fe6359": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + } + } + }, + "0xc20059e0317de91738d13af027dfc4a50781b066": { + "label": null, + "balanceDiff": null, + "stateDiff": { + "0x53b3c414708e6bf1403e7bc4b6055c4aeb76e470e2ebe8e79cbd2b9e2fce79de": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000000000000000000000004f94c7ddf0e014e30c00" + } + } + }, + "0xdabad81af85554e9ae636395611c58f7ec1aaec5": { + "label": "GovernanceV3Ethereum.PAYLOADS_CONTROLLER", + "balanceDiff": null, + "stateDiff": { + "0x32e830cc2d99bcd03a6b00de44c079172fc1615142526593da9060da4afbf6cd": { + "previousValue": "0x0069122d2e000000000002000000000000000000000000000000000000000000", + "newValue": "0x0069122d2e000000000003000000000000000000000000000000000000000000" + }, + "0x32e830cc2d99bcd03a6b00de44c079172fc1615142526593da9060da4afbf6ce": { + "previousValue": "0x000000000000000000093a80000000000000694051af00000000000000000000", + "newValue": "0x000000000000000000093a80000000000000694051af00000000000069122d2f" + } + } + } + } +} +``` \ No newline at end of file diff --git a/src/20251110_Multi_NovemberFundingUpdate/AaveV3BNB_NovemberFundingUpdate_20251110.sol b/src/20251110_Multi_NovemberFundingUpdate/AaveV3BNB_NovemberFundingUpdate_20251110.sol index fad365d81..cec3f8ae5 100644 --- a/src/20251110_Multi_NovemberFundingUpdate/AaveV3BNB_NovemberFundingUpdate_20251110.sol +++ b/src/20251110_Multi_NovemberFundingUpdate/AaveV3BNB_NovemberFundingUpdate_20251110.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.0; import {IERC20} from 'openzeppelin-contracts/contracts/token/ERC20/IERC20.sol'; -import {AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; import {AaveV3BNB, AaveV3BNBAssets} from 'aave-address-book/AaveV3BNB.sol'; import {MiscBNB} from 'aave-address-book/MiscBNB.sol'; import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; diff --git a/src/20251110_Multi_NovemberFundingUpdate/AaveV3Ethereum_NovemberFundingUpdate_20251110.sol b/src/20251110_Multi_NovemberFundingUpdate/AaveV3Ethereum_NovemberFundingUpdate_20251110.sol index 8040f3416..233f49dd7 100644 --- a/src/20251110_Multi_NovemberFundingUpdate/AaveV3Ethereum_NovemberFundingUpdate_20251110.sol +++ b/src/20251110_Multi_NovemberFundingUpdate/AaveV3Ethereum_NovemberFundingUpdate_20251110.sol @@ -5,10 +5,10 @@ import {IERC20} from 'openzeppelin-contracts/contracts/token/ERC20/IERC20.sol'; import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; import {AaveV3EthereumLido, AaveV3EthereumLidoAssets} from 'aave-address-book/AaveV3EthereumLido.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'; interface IMainnetSwapSteward { - function increaseTokenBudget(address token, uint256 budget) external; function setSwappablePair(address fromToken, address toToken, bool allowed) external; } @@ -42,6 +42,12 @@ contract AaveV3Ethereum_NovemberFundingUpdate_20251110 is IProposalGenericExecut address public constant TOKEN_LOGIC = 0xAA088dfF3dcF619664094945028d44E779F19894; uint256 public constant REIMBURSEMENTS_GHO_AMOUNT = 71_698 ether; + // stkAAVE + uint128 public constant AAVE_EMISSION_PER_SECOND_STK_AAVE = uint128(260 ether) / 1 days; + + // stkABPT + uint128 public constant AAVE_EMISSION_PER_SECOND_STK_BPT = uint128(130 ether) / 1 days; + function execute() external { _runway(); _v4Audits(); @@ -49,6 +55,7 @@ contract AaveV3Ethereum_NovemberFundingUpdate_20251110 is IProposalGenericExecut _reimbursements(); _ecosystemReserve(); _swapPathsAndBudget(); + _emissionsIncrease(); } function _runway() internal { @@ -190,4 +197,50 @@ contract AaveV3Ethereum_NovemberFundingUpdate_20251110 is IProposalGenericExecut true ); } + + function _emissionsIncrease() internal { + // Excess allowance that has not been claimed + uint256 allowanceToKeep = IERC20(AaveV3EthereumAssets.AAVE_UNDERLYING).allowance( + address(MiscEthereum.ECOSYSTEM_RESERVE), + AaveSafetyModule.STK_AAVE + ); + + uint256 newAllowance = allowanceToKeep + 14 days * AAVE_EMISSION_PER_SECOND_STK_AAVE; + + 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, + newAllowance + ); + + // Excess allowance that has not been claimed + allowanceToKeep = IERC20(AaveV3EthereumAssets.AAVE_UNDERLYING).allowance( + address(MiscEthereum.ECOSYSTEM_RESERVE), + AaveSafetyModule.STK_AAVE_WSTETH_BPTV2 + ); + + newAllowance = allowanceToKeep + 14 days * AAVE_EMISSION_PER_SECOND_STK_BPT; + + MiscEthereum.AAVE_ECOSYSTEM_RESERVE_CONTROLLER.approve( + MiscEthereum.ECOSYSTEM_RESERVE, + AaveV3EthereumAssets.AAVE_UNDERLYING, + AaveSafetyModule.STK_AAVE_WSTETH_BPTV2, + 0 + ); + + MiscEthereum.AAVE_ECOSYSTEM_RESERVE_CONTROLLER.approve( + MiscEthereum.ECOSYSTEM_RESERVE, + AaveV3EthereumAssets.AAVE_UNDERLYING, + AaveSafetyModule.STK_AAVE_WSTETH_BPTV2, + newAllowance + ); + } } diff --git a/src/20251110_Multi_NovemberFundingUpdate/AaveV3Ethereum_NovemberFundingUpdate_20251110.t.sol b/src/20251110_Multi_NovemberFundingUpdate/AaveV3Ethereum_NovemberFundingUpdate_20251110.t.sol index bf3013a88..54fcff920 100644 --- a/src/20251110_Multi_NovemberFundingUpdate/AaveV3Ethereum_NovemberFundingUpdate_20251110.t.sol +++ b/src/20251110_Multi_NovemberFundingUpdate/AaveV3Ethereum_NovemberFundingUpdate_20251110.t.sol @@ -5,9 +5,14 @@ import {IERC20} from 'openzeppelin-contracts/contracts/token/ERC20/IERC20.sol'; import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; import {AaveV3EthereumLido, AaveV3EthereumLidoAssets} from 'aave-address-book/AaveV3EthereumLido.sol'; import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {AaveSafetyModule} from 'aave-address-book/AaveSafetyModule.sol'; import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; import {AaveV3Ethereum_NovemberFundingUpdate_20251110} from './AaveV3Ethereum_NovemberFundingUpdate_20251110.sol'; +interface IMainnetSwapSteward { + function swapApprovedToken(address from, address to) external view returns (bool); +} + /** * @dev Test for AaveV3Ethereum_NovemberFundingUpdate_20251110 * command: FOUNDRY_PROFILE=test forge test --match-path=src/20251110_Multi_NovemberFundingUpdate/AaveV3Ethereum_NovemberFundingUpdate_20251110.t.sol -vv @@ -126,7 +131,8 @@ contract AaveV3Ethereum_NovemberFundingUpdate_20251110_Test is ProtocolV3TestBas address(AaveV3Ethereum.COLLECTOR), MiscEthereum.MERIT_AHAB_SAFE ); - assertEq(allowanceBefore, 0); + + assertApproxEqAbs(allowanceBefore, 0, 1 ether); executePayload(vm, address(proposal)); @@ -135,7 +141,7 @@ contract AaveV3Ethereum_NovemberFundingUpdate_20251110_Test is ProtocolV3TestBas MiscEthereum.MERIT_AHAB_SAFE ); - assertEq(allowanceAfter, allowanceBefore + proposal.MERIT_GHO_AMOUNT()); + assertEq(allowanceAfter, proposal.MERIT_GHO_AMOUNT()); } function test_reimbursements() public { @@ -155,7 +161,258 @@ contract AaveV3Ethereum_NovemberFundingUpdate_20251110_Test is ProtocolV3TestBas assertEq(allowanceAfter, allowanceBefore + proposal.REIMBURSEMENTS_GHO_AMOUNT()); } - function test_ecosystemReserve() public {} + function test_ecosystemReserve() public { + uint256 balance = IERC20(AaveV3EthereumAssets.AAVE_UNDERLYING).balanceOf( + MiscEthereum.ECOSYSTEM_RESERVE + ); + uint256 balanceCollector = IERC20(AaveV3EthereumAssets.AAVE_UNDERLYING).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + + executePayload(vm, address(proposal)); + + uint256 balanceAfter = IERC20(AaveV3EthereumAssets.AAVE_UNDERLYING).balanceOf( + MiscEthereum.ECOSYSTEM_RESERVE + ); + + assertEq( + IERC20(AaveV3EthereumAssets.AAVE_UNDERLYING).balanceOf(address(AaveV3Ethereum.COLLECTOR)), + 0 + ); + assertEq(balanceAfter, balance + balanceCollector); + } + + function test_swapPaths() public { + IMainnetSwapSteward steward = IMainnetSwapSteward(AaveV3Ethereum.COLLECTOR_SWAP_STEWARD); + + // pyUSD + assertFalse( + steward.swapApprovedToken( + AaveV3EthereumAssets.USDC_UNDERLYING, + AaveV3EthereumAssets.PYUSD_UNDERLYING + ) + ); + assertFalse( + steward.swapApprovedToken( + AaveV3EthereumAssets.USDT_UNDERLYING, + AaveV3EthereumAssets.PYUSD_UNDERLYING + ) + ); + assertFalse( + steward.swapApprovedToken( + AaveV3EthereumAssets.GHO_UNDERLYING, + AaveV3EthereumAssets.PYUSD_UNDERLYING + ) + ); + assertFalse( + steward.swapApprovedToken( + AaveV3EthereumAssets.USDS_UNDERLYING, + AaveV3EthereumAssets.PYUSD_UNDERLYING + ) + ); + assertFalse( + steward.swapApprovedToken( + AaveV3EthereumAssets.DAI_UNDERLYING, + AaveV3EthereumAssets.PYUSD_UNDERLYING + ) + ); + assertFalse( + steward.swapApprovedToken( + AaveV3EthereumAssets.LUSD_UNDERLYING, + AaveV3EthereumAssets.PYUSD_UNDERLYING + ) + ); + assertFalse( + steward.swapApprovedToken( + AaveV3EthereumAssets.USDe_UNDERLYING, + AaveV3EthereumAssets.PYUSD_UNDERLYING + ) + ); + assertFalse( + steward.swapApprovedToken( + AaveV3EthereumAssets.RLUSD_UNDERLYING, + AaveV3EthereumAssets.PYUSD_UNDERLYING + ) + ); + + // rlUSD + assertFalse( + steward.swapApprovedToken( + AaveV3EthereumAssets.USDC_UNDERLYING, + AaveV3EthereumAssets.RLUSD_UNDERLYING + ) + ); + assertFalse( + steward.swapApprovedToken( + AaveV3EthereumAssets.USDT_UNDERLYING, + AaveV3EthereumAssets.RLUSD_UNDERLYING + ) + ); + assertFalse( + steward.swapApprovedToken( + AaveV3EthereumAssets.GHO_UNDERLYING, + AaveV3EthereumAssets.RLUSD_UNDERLYING + ) + ); + assertFalse( + steward.swapApprovedToken( + AaveV3EthereumAssets.USDS_UNDERLYING, + AaveV3EthereumAssets.RLUSD_UNDERLYING + ) + ); + assertFalse( + steward.swapApprovedToken( + AaveV3EthereumAssets.DAI_UNDERLYING, + AaveV3EthereumAssets.RLUSD_UNDERLYING + ) + ); + assertFalse( + steward.swapApprovedToken( + AaveV3EthereumAssets.LUSD_UNDERLYING, + AaveV3EthereumAssets.RLUSD_UNDERLYING + ) + ); + assertFalse( + steward.swapApprovedToken( + AaveV3EthereumAssets.USDe_UNDERLYING, + AaveV3EthereumAssets.RLUSD_UNDERLYING + ) + ); + assertFalse( + steward.swapApprovedToken( + AaveV3EthereumAssets.RLUSD_UNDERLYING, + AaveV3EthereumAssets.RLUSD_UNDERLYING + ) + ); + + executePayload(vm, address(proposal)); + + // pyUSD + assertTrue( + steward.swapApprovedToken( + AaveV3EthereumAssets.USDC_UNDERLYING, + AaveV3EthereumAssets.PYUSD_UNDERLYING + ) + ); + assertTrue( + steward.swapApprovedToken( + AaveV3EthereumAssets.USDT_UNDERLYING, + AaveV3EthereumAssets.PYUSD_UNDERLYING + ) + ); + assertTrue( + steward.swapApprovedToken( + AaveV3EthereumAssets.GHO_UNDERLYING, + AaveV3EthereumAssets.PYUSD_UNDERLYING + ) + ); + assertTrue( + steward.swapApprovedToken( + AaveV3EthereumAssets.USDS_UNDERLYING, + AaveV3EthereumAssets.PYUSD_UNDERLYING + ) + ); + assertTrue( + steward.swapApprovedToken( + AaveV3EthereumAssets.DAI_UNDERLYING, + AaveV3EthereumAssets.PYUSD_UNDERLYING + ) + ); + assertTrue( + steward.swapApprovedToken( + AaveV3EthereumAssets.LUSD_UNDERLYING, + AaveV3EthereumAssets.PYUSD_UNDERLYING + ) + ); + assertTrue( + steward.swapApprovedToken( + AaveV3EthereumAssets.USDe_UNDERLYING, + AaveV3EthereumAssets.PYUSD_UNDERLYING + ) + ); + assertTrue( + steward.swapApprovedToken( + AaveV3EthereumAssets.RLUSD_UNDERLYING, + AaveV3EthereumAssets.PYUSD_UNDERLYING + ) + ); + + // rlUSD + assertTrue( + steward.swapApprovedToken( + AaveV3EthereumAssets.USDC_UNDERLYING, + AaveV3EthereumAssets.RLUSD_UNDERLYING + ) + ); + assertTrue( + steward.swapApprovedToken( + AaveV3EthereumAssets.USDT_UNDERLYING, + AaveV3EthereumAssets.RLUSD_UNDERLYING + ) + ); + assertTrue( + steward.swapApprovedToken( + AaveV3EthereumAssets.GHO_UNDERLYING, + AaveV3EthereumAssets.RLUSD_UNDERLYING + ) + ); + assertTrue( + steward.swapApprovedToken( + AaveV3EthereumAssets.USDS_UNDERLYING, + AaveV3EthereumAssets.RLUSD_UNDERLYING + ) + ); + assertTrue( + steward.swapApprovedToken( + AaveV3EthereumAssets.DAI_UNDERLYING, + AaveV3EthereumAssets.RLUSD_UNDERLYING + ) + ); + assertTrue( + steward.swapApprovedToken( + AaveV3EthereumAssets.LUSD_UNDERLYING, + AaveV3EthereumAssets.RLUSD_UNDERLYING + ) + ); + assertTrue( + steward.swapApprovedToken( + AaveV3EthereumAssets.USDe_UNDERLYING, + AaveV3EthereumAssets.RLUSD_UNDERLYING + ) + ); + assertTrue( + steward.swapApprovedToken( + AaveV3EthereumAssets.PYUSD_UNDERLYING, + AaveV3EthereumAssets.RLUSD_UNDERLYING + ) + ); + } + + function test_emissionsAllowances() public { + uint256 allowanceBeforeStkAAVE = IERC20(AaveV3EthereumAssets.AAVE_UNDERLYING).allowance( + MiscEthereum.ECOSYSTEM_RESERVE, + AaveSafetyModule.STK_AAVE + ); + + uint256 allowanceBeforeStkABPT = IERC20(AaveV3EthereumAssets.AAVE_UNDERLYING).allowance( + MiscEthereum.ECOSYSTEM_RESERVE, + AaveSafetyModule.STK_AAVE_WSTETH_BPTV2 + ); + + executePayload(vm, address(proposal)); + + uint256 allowanceAfterStkAAVE = IERC20(AaveV3EthereumAssets.AAVE_UNDERLYING).allowance( + MiscEthereum.ECOSYSTEM_RESERVE, + AaveSafetyModule.STK_AAVE + ); + + uint256 allowanceAfterStkABPT = IERC20(AaveV3EthereumAssets.AAVE_UNDERLYING).allowance( + MiscEthereum.ECOSYSTEM_RESERVE, + AaveSafetyModule.STK_AAVE_WSTETH_BPTV2 + ); - function test_swapPaths() public {} + // New allowance is less than before + assertGt(allowanceAfterStkAAVE, allowanceBeforeStkAAVE); + assertGt(allowanceAfterStkABPT, allowanceBeforeStkABPT); + } } diff --git a/src/20251110_Multi_NovemberFundingUpdate/AaveV3Optimism_NovemberFundingUpdate_20251110.sol b/src/20251110_Multi_NovemberFundingUpdate/AaveV3Optimism_NovemberFundingUpdate_20251110.sol index c09c5c488..efc86618d 100644 --- a/src/20251110_Multi_NovemberFundingUpdate/AaveV3Optimism_NovemberFundingUpdate_20251110.sol +++ b/src/20251110_Multi_NovemberFundingUpdate/AaveV3Optimism_NovemberFundingUpdate_20251110.sol @@ -26,7 +26,7 @@ contract AaveV3Optimism_NovemberFundingUpdate_20251110 is IProposalGenericExecut AaveV3Optimism.COLLECTOR.approve( IERC20(AaveV3OptimismAssets.sUSD_UNDERLYING), MiscOptimism.AFC_SAFE, - IERC20(AaveV3OptimismAssets.sUSD_UNDERLYING).balanceOf(address(AaveV3Optimism.COLLECTOR)) + SUSD_AMOUNT ); } diff --git a/src/20251110_Multi_NovemberFundingUpdate/AaveV3Polygon_NovemberFundingUpdate_20251110.sol b/src/20251110_Multi_NovemberFundingUpdate/AaveV3Polygon_NovemberFundingUpdate_20251110.sol index a93d681b0..207cecf9c 100644 --- a/src/20251110_Multi_NovemberFundingUpdate/AaveV3Polygon_NovemberFundingUpdate_20251110.sol +++ b/src/20251110_Multi_NovemberFundingUpdate/AaveV3Polygon_NovemberFundingUpdate_20251110.sol @@ -15,7 +15,7 @@ import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGen */ contract AaveV3Polygon_NovemberFundingUpdate_20251110 is IProposalGenericExecutor { uint256 public constant USDC_AMOUNT = 130_000e6; - uint256 public constant USDT_AMOUNT = 220_000e6; + uint256 public constant USDT_AMOUNT = 230_000e6; uint256 public constant WPOL_AMOUNT = 135_000 ether; function execute() external { diff --git a/src/20251110_Multi_NovemberFundingUpdate/AaveV3Sonic_NovemberFundingUpdate_20251110.sol b/src/20251110_Multi_NovemberFundingUpdate/AaveV3Sonic_NovemberFundingUpdate_20251110.sol index 78d9edc11..460ac663b 100644 --- a/src/20251110_Multi_NovemberFundingUpdate/AaveV3Sonic_NovemberFundingUpdate_20251110.sol +++ b/src/20251110_Multi_NovemberFundingUpdate/AaveV3Sonic_NovemberFundingUpdate_20251110.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.0; import {IERC20} from 'openzeppelin-contracts/contracts/token/ERC20/IERC20.sol'; -import {AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; import {AaveV3Sonic, AaveV3SonicAssets} from 'aave-address-book/AaveV3Sonic.sol'; import {MiscSonic} from 'aave-address-book/MiscSonic.sol'; import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; diff --git a/src/20251110_Multi_NovemberFundingUpdate/NovemberFundingUpdate.md b/src/20251110_Multi_NovemberFundingUpdate/NovemberFundingUpdate.md index 650e6cca9..b632d5044 100644 --- a/src/20251110_Multi_NovemberFundingUpdate/NovemberFundingUpdate.md +++ b/src/20251110_Multi_NovemberFundingUpdate/NovemberFundingUpdate.md @@ -9,21 +9,21 @@ discussions: "https://governance.aave.com/t/direct-to-aip-november-2025-funding- This publication presents the November Funding Update, consisting of the following key activities: - Bridge funds to Ethereum; -- Aquire GHO to support runway; +- Acquire GHO to support runway; - Consolidate asset holdings; and, - Create Allowances to support Operations. ## Motivation -This publication balances near term operational needs, consolidates assets holdings and extends some Allowances to the MainnetSwapSteward to support optimising the DAOs stablecoin holdings. +This publication balances near-term operational needs, consolidates asset holdings and extends some Allowances to the MainnetSwapSteward to support optimising the DAO's stablecoin holdings. Fund Ongoing Initiatives As with every funding update, our goal is to ensure that all ongoing initiatives and service provider streams remain adequately funded. Since most activities have now transitioned to GHO, specifically aEthLidoGHO, this update focuses on maintaining sufficient liquidity within the Prime instance. -To meet upcoming funding requirements, we plan to repurchase 8 million GHO from the market over the next month and deposit it into the Prime instance. This allocation will support existing streams, including ACI, TokenLogic, ALC, Chaos Labs, and LlamaRisk, as well as the upcoming renewal of Certora and BGD contracts, the continuation of the Merit initiative and the payment for Aave v4 audits. +To meet upcoming funding requirements, we plan to repurchase 8 million GHO from the market over the next month and deposit it into the Prime instance. This allocation will support existing streams, including ACI, TokenLogic, ALC, Chaos Labs, and LlamaRisk, as well as the upcoming renewal of Certora and BGD contracts, the continuation of the Merit initiative, and the payment for Aave v4 audits. Bridge Assets to Ethereum -For this cycle, funds held across several networks will be bridged back to Ethereum to continue supporting the DAO’s operational needs. Some assets will be swapped on the respective network prior to being bridged by the AFC, such as sUSD on Optimism.Once received on Ethereum, all assets will be deposited into the Aave Protocol to generate yield and ensure efficient treasury management. +For this cycle, funds held across several networks will be bridged back to Ethereum to continue supporting the DAO’s operational needs. Some assets will be swapped on the respective network prior to being bridged by the AFC, such as sUSD on Optimism. Once received on Ethereum, all assets will be deposited into the Aave Protocol to generate yield and ensure efficient treasury management. ## Specification @@ -45,7 +45,7 @@ _Polygon_ Amount: 130,000 USDCn Amount: 230,000 USDT -Amount: 135,000 wMATIC +Amount: 135,000 wPOL Spender: AFC `0x22740deBa78d5a0c24C58C740e3715ec29de1bFa` Method: `approve()` above assets on the Aave Collector contract to the AFC address @@ -53,7 +53,7 @@ _Binance_ Amount: 123,000 USDC Amount: 323,000 USDT -Amount: 27 WETH +Amount: 27 ETH Spender: AFC `0x22740deBa78d5a0c24C58C740e3715ec29de1bFa` Method: `approve()` above assets on the Aave Collector contract to the AFC address @@ -98,7 +98,7 @@ Method: `approve()` aEthLidoGHO on the Aave Collector contract to the Aave v4 Au _Reimbursements_ Asset: aEthLidoGHO -Amount: 71,698,000 +Amount: 71,698 Spender: TokenLogic `0xAA088dfF3dcF619664094945028d44E779F19894` Method: `approve()` aEthLidoGHO on the Aave Collector contract to the TokenLogic address. @@ -110,6 +110,10 @@ _Swaps_ Approve stablecoins to be swapped to `pyUSD` and `rlUSD`. +#### Emissions + +Increase allowance of stkAAVE and stkBPT for 14 days of emissions between end and restart. + ## References - Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20251110_Multi_NovemberFundingUpdate/AaveV3Ethereum_NovemberFundingUpdate_20251110.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20251110_Multi_NovemberFundingUpdate/AaveV3Polygon_NovemberFundingUpdate_20251110.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20251110_Multi_NovemberFundingUpdate/AaveV3Optimism_NovemberFundingUpdate_20251110.sol), [AaveV3Metis](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20251110_Multi_NovemberFundingUpdate/AaveV3Metis_NovemberFundingUpdate_20251110.sol), [AaveV3BNB](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20251110_Multi_NovemberFundingUpdate/AaveV3BNB_NovemberFundingUpdate_20251110.sol), [AaveV3Sonic](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20251110_Multi_NovemberFundingUpdate/AaveV3Sonic_NovemberFundingUpdate_20251110.sol) diff --git a/src/20251110_Multi_NovemberFundingUpdate/NovemberFundingUpdate_20251110.s.sol b/src/20251110_Multi_NovemberFundingUpdate/NovemberFundingUpdate_20251110.s.sol index 036f1f2af..4cff09ca1 100644 --- a/src/20251110_Multi_NovemberFundingUpdate/NovemberFundingUpdate_20251110.s.sol +++ b/src/20251110_Multi_NovemberFundingUpdate/NovemberFundingUpdate_20251110.s.sol @@ -4,11 +4,10 @@ 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, MetisScript, BNBScript, SonicScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {EthereumScript, PolygonScript, OptimismScript, BNBScript, SonicScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; import {AaveV3Ethereum_NovemberFundingUpdate_20251110} from './AaveV3Ethereum_NovemberFundingUpdate_20251110.sol'; import {AaveV3Polygon_NovemberFundingUpdate_20251110} from './AaveV3Polygon_NovemberFundingUpdate_20251110.sol'; import {AaveV3Optimism_NovemberFundingUpdate_20251110} from './AaveV3Optimism_NovemberFundingUpdate_20251110.sol'; -import {AaveV3Metis_NovemberFundingUpdate_20251110} from './AaveV3Metis_NovemberFundingUpdate_20251110.sol'; import {AaveV3BNB_NovemberFundingUpdate_20251110} from './AaveV3BNB_NovemberFundingUpdate_20251110.sol'; import {AaveV3Sonic_NovemberFundingUpdate_20251110} from './AaveV3Sonic_NovemberFundingUpdate_20251110.sol'; @@ -78,28 +77,6 @@ contract DeployOptimism is OptimismScript { } } -/** - * @dev Deploy Metis - * deploy-command: make deploy-ledger contract=src/20251110_Multi_NovemberFundingUpdate/NovemberFundingUpdate_20251110.s.sol:DeployMetis chain=metis - * verify-command: FOUNDRY_PROFILE=deploy npx catapulta-verify -b broadcast/NovemberFundingUpdate_20251110.s.sol/1088/run-latest.json - */ -contract DeployMetis is MetisScript { - function run() external broadcast { - // deploy payloads - address payload0 = GovV3Helpers.deployDeterministic( - type(AaveV3Metis_NovemberFundingUpdate_20251110).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/20251110_Multi_NovemberFundingUpdate/NovemberFundingUpdate_20251110.s.sol:DeployBNB chain=bnb @@ -151,7 +128,7 @@ contract DeploySonic is SonicScript { contract CreateProposal is EthereumScript { function run() external { // create payloads - PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](6); + PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](5); // compose actions for validation { @@ -181,22 +158,13 @@ contract CreateProposal is EthereumScript { payloads[2] = GovV3Helpers.buildOptimismPayload(vm, actionsOptimism); } - { - IPayloadsControllerCore.ExecutionAction[] - memory actionsMetis = new IPayloadsControllerCore.ExecutionAction[](1); - actionsMetis[0] = GovV3Helpers.buildAction( - type(AaveV3Metis_NovemberFundingUpdate_20251110).creationCode - ); - payloads[3] = GovV3Helpers.buildMetisPayload(vm, actionsMetis); - } - { IPayloadsControllerCore.ExecutionAction[] memory actionsBNB = new IPayloadsControllerCore.ExecutionAction[](1); actionsBNB[0] = GovV3Helpers.buildAction( type(AaveV3BNB_NovemberFundingUpdate_20251110).creationCode ); - payloads[4] = GovV3Helpers.buildBNBPayload(vm, actionsBNB); + payloads[3] = GovV3Helpers.buildBNBPayload(vm, actionsBNB); } { @@ -205,7 +173,7 @@ contract CreateProposal is EthereumScript { actionsSonic[0] = GovV3Helpers.buildAction( type(AaveV3Sonic_NovemberFundingUpdate_20251110).creationCode ); - payloads[5] = GovV3Helpers.buildSonicPayload(vm, actionsSonic); + payloads[4] = GovV3Helpers.buildSonicPayload(vm, actionsSonic); } // create proposal