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/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/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..cec3f8ae5 --- /dev/null +++ b/src/20251110_Multi_NovemberFundingUpdate/AaveV3BNB_NovemberFundingUpdate_20251110.sol @@ -0,0 +1,39 @@ +// 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 {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..233f49dd7 --- /dev/null +++ b/src/20251110_Multi_NovemberFundingUpdate/AaveV3Ethereum_NovemberFundingUpdate_20251110.sol @@ -0,0 +1,246 @@ +// 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 {AaveSafetyModule} from 'aave-address-book/AaveSafetyModule.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; + +interface IMainnetSwapSteward { + 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; + + // 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(); + _merit(); + _reimbursements(); + _ecosystemReserve(); + _swapPathsAndBudget(); + _emissionsIncrease(); + } + + 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 + ); + } + + 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 new file mode 100644 index 000000000..54fcff920 --- /dev/null +++ b/src/20251110_Multi_NovemberFundingUpdate/AaveV3Ethereum_NovemberFundingUpdate_20251110.t.sol @@ -0,0 +1,418 @@ +// 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 {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 + */ +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 + ); + + assertApproxEqAbs(allowanceBefore, 0, 1 ether); + + executePayload(vm, address(proposal)); + + uint256 allowanceAfter = IERC20(AaveV3EthereumLidoAssets.GHO_A_TOKEN).allowance( + address(AaveV3Ethereum.COLLECTOR), + MiscEthereum.MERIT_AHAB_SAFE + ); + + assertEq(allowanceAfter, 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 { + 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 + ); + + // 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 new file mode 100644 index 000000000..efc86618d --- /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, + SUSD_AMOUNT + ); + } + + 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..207cecf9c --- /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 = 230_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..460ac663b --- /dev/null +++ b/src/20251110_Multi_NovemberFundingUpdate/AaveV3Sonic_NovemberFundingUpdate_20251110.sol @@ -0,0 +1,25 @@ +// 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 {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..b632d5044 --- /dev/null +++ b/src/20251110_Multi_NovemberFundingUpdate/NovemberFundingUpdate.md @@ -0,0 +1,126 @@ +--- +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; +- Acquire GHO to support runway; +- Consolidate asset holdings; and, +- Create Allowances to support Operations. + +## Motivation + +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. + +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 wPOL +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 ETH +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 +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`. + +#### 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) +- 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..4cff09ca1 --- /dev/null +++ b/src/20251110_Multi_NovemberFundingUpdate/NovemberFundingUpdate_20251110.s.sol @@ -0,0 +1,191 @@ +// 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, 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 {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 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[](5); + + // 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 actionsBNB = new IPayloadsControllerCore.ExecutionAction[](1); + actionsBNB[0] = GovV3Helpers.buildAction( + type(AaveV3BNB_NovemberFundingUpdate_20251110).creationCode + ); + payloads[3] = GovV3Helpers.buildBNBPayload(vm, actionsBNB); + } + + { + IPayloadsControllerCore.ExecutionAction[] + memory actionsSonic = new IPayloadsControllerCore.ExecutionAction[](1); + actionsSonic[0] = GovV3Helpers.buildAction( + type(AaveV3Sonic_NovemberFundingUpdate_20251110).creationCode + ); + payloads[4] = 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}}, + }, +};