diff --git a/diffs/AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1_before_AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1_after.md b/diffs/AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1_before_AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1_after.md new file mode 100644 index 000000000..9fcbfec6a --- /dev/null +++ b/diffs/AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1_before_AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1_after.md @@ -0,0 +1,48 @@ +## Raw diff + +```json +{ + "raw": { + "0x06179f7c1be40863405f374e7f5f8806c728660a": { + "label": "GhoEthereum.GHO_CCIP_TOKEN_POOL", + "balanceDiff": null, + "stateDiff": { + "0x0000000000000000000000000000000000000000000000000000000000000035": { + "previousValue": "0x0000000000000000000000000000000000000000002116545850052128000000", + "newValue": "0x00000000000000000000000000000000000000000052b7d2dcc80cd2e4000000" + }, + "0xa063a28f00c2eed20ba42192fe8506a058475c23dc2713d76c1b291f7c3ef459": { + "previousValue": "0x00000000000000000000000168fa744b0000000000013da31bd57cb0ca1c0000", + "newValue": "0x0000000000000000000000016916296b0000000000013da329b6336471800000" + }, + "0xa063a28f00c2eed20ba42192fe8506a058475c23dc2713d76c1b291f7c3ef45a": { + "previousValue": "0x000000000000001043561a88293000000000000000013da329b6336471800000", + "newValue": "0x00000000002d7eb3f96e070d96ffffff00000000002d7eb3f96e070d97000000" + }, + "0xa063a28f00c2eed20ba42192fe8506a058475c23dc2713d76c1b291f7c3ef45b": { + "previousValue": "0x0000000000000000000000016902182700000000000000000000000000000000", + "newValue": "0x0000000000000000000000016916296b0000000000013da329b6336471800000" + }, + "0xa063a28f00c2eed20ba42192fe8506a058475c23dc2713d76c1b291f7c3ef45c": { + "previousValue": "0x000000000000001043561a88293000000000000000013da329b6336471800000", + "newValue": "0x000000000000001043561a88293000000000000000013da329b6336471800000" + } + } + }, + "0xdabad81af85554e9ae636395611c58f7ec1aaec5": { + "label": "GovernanceV3Ethereum.PAYLOADS_CONTROLLER", + "balanceDiff": null, + "stateDiff": { + "0x32e830cc2d99bcd03a6b00de44c079172fc1615142526593da9060da4afbf6cd": { + "previousValue": "0x006916296a000000000002000000000000000000000000000000000000000000", + "newValue": "0x006916296a000000000003000000000000000000000000000000000000000000" + }, + "0x32e830cc2d99bcd03a6b00de44c079172fc1615142526593da9060da4afbf6ce": { + "previousValue": "0x000000000000000000093a8000000000000069444deb00000000000000000000", + "newValue": "0x000000000000000000093a8000000000000069444deb0000000000006916296b" + } + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1_before_AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1_after.md b/diffs/AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1_before_AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1_after.md new file mode 100644 index 000000000..8b14196cb --- /dev/null +++ b/diffs/AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1_before_AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1_after.md @@ -0,0 +1,44 @@ +## Raw diff + +```json +{ + "raw": { + "0x360d8aa8f6b09b7bc57af34db2eb84dd87bf4d12": { + "label": null, + "balanceDiff": null, + "stateDiff": { + "0xc43d59e5cc2bf8f1b992795c27c2d5bb31adadefc93354955ac0e2ca9c5be0f7": { + "previousValue": "0x000000000000000000000001690217ec00000000000000000000000000000000", + "newValue": "0x000000000000000000000001690a49210000000000013da329b6336471800000" + }, + "0xc43d59e5cc2bf8f1b992795c27c2d5bb31adadefc93354955ac0e2ca9c5be0f8": { + "previousValue": "0x000000000000001043561a88293000000000000000013da329b6336471800000", + "newValue": "0x000000000000001043561a88293000000000000000013da329b6336471800000" + }, + "0xc43d59e5cc2bf8f1b992795c27c2d5bb31adadefc93354955ac0e2ca9c5be0f9": { + "previousValue": "0x00000000000000000000000168fa77930000000000013da31bd57cb0ca1c0000", + "newValue": "0x000000000000000000000001690a49210000000000013da329b6336471800000" + }, + "0xc43d59e5cc2bf8f1b992795c27c2d5bb31adadefc93354955ac0e2ca9c5be0fa": { + "previousValue": "0x000000000000001043561a88293000000000000000013da329b6336471800000", + "newValue": "0x00000000002d7eb3f96e070d96ffffff00000000002d7eb3f96e070d97000000" + } + } + }, + "0xe76eb348e65ef163d85ce282125ff5a7f5712a1d": { + "label": "GovernanceV3Plasma.PAYLOADS_CONTROLLER", + "balanceDiff": null, + "stateDiff": { + "0x85aaa47b6dc46495bb8824fad4583769726fea36efd831a35556690b830a8fbe": { + "previousValue": "0x00690a4920000000000002000000000000000000000000000000000000000000", + "newValue": "0x00690a4920000000000003000000000000000000000000000000000000000000" + }, + "0x85aaa47b6dc46495bb8824fad4583769726fea36efd831a35556690b830a8fbf": { + "previousValue": "0x000000000000000000093a8000000000000069386da100000000000000000000", + "newValue": "0x000000000000000000093a8000000000000069386da1000000000000690a4921" + } + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2_before_AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2_after.md b/diffs/AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2_before_AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2_after.md new file mode 100644 index 000000000..4bd2a3ad3 --- /dev/null +++ b/diffs/AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2_before_AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2_after.md @@ -0,0 +1,656 @@ +## Reserve changes + +### Reserves added + +#### GHO (0xb77E872A68C62CfC0dFb02C067Ecc3DA23B4bbf3) + +| description | value | +| --- | --- | +| decimals | 18 | +| isActive | true | +| isFrozen | false | +| supplyCap | 50,000,000 GHO | +| borrowCap | 20,000,000 GHO | +| debtCeiling | 0 $ [0] | +| isSiloed | false | +| isFlashloanable | true | +| oracle | 0xb0e1c7830aA781362f79225559Aa068E6bDaF1d1 | +| oracleDecimals | 8 | +| oracleLatestAnswer | 1 | +| usageAsCollateralEnabled | true | +| ltv | 75 % [7500] | +| liquidationThreshold | 78 % [7800] | +| liquidationBonus | 4.5 % | +| liquidationProtocolFee | 10 % [1000] | +| reserveFactor | 10 % [1000] | +| aToken | 0x5aA4bc74811D672DA5308019dA4779f673e60B47 | +| variableDebtToken | 0x7ec35d7008682c33dBC6b214E01D919e8d441e48 | +| borrowingEnabled | true | +| isBorrowableInIsolation | false | +| interestRateStrategy | 0x2B16E93bdB1897f517881B3c388bABD0C62C6cdC | +| aTokenName | Aave Plasma GHO | +| aTokenSymbol | aPlaGHO | +| aTokenUnderlyingBalance | 10 GHO [10000000000000000000] | +| id | 11 | +| isPaused | false | +| variableDebtTokenName | Aave Plasma Variable Debt GHO | +| variableDebtTokenSymbol | variableDebtPlaGHO | +| virtualBalance | 10 GHO [10000000000000000000] | +| optimalUsageRatio | 92 % | +| maxVariableBorrowRate | 21.25 % | +| baseVariableBorrowRate | 1.25 % | +| variableRateSlope1 | 3.5 % | +| variableRateSlope2 | 16.5 % | +| interestRate | ![ir](https://dash.onaave.com/api/static?variableRateSlope1=35000000000000000000000000&variableRateSlope2=165000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=12500000000000000000000000&maxVariableBorrowRate=212500000000000000000000000) | + + +## Emodes changed + +### EMode: USDe Stablecoins(id: 1) + + + +### EMode: sUSDe Stablecoins(id: 2) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label (unchanged) | sUSDe Stablecoins | sUSDe Stablecoins | +| eMode.ltv (unchanged) | 90 % | 90 % | +| eMode.liquidationThreshold (unchanged) | 92 % | 92 % | +| eMode.liquidationBonus (unchanged) | 4 % | 4 % | +| eMode.borrowableBitmap | USDT0 | USDT0, GHO | +| eMode.collateralBitmap (unchanged) | USDe, sUSDe | USDe, sUSDe | + + +### EMode: weETH WETH(id: 3) + + + +### EMode: weETH Stablecoins(id: 4) + + + +### EMode: PT-USDe Stablecoins Jan 2026(id: 5) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label (unchanged) | PT-USDe Stablecoins Jan 2026 | PT-USDe Stablecoins Jan 2026 | +| eMode.ltv | 87.4 % | 85.9 % | +| eMode.liquidationThreshold | 89.4 % | 87.9 % | +| eMode.liquidationBonus (unchanged) | 4.3 % | 4.3 % | +| eMode.borrowableBitmap | USDT0, USDe | USDT0, USDe, GHO | +| eMode.collateralBitmap (unchanged) | PT-USDe-15JAN2026 | PT-USDe-15JAN2026 | + + +### EMode: PT-USDe USDe Jan 2026(id: 6) + + + +### EMode: PT-sUSDe Stablecoins Jan 2026(id: 7) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label (unchanged) | PT-sUSDe Stablecoins Jan 2026 | PT-sUSDe Stablecoins Jan 2026 | +| eMode.ltv | 85.9 % | 84.4 % | +| eMode.liquidationThreshold | 87.9 % | 86.4 % | +| eMode.liquidationBonus (unchanged) | 5.7 % | 5.7 % | +| eMode.borrowableBitmap | USDT0, USDe | USDT0, USDe, GHO | +| eMode.collateralBitmap (unchanged) | PT-sUSDE-15JAN2026 | PT-sUSDE-15JAN2026 | + + +### EMode: PT-sUSDe USDe Jan 2026(id: 8) + + + +### EMode: wrsETH/WETH(id: 9) + + + +### EMode: wstETH/WETH(id: 10) + + + +### EMode: syrupUSDT/USDT0(id: 11) + + + +### EMode: GHO/USDT0(id: 12) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label | - | GHO/USDT0 | +| eMode.ltv | - | 94 % | +| eMode.liquidationThreshold | - | 96 % | +| eMode.liquidationBonus | - | 2 % | +| eMode.borrowableBitmap | - | USDT0 | +| eMode.collateralBitmap | - | syrupUSDT | + + +### EMode: syrupUSDT/GHO(id: 13) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label | - | syrupUSDT/GHO | +| eMode.ltv | - | 90 % | +| eMode.liquidationThreshold | - | 92 % | +| eMode.liquidationBonus | - | 4 % | +| eMode.borrowableBitmap | - | USDT0 | +| eMode.collateralBitmap | - | syrupUSDT | + + +### EMode: syrupUSDT Stables(id: 14) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label | - | syrupUSDT Stables | +| eMode.ltv | - | 90 % | +| eMode.liquidationThreshold | - | 92 % | +| eMode.liquidationBonus | - | 4 % | +| eMode.borrowableBitmap | - | USDT0 | +| eMode.collateralBitmap | - | syrupUSDT, GHO | + + +## Raw diff + +```json +{ + "eModes": { + "2": { + "borrowableBitmap": { + "from": "1", + "to": "2049" + } + }, + "5": { + "borrowableBitmap": { + "from": "3", + "to": "2051" + }, + "liquidationThreshold": { + "from": 8940, + "to": 8790 + }, + "ltv": { + "from": 8740, + "to": 8590 + } + }, + "7": { + "borrowableBitmap": { + "from": "3", + "to": "2051" + }, + "liquidationThreshold": { + "from": 8790, + "to": 8640 + }, + "ltv": { + "from": 8590, + "to": 8440 + } + }, + "12": { + "from": null, + "to": { + "borrowableBitmap": "1", + "collateralBitmap": "1024", + "eModeCategory": 12, + "label": "GHO/USDT0", + "liquidationBonus": 10200, + "liquidationThreshold": 9600, + "ltv": 9400 + } + }, + "13": { + "from": null, + "to": { + "borrowableBitmap": "1", + "collateralBitmap": "1024", + "eModeCategory": 13, + "label": "syrupUSDT/GHO", + "liquidationBonus": 10400, + "liquidationThreshold": 9200, + "ltv": 9000 + } + }, + "14": { + "from": null, + "to": { + "borrowableBitmap": "1", + "collateralBitmap": "3072", + "eModeCategory": 14, + "label": "syrupUSDT Stables", + "liquidationBonus": 10400, + "liquidationThreshold": 9200, + "ltv": 9000 + } + } + }, + "reserves": { + "0xb77E872A68C62CfC0dFb02C067Ecc3DA23B4bbf3": { + "from": null, + "to": { + "aToken": "0x5aA4bc74811D672DA5308019dA4779f673e60B47", + "aTokenName": "Aave Plasma GHO", + "aTokenSymbol": "aPlaGHO", + "aTokenUnderlyingBalance": "10000000000000000000", + "borrowCap": 20000000, + "borrowingEnabled": true, + "debtCeiling": 0, + "decimals": 18, + "id": 11, + "interestRateStrategy": "0x2B16E93bdB1897f517881B3c388bABD0C62C6cdC", + "isActive": true, + "isBorrowableInIsolation": false, + "isFlashloanable": true, + "isFrozen": false, + "isPaused": false, + "isSiloed": false, + "liquidationBonus": 10450, + "liquidationProtocolFee": 1000, + "liquidationThreshold": 7800, + "ltv": 7500, + "oracle": "0xb0e1c7830aA781362f79225559Aa068E6bDaF1d1", + "oracleDecimals": 8, + "oracleLatestAnswer": "100000000", + "reserveFactor": 1000, + "supplyCap": 50000000, + "symbol": "GHO", + "underlying": "0xb77E872A68C62CfC0dFb02C067Ecc3DA23B4bbf3", + "usageAsCollateralEnabled": true, + "variableDebtToken": "0x7ec35d7008682c33dBC6b214E01D919e8d441e48", + "variableDebtTokenName": "Aave Plasma Variable Debt GHO", + "variableDebtTokenSymbol": "variableDebtPlaGHO", + "virtualBalance": "10000000000000000000" + } + } + }, + "strategies": { + "0xb77E872A68C62CfC0dFb02C067Ecc3DA23B4bbf3": { + "from": null, + "to": { + "address": "0x2B16E93bdB1897f517881B3c388bABD0C62C6cdC", + "baseVariableBorrowRate": "12500000000000000000000000", + "maxVariableBorrowRate": "212500000000000000000000000", + "optimalUsageRatio": "920000000000000000000000000", + "variableRateSlope1": "35000000000000000000000000", + "variableRateSlope2": "165000000000000000000000000" + } + } + }, + "raw": { + "0x2b16e93bdb1897f517881b3c388babd0c62c6cdc": { + "label": null, + "balanceDiff": null, + "stateDiff": { + "0x2946f03ada64466b4e53a11bb68fb38d2e2ddd5250c0baafaee99496b6fc0a38": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000000000000000000006720000015e0000007d23f0" + } + } + }, + "0x33e0b3fc976dc9c516926ba48cfc0a9e10a2aaa5": { + "label": "AaveV3Plasma.ORACLE", + "balanceDiff": null, + "stateDiff": { + "0x2946f03ada64466b4e53a11bb68fb38d2e2ddd5250c0baafaee99496b6fc0a38": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000b0e1c7830aa781362f79225559aa068e6bdaf1d1" + } + } + }, + "0x360d8aa8f6b09b7bc57af34db2eb84dd87bf4d12": { + "label": null, + "balanceDiff": null, + "stateDiff": { + "0xc43d59e5cc2bf8f1b992795c27c2d5bb31adadefc93354955ac0e2ca9c5be0f7": { + "previousValue": "0x000000000000000000000001690217ec00000000000000000000000000000000", + "newValue": "0x000000000000000000000001690a49210000000000013da329b6336471800000" + }, + "0xc43d59e5cc2bf8f1b992795c27c2d5bb31adadefc93354955ac0e2ca9c5be0f8": { + "previousValue": "0x000000000000001043561a88293000000000000000013da329b6336471800000", + "newValue": "0x000000000000001043561a88293000000000000000013da329b6336471800000" + }, + "0xc43d59e5cc2bf8f1b992795c27c2d5bb31adadefc93354955ac0e2ca9c5be0f9": { + "previousValue": "0x00000000000000000000000168fa77930000000000013da31bd57cb0ca1c0000", + "newValue": "0x000000000000000000000001690a49210000000000013da329b6336471800000" + }, + "0xc43d59e5cc2bf8f1b992795c27c2d5bb31adadefc93354955ac0e2ca9c5be0fa": { + "previousValue": "0x000000000000001043561a88293000000000000000013da329b6336471800000", + "newValue": "0x000000000000001043561a88293000000000000000013da329b6336471800000" + } + } + }, + "0x5117f170716eceac8ef63d375bc7416afa6f4497": { + "label": "AaveV3Plasma.EMISSION_MANAGER", + "balanceDiff": null, + "stateDiff": { + "0x0e02b2c0482f5046c22f5571248a57158da27a0e7aba9a498664e4aa976ac803": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000ac140648435d03f784879cd789130f22ef588fcd" + }, + "0x6a24eec3ea7f5ab213e50c1e4e4999b2ff9cb338a97a4d989bfdaca041ca8cfe": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000ac140648435d03f784879cd789130f22ef588fcd" + } + } + }, + "0x5aa4bc74811d672da5308019da4779f673e60b47": { + "label": null, + "balanceDiff": null, + "stateDiff": { + "0x0000000000000000000000000000000000000000000000000000000000000000": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000004" + }, + "0x0000000000000000000000000000000000000000000000000000000000000001": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + "0x0000000000000000000000000000000000000000000000000000000000000036": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000008ac7230489e80000" + }, + "0x0000000000000000000000000000000000000000000000000000000000000037": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x4161766520506c61736d612047484f000000000000000000000000000000001e" + }, + "0x0000000000000000000000000000000000000000000000000000000000000038": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x61506c6147484f0000000000000000000000000000000000000000000000000e" + }, + "0x0000000000000000000000000000000000000000000000000000000000000039": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000012" + }, + "0x000000000000000000000000000000000000000000000000000000000000003b": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0xc873579795ccba65f2b59dce6f93cbacd520c58651307fe616f7b065269296e0" + }, + "0x000000000000000000000000000000000000000000000000000000000000003d": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000b77e872a68c62cfc0dfb02c067ecc3da23b4bbf3" + }, + "0x208dbdea7f47b2b5a177d450774cdf528c89faaec27279171fb7a3b116eacacd": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x00000000033b2e3c9fd0803ce800000000000000000000008ac7230489e80000" + }, + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000f6dac650da5616bc3206e969d7868e7c25805171", + "label": "Implementation slot" + } + } + }, + "0x7ec35d7008682c33dbc6b214e01d919e8d441e48": { + "label": null, + "balanceDiff": null, + "stateDiff": { + "0x0000000000000000000000000000000000000000000000000000000000000000": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000004" + }, + "0x0000000000000000000000000000000000000000000000000000000000000001": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + "0x0000000000000000000000000000000000000000000000000000000000000035": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x89dc6b2d5c9fe5fbc517e8b606d8fddf624f9d1e8bf847f3e3f98d600fa3820d" + }, + "0x0000000000000000000000000000000000000000000000000000000000000037": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000b77e872a68c62cfc0dfb02c067ecc3da23b4bbf3" + }, + "0x000000000000000000000000000000000000000000000000000000000000003b": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x4161766520506c61736d61205661726961626c6520446562742047484f00003a" + }, + "0x000000000000000000000000000000000000000000000000000000000000003c": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x7661726961626c6544656274506c6147484f0000000000000000000000000024" + }, + "0x000000000000000000000000000000000000000000000000000000000000003d": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000012" + }, + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000458d281bffce958e34571b33f1f26bd42aa27c44", + "label": "Implementation slot" + } + } + }, + "0x925a2a7214ed92428b5b1b090f80b25700095e12": { + "label": "AaveV3Plasma.POOL", + "balanceDiff": null, + "stateDiff": { + "0x000000000000000000000000000000000000000000000000000000000000003b": { + "previousValue": "0x00000000000000000000000000000000000000000000000b0000000000000000", + "newValue": "0x00000000000000000000000000000000000000000000000c0000000000000000" + }, + "0x04e6a57294bb916b654e5f2a9be58b33bb23f83005593c07f959637b56d00d6f": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000000000000000000000000000040028a023f02328" + }, + "0x04e6a57294bb916b654e5f2a9be58b33bb23f83005593c07f959637b56d00d70": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x7379727570555344542f47484f0000000000000000000000000000000000001a" + }, + "0x04e6a57294bb916b654e5f2a9be58b33bb23f83005593c07f959637b56d00d71": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0x1aec1d7d90e7fdc8d0cb5cae39901fd57c1eb538af488d7215b10b8d307d84b7": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000000000000000000000000000040027d8258024b8" + }, + "0x1aec1d7d90e7fdc8d0cb5cae39901fd57c1eb538af488d7215b10b8d307d84b8": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x47484f2f55534454300000000000000000000000000000000000000000000012" + }, + "0x1aec1d7d90e7fdc8d0cb5cae39901fd57c1eb538af488d7215b10b8d307d84b9": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0x1e4061ed12ce1f4439fe6c7922bd1dce45af754358ce2f94214f93749947e40a": { + "previousValue": "0x0000000000000000000000000000000000000000000000000080294a2256218e", + "newValue": "0x0000000000000000000000000000000000000000000000000080294a21c020f8" + }, + "0x1e4061ed12ce1f4439fe6c7922bd1dce45af754358ce2f94214f93749947e40b": { + "previousValue": "0x50542d735553446520537461626c65636f696e73204a616e203230323600003a", + "newValue": "0x50542d735553446520537461626c65636f696e73204a616e203230323600003a" + }, + "0x1e4061ed12ce1f4439fe6c7922bd1dce45af754358ce2f94214f93749947e40c": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000003", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000803" + }, + "0x2ab8cd8eab3e8c901115e793997bc427e1596b98dcca832d2eb3bc8b02d226a1": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000c0028a023f02328" + }, + "0x2ab8cd8eab3e8c901115e793997bc427e1596b98dcca832d2eb3bc8b02d226a2": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x73797275705553445420537461626c6573000000000000000000000000000022" + }, + "0x2ab8cd8eab3e8c901115e793997bc427e1596b98dcca832d2eb3bc8b02d226a3": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0x4138f036c3ffa28e5a438654f0c2140682f898abe9be8e78a8a4ce94f75bb5aa": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x100000000000000000000003e8002faf080001312d0003e8851228d21e781d4c" + }, + "0x4138f036c3ffa28e5a438654f0c2140682f898abe9be8e78a8a4ce94f75bb5ab": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000033b2e3c9fd0803ce8000000" + }, + "0x4138f036c3ffa28e5a438654f0c2140682f898abe9be8e78a8a4ce94f75bb5ac": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x00000000000a56fa5b99019a5c80000000000000033b2e3c9fd0803ce8000000" + }, + "0x4138f036c3ffa28e5a438654f0c2140682f898abe9be8e78a8a4ce94f75bb5ad": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000b00690a492100000000000000000000000000000000" + }, + "0x4138f036c3ffa28e5a438654f0c2140682f898abe9be8e78a8a4ce94f75bb5ae": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000005aa4bc74811d672da5308019da4779f673e60b47" + }, + "0x4138f036c3ffa28e5a438654f0c2140682f898abe9be8e78a8a4ce94f75bb5b0": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000007ec35d7008682c33dbc6b214e01d919e8d441e48" + }, + "0x4138f036c3ffa28e5a438654f0c2140682f898abe9be8e78a8a4ce94f75bb5b2": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x00000000000000008ac7230489e8000000000000000000000000000000000000" + }, + "0x4138f036c3ffa28e5a438654f0c2140682f898abe9be8e78a8a4ce94f75bb5b3": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + "0x50039cf134a124858bd88bbc9225ec3c537b89a0e9237ce39fe1813e6edf8257": { + "previousValue": "0x000000000000000000000000000000000000000000000000004028be22ec2224", + "newValue": "0x000000000000000000000000000000000000000000000000004028be2256218e" + }, + "0x50039cf134a124858bd88bbc9225ec3c537b89a0e9237ce39fe1813e6edf8258": { + "previousValue": "0x50542d5553446520537461626c65636f696e73204a616e203230323600000038", + "newValue": "0x50542d5553446520537461626c65636f696e73204a616e203230323600000038" + }, + "0x50039cf134a124858bd88bbc9225ec3c537b89a0e9237ce39fe1813e6edf8259": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000003", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000803" + }, + "0x67dcc86da9aaaf40a183002157e56801115aa6057705e43279b4c1c90942d6b2": { + "previousValue": "0x000000000000000000000000000000000000000000000000000628a023f02328", + "newValue": "0x000000000000000000000000000000000000000000000000000628a023f02328" + }, + "0x67dcc86da9aaaf40a183002157e56801115aa6057705e43279b4c1c90942d6b4": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000801" + }, + "0xf7b916e89ff198a55c9a32d87db68cde6f482de2d189099c6dab6507b6e177ae": { + "previousValue": "0x00000000000000000000000000000000000000000000000000000000002aaa2a", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000aaaa2a" + }, + "0xf801cd91f4737d4fcbeb3108ca2da80cf9c1a7a3469221f74308d5bc7ba7610b": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000b77e872a68c62cfc0dfb02c067ecc3da23b4bbf3" + } + } + }, + "0xa860355f0ccfdc823f7332ac108317b2a1509c06": { + "label": "AaveV3Plasma.ACL_MANAGER", + "balanceDiff": null, + "stateDiff": { + "0xa468be17ccb04a81200cd39fdb6e4ec81e44858b0e7814526f2643905eae614f": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + } + } + }, + "0xb77e872a68c62cfc0dfb02c067ecc3da23b4bbf3": { + "label": null, + "balanceDiff": null, + "stateDiff": { + "0x65266b84825d8bb61d69c7d2bc2fe50e7dee46583bcc5d823eefa5dd83b09049": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000008ac7230489e80000" + }, + "0x6689af251dc0b2943fc392fc8ef86ab234ede24d687011823b8f8b0aede7d219": { + "previousValue": "0x000000000000000000000000000000000000000000295be9f92b296dfbe80000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + "0x8745960c47bf71bf554325fbbad03c9b5685e46b51cfde2bf2bde8c1b6b659f2": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000000000000000000000295be96e64066972000000" + }, + "0x9ff2999df03f19dda98f7a8abb01d592df96e9d3ba818a81f818be4a10cc0896": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + "0xa2fd85a9b347f1041e91f80427bc02531df11e736b8ac39ce9699066ca5ef08f": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + } + }, + "0xbada742e7ff54595f9049eef1cc5aaf4364988b9": { + "label": null, + "balanceDiff": null, + "stateDiff": { + "0x0000000000000000000000000000000000000000000000000000000000000036": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0x1ec0abbf0635e36499113ff15936f70705c387ddd2e9a57f6c4b41d7163572ad": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000000000000000000000295be96e64066972000000" + }, + "0x4a11f94e20a93c79f6ec743a1954ec4fc2c08429ae2122118bf234b2185c81b8": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000d06114f714becd6f373e5ce94e07278ef46ebf37" + }, + "0x528409ae7d19f60e7983a73badac54e7d38d52b21a6f5486bc0450fdc95062fe": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + } + } + }, + "0xc563fc29dd0a7e56d1b5cc7bbf1dcf044d755303": { + "label": null, + "balanceDiff": null, + "stateDiff": { + "0x0000000000000000000000000000000000000000000000000000000000000001": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0x8e98d45570ff3fa69e12ac542fefda790c069ada879027e142a20629e641c04a": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000d06114f714becd6f373e5ce94e07278ef46ebf37" + } + } + }, + "0xd06114f714becd6f373e5ce94e07278ef46ebf37": { + "label": null, + "balanceDiff": null, + "stateDiff": { + "0x0000000000000000000000000000000000000000000000000000000000000037": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000d70be7e6111ea563226cb8e53b1f195da4e566e2" + }, + "0xd416476fb6e6a1adff89bd6a549896895440a6eb6eb559f8157f82060fee3072": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0xee422176155ce30ad5fb06988dabe5f66c217b34ce1729f1ade63e07846cdb3c": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0xf0ffe599d5370647658fff0ba785eed348fbb3de8f8c11048497c36b9859b2c4": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + } + } + }, + "0xe76eb348e65ef163d85ce282125ff5a7f5712a1d": { + "label": "GovernanceV3Plasma.PAYLOADS_CONTROLLER", + "balanceDiff": null, + "stateDiff": { + "0x85aaa47b6dc46495bb8824fad4583769726fea36efd831a35556690b830a8fbe": { + "previousValue": "0x00690a4920000000000002000000000000000000000000000000000000000000", + "newValue": "0x00690a4920000000000003000000000000000000000000000000000000000000" + }, + "0x85aaa47b6dc46495bb8824fad4583769726fea36efd831a35556690b830a8fbf": { + "previousValue": "0x000000000000000000093a8000000000000069386da100000000000000000000", + "newValue": "0x000000000000000000093a8000000000000069386da1000000000000690a4921" + } + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_before_AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_after.md b/diffs/AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_before_AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_after.md new file mode 100644 index 000000000..e8b05fab1 --- /dev/null +++ b/diffs/AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_before_AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_after.md @@ -0,0 +1,634 @@ +## Reserve changes + +### Reserves added + +#### GHO (0xb77E872A68C62CfC0dFb02C067Ecc3DA23B4bbf3) + +| description | value | +| --- | --- | +| decimals | 18 | +| isActive | true | +| isFrozen | false | +| supplyCap | 50,000,000 GHO | +| borrowCap | 20,000,000 GHO | +| debtCeiling | 0 $ [0] | +| isSiloed | false | +| isFlashloanable | true | +| oracle | 0xb0e1c7830aA781362f79225559Aa068E6bDaF1d1 | +| oracleDecimals | 8 | +| oracleLatestAnswer | 1 | +| usageAsCollateralEnabled | true | +| ltv | 75 % [7500] | +| liquidationThreshold | 78 % [7800] | +| liquidationBonus | 4.5 % | +| liquidationProtocolFee | 10 % [1000] | +| reserveFactor | 10 % [1000] | +| aToken | 0x5aA4bc74811D672DA5308019dA4779f673e60B47 | +| variableDebtToken | 0x7ec35d7008682c33dBC6b214E01D919e8d441e48 | +| borrowingEnabled | true | +| isBorrowableInIsolation | false | +| interestRateStrategy | 0x2B16E93bdB1897f517881B3c388bABD0C62C6cdC | +| aTokenName | Aave Plasma GHO | +| aTokenSymbol | aPlaGHO | +| aTokenUnderlyingBalance | 1 GHO [1000000000000000000] | +| id | 11 | +| isPaused | false | +| variableDebtTokenName | Aave Plasma Variable Debt GHO | +| variableDebtTokenSymbol | variableDebtPlaGHO | +| virtualBalance | 1 GHO [1000000000000000000] | +| optimalUsageRatio | 92 % | +| maxVariableBorrowRate | 21.25 % | +| baseVariableBorrowRate | 1.25 % | +| variableRateSlope1 | 3.5 % | +| variableRateSlope2 | 16.5 % | +| interestRate | ![ir](https://dash.onaave.com/api/static?variableRateSlope1=35000000000000000000000000&variableRateSlope2=165000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=12500000000000000000000000&maxVariableBorrowRate=212500000000000000000000000) | + + +## Emodes changed + +### EMode: USDe Stablecoins(id: 1) + + + +### EMode: sUSDe Stablecoins(id: 2) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label (unchanged) | sUSDe Stablecoins | sUSDe Stablecoins | +| eMode.ltv (unchanged) | 90 % | 90 % | +| eMode.liquidationThreshold (unchanged) | 92 % | 92 % | +| eMode.liquidationBonus (unchanged) | 4 % | 4 % | +| eMode.borrowableBitmap | USDT0 | USDT0, GHO | +| eMode.collateralBitmap (unchanged) | USDe, sUSDe | USDe, sUSDe | + + +### EMode: weETH WETH(id: 3) + + + +### EMode: weETH Stablecoins(id: 4) + + + +### EMode: PT-USDe Stablecoins Jan 2026(id: 5) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label (unchanged) | PT-USDe Stablecoins Jan 2026 | PT-USDe Stablecoins Jan 2026 | +| eMode.ltv | 86.9 % | 85.9 % | +| eMode.liquidationThreshold | 88.9 % | 87.9 % | +| eMode.liquidationBonus (unchanged) | 4.6 % | 4.6 % | +| eMode.borrowableBitmap | USDT0, USDe | USDT0, USDe, GHO | +| eMode.collateralBitmap (unchanged) | PT-USDe-15JAN2026 | PT-USDe-15JAN2026 | + + +### EMode: PT-USDe USDe Jan 2026(id: 6) + + + +### EMode: PT-sUSDe Stablecoins Jan 2026(id: 7) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label (unchanged) | PT-sUSDe Stablecoins Jan 2026 | PT-sUSDe Stablecoins Jan 2026 | +| eMode.ltv | 85.4 % | 84.4 % | +| eMode.liquidationThreshold | 87.4 % | 86.4 % | +| eMode.liquidationBonus (unchanged) | 5.7 % | 5.7 % | +| eMode.borrowableBitmap | USDT0, USDe | USDT0, USDe, GHO | +| eMode.collateralBitmap (unchanged) | PT-sUSDE-15JAN2026 | PT-sUSDE-15JAN2026 | + + +### EMode: PT-sUSDe USDe Jan 2026(id: 8) + + + +### EMode: wrsETH/WETH(id: 9) + + + +### EMode: wstETH/WETH(id: 10) + + + +### EMode: syrupUSDT/USDT0(id: 11) + + + +### EMode: GHO/USDT0(id: 12) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label | - | GHO/USDT0 | +| eMode.ltv | - | 94 % | +| eMode.liquidationThreshold | - | 96 % | +| eMode.liquidationBonus | - | 2 % | +| eMode.borrowableBitmap | - | USDT0 | +| eMode.collateralBitmap | - | syrupUSDT | + + +### EMode: syrupUSDT/GHO(id: 13) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label | - | syrupUSDT/GHO | +| eMode.ltv | - | 90 % | +| eMode.liquidationThreshold | - | 92 % | +| eMode.liquidationBonus | - | 4 % | +| eMode.borrowableBitmap | - | USDT0 | +| eMode.collateralBitmap | - | syrupUSDT | + + +### EMode: syrupUSDT Stables(id: 14) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label | - | syrupUSDT Stables | +| eMode.ltv | - | 90 % | +| eMode.liquidationThreshold | - | 92 % | +| eMode.liquidationBonus | - | 4 % | +| eMode.borrowableBitmap | - | USDT0 | +| eMode.collateralBitmap | - | syrupUSDT, GHO | + + +## Raw diff + +```json +{ + "eModes": { + "2": { + "borrowableBitmap": { + "from": "1", + "to": "2049" + } + }, + "5": { + "borrowableBitmap": { + "from": "3", + "to": "2051" + }, + "liquidationThreshold": { + "from": 8890, + "to": 8790 + }, + "ltv": { + "from": 8690, + "to": 8590 + } + }, + "7": { + "borrowableBitmap": { + "from": "3", + "to": "2051" + }, + "liquidationThreshold": { + "from": 8740, + "to": 8640 + }, + "ltv": { + "from": 8540, + "to": 8440 + } + }, + "12": { + "from": null, + "to": { + "borrowableBitmap": "1", + "collateralBitmap": "1024", + "eModeCategory": 12, + "label": "GHO/USDT0", + "liquidationBonus": 10200, + "liquidationThreshold": 9600, + "ltv": 9400 + } + }, + "13": { + "from": null, + "to": { + "borrowableBitmap": "1", + "collateralBitmap": "1024", + "eModeCategory": 13, + "label": "syrupUSDT/GHO", + "liquidationBonus": 10400, + "liquidationThreshold": 9200, + "ltv": 9000 + } + }, + "14": { + "from": null, + "to": { + "borrowableBitmap": "1", + "collateralBitmap": "3072", + "eModeCategory": 14, + "label": "syrupUSDT Stables", + "liquidationBonus": 10400, + "liquidationThreshold": 9200, + "ltv": 9000 + } + } + }, + "reserves": { + "0xb77E872A68C62CfC0dFb02C067Ecc3DA23B4bbf3": { + "from": null, + "to": { + "aToken": "0x5aA4bc74811D672DA5308019dA4779f673e60B47", + "aTokenName": "Aave Plasma GHO", + "aTokenSymbol": "aPlaGHO", + "aTokenUnderlyingBalance": "1000000000000000000", + "borrowCap": 20000000, + "borrowingEnabled": true, + "debtCeiling": 0, + "decimals": 18, + "id": 11, + "interestRateStrategy": "0x2B16E93bdB1897f517881B3c388bABD0C62C6cdC", + "isActive": true, + "isBorrowableInIsolation": false, + "isFlashloanable": true, + "isFrozen": false, + "isPaused": false, + "isSiloed": false, + "liquidationBonus": 10450, + "liquidationProtocolFee": 1000, + "liquidationThreshold": 7800, + "ltv": 7500, + "oracle": "0xb0e1c7830aA781362f79225559Aa068E6bDaF1d1", + "oracleDecimals": 8, + "oracleLatestAnswer": "100000000", + "reserveFactor": 1000, + "supplyCap": 50000000, + "symbol": "GHO", + "underlying": "0xb77E872A68C62CfC0dFb02C067Ecc3DA23B4bbf3", + "usageAsCollateralEnabled": true, + "variableDebtToken": "0x7ec35d7008682c33dBC6b214E01D919e8d441e48", + "variableDebtTokenName": "Aave Plasma Variable Debt GHO", + "variableDebtTokenSymbol": "variableDebtPlaGHO", + "virtualBalance": "1000000000000000000" + } + } + }, + "strategies": { + "0xb77E872A68C62CfC0dFb02C067Ecc3DA23B4bbf3": { + "from": null, + "to": { + "address": "0x2B16E93bdB1897f517881B3c388bABD0C62C6cdC", + "baseVariableBorrowRate": "12500000000000000000000000", + "maxVariableBorrowRate": "212500000000000000000000000", + "optimalUsageRatio": "920000000000000000000000000", + "variableRateSlope1": "35000000000000000000000000", + "variableRateSlope2": "165000000000000000000000000" + } + } + }, + "raw": { + "0x2b16e93bdb1897f517881b3c388babd0c62c6cdc": { + "label": null, + "balanceDiff": null, + "stateDiff": { + "0x2946f03ada64466b4e53a11bb68fb38d2e2ddd5250c0baafaee99496b6fc0a38": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000000000000000000006720000015e0000007d23f0" + } + } + }, + "0x33e0b3fc976dc9c516926ba48cfc0a9e10a2aaa5": { + "label": "AaveV3Plasma.ORACLE", + "balanceDiff": null, + "stateDiff": { + "0x2946f03ada64466b4e53a11bb68fb38d2e2ddd5250c0baafaee99496b6fc0a38": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000b0e1c7830aa781362f79225559aa068e6bdaf1d1" + } + } + }, + "0x5117f170716eceac8ef63d375bc7416afa6f4497": { + "label": "AaveV3Plasma.EMISSION_MANAGER", + "balanceDiff": null, + "stateDiff": { + "0x0e02b2c0482f5046c22f5571248a57158da27a0e7aba9a498664e4aa976ac803": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000ac140648435d03f784879cd789130f22ef588fcd" + }, + "0x6a24eec3ea7f5ab213e50c1e4e4999b2ff9cb338a97a4d989bfdaca041ca8cfe": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000ac140648435d03f784879cd789130f22ef588fcd" + } + } + }, + "0x5aa4bc74811d672da5308019da4779f673e60b47": { + "label": null, + "balanceDiff": null, + "stateDiff": { + "0x0000000000000000000000000000000000000000000000000000000000000000": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000004" + }, + "0x0000000000000000000000000000000000000000000000000000000000000001": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + "0x0000000000000000000000000000000000000000000000000000000000000036": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000" + }, + "0x0000000000000000000000000000000000000000000000000000000000000037": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x4161766520506c61736d612047484f000000000000000000000000000000001e" + }, + "0x0000000000000000000000000000000000000000000000000000000000000038": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x61506c6147484f0000000000000000000000000000000000000000000000000e" + }, + "0x0000000000000000000000000000000000000000000000000000000000000039": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000012" + }, + "0x000000000000000000000000000000000000000000000000000000000000003b": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0xc873579795ccba65f2b59dce6f93cbacd520c58651307fe616f7b065269296e0" + }, + "0x000000000000000000000000000000000000000000000000000000000000003d": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000b77e872a68c62cfc0dfb02c067ecc3da23b4bbf3" + }, + "0x208dbdea7f47b2b5a177d450774cdf528c89faaec27279171fb7a3b116eacacd": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x00000000033b2e3c9fd0803ce800000000000000000000000de0b6b3a7640000" + }, + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000f6dac650da5616bc3206e969d7868e7c25805171", + "label": "Implementation slot" + } + } + }, + "0x7ec35d7008682c33dbc6b214e01d919e8d441e48": { + "label": null, + "balanceDiff": null, + "stateDiff": { + "0x0000000000000000000000000000000000000000000000000000000000000000": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000004" + }, + "0x0000000000000000000000000000000000000000000000000000000000000001": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + "0x0000000000000000000000000000000000000000000000000000000000000035": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x89dc6b2d5c9fe5fbc517e8b606d8fddf624f9d1e8bf847f3e3f98d600fa3820d" + }, + "0x0000000000000000000000000000000000000000000000000000000000000037": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000b77e872a68c62cfc0dfb02c067ecc3da23b4bbf3" + }, + "0x000000000000000000000000000000000000000000000000000000000000003b": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x4161766520506c61736d61205661726961626c6520446562742047484f00003a" + }, + "0x000000000000000000000000000000000000000000000000000000000000003c": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x7661726961626c6544656274506c6147484f0000000000000000000000000024" + }, + "0x000000000000000000000000000000000000000000000000000000000000003d": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000012" + }, + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000458d281bffce958e34571b33f1f26bd42aa27c44", + "label": "Implementation slot" + } + } + }, + "0x925a2a7214ed92428b5b1b090f80b25700095e12": { + "label": "AaveV3Plasma.POOL", + "balanceDiff": null, + "stateDiff": { + "0x000000000000000000000000000000000000000000000000000000000000003b": { + "previousValue": "0x00000000000000000000000000000000000000000000000b0000000000000000", + "newValue": "0x00000000000000000000000000000000000000000000000c0000000000000000" + }, + "0x04e6a57294bb916b654e5f2a9be58b33bb23f83005593c07f959637b56d00d6f": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000000000000000000000000000040028a023f02328" + }, + "0x04e6a57294bb916b654e5f2a9be58b33bb23f83005593c07f959637b56d00d70": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x7379727570555344542f47484f0000000000000000000000000000000000001a" + }, + "0x04e6a57294bb916b654e5f2a9be58b33bb23f83005593c07f959637b56d00d71": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0x1aec1d7d90e7fdc8d0cb5cae39901fd57c1eb538af488d7215b10b8d307d84b7": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000000000000000000000000000040027d8258024b8" + }, + "0x1aec1d7d90e7fdc8d0cb5cae39901fd57c1eb538af488d7215b10b8d307d84b8": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x47484f2f55534454300000000000000000000000000000000000000000000012" + }, + "0x1aec1d7d90e7fdc8d0cb5cae39901fd57c1eb538af488d7215b10b8d307d84b9": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0x1e4061ed12ce1f4439fe6c7922bd1dce45af754358ce2f94214f93749947e40a": { + "previousValue": "0x0000000000000000000000000000000000000000000000000080294a2224215c", + "newValue": "0x0000000000000000000000000000000000000000000000000080294a21c020f8" + }, + "0x1e4061ed12ce1f4439fe6c7922bd1dce45af754358ce2f94214f93749947e40b": { + "previousValue": "0x50542d735553446520537461626c65636f696e73204a616e203230323600003a", + "newValue": "0x50542d735553446520537461626c65636f696e73204a616e203230323600003a" + }, + "0x1e4061ed12ce1f4439fe6c7922bd1dce45af754358ce2f94214f93749947e40c": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000003", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000803" + }, + "0x2ab8cd8eab3e8c901115e793997bc427e1596b98dcca832d2eb3bc8b02d226a1": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000c0028a023f02328" + }, + "0x2ab8cd8eab3e8c901115e793997bc427e1596b98dcca832d2eb3bc8b02d226a2": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x73797275705553445420537461626c6573000000000000000000000000000022" + }, + "0x2ab8cd8eab3e8c901115e793997bc427e1596b98dcca832d2eb3bc8b02d226a3": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0x4138f036c3ffa28e5a438654f0c2140682f898abe9be8e78a8a4ce94f75bb5aa": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x100000000000000000000003e8002faf080001312d0003e8851228d21e781d4c" + }, + "0x4138f036c3ffa28e5a438654f0c2140682f898abe9be8e78a8a4ce94f75bb5ab": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000033b2e3c9fd0803ce8000000" + }, + "0x4138f036c3ffa28e5a438654f0c2140682f898abe9be8e78a8a4ce94f75bb5ac": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x00000000000a56fa5b99019a5c80000000000000033b2e3c9fd0803ce8000000" + }, + "0x4138f036c3ffa28e5a438654f0c2140682f898abe9be8e78a8a4ce94f75bb5ad": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000b00690136f000000000000000000000000000000000" + }, + "0x4138f036c3ffa28e5a438654f0c2140682f898abe9be8e78a8a4ce94f75bb5ae": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000005aa4bc74811d672da5308019da4779f673e60b47" + }, + "0x4138f036c3ffa28e5a438654f0c2140682f898abe9be8e78a8a4ce94f75bb5b0": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000007ec35d7008682c33dbc6b214e01d919e8d441e48" + }, + "0x4138f036c3ffa28e5a438654f0c2140682f898abe9be8e78a8a4ce94f75bb5b2": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x00000000000000000de0b6b3a764000000000000000000000000000000000000" + }, + "0x4138f036c3ffa28e5a438654f0c2140682f898abe9be8e78a8a4ce94f75bb5b3": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + "0x50039cf134a124858bd88bbc9225ec3c537b89a0e9237ce39fe1813e6edf8257": { + "previousValue": "0x000000000000000000000000000000000000000000000000004028dc22ba21f2", + "newValue": "0x000000000000000000000000000000000000000000000000004028dc2256218e" + }, + "0x50039cf134a124858bd88bbc9225ec3c537b89a0e9237ce39fe1813e6edf8258": { + "previousValue": "0x50542d5553446520537461626c65636f696e73204a616e203230323600000038", + "newValue": "0x50542d5553446520537461626c65636f696e73204a616e203230323600000038" + }, + "0x50039cf134a124858bd88bbc9225ec3c537b89a0e9237ce39fe1813e6edf8259": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000003", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000803" + }, + "0x67dcc86da9aaaf40a183002157e56801115aa6057705e43279b4c1c90942d6b2": { + "previousValue": "0x000000000000000000000000000000000000000000000000000628a023f02328", + "newValue": "0x000000000000000000000000000000000000000000000000000628a023f02328" + }, + "0x67dcc86da9aaaf40a183002157e56801115aa6057705e43279b4c1c90942d6b4": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000801" + }, + "0xf7b916e89ff198a55c9a32d87db68cde6f482de2d189099c6dab6507b6e177ae": { + "previousValue": "0x00000000000000000000000000000000000000000000000000000000002aaa2a", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000aaaa2a" + }, + "0xf801cd91f4737d4fcbeb3108ca2da80cf9c1a7a3469221f74308d5bc7ba7610b": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000b77e872a68c62cfc0dfb02c067ecc3da23b4bbf3" + } + } + }, + "0xa860355f0ccfdc823f7332ac108317b2a1509c06": { + "label": "AaveV3Plasma.ACL_MANAGER", + "balanceDiff": null, + "stateDiff": { + "0xa468be17ccb04a81200cd39fdb6e4ec81e44858b0e7814526f2643905eae614f": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + } + } + }, + "0xb77e872a68c62cfc0dfb02c067ecc3da23b4bbf3": { + "label": null, + "balanceDiff": null, + "stateDiff": { + "0x65266b84825d8bb61d69c7d2bc2fe50e7dee46583bcc5d823eefa5dd83b09049": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000" + }, + "0x6689af251dc0b2943fc392fc8ef86ab234ede24d687011823b8f8b0aede7d219": { + "previousValue": "0x000000000000000000000000000000000000000000295be97c44bd1d19640000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + "0x8745960c47bf71bf554325fbbad03c9b5685e46b51cfde2bf2bde8c1b6b659f2": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000000000000000000000295be96e64066972000000" + }, + "0x9ff2999df03f19dda98f7a8abb01d592df96e9d3ba818a81f818be4a10cc0896": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + "0xa2fd85a9b347f1041e91f80427bc02531df11e736b8ac39ce9699066ca5ef08f": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + } + }, + "0xbada742e7ff54595f9049eef1cc5aaf4364988b9": { + "label": null, + "balanceDiff": null, + "stateDiff": { + "0x0000000000000000000000000000000000000000000000000000000000000036": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0x1ec0abbf0635e36499113ff15936f70705c387ddd2e9a57f6c4b41d7163572ad": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000000000000000000000295be96e64066972000000" + }, + "0x4a11f94e20a93c79f6ec743a1954ec4fc2c08429ae2122118bf234b2185c81b8": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000d06114f714becd6f373e5ce94e07278ef46ebf37" + }, + "0x528409ae7d19f60e7983a73badac54e7d38d52b21a6f5486bc0450fdc95062fe": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + } + } + }, + "0xc563fc29dd0a7e56d1b5cc7bbf1dcf044d755303": { + "label": null, + "balanceDiff": null, + "stateDiff": { + "0x0000000000000000000000000000000000000000000000000000000000000001": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0x8e98d45570ff3fa69e12ac542fefda790c069ada879027e142a20629e641c04a": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000d06114f714becd6f373e5ce94e07278ef46ebf37" + } + } + }, + "0xd06114f714becd6f373e5ce94e07278ef46ebf37": { + "label": null, + "balanceDiff": null, + "stateDiff": { + "0x0000000000000000000000000000000000000000000000000000000000000037": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x000000000000000000000000d70be7e6111ea563226cb8e53b1f195da4e566e2" + }, + "0x0f628fb63a8d25c134f60c4417b5297d243c8bade8611da5656b277c0679233e": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0xd416476fb6e6a1adff89bd6a549896895440a6eb6eb559f8157f82060fee3072": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + "0xee422176155ce30ad5fb06988dabe5f66c217b34ce1729f1ade63e07846cdb3c": { + "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001" + } + } + }, + "0xe76eb348e65ef163d85ce282125ff5a7f5712a1d": { + "label": "GovernanceV3Plasma.PAYLOADS_CONTROLLER", + "balanceDiff": null, + "stateDiff": { + "0x85aaa47b6dc46495bb8824fad4583769726fea36efd831a35556690b830a8fbe": { + "previousValue": "0x00690136ef000000000002000000000000000000000000000000000000000000", + "newValue": "0x00690136ef000000000003000000000000000000000000000000000000000000" + }, + "0x85aaa47b6dc46495bb8824fad4583769726fea36efd831a35556690b830a8fbf": { + "previousValue": "0x000000000000000000093a80000000000000692f5b7000000000000000000000", + "newValue": "0x000000000000000000093a80000000000000692f5b70000000000000690136f0" + } + } + } + } +} +``` \ No newline at end of file diff --git a/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1.sol b/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1.sol new file mode 100644 index 000000000..3a4dc4d2b --- /dev/null +++ b/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1.sol @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {GhoEthereum} from 'aave-address-book/GhoEthereum.sol'; + +import {IUpgradeableLockReleaseTokenPool, IRateLimiter} from 'src/interfaces/ccip/IUpgradeableLockReleaseTokenPool.sol'; +import {CCIPChainSelectors} from '../helpers/gho-launch/constants/CCIPChainSelectors.sol'; + +/** + * @title Add GHO and deploy GSM on Plasma. Migrate to new GSM on Ethereum + * @author @TokenLogic + * - Snapshot: https://snapshot.box/#/s:aavedao.eth/proposal/0xeb3572580924976867073ad9c8012cb9e52093c76dafebd7d3aebf318f2576fb + * - Discussion: https://governance.aave.com/t/arfc-launch-gho-on-plasma-set-aci-as-emissions-manager-for-rewards/22994/6 + */ +contract AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1 is + IProposalGenericExecutor +{ + // 50M GHO bridge amount + 10% leeway in case of other bridges + uint256 public constant TEMP_BRIDGE_CAPACITY = 55_000_000 ether; + uint256 public constant NEW_BRIDGE_LIMIT = 100_000_000 ether; + + uint128 public constant DEFAULT_RATE_LIMITER_CAPACITY = 1_500_000e18; + uint128 public constant DEFAULT_RATE_LIMITER_RATE = 300e18; + + function execute() external { + IUpgradeableLockReleaseTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL).setBridgeLimit( + NEW_BRIDGE_LIMIT + ); + + // Temporarily increase the maximum bridge limit + IUpgradeableLockReleaseTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL).setChainRateLimiterConfig( + CCIPChainSelectors.PLASMA, + IRateLimiter.Config({ + isEnabled: true, + capacity: uint128(TEMP_BRIDGE_CAPACITY), + rate: uint128(TEMP_BRIDGE_CAPACITY) - 1 // Set rate to new capacity so it refills immediately + }), + IRateLimiter.Config({ + isEnabled: true, + capacity: DEFAULT_RATE_LIMITER_CAPACITY, + rate: DEFAULT_RATE_LIMITER_RATE + }) + ); + } +} diff --git a/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1.t.sol b/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1.t.sol new file mode 100644 index 000000000..09b756aef --- /dev/null +++ b/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1.t.sol @@ -0,0 +1,82 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {IUpgradeableLockReleaseTokenPool, IRateLimiter} from 'src/interfaces/ccip/IUpgradeableLockReleaseTokenPool.sol'; +import {CCIPChainSelectors} from '../helpers/gho-launch/constants/CCIPChainSelectors.sol'; +import {GhoEthereum} from 'aave-address-book/GhoEthereum.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; + +import {AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1} from './AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1.sol'; + +/** + * @dev Test for AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930 + * command: FOUNDRY_PROFILE=test forge test --match-path=src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1.t.sol -vv + */ +contract AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Test is + ProtocolV3TestBase +{ + AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1 + internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 23792200); + proposal = new AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1', + AaveV3Ethereum.POOL, + address(proposal) + ); + } + + function test_bridgeLimit() public { + assertEq( + IUpgradeableLockReleaseTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL).getBridgeLimit(), + 40_000_000 ether + ); + + executePayload(vm, address(proposal)); + + assertEq( + IUpgradeableLockReleaseTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL).getBridgeLimit(), + proposal.NEW_BRIDGE_LIMIT() + ); + } + + function test_rateLimiter() public { + IRateLimiter.TokenBucket memory bucket = IUpgradeableLockReleaseTokenPool( + GhoEthereum.GHO_CCIP_TOKEN_POOL + ).getCurrentOutboundRateLimiterState(CCIPChainSelectors.PLASMA); + + assertEq(bucket.capacity, proposal.DEFAULT_RATE_LIMITER_CAPACITY()); + assertEq(bucket.rate, proposal.DEFAULT_RATE_LIMITER_RATE()); + assertTrue(bucket.isEnabled); + assertEq(bucket.tokens, proposal.DEFAULT_RATE_LIMITER_CAPACITY()); + + executePayload(vm, address(proposal)); + + bucket = IUpgradeableLockReleaseTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL) + .getCurrentOutboundRateLimiterState(CCIPChainSelectors.PLASMA); + + assertEq(bucket.capacity, proposal.TEMP_BRIDGE_CAPACITY()); + assertEq(bucket.rate, proposal.TEMP_BRIDGE_CAPACITY() - 1); + assertTrue(bucket.isEnabled); + assertEq(bucket.tokens, proposal.DEFAULT_RATE_LIMITER_CAPACITY()); + + vm.warp(block.timestamp + 1); + + bucket = IUpgradeableLockReleaseTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL) + .getCurrentOutboundRateLimiterState(CCIPChainSelectors.PLASMA); + + assertEq(bucket.capacity, proposal.TEMP_BRIDGE_CAPACITY()); + assertEq(bucket.rate, proposal.TEMP_BRIDGE_CAPACITY() - 1); + assertTrue(bucket.isEnabled); + assertEq(bucket.tokens, proposal.TEMP_BRIDGE_CAPACITY()); + } +} diff --git a/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2.sol b/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2.sol new file mode 100644 index 000000000..8711f9162 --- /dev/null +++ b/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from 'openzeppelin-contracts/contracts/token/ERC20/IERC20.sol'; +import {SafeERC20} from 'openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol'; +import {CCIPChainSelectors} from '../helpers/gho-launch/constants/CCIPChainSelectors.sol'; +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {GhoEthereum} from 'aave-address-book/GhoEthereum.sol'; +import {IUpgradeableLockReleaseTokenPool, IRateLimiter} from 'src/interfaces/ccip/IUpgradeableLockReleaseTokenPool.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {IAaveGhoCcipBridge} from 'aave-helpers/src/bridges/ccip/interfaces/IAaveGhoCcipBridge.sol'; +import {IGhoToken} from 'src/interfaces/IGhoToken.sol'; +import {IOwnableFacilitator} from 'src/interfaces/IOwnableFacilitator.sol'; + +/** + * @title Add GHO and deploy GSM on Plasma. Migrate to new GSM on Ethereum + * @author @TokenLogic + * - Snapshot: https://snapshot.box/#/s:aavedao.eth/proposal/0xeb3572580924976867073ad9c8012cb9e52093c76dafebd7d3aebf318f2576fb + * - Discussion: https://governance.aave.com/t/arfc-launch-gho-on-plasma-set-aci-as-emissions-manager-for-rewards/22994/6 + */ +contract AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2 is + IProposalGenericExecutor +{ + using SafeERC20 for IERC20; + + // OwnableFacilitator Constants + // https://etherscan.io/address/0x023eb65d5098bfb44e71bf0d3affe2a9b87e743d + address public constant OWNABLE_FACILITATOR = 0x023eb65d5098bfB44E71bf0D3AFfe2A9B87e743d; + string public constant OWNABLE_FACILITATOR_NAME = 'OwnableFacilitator GHO On Plasma'; + uint128 public constant OWNABLE_FACILITATOR_CAPACITY = 50_000_000 ether; + + // https://etherscan.io/address/0x7f2f96fcdc3a29be75938d2ac3d92e7006919fe6 + address public constant CCIP_BRIDGE = 0x7F2f96fcdC3A29Be75938d2aC3D92E7006919fe6; + + uint128 public constant DEFAULT_RATE_LIMITER_CAPACITY = 1_500_000e18; + uint128 public constant DEFAULT_RATE_LIMITER_RATE = 300e18; + uint256 public constant PLASMA_BRIDGE_AMOUNT = 50_000_000 ether; + + function execute() external { + IGhoToken(AaveV3EthereumAssets.GHO_UNDERLYING).addFacilitator( + OWNABLE_FACILITATOR, + OWNABLE_FACILITATOR_NAME, + OWNABLE_FACILITATOR_CAPACITY + ); + + IOwnableFacilitator(OWNABLE_FACILITATOR).mint(address(this), PLASMA_BRIDGE_AMOUNT); + + IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).approve(CCIP_BRIDGE, PLASMA_BRIDGE_AMOUNT); + + // Bridge already has LINK to bridge, no need to send for fee + IAaveGhoCcipBridge(CCIP_BRIDGE).send( + CCIPChainSelectors.PLASMA, + PLASMA_BRIDGE_AMOUNT, + AaveV3EthereumAssets.LINK_UNDERLYING + ); + + // Restore bridge limit + IUpgradeableLockReleaseTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL).setChainRateLimiterConfig( + CCIPChainSelectors.PLASMA, + IRateLimiter.Config({ + isEnabled: true, + capacity: DEFAULT_RATE_LIMITER_CAPACITY, + rate: DEFAULT_RATE_LIMITER_RATE + }), + IRateLimiter.Config({ + isEnabled: true, + capacity: DEFAULT_RATE_LIMITER_CAPACITY, + rate: DEFAULT_RATE_LIMITER_RATE + }) + ); + } +} diff --git a/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2.t.sol b/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2.t.sol new file mode 100644 index 000000000..438e6a917 --- /dev/null +++ b/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2.t.sol @@ -0,0 +1,139 @@ +// 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 {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {GhoEthereum} from 'aave-address-book/GhoEthereum.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {IAaveGhoCcipBridge} from 'aave-helpers/src/bridges/ccip/interfaces/IAaveGhoCcipBridge.sol'; +import {CCIPChainSelectors} from '../helpers/gho-launch/constants/CCIPChainSelectors.sol'; +import {IUpgradeableBurnMintTokenPool, IRateLimiter} from 'src/interfaces/ccip/IUpgradeableBurnMintTokenPool.sol'; +import {IUpgradeableLockReleaseTokenPool} from 'src/interfaces/ccip/IUpgradeableLockReleaseTokenPool.sol'; +import {IGhoToken} from 'src/interfaces/IGhoToken.sol'; + +import {AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2} from './AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2.sol'; + +/** + * @dev Test for AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2 + * command: FOUNDRY_PROFILE=test forge test --match-path=src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2.t.sol -vv + */ +contract AaveV3Ethereum_LaunchGHOOnEthereumSetACIAsEmissionsManagerForRewards_20250930_Part2_Test is + ProtocolV3TestBase +{ + /** + * @dev Emitted when a new GHO transfer is issued + * @param messageId The ID of the cross-chain message + * @param destinationChainSelector The selector of the destination chain + * @param from The address of sender on source chain + * @param amount The total amount of GHO transferred + */ + event BridgeMessageInitiated( + bytes32 indexed messageId, + uint64 indexed destinationChainSelector, + address indexed from, + uint256 amount + ); + + AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2 + internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 23792200); + proposal = new AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2(); + } + + function test_bridgeLimitRestore() public { + // Mock the update from Part 1 + vm.startPrank(GovernanceV3Ethereum.EXECUTOR_LVL_1); + IUpgradeableLockReleaseTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL).setBridgeLimit( + proposal.OWNABLE_FACILITATOR_CAPACITY() * 2 + ); + + IUpgradeableBurnMintTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL).setChainRateLimiterConfig( + CCIPChainSelectors.PLASMA, + IRateLimiter.Config({isEnabled: true, capacity: 55_000_000 ether, rate: 54_999_999 ether}), + IRateLimiter.Config({ + isEnabled: true, + capacity: proposal.DEFAULT_RATE_LIMITER_CAPACITY(), + rate: proposal.DEFAULT_RATE_LIMITER_RATE() + }) + ); + vm.stopPrank(); + vm.warp(block.timestamp + 1); + + IRateLimiter.TokenBucket memory bucket = IUpgradeableBurnMintTokenPool( + GhoEthereum.GHO_CCIP_TOKEN_POOL + ).getCurrentOutboundRateLimiterState(CCIPChainSelectors.PLASMA); + + assertGt(bucket.capacity, proposal.DEFAULT_RATE_LIMITER_CAPACITY()); + assertGt(bucket.rate, proposal.DEFAULT_RATE_LIMITER_RATE()); + assertTrue(bucket.isEnabled); + assertGt(bucket.tokens, proposal.DEFAULT_RATE_LIMITER_CAPACITY()); + + executePayload(vm, address(proposal)); + + bucket = IUpgradeableBurnMintTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL) + .getCurrentOutboundRateLimiterState(CCIPChainSelectors.PLASMA); + + assertEq(bucket.capacity, proposal.DEFAULT_RATE_LIMITER_CAPACITY()); + assertEq(bucket.rate, proposal.DEFAULT_RATE_LIMITER_RATE()); + assertTrue(bucket.isEnabled); + assertEq(bucket.tokens, proposal.DEFAULT_RATE_LIMITER_CAPACITY()); + } + + function test_bridge() public { + vm.startPrank(GovernanceV3Ethereum.EXECUTOR_LVL_1); + IGhoToken.Facilitator memory facilitator = IGhoToken(AaveV3EthereumAssets.GHO_UNDERLYING) + .getFacilitator(proposal.OWNABLE_FACILITATOR()); + + IUpgradeableLockReleaseTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL).setBridgeLimit( + proposal.OWNABLE_FACILITATOR_CAPACITY() * 2 + ); + + IUpgradeableBurnMintTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL).setChainRateLimiterConfig( + CCIPChainSelectors.PLASMA, + IRateLimiter.Config({isEnabled: true, capacity: 55_000_000 ether, rate: 54_999_999 ether}), + IRateLimiter.Config({ + isEnabled: true, + capacity: proposal.DEFAULT_RATE_LIMITER_CAPACITY(), + rate: proposal.DEFAULT_RATE_LIMITER_RATE() + }) + ); + vm.stopPrank(); + vm.warp(block.timestamp + 1); + + assertEq(facilitator.bucketCapacity, 0); + assertEq(facilitator.bucketLevel, 0); + + uint256 fee = IAaveGhoCcipBridge(proposal.CCIP_BRIDGE()).quoteBridge( + CCIPChainSelectors.PLASMA, + proposal.PLASMA_BRIDGE_AMOUNT(), + AaveV3EthereumAssets.LINK_UNDERLYING + ); + + uint256 feeBalance = IERC20(AaveV3EthereumAssets.LINK_UNDERLYING).balanceOf( + proposal.CCIP_BRIDGE() + ); + + emit BridgeMessageInitiated( + bytes32(0), + CCIPChainSelectors.PLASMA, + GovernanceV3Ethereum.EXECUTOR_LVL_1, + proposal.PLASMA_BRIDGE_AMOUNT() + ); + + executePayload(vm, address(proposal)); + + facilitator = IGhoToken(AaveV3EthereumAssets.GHO_UNDERLYING).getFacilitator( + proposal.OWNABLE_FACILITATOR() + ); + + assertEq(facilitator.bucketCapacity, proposal.OWNABLE_FACILITATOR_CAPACITY()); + assertEq(facilitator.bucketLevel, proposal.PLASMA_BRIDGE_AMOUNT()); + assertEq( + IERC20(AaveV3EthereumAssets.LINK_UNDERLYING).balanceOf(proposal.CCIP_BRIDGE()), + feeBalance - fee + ); + } +} diff --git a/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1.sol b/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1.sol new file mode 100644 index 000000000..4d04ca2af --- /dev/null +++ b/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GhoPlasma} from 'aave-address-book/GhoPlasma.sol'; +import {CCIPChainSelectors} from '../helpers/gho-launch/constants/CCIPChainSelectors.sol'; +import {IUpgradeableBurnMintTokenPool, IRateLimiter} from 'src/interfaces/ccip/IUpgradeableBurnMintTokenPool.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; + +/** + * @title Add GHO and deploy GSM on Plasma. Migrate to new GSM on Ethereum + * @author @TokenLogic + * - Snapshot: https://snapshot.box/#/s:aavedao.eth/proposal/0xeb3572580924976867073ad9c8012cb9e52093c76dafebd7d3aebf318f2576fb + * - Discussion: https://governance.aave.com/t/arfc-launch-gho-on-plasma-set-aci-as-emissions-manager-for-rewards/22994/6 + */ +contract AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1 is + IProposalGenericExecutor +{ + uint128 public constant DEFAULT_RATE_LIMITER_CAPACITY = 1_500_000e18; + uint128 public constant DEFAULT_RATE_LIMITER_RATE = 300e18; + + // 50M GHO to be bridged, add 10% leeway initially in case other bridges take place + uint256 public constant NEW_CAPACITY = 55_000_000 ether; + + function execute() external { + IUpgradeableBurnMintTokenPool(GhoPlasma.GHO_CCIP_TOKEN_POOL).setChainRateLimiterConfig( + CCIPChainSelectors.ETHEREUM, + IRateLimiter.Config({ + isEnabled: true, + capacity: DEFAULT_RATE_LIMITER_CAPACITY, + rate: DEFAULT_RATE_LIMITER_RATE + }), + IRateLimiter.Config({ + isEnabled: true, + capacity: uint128(NEW_CAPACITY), + rate: uint128(NEW_CAPACITY) - 1 // Set rate to capacity so it fills to limit right away (-1 because they cannot be the same) + }) + ); + } +} diff --git a/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1.t.sol b/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1.t.sol new file mode 100644 index 000000000..ee46ec5cb --- /dev/null +++ b/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1.t.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from 'openzeppelin-contracts/contracts/token/ERC20/IERC20.sol'; +import {AaveV3Plasma, AaveV3PlasmaAssets} from 'aave-address-book/AaveV3Plasma.sol'; +import {GovernanceV3Plasma} from 'aave-address-book/GovernanceV3Plasma.sol'; +import {GhoPlasma} from 'aave-address-book/GhoPlasma.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {IUpgradeableBurnMintTokenPool, IRateLimiter} from 'src/interfaces/ccip/IUpgradeableBurnMintTokenPool.sol'; +import {CCIPChainSelectors} from '../helpers/gho-launch/constants/CCIPChainSelectors.sol'; + +import {AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1} from './AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1.sol'; + +/** + * @dev Test for AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1 + * command: FOUNDRY_PROFILE=test forge test --match-path=src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1.t.sol -vv + */ +contract AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1_Test is + ProtocolV3TestBase +{ + AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('plasma'), 6128244); + proposal = new AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1', + AaveV3Plasma.POOL, + address(proposal) + ); + } + + function test_bridgeLimitIncrease() public { + IRateLimiter.TokenBucket memory bucket = IUpgradeableBurnMintTokenPool( + GhoPlasma.GHO_CCIP_TOKEN_POOL + ).getCurrentInboundRateLimiterState(CCIPChainSelectors.ETHEREUM); + + assertEq(bucket.capacity, proposal.DEFAULT_RATE_LIMITER_CAPACITY()); + assertEq(bucket.rate, proposal.DEFAULT_RATE_LIMITER_RATE()); + assertTrue(bucket.isEnabled); + assertEq(bucket.tokens, proposal.DEFAULT_RATE_LIMITER_CAPACITY()); + + executePayload(vm, address(proposal)); + + vm.warp(block.timestamp + 1); + + bucket = IUpgradeableBurnMintTokenPool(GhoPlasma.GHO_CCIP_TOKEN_POOL) + .getCurrentInboundRateLimiterState(CCIPChainSelectors.ETHEREUM); + + assertEq(bucket.capacity, proposal.NEW_CAPACITY()); + assertEq(bucket.rate, proposal.NEW_CAPACITY() - 1); + assertTrue(bucket.isEnabled); + assertEq(bucket.tokens, proposal.NEW_CAPACITY()); + } +} diff --git a/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2.sol b/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2.sol new file mode 100644 index 000000000..a6cfd82f5 --- /dev/null +++ b/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2.sol @@ -0,0 +1,285 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from 'openzeppelin-contracts/contracts/token/ERC20/IERC20.sol'; +import {IACLManager} from 'aave-address-book/AaveV3.sol'; +import {SafeERC20} from 'openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol'; +import {AaveV3Plasma, AaveV3PlasmaAssets} from 'aave-address-book/AaveV3Plasma.sol'; +import {AaveV3PayloadPlasma} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadPlasma.sol'; +import {GhoPlasma} from 'aave-address-book/GhoPlasma.sol'; +import {MiscPlasma} from 'aave-address-book/MiscPlasma.sol'; +import {GovernanceV3Plasma} from 'aave-address-book/GovernanceV3Plasma.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {CCIPChainSelectors} from '../helpers/gho-launch/constants/CCIPChainSelectors.sol'; +import {IUpgradeableBurnMintTokenPool, IRateLimiter} from 'src/interfaces/ccip/IUpgradeableBurnMintTokenPool.sol'; +import {IEmissionManager} from 'aave-v3-origin/contracts/rewards/interfaces/IEmissionManager.sol'; + +import {IGhoBucketSteward} from 'src/interfaces/IGhoBucketSteward.sol'; +import {IGhoToken} from 'src/interfaces/IGhoToken.sol'; +import {IGsm} from 'src/interfaces/IGsm.sol'; +import {IGsmRegistry} from 'src/interfaces/IGsmRegistry.sol'; +import {IAaveCLRobotOperator} from 'src/interfaces/IAaveCLRobotOperator.sol'; + +interface IGhoReserve { + function addEntity(address entity) external; + function setLimit(address entity, uint256 limit) external; + function totalEntities() external view returns (uint256); +} + +/** + * @title Add GHO and deploy GSM on Plasma. Migrate to new GSM on Ethereum + * @author @TokenLogic + * - Snapshot: https://snapshot.box/#/s:aavedao.eth/proposal/0xeb3572580924976867073ad9c8012cb9e52093c76dafebd7d3aebf318f2576fb + * - Discussion: https://governance.aave.com/t/arfc-launch-gho-on-plasma-set-aci-as-emissions-manager-for-rewards/22994/6 + */ +contract AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2 is + AaveV3PayloadPlasma +{ + using SafeERC20 for IERC20; + + uint128 public constant DEFAULT_RATE_LIMITER_CAPACITY = 1_500_000e18; + uint128 public constant DEFAULT_RATE_LIMITER_RATE = 300e18; + + // https://plasmascan.to/address/0xac140648435d03f784879cd789130F22Ef588Fcd + address public constant GHO_LM_ADMIN = 0xac140648435d03f784879cd789130F22Ef588Fcd; + + uint256 public constant GHO_SEED_AMOUNT = 10e18; + + // GhoReserve + // https://plasmascan.to/address/0xBAdA742e7Ff54595F9049eeF1Cc5AaF4364988B9 + address public constant GHO_RESERVE = 0xBAdA742e7Ff54595F9049eeF1Cc5AaF4364988B9; + uint256 public constant BRIDGED_AMOUNT = 50_000_000 ether; + + // Capacities + uint128 public constant USDT_CAPACITY = 50_000_000 ether; + + // https://plasmascan.to/address/0x86992b2E2385E478dd2eeBfaE06369636e0a64E8 + address public constant GHO_GSM_STEWARD = 0x86992b2E2385E478dd2eeBfaE06369636e0a64E8; + + // https://plasmascan.to/address/0xA5Ba213867E175A182a5dd6A9193C6158738105A + address public constant GHO_AAVE_STEWARD = 0xA5Ba213867E175A182a5dd6A9193C6158738105A; + + // https://plasmascan.to/address/0xc563fc29dD0A7E56D1B5Cc7bbF1DCF044d755303 + address public constant GSM_REGISTRY = 0xc563fc29dD0A7E56D1B5Cc7bbF1DCF044d755303; + + // https://plasmascan.to/address/0xd06114F714beCD6f373e5cE94E07278eF46eBF37 + address public constant NEW_GSM_USDT = 0xd06114F714beCD6f373e5cE94E07278eF46eBF37; + + // https://plasmascan.to/address/0x0B60713B53Cf01Ff53111D0BC29743eF1E03C296 + address public constant USDT_ORACLE_SWAP_FREEZER = 0x0B60713B53Cf01Ff53111D0BC29743eF1E03C296; + + // https://plasmascan.to/address/0xD70BE7e6111EA563226cb8e53B1F195Da4E566E2 + address public constant FEE_STRATEGY = 0xD70BE7e6111EA563226cb8e53B1F195Da4E566E2; + + bytes32 public immutable LIQUIDATOR_ROLE = IGsm(NEW_GSM_USDT).LIQUIDATOR_ROLE(); + bytes32 public immutable SWAP_FREEZER_ROLE = IGsm(NEW_GSM_USDT).SWAP_FREEZER_ROLE(); + + function _preExecute() internal override { + AaveV3Plasma.ACL_MANAGER.grantRole( + AaveV3Plasma.ACL_MANAGER.RISK_ADMIN_ROLE(), + GHO_AAVE_STEWARD + ); + + _grantAccess(); + _updateFeeStrategy(); + _registerOracles(); + } + + function _grantAccess() internal { + // Enroll GSMs as entities and set limit + IGhoReserve(GHO_RESERVE).addEntity(NEW_GSM_USDT); + IGhoReserve(GHO_RESERVE).setLimit(NEW_GSM_USDT, USDT_CAPACITY); + + // Add GSM Swap Freezer role to OracleSwapFreezers + IGsm(NEW_GSM_USDT).grantRole(SWAP_FREEZER_ROLE, USDT_ORACLE_SWAP_FREEZER); + IGsm(NEW_GSM_USDT).grantRole(SWAP_FREEZER_ROLE, GovernanceV3Plasma.EXECUTOR_LVL_1); + + // Add GSMs to GSM Registry + IGsmRegistry(GSM_REGISTRY).addGsm(NEW_GSM_USDT); + + // GHO GSM Steward + IGsm(NEW_GSM_USDT).grantRole(IGsm(NEW_GSM_USDT).CONFIGURATOR_ROLE(), GHO_GSM_STEWARD); + } + + function _updateFeeStrategy() internal { + IGsm(NEW_GSM_USDT).updateFeeStrategy(FEE_STRATEGY); + } + + function _registerOracles() internal { + // Manual via Gelato for Plasma + } + + function _postExecute() internal override { + AaveV3Plasma.COLLECTOR.transfer(IERC20(GhoPlasma.GHO_TOKEN), address(this), GHO_SEED_AMOUNT); + IERC20(GhoPlasma.GHO_TOKEN).forceApprove(address(AaveV3Plasma.POOL), GHO_SEED_AMOUNT); + AaveV3Plasma.POOL.supply(GhoPlasma.GHO_TOKEN, GHO_SEED_AMOUNT, AaveV3Plasma.DUST_BIN, 0); + + address aGHO = AaveV3Plasma.POOL.getReserveAToken(GhoPlasma.GHO_TOKEN); + IEmissionManager(AaveV3Plasma.EMISSION_MANAGER).setEmissionAdmin( + GhoPlasma.GHO_TOKEN, + GHO_LM_ADMIN + ); + IEmissionManager(AaveV3Plasma.EMISSION_MANAGER).setEmissionAdmin(aGHO, GHO_LM_ADMIN); + + AaveV3Plasma.COLLECTOR.transfer(IERC20(GhoPlasma.GHO_TOKEN), GHO_RESERVE, BRIDGED_AMOUNT); + + // Restore bridge limits after GHO bridging + IUpgradeableBurnMintTokenPool(GhoPlasma.GHO_CCIP_TOKEN_POOL).setChainRateLimiterConfig( + CCIPChainSelectors.ETHEREUM, + IRateLimiter.Config({ + isEnabled: true, + capacity: DEFAULT_RATE_LIMITER_CAPACITY, + rate: DEFAULT_RATE_LIMITER_RATE + }), + IRateLimiter.Config({ + isEnabled: true, + capacity: DEFAULT_RATE_LIMITER_CAPACITY, + rate: DEFAULT_RATE_LIMITER_RATE + }) + ); + } + + function newListings() public pure override returns (IAaveV3ConfigEngine.Listing[] memory) { + IAaveV3ConfigEngine.Listing[] memory listings = new IAaveV3ConfigEngine.Listing[](1); + + listings[0] = IAaveV3ConfigEngine.Listing({ + asset: GhoPlasma.GHO_TOKEN, + assetSymbol: 'GHO', + priceFeed: GhoPlasma.GHO_ORACLE, + enabledToBorrow: EngineFlags.ENABLED, + borrowableInIsolation: EngineFlags.DISABLED, + withSiloedBorrowing: EngineFlags.DISABLED, + flashloanable: EngineFlags.ENABLED, + ltv: 75_00, + liqThreshold: 78_00, + liqBonus: 4_50, + reserveFactor: 10_00, + supplyCap: 50_000_000, + borrowCap: 20_000_000, + debtCeiling: 0, + liqProtocolFee: 10_00, + rateStrategyParams: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: 92_00, + baseVariableBorrowRate: 1_25, + variableRateSlope1: 3_50, + variableRateSlope2: 16_50 + }) + }); + + return listings; + } + + function eModeCategoryCreations() + public + pure + override + returns (IAaveV3ConfigEngine.EModeCategoryCreation[] memory) + { + IAaveV3ConfigEngine.EModeCategoryCreation[] + memory eModeCreations = new IAaveV3ConfigEngine.EModeCategoryCreation[](3); + + address[] memory collateralAssets = new address[](1); + address[] memory borrowableAssets = new address[](1); + + collateralAssets[0] = GhoPlasma.GHO_TOKEN; + borrowableAssets[0] = AaveV3PlasmaAssets.USDT0_UNDERLYING; + + eModeCreations[0] = IAaveV3ConfigEngine.EModeCategoryCreation({ + ltv: 94_00, + liqThreshold: 96_00, + liqBonus: 2_00, + label: 'GHO/USDT0', + collaterals: collateralAssets, + borrowables: borrowableAssets + }); + + collateralAssets[0] = AaveV3PlasmaAssets.syrupUSDT_UNDERLYING; + borrowableAssets[0] = GhoPlasma.GHO_TOKEN; + + eModeCreations[1] = IAaveV3ConfigEngine.EModeCategoryCreation({ + ltv: 90_00, + liqThreshold: 92_00, + liqBonus: 4_00, + label: 'syrupUSDT/GHO', + collaterals: collateralAssets, + borrowables: borrowableAssets + }); + + address[] memory collateralAssets_syrup = new address[](2); + + collateralAssets_syrup[0] = GhoPlasma.GHO_TOKEN; + collateralAssets_syrup[1] = AaveV3PlasmaAssets.syrupUSDT_UNDERLYING; + borrowableAssets[0] = AaveV3PlasmaAssets.USDT0_UNDERLYING; + + eModeCreations[2] = IAaveV3ConfigEngine.EModeCategoryCreation({ + ltv: 90_00, + liqThreshold: 92_00, + liqBonus: 4_00, + label: 'syrupUSDT Stables', + collaterals: collateralAssets_syrup, + borrowables: borrowableAssets + }); + + return eModeCreations; + } + + function eModeCategoriesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.EModeCategoryUpdate[] memory) + { + IAaveV3ConfigEngine.EModeCategoryUpdate[] + memory eModeUpdates = new IAaveV3ConfigEngine.EModeCategoryUpdate[](2); + + eModeUpdates[0] = IAaveV3ConfigEngine.EModeCategoryUpdate({ + eModeCategory: 5, + ltv: 85_90, + liqThreshold: 87_90, + liqBonus: EngineFlags.KEEP_CURRENT, + label: EngineFlags.KEEP_CURRENT_STRING + }); + + eModeUpdates[1] = IAaveV3ConfigEngine.EModeCategoryUpdate({ + eModeCategory: 7, + ltv: 84_40, + liqThreshold: 86_40, + liqBonus: EngineFlags.KEEP_CURRENT, + label: EngineFlags.KEEP_CURRENT_STRING + }); + + return eModeUpdates; + } + + function assetsEModeUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.AssetEModeUpdate[] memory) + { + IAaveV3ConfigEngine.AssetEModeUpdate[] + memory assetEModeUpdates = new IAaveV3ConfigEngine.AssetEModeUpdate[](3); + + assetEModeUpdates[0] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: GhoPlasma.GHO_TOKEN, + eModeCategory: 2, + borrowable: EngineFlags.ENABLED, + collateral: EngineFlags.DISABLED + }); + assetEModeUpdates[1] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: GhoPlasma.GHO_TOKEN, + eModeCategory: 5, + borrowable: EngineFlags.ENABLED, + collateral: EngineFlags.DISABLED + }); + assetEModeUpdates[2] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: GhoPlasma.GHO_TOKEN, + eModeCategory: 7, + borrowable: EngineFlags.ENABLED, + collateral: EngineFlags.DISABLED + }); + + return assetEModeUpdates; + } +} diff --git a/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2.t.sol b/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2.t.sol new file mode 100644 index 000000000..d95fc98f6 --- /dev/null +++ b/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2.t.sol @@ -0,0 +1,394 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from 'openzeppelin-contracts/contracts/token/ERC20/IERC20.sol'; +import {IERC4626} from 'openzeppelin-contracts/contracts/interfaces/IERC4626.sol'; +import {AaveV3Plasma, AaveV3PlasmaAssets} from 'aave-address-book/AaveV3Plasma.sol'; +import {GovernanceV3Plasma} from 'aave-address-book/GovernanceV3Plasma.sol'; +import {GhoPlasma} from 'aave-address-book/GhoPlasma.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {IUpgradeableBurnMintTokenPool, IRateLimiter} from 'src/interfaces/ccip/IUpgradeableBurnMintTokenPool.sol'; +import {CCIPChainSelectors} from '../helpers/gho-launch/constants/CCIPChainSelectors.sol'; +import {IAaveOracle} from 'aave-address-book/AaveV2.sol'; +import {IEmissionManager} from 'aave-v3-origin/contracts/rewards/interfaces/IEmissionManager.sol'; +import {IGhoToken} from 'src/interfaces/IGhoToken.sol'; +import {IGsm} from 'src/interfaces/IGsm.sol'; +import {IGsmFeeStrategy} from 'src/interfaces/IGsmFeeStrategy.sol'; +import {IGsmRegistry} from 'src/interfaces/IGsmRegistry.sol'; +import {IGsmSteward} from 'src/interfaces/IGsmSteward.sol'; + +import {AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2} from './AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2.sol'; + +interface IGhoReserve { + function addEntity(address entity) external; + function getLimit(address entity) external view returns (uint256); + function setLimit(address entity, uint256 limit) external; + function totalEntities() external view returns (uint256); +} + +/** + * @dev Test for AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2 + * command: FOUNDRY_PROFILE=test forge test --match-path=src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2.t.sol -vv + */ +contract AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2_Test is + ProtocolV3TestBase +{ + AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2 internal proposal; + address public RISK_COUNCIL = 0x8513e6F37dBc52De87b166980Fa3F50639694B60; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('plasma'), 6128244); + proposal = new AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2(); + + // Deal GHO that is going to be bridged from Mainnet + // 1 GHO for seed amount already sent to Collector + deal(GhoPlasma.GHO_TOKEN, address(AaveV3Plasma.COLLECTOR), 50_000_010 ether); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2', + AaveV3Plasma.POOL, + address(proposal) + ); + } + + function test_bridgeLimitRestore() public { + // Mock the update from Part 1 + vm.startPrank(GovernanceV3Plasma.EXECUTOR_LVL_1); + IUpgradeableBurnMintTokenPool(GhoPlasma.GHO_CCIP_TOKEN_POOL).setChainRateLimiterConfig( + CCIPChainSelectors.ETHEREUM, + IRateLimiter.Config({ + isEnabled: true, + capacity: proposal.DEFAULT_RATE_LIMITER_CAPACITY(), + rate: proposal.DEFAULT_RATE_LIMITER_RATE() + }), + IRateLimiter.Config({isEnabled: true, capacity: 5_000_000 ether, rate: 4_000_000 ether}) + ); + vm.stopPrank(); + vm.warp(block.timestamp + 1); + + IRateLimiter.TokenBucket memory bucket = IUpgradeableBurnMintTokenPool( + GhoPlasma.GHO_CCIP_TOKEN_POOL + ).getCurrentInboundRateLimiterState(CCIPChainSelectors.ETHEREUM); + + assertGt(bucket.capacity, proposal.DEFAULT_RATE_LIMITER_CAPACITY()); + assertGt(bucket.rate, proposal.DEFAULT_RATE_LIMITER_RATE()); + assertTrue(bucket.isEnabled); + assertGt(bucket.tokens, proposal.DEFAULT_RATE_LIMITER_CAPACITY()); + + executePayload(vm, address(proposal)); + + bucket = IUpgradeableBurnMintTokenPool(GhoPlasma.GHO_CCIP_TOKEN_POOL) + .getCurrentInboundRateLimiterState(CCIPChainSelectors.ETHEREUM); + + assertEq(bucket.capacity, proposal.DEFAULT_RATE_LIMITER_CAPACITY()); + assertEq(bucket.rate, proposal.DEFAULT_RATE_LIMITER_RATE()); + assertTrue(bucket.isEnabled); + assertEq(bucket.tokens, proposal.DEFAULT_RATE_LIMITER_CAPACITY()); + } + + function test_dustBinHasGHOFunds() public { + executePayload(vm, address(proposal)); + address aTokenAddress = AaveV3Plasma.POOL.getReserveAToken(GhoPlasma.GHO_TOKEN); + assertGe(IERC20(aTokenAddress).balanceOf(address(AaveV3Plasma.DUST_BIN)), 10 ** 18); + } + + function test_GHOAdmin() public { + executePayload(vm, address(proposal)); + address aGHO = AaveV3Plasma.POOL.getReserveAToken(GhoPlasma.GHO_TOKEN); + assertEq( + IEmissionManager(AaveV3Plasma.EMISSION_MANAGER).getEmissionAdmin(GhoPlasma.GHO_TOKEN), + proposal.GHO_LM_ADMIN() + ); + assertEq( + IEmissionManager(AaveV3Plasma.EMISSION_MANAGER).getEmissionAdmin(aGHO), + proposal.GHO_LM_ADMIN() + ); + } + + function test_checkGsmConfig() public { + // GhoReserve check limits and entities + + executePayload(vm, address(proposal)); + + uint256 limit = IGhoReserve(proposal.GHO_RESERVE()).getLimit(proposal.NEW_GSM_USDT()); + assertEq(limit, proposal.USDT_CAPACITY()); + + // GSM USDT + GsmConfig memory gsmUsdtConfig = GsmConfig({ + sellFee: 0, // 0% + buyFee: 0.001e4, // 0.2% + exposureCap: 45_000_000e6, + isFrozen: false, + isSeized: false, + freezerCanUnfreeze: true, + freezeLowerBound: 0.99e8, + freezeUpperBound: 1.01e8, + unfreezeLowerBound: 0.995e8, + unfreezeUpperBound: 1.005e8 + }); + _checkGsmConfig( + IGsm(proposal.NEW_GSM_USDT()), + AaveV3PlasmaAssets.USDT0_STATA_TOKEN, + IOracleSwapFreezer(proposal.USDT_ORACLE_SWAP_FREEZER()), + gsmUsdtConfig + ); + } + + function test_oracleSwapFreezers() public { + // OracleSwapFreezers are not authorized + assertEq( + IGsm(proposal.NEW_GSM_USDT()).hasRole( + IGsm(proposal.NEW_GSM_USDT()).SWAP_FREEZER_ROLE(), + proposal.USDT_ORACLE_SWAP_FREEZER() + ), + false + ); + + IOracleSwapFreezer usdtFreezer = IOracleSwapFreezer(proposal.USDT_ORACLE_SWAP_FREEZER()); + (uint128 usdtFreezeLowerBound, ) = usdtFreezer.getFreezeBound(); + (uint128 usdtUnfreezeLowerBound, ) = usdtFreezer.getUnfreezeBound(); + + // Price outside the price range + // Freezers cannot execute freeze without authorization + _mockAssetPrice( + address(AaveV3Plasma.ORACLE), + AaveV3PlasmaAssets.USDT0_UNDERLYING, + usdtFreezeLowerBound - 1 + ); + + (bool canPerformUpkeep, ) = usdtFreezer.checkUpkeep(bytes('')); + assertEq(canPerformUpkeep, false); + usdtFreezer.performUpkeep(bytes('')); + assertEq(IGsm(proposal.NEW_GSM_USDT()).getIsFrozen(), false); + + // Payload execution + executePayload(vm, address(proposal)); + + // Freezers are authorized now + assertEq( + IGsm(proposal.NEW_GSM_USDT()).hasRole( + IGsm(proposal.NEW_GSM_USDT()).SWAP_FREEZER_ROLE(), + proposal.USDT_ORACLE_SWAP_FREEZER() + ), + true + ); + + // Freezers freeze GSM contracts + (canPerformUpkeep, ) = usdtFreezer.checkUpkeep(bytes('')); + assertEq(canPerformUpkeep, true); + usdtFreezer.performUpkeep(bytes('')); + assertEq(IGsm(proposal.NEW_GSM_USDT()).getIsFrozen(), true); + + // Price back to normal + _mockAssetPrice( + address(AaveV3Plasma.ORACLE), + AaveV3PlasmaAssets.USDT0_UNDERLYING, + usdtUnfreezeLowerBound + 1 + ); + + (canPerformUpkeep, ) = usdtFreezer.checkUpkeep(bytes('')); + assertEq(canPerformUpkeep, true); + usdtFreezer.performUpkeep(bytes('')); + assertEq(IGsm(proposal.NEW_GSM_USDT()).getIsFrozen(), false); + } + + function test_checkRoles() public { + executePayload(vm, address(proposal)); + + _checkRolesConfig(IGsm(proposal.NEW_GSM_USDT())); + } + + function test_gsmUsdtIsOperational() public { + executePayload(vm, address(proposal)); + + deal(AaveV3PlasmaAssets.USDT0_STATA_TOKEN, address(this), 1_000e6); + + // New GSMs are operational + IERC20(AaveV3PlasmaAssets.USDT0_STATA_TOKEN).approve(proposal.NEW_GSM_USDT(), 1_000e6); + IERC20(GhoPlasma.GHO_TOKEN).approve(proposal.NEW_GSM_USDT(), 1_200 ether); + + uint256 amountUnderlying = 1_000e6; + uint256 balanceBeforeUsdtGsm = IERC20(AaveV3PlasmaAssets.USDT0_STATA_TOKEN).balanceOf( + proposal.NEW_GSM_USDT() + ); + uint256 balanceGhoBefore = IGhoToken(GhoPlasma.GHO_TOKEN).balanceOf(address(this)); + + (, uint256 ghoBought) = IGsm(proposal.NEW_GSM_USDT()).sellAsset( + amountUnderlying, + address(this) + ); + + assertEq( + IERC20(AaveV3PlasmaAssets.USDT0_STATA_TOKEN).balanceOf(proposal.NEW_GSM_USDT()), + balanceBeforeUsdtGsm + amountUnderlying, + 'amounts USDT after sellAsset not equal' + ); + assertEq( + IGhoToken(GhoPlasma.GHO_TOKEN).balanceOf(address(this)), + balanceGhoBefore + ghoBought, + 'GHO balance after sellAsset not equal' + ); + + (, uint256 ghoSold) = IGsm(proposal.NEW_GSM_USDT()).buyAsset(500e6, address(this)); + + assertEq( + IERC20(AaveV3PlasmaAssets.USDT0_STATA_TOKEN).balanceOf(proposal.NEW_GSM_USDT()), + balanceBeforeUsdtGsm + amountUnderlying - 500e6, + 'stataUSDT balance after buyAsset not equal' + ); + assertEq( + IGhoToken(GhoPlasma.GHO_TOKEN).balanceOf(address(this)), + balanceGhoBefore + ghoBought - ghoSold, + 'GHO balance after buyAsset not equal' + ); + } + + function test_ghoGsmSteward_updateExposureCapUSDT() public { + executePayload(vm, address(proposal)); + + uint128 oldExposureCap = IGsm(proposal.NEW_GSM_USDT()).getExposureCap(); + uint128 newExposureCap = oldExposureCap + 1; + + vm.startPrank(RISK_COUNCIL); + IGsmSteward(proposal.GHO_GSM_STEWARD()).updateGsmExposureCap( + proposal.NEW_GSM_USDT(), + newExposureCap + ); + uint128 currentExposureCap = IGsm(proposal.NEW_GSM_USDT()).getExposureCap(); + assertEq(currentExposureCap, newExposureCap); + } + + function test_ghoGsmSteward_updateGsmBuySellFeesUSDT() public { + executePayload(vm, address(proposal)); + + address feeStrategy = IGsm(proposal.NEW_GSM_USDT()).getFeeStrategy(); + uint256 buyFee = IGsmFeeStrategy(feeStrategy).getBuyFee(1e4); + uint256 sellFee = IGsmFeeStrategy(feeStrategy).getSellFee(1e4); + + vm.startPrank(RISK_COUNCIL); + IGsmSteward(proposal.GHO_GSM_STEWARD()).updateGsmBuySellFees( + proposal.NEW_GSM_USDT(), + buyFee + 1, + sellFee + ); + address newStrategy = IGsm(proposal.NEW_GSM_USDT()).getFeeStrategy(); + uint256 newBuyFee = IGsmFeeStrategy(newStrategy).getBuyFee(1e4); + assertEq(newBuyFee, buyFee + 1); + } + + function _checkRolesConfig(IGsm gsm) internal view { + // DAO permissions + assertTrue(gsm.hasRole(bytes32(0), GovernanceV3Plasma.EXECUTOR_LVL_1), 'Executor is not admin'); + assertTrue( + gsm.hasRole(gsm.SWAP_FREEZER_ROLE(), GovernanceV3Plasma.EXECUTOR_LVL_1), + 'Executor is not swap freezer' + ); + assertTrue( + gsm.hasRole(gsm.CONFIGURATOR_ROLE(), GovernanceV3Plasma.EXECUTOR_LVL_1), + 'Executor is not configurator' + ); + // No need to be liquidator or token rescuer at the beginning + assertFalse(gsm.hasRole(gsm.LIQUIDATOR_ROLE(), GovernanceV3Plasma.EXECUTOR_LVL_1)); + assertFalse(gsm.hasRole(gsm.TOKEN_RESCUER_ROLE(), GovernanceV3Plasma.EXECUTOR_LVL_1)); + + // Deployer does not have permissions + address deployer = 0x99C7A4A4Ab99882C422eF777b182eBda204D5B02; + assertFalse(gsm.hasRole(bytes32(0), deployer), 'Deployer cannot be admin'); + assertFalse(gsm.hasRole(gsm.SWAP_FREEZER_ROLE(), deployer), 'Deployer cannot be swap freezer'); + assertFalse(gsm.hasRole(gsm.CONFIGURATOR_ROLE(), deployer), 'Deployer cannot be configurator'); + assertFalse(gsm.hasRole(gsm.LIQUIDATOR_ROLE(), deployer), 'Deployer cannot be liquidator'); + assertFalse( + gsm.hasRole(gsm.TOKEN_RESCUER_ROLE(), deployer), + 'Deployer cannot be token rescuer' + ); + + // GHO Steward + assertTrue( + gsm.hasRole(gsm.CONFIGURATOR_ROLE(), proposal.GHO_GSM_STEWARD()), + 'Gho Steward not configured' + ); + } + + function _mockAssetPrice(address priceOracle, address asset, uint256 price) internal { + vm.mockCall( + priceOracle, + abi.encodeWithSelector(IAaveOracle.getAssetPrice.selector, asset), + abi.encode(price) + ); + } + + struct GsmConfig { + uint256 sellFee; + uint256 buyFee; + uint256 exposureCap; + bool isFrozen; + bool isSeized; + bool freezerCanUnfreeze; + uint256 freezeLowerBound; + uint256 freezeUpperBound; + uint256 unfreezeLowerBound; + uint256 unfreezeUpperBound; + } + + function _checkGsmConfig( + IGsm gsm, + address underlying, + IOracleSwapFreezer freezer, + GsmConfig memory config + ) internal view { + assertEq(gsm.UNDERLYING_ASSET(), underlying, 'wrong underlying asset'); + assertEq(gsm.getAvailableUnderlyingExposure(), config.exposureCap, 'wrong exposure cap'); + assertEq(gsm.getIsFrozen(), config.isFrozen, 'wrong freeze state'); + assertEq(gsm.getIsSeized(), config.isSeized, 'wrong seized state'); + + // Fee Strategy + IGsmFeeStrategy feeStrategy = IGsmFeeStrategy(gsm.getFeeStrategy()); + assertEq(feeStrategy.getSellFee(10000), config.sellFee, 'wrong sell fee'); + assertEq(feeStrategy.getBuyFee(10000), config.buyFee, 'wrong buy fee'); + + // Price Strategy + IFixedPriceStrategy4626 priceStrategy = IFixedPriceStrategy4626(gsm.PRICE_STRATEGY()); + assertEq( + IERC4626(underlying).previewMint(1e6) * 10 ** 12, + priceStrategy.getAssetPriceInGho(1e6, true) + ); + assertEq( + IERC4626(underlying).previewWithdraw(1 ether) / 10 ** 12, + priceStrategy.getGhoPriceInAsset(1 ether, false) + ); + + assertEq(gsm.getGhoTreasury(), address(AaveV3Plasma.COLLECTOR)); + + // Oracle freezer + assertEq(freezer.getCanUnfreeze(), config.freezerCanUnfreeze, 'wrong freezer config'); + (uint256 lowerBound, uint256 upperBound) = freezer.getFreezeBound(); + assertEq(lowerBound, config.freezeLowerBound, 'wrong freeze lower bound'); + assertEq(upperBound, config.freezeUpperBound, 'wrong freeze upper bound'); + (lowerBound, upperBound) = freezer.getUnfreezeBound(); + assertEq(lowerBound, config.unfreezeLowerBound, 'wrong unfreeze lower bound'); + assertEq(upperBound, config.unfreezeUpperBound, 'wrong unfreeze upper bound'); + + assertEq(freezer.ADDRESS_PROVIDER(), address(AaveV3Plasma.POOL_ADDRESSES_PROVIDER)); + assertEq(freezer.GSM(), address(gsm)); + } +} + +interface IOracleSwapFreezer { + function ADDRESS_PROVIDER() external view returns (address); + function GSM() external view returns (address); + function getCanUnfreeze() external view returns (bool); + function getFreezeBound() external view returns (uint128, uint128); + function getUnfreezeBound() external view returns (uint128, uint128); + function checkUpkeep(bytes calldata) external view returns (bool, bytes memory); + function performUpkeep(bytes calldata) external; +} + +interface IFixedPriceStrategy4626 { + function getAssetPriceInGho(uint256 assetAmount, bool roundUp) external view returns (uint256); + function getGhoPriceInAsset(uint256 ghoAmount, bool roundUp) external view returns (uint256); +} diff --git a/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards.md b/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards.md new file mode 100644 index 000000000..1f41a0b57 --- /dev/null +++ b/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards.md @@ -0,0 +1,183 @@ +--- +title: "Add GHO on Aave Plasma and deploy GSM on Plasma." +author: "@TokenLogic" +discussions: "https://governance.aave.com/t/arfc-launch-gho-on-plasma-set-aci-as-emissions-manager-for-rewards/22994/6" +snapshot: "https://snapshot.box/#/s:aavedao.eth/proposal/0xeb3572580924976867073ad9c8012cb9e52093c76dafebd7d3aebf318f2576fb" +--- + +## Simple Summary + +With the GHO lanes now activated on CCIP, this publication defines the launch parameters for GHO on Plasma, as well as the introduction of GSMs on Plasma. + +## Motivation + +This publicaiton presents the revised GHO parameter configuration for deploying the RemoteGSM and listing GHO on Aave Protocol. A joint collaboration program with Plasma, Maple Finance and Ethena, will be launched on Aave Protocol whilst separate and complimentary rewards programs will commence on Fluid and Balancer. + +### GHO Supply + +Within the new syrupUSDT and GHO collateral eMode, users who: + +- Supply syrupUSDT and GHO (50% syrupUSDT:50% GHO), with a cap of 50% for GHO eligible for rewards (if additional GHO is supplied, it won't be rewarded) +- Borrow USDT and complete at least one leverage loop +- Maintain a health factor of less than 2.0 + +Will receive GHO incentives (~3.50%) such that the Total Supply yield (Native + Incentives) exceeds the native syrupUSDT yield by approximately 50bps. + +The above incentive strategies create GHO Supply on Aave Protocol. Sourcing the GHO is expected to at least partially flow from through the remote GSM, which deposits USDT into Aave whereby the DAO earns the Supply yield. + +### GHO Demand + +With strong GHO supply expected from the GHO incentives, GHO demand is created via the revision of eMode 2 to include GHO as a debt asset. eMode 2 is to offer sUSDe and USDe as collateral with USDT and GHO as debt, the GHO debt will receive a x5 Sats multiplier from the Ethena team that matches what is currently available on the Ethereum Core and Prime instances. + +This is expected to stimulate Demand for GHO on Aave Protocol with GHO expected to be a lower cost alternative to USDT due to the Borrow Rate configuration (150bps less than USDT at Uoptimal) and additional Sat incentives acting to offset the cost of capital for leverage users. + +Furthemore, additional eModes with Pendle PT assets are expected to provide sustained demand for GHO that reduces the reliance on GHO Incentive yield to attract GHO supply. + +### Fluid and Balancer + +With support from the Aave Liquidity Committee (ALC) concentrated liquidity facilitating swaps will be incentivised on Fluid and Balancer in collaboration with each respective team and the Plasma team. Importantly, this stimulates demand for GHO on secondary markets outside of Aave Protocol and is expected to provide a net counter flow where users are expected to be net acquiring GHO. + +## Specification + +The table below illustrates the configured risk parameters for **GHO** + +| Parameter | Value | +| ------------------------- | -----------------------------------------: | +| Isolation Mode | false | +| Borrowable | ENABLED | +| Collateral Enabled | true | +| Supply Cap (GHO) | 5,000,000 | +| Borrow Cap (GHO) | 4,500,000 | +| Debt Ceiling | USD 0 | +| LTV | 75 % | +| LT | 78 % | +| Liquidation Bonus | 4.5 % | +| Liquidation Protocol Fee | 10 % | +| Reserve Factor | 10 % | +| Base Variable Borrow Rate | 1.25 % | +| Variable Slope 1 | 3.5 % | +| Variable Slope 2 | 16.5 % | +| Uoptimal | 92 % | +| Flashloanable | ENABLED | +| Siloed Borrowing | DISABLED | +| Borrowable in Isolation | DISABLED | +| Oracle | 0xb0e1c7830aA781362f79225559Aa068E6bDaF1d1 | + +Additionally [0xac140648435d03f784879cd789130F22Ef588Fcd](https://plasmascan.to/address/0xac140648435d03f784879cd789130F22Ef588Fcd) has been set as the emission admin for GHO and the corresponding aToken. + +### EModes + +## eMode Category 2 + +| Parameter | sUSDe | USDe | USDT | GHO | +| --------------------- | :---------: | :--: | :--: | :-: | +| Collateral | sUSDe, USDe | Yes | No | No | +| Borrowable | USDT, GHOd | No | Yes | Yes | +| Max LTV | 90% | 90% | - | - | +| Liquidation Threshold | 92% | 92% | - | - | +| Liquidation Bonus | 4.0% | 4.0% | - | - | + +## eMode Category - Category 5 + +| Parameter | PT-USDe Jan | USDT | USDe | GHO | +| --------------------- | :---------: | :--: | :--: | :-: | +| Collateral | Yes | No | No | No | +| Borrowable | No | Yes | Yes | Yes | +| Max LTV | 85.9% | - | - | - | +| Liquidation Threshold | 87.9% | - | - | - | +| Liquidation Bonus | 4.9% | - | - | - | + +## eMode Category - Category 7 + +| Parameter | PT-sUSDe Jan | USDT | USDe | GHO | +| --------------------- | :----------: | :--: | :--: | :-: | +| Collateral | Yes | No | No | No | +| Borrowable | No | Yes | Yes | Yes | +| Max LTV | 84.4% | - | - | - | +| Liquidation Threshold | 86.4% | - | - | - | +| Liquidation Bonus | 6.0% | - | - | - | + +## eMode Category (new) + +| Parameter | GHO | USDT | +| --------------------- | :--: | :--: | +| Collateral | Yes | No | +| Borrowable | No | Yes | +| Max LTV | 94% | - | +| Liquidation Threshold | 96% | - | +| Liquidation Bonus | 2.0% | - | + +## eMode Category (new) + +| Parameter | syrupUSDT | GHO | +| --------------------- | :-------: | :-: | +| Collateral | Yes | No | +| Borrowable | No | Yes | +| Max LTV | 90% | - | +| Liquidation Threshold | 92% | - | +| Liquidation Bonus | 4.0% | - | + +## eMode Category (new) + +| Parameter | syrupUSDT | GHO | USDT | +| --------------------- | :-------: | :--: | :--: | +| Collateral | Yes | Yes | No | +| Borrowable | No | No | Yes | +| Max LTV | 90% | 90% | - | +| Liquidation Threshold | 92% | 92% | - | +| Liquidation Bonus | 4.0% | 4.0% | - | + +### Facilitator & Bridging + +Deploy an **OwnableFacilitator** facilitator on Ethereum to enable GHO issuance for Plasma. + +- **OwnableFacilitator Mint Cap**: 50M GHO +- **Initial Mint**: 50M GHO + +As required, future Minting of GHO on Ethereum, to be supplied into the RemoteGSM on Plasma (or other networks) will be performed via direct submission of AIPs. + +**GhoReserve** + +Deploy GhoReserve on Plasma to hold bridged GHO. +Configure stataUSDT RemoteGSM as an entity with a draw capacity of 50M GHO. + +### RemoteGSM Parameters (stataUSDT) + +| Parameter | Value | +| ---------------------- | ------ | +| GHO Cap | 50M | +| stataUSDT Exposure Cap | 45M | +| Freeze Lower Bound | $0.990 | +| Freeze Upper Bound | $1.010 | +| Unfreeze Lower Bound | $0.995 | +| Unfreeze Upper Bound | $1.005 | +| Mint GHO Fee | 0.00% | +| Burn GHO Fee | 0.15% | + +### GHO Steward Configuration + +**GhoAaveSteward** + +- `updateGhoBorrowCap`: ±100% +- `updateGhoBorrowRate`: ±5% on optimal usage ratio, base variable rates, slopes +- `updateGhoSupplyCap`: Up to +100% + +**GhoGsmSteward** + +- `updateGsmExposureCap`: ±100% +- `updateGsmBuySellFees`: ±0.5% per side (FixedFeeStrategy) + +### Bridging + +Bridge 50M GHO from Mainnet to Plasma utilizing the newly set up AaveGhoCcipBridge. + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930.sol), [AaveV3Plasma](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930.t.sol), [AaveV3Plasma](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930.t.sol) +- [Snapshot](https://snapshot.box/#/s:aavedao.eth/proposal/0xeb3572580924976867073ad9c8012cb9e52093c76dafebd7d3aebf318f2576fb) +- [Discussion](https://governance.aave.com/t/arfc-launch-gho-on-plasma-set-aci-as-emissions-manager-for-rewards/22994/6) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930.s.sol b/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930.s.sol new file mode 100644 index 000000000..f9ac7e570 --- /dev/null +++ b/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930.s.sol @@ -0,0 +1,119 @@ +// 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, PlasmaScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1} from './AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1.sol'; +import {AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2} from './AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2.sol'; +import {AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1} from './AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1.sol'; +import {AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2} from './AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=deploy npx catapulta-verify -b broadcast/LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1) + .creationCode + ); + address payload1 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2) + .creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](2); + actions[0] = GovV3Helpers.buildAction(payload0); + actions[1] = GovV3Helpers.buildAction(payload1); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Plasma + * deploy-command: make deploy-ledger contract=src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930.s.sol:DeployPlasma chain=plasma + * verify-command: FOUNDRY_PROFILE=deploy npx catapulta-verify -b broadcast/LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930.s.sol/9745/run-latest.json + */ +contract DeployPlasma is PlasmaScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1) + .creationCode + ); + address payload1 = GovV3Helpers.deployDeterministic( + type(AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2) + .creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](2); + actions[0] = GovV3Helpers.buildAction(payload0); + actions[1] = GovV3Helpers.buildAction(payload1); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Create Proposal + * command: make deploy-ledger contract=src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930.s.sol:CreateProposal chain=mainnet + */ +contract CreateProposal is EthereumScript { + function run() external { + // create payloads + PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](2); + + // compose actions for validation + { + IPayloadsControllerCore.ExecutionAction[] + memory actionsEthereum = new IPayloadsControllerCore.ExecutionAction[](2); + actionsEthereum[0] = GovV3Helpers.buildAction( + type(AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1) + .creationCode + ); + actionsEthereum[1] = GovV3Helpers.buildAction( + type(AaveV3Ethereum_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2) + .creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + } + + { + IPayloadsControllerCore.ExecutionAction[] + memory actionsPlasma = new IPayloadsControllerCore.ExecutionAction[](2); + actionsPlasma[0] = GovV3Helpers.buildAction( + type(AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part1) + .creationCode + ); + actionsPlasma[1] = GovV3Helpers.buildAction( + type(AaveV3Plasma_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards_20250930_Part2) + .creationCode + ); + payloads[1] = GovV3Helpers.buildPlasmaPayload(vm, actionsPlasma); + } + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_AVAX, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards.md' + ) + ); + } +} diff --git a/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/config.ts b/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/config.ts new file mode 100644 index 000000000..a72a509ed --- /dev/null +++ b/src/20250930_Multi_LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards/config.ts @@ -0,0 +1,50 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3Ethereum', 'AaveV3Plasma'], + title: 'Launch GHO on Plasma & Set ACI as Emissions Manager for Rewards', + shortName: 'LaunchGHOOnPlasmaSetACIAsEmissionsManagerForRewards', + date: '20250930', + author: '@TokenLogic', + discussion: + 'https://governance.aave.com/t/arfc-launch-gho-on-plasma-set-aci-as-emissions-manager-for-rewards/22994/6', + snapshot: + 'https://snapshot.box/#/s:aavedao.eth/proposal/0xeb3572580924976867073ad9c8012cb9e52093c76dafebd7d3aebf318f2576fb', + votingNetwork: 'AVALANCHE', + }, + poolOptions: { + AaveV3Ethereum: {configs: {OTHERS: {}}, cache: {blockNumber: 23792200}}, + AaveV3Plasma: { + configs: { + ASSET_LISTING: [ + { + assetSymbol: 'GHO', + decimals: 18, + priceFeed: '0xb0e1c7830aA781362f79225559Aa068E6bDaF1d1', + ltv: '0', + liqThreshold: '0', + liqBonus: '0', + debtCeiling: '0', + liqProtocolFee: '0', + enabledToBorrow: 'ENABLED', + flashloanable: 'ENABLED', + borrowableInIsolation: 'DISABLED', + withSiloedBorrowing: 'DISABLED', + reserveFactor: '10', + supplyCap: '5000000', + borrowCap: '4500000', + rateStrategyParams: { + optimalUtilizationRate: '90', + baseVariableBorrowRate: '0', + variableRateSlope1: '6.5', + variableRateSlope2: '50', + }, + asset: '0xb77E872A68C62CfC0dFb02C067Ecc3DA23B4bbf3', + admin: '0xac140648435d03f784879cd789130F22Ef588Fcd', + }, + ], + }, + cache: {blockNumber: 6128244}, + }, + }, +}; diff --git a/src/interfaces/IGhoReserve.sol b/src/interfaces/IGhoReserve.sol new file mode 100644 index 000000000..6a18d0a96 --- /dev/null +++ b/src/interfaces/IGhoReserve.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface IGhoReserve { + function addEntity(address entity) external; + function setLimit(address entity, uint256 limit) external; + function getLimit(address entity) external view returns (uint256); + function getUsed(address entity) external view returns (uint256); + function isEntity(address entity) external view returns (bool); + function totalEntities() external view returns (uint256); +} diff --git a/src/interfaces/IGsmRegistry.sol b/src/interfaces/IGsmRegistry.sol index 6024d123e..52e0cf8f0 100644 --- a/src/interfaces/IGsmRegistry.sol +++ b/src/interfaces/IGsmRegistry.sol @@ -3,6 +3,5 @@ pragma solidity ^0.8.0; interface IGsmRegistry { function addGsm(address gsmAddress) external; - function removeGsm(address gsmAddress) external; } diff --git a/src/interfaces/IOwnableFacilitator.sol b/src/interfaces/IOwnableFacilitator.sol new file mode 100644 index 000000000..fd77ccd9b --- /dev/null +++ b/src/interfaces/IOwnableFacilitator.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface IOwnableFacilitator { + function mint(address to, uint256 amount) external; +}