diff --git a/.assets/014904fabcaa28d579bed688e1e3c35928c86f7c.svg b/.assets/014904fabcaa28d579bed688e1e3c35928c86f7c.svg
new file mode 100644
index 000000000..771e3e22e
--- /dev/null
+++ b/.assets/014904fabcaa28d579bed688e1e3c35928c86f7c.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/.assets/abedf4afd5084c01c3adcdc5b8f4eee6095dcfa8.svg b/.assets/abedf4afd5084c01c3adcdc5b8f4eee6095dcfa8.svg
new file mode 100644
index 000000000..8afae5721
--- /dev/null
+++ b/.assets/abedf4afd5084c01c3adcdc5b8f4eee6095dcfa8.svg
@@ -0,0 +1 @@
+ Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%150%uOptimal 77%uOptimal 77%
\ No newline at end of file
diff --git a/.assets/cbb6d69c16e942f7a9716ce6235797558b476b47.svg b/.assets/cbb6d69c16e942f7a9716ce6235797558b476b47.svg
new file mode 100644
index 000000000..6ab8199c8
--- /dev/null
+++ b/.assets/cbb6d69c16e942f7a9716ce6235797558b476b47.svg
@@ -0,0 +1 @@
+ Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%150%uOptimal 52%uOptimal 52%
\ No newline at end of file
diff --git a/.assets/d8086786791314945878c8ed6dcc4c94e5881481.svg b/.assets/d8086786791314945878c8ed6dcc4c94e5881481.svg
new file mode 100644
index 000000000..e0296f561
--- /dev/null
+++ b/.assets/d8086786791314945878c8ed6dcc4c94e5881481.svg
@@ -0,0 +1 @@
+ Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%150%uOptimal 37%uOptimal 37%
\ No newline at end of file
diff --git a/.assets/f78b64acb67ea422abc0a7cab9be859cfaa6851c.svg b/.assets/f78b64acb67ea422abc0a7cab9be859cfaa6851c.svg
new file mode 100644
index 000000000..79f1385fa
--- /dev/null
+++ b/.assets/f78b64acb67ea422abc0a7cab9be859cfaa6851c.svg
@@ -0,0 +1 @@
+ Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%150%uOptimal 40%uOptimal 40%
\ No newline at end of file
diff --git a/.assets/f8796b83937e1ee85d5683643bca20a8da92ece0.svg b/.assets/f8796b83937e1ee85d5683643bca20a8da92ece0.svg
new file mode 100644
index 000000000..d30e8bba3
--- /dev/null
+++ b/.assets/f8796b83937e1ee85d5683643bca20a8da92ece0.svg
@@ -0,0 +1 @@
+ Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%150%uOptimal 71%uOptimal 71%
\ No newline at end of file
diff --git a/.assets/f89c969005021ca7b9743d065391c57d66cc9be3.svg b/.assets/f89c969005021ca7b9743d065391c57d66cc9be3.svg
new file mode 100644
index 000000000..e6b944bee
--- /dev/null
+++ b/.assets/f89c969005021ca7b9743d065391c57d66cc9be3.svg
@@ -0,0 +1 @@
+ Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%150%uOptimal 48%uOptimal 48%
\ No newline at end of file
diff --git a/diffs/AaveV2Avalanche_ReserveFactorUpgrades_20240528_before_AaveV2Avalanche_ReserveFactorUpgrades_20240528_after.md b/diffs/AaveV2Avalanche_ReserveFactorUpgrades_20240528_before_AaveV2Avalanche_ReserveFactorUpgrades_20240528_after.md
new file mode 100644
index 000000000..a2018cb26
--- /dev/null
+++ b/diffs/AaveV2Avalanche_ReserveFactorUpgrades_20240528_before_AaveV2Avalanche_ReserveFactorUpgrades_20240528_after.md
@@ -0,0 +1,90 @@
+## Reserve changes
+
+### Reserve altered
+
+#### WETH.e ([0x49D5c2BdFfac6CE2BFdB6640F4F80f226bc10bAB](https://snowscan.xyz/address/0x49D5c2BdFfac6CE2BFdB6640F4F80f226bc10bAB))
+
+| description | value before | value after |
+| --- | --- | --- |
+| reserveFactor | 50 % | 55 % |
+
+
+#### WBTC.e ([0x50b7545627a5162F82A992c33b87aDc75187B218](https://snowscan.xyz/address/0x50b7545627a5162F82A992c33b87aDc75187B218))
+
+| description | value before | value after |
+| --- | --- | --- |
+| reserveFactor | 55 % | 60 % |
+
+
+#### USDC.e ([0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664](https://snowscan.xyz/address/0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664))
+
+| description | value before | value after |
+| --- | --- | --- |
+| reserveFactor | 50 % | 55 % |
+
+
+#### WAVAX ([0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7](https://snowscan.xyz/address/0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7))
+
+| description | value before | value after |
+| --- | --- | --- |
+| reserveFactor | 50 % | 55 % |
+
+
+#### USDT.e ([0xc7198437980c041c805A1EDcbA50c1Ce5db95118](https://snowscan.xyz/address/0xc7198437980c041c805A1EDcbA50c1Ce5db95118))
+
+| description | value before | value after |
+| --- | --- | --- |
+| reserveFactor | 50 % | 55 % |
+
+
+#### DAI.e ([0xd586E7F844cEa2F87f50152665BCbc2C279D8d70](https://snowscan.xyz/address/0xd586E7F844cEa2F87f50152665BCbc2C279D8d70))
+
+| description | value before | value after |
+| --- | --- | --- |
+| reserveFactor | 50 % | 55 % |
+
+
+## Raw diff
+
+```json
+{
+ "reserves": {
+ "0x49D5c2BdFfac6CE2BFdB6640F4F80f226bc10bAB": {
+ "reserveFactor": {
+ "from": 5000,
+ "to": 5500
+ }
+ },
+ "0x50b7545627a5162F82A992c33b87aDc75187B218": {
+ "reserveFactor": {
+ "from": 5500,
+ "to": 6000
+ }
+ },
+ "0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664": {
+ "reserveFactor": {
+ "from": 5000,
+ "to": 5500
+ }
+ },
+ "0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7": {
+ "reserveFactor": {
+ "from": 5000,
+ "to": 5500
+ }
+ },
+ "0xc7198437980c041c805A1EDcbA50c1Ce5db95118": {
+ "reserveFactor": {
+ "from": 5000,
+ "to": 5500
+ }
+ },
+ "0xd586E7F844cEa2F87f50152665BCbc2C279D8d70": {
+ "reserveFactor": {
+ "from": 5000,
+ "to": 5500
+ }
+ }
+ }
+}
+```
\ No newline at end of file
diff --git a/diffs/AaveV2Ethereum_ReserveFactorUpgrades_20240528_before_AaveV2Ethereum_ReserveFactorUpgrades_20240528_after.md b/diffs/AaveV2Ethereum_ReserveFactorUpgrades_20240528_before_AaveV2Ethereum_ReserveFactorUpgrades_20240528_after.md
new file mode 100644
index 000000000..f906fd814
--- /dev/null
+++ b/diffs/AaveV2Ethereum_ReserveFactorUpgrades_20240528_before_AaveV2Ethereum_ReserveFactorUpgrades_20240528_after.md
@@ -0,0 +1,90 @@
+## Reserve changes
+
+### Reserve altered
+
+#### WBTC ([0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599](https://etherscan.io/address/0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599))
+
+| description | value before | value after |
+| --- | --- | --- |
+| reserveFactor | 60 % | 65 % |
+
+
+#### LINK ([0x514910771AF9Ca656af840dff83E8264EcF986CA](https://etherscan.io/address/0x514910771AF9Ca656af840dff83E8264EcF986CA))
+
+| description | value before | value after |
+| --- | --- | --- |
+| reserveFactor | 60 % | 65 % |
+
+
+#### DAI ([0x6B175474E89094C44Da98b954EedeAC495271d0F](https://etherscan.io/address/0x6B175474E89094C44Da98b954EedeAC495271d0F))
+
+| description | value before | value after |
+| --- | --- | --- |
+| reserveFactor | 55 % | 60 % |
+
+
+#### USDC ([0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48](https://etherscan.io/address/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48))
+
+| description | value before | value after |
+| --- | --- | --- |
+| reserveFactor | 55 % | 60 % |
+
+
+#### WETH ([0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2](https://etherscan.io/address/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2))
+
+| description | value before | value after |
+| --- | --- | --- |
+| reserveFactor | 55 % | 60 % |
+
+
+#### USDT ([0xdAC17F958D2ee523a2206206994597C13D831ec7](https://etherscan.io/address/0xdAC17F958D2ee523a2206206994597C13D831ec7))
+
+| description | value before | value after |
+| --- | --- | --- |
+| reserveFactor | 55 % | 60 % |
+
+
+## Raw diff
+
+```json
+{
+ "reserves": {
+ "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599": {
+ "reserveFactor": {
+ "from": 6000,
+ "to": 6500
+ }
+ },
+ "0x514910771AF9Ca656af840dff83E8264EcF986CA": {
+ "reserveFactor": {
+ "from": 6000,
+ "to": 6500
+ }
+ },
+ "0x6B175474E89094C44Da98b954EedeAC495271d0F": {
+ "reserveFactor": {
+ "from": 5500,
+ "to": 6000
+ }
+ },
+ "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48": {
+ "reserveFactor": {
+ "from": 5500,
+ "to": 6000
+ }
+ },
+ "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2": {
+ "reserveFactor": {
+ "from": 5500,
+ "to": 6000
+ }
+ },
+ "0xdAC17F958D2ee523a2206206994597C13D831ec7": {
+ "reserveFactor": {
+ "from": 5500,
+ "to": 6000
+ }
+ }
+ }
+}
+```
\ No newline at end of file
diff --git a/diffs/AaveV2Polygon_BorrowRateUpdates_20240528_before_AaveV2Polygon_BorrowRateUpdates_20240528_after.md b/diffs/AaveV2Polygon_BorrowRateUpdates_20240528_before_AaveV2Polygon_BorrowRateUpdates_20240528_after.md
new file mode 100644
index 000000000..57bb36243
--- /dev/null
+++ b/diffs/AaveV2Polygon_BorrowRateUpdates_20240528_before_AaveV2Polygon_BorrowRateUpdates_20240528_after.md
@@ -0,0 +1,173 @@
+## Reserve changes
+
+### Reserve altered
+
+#### WMATIC ([0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270](https://polygonscan.com/address/0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270))
+
+| description | value before | value after |
+| --- | --- | --- |
+| interestRateStrategy | [0xF590246fed67ea88ed1DEaB14605165b6edeA9E3](https://polygonscan.com/address/0xF590246fed67ea88ed1DEaB14605165b6edeA9E3) | [0x6a94A6FFbD550316d75741AB895e913F259FFA23](https://polygonscan.com/address/0x6a94A6FFbD550316d75741AB895e913F259FFA23) |
+| variableRateSlope1 | 6.75 % | 8.25 % |
+| interestRate | ![before](/.assets/6c3ce91b32b481ec0786abcf3b7a167a1573db7f.svg) | ![after](/.assets/f89c969005021ca7b9743d065391c57d66cc9be3.svg) |
+
+#### WBTC ([0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6](https://polygonscan.com/address/0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6))
+
+| description | value before | value after |
+| --- | --- | --- |
+| interestRateStrategy | [0xf121bF9E438A99884476BF1053937b7EdBB179A9](https://polygonscan.com/address/0xf121bF9E438A99884476BF1053937b7EdBB179A9) | [0x1FE6e3d91a3Bf37731A77B8AB4D50328D8278817](https://polygonscan.com/address/0x1FE6e3d91a3Bf37731A77B8AB4D50328D8278817) |
+| variableRateSlope1 | 4.75 % | 6.25 % |
+| interestRate | ![before](/.assets/dc50cbd8c03de754c9c1af896e24493201cc3559.svg) | ![after](/.assets/d8086786791314945878c8ed6dcc4c94e5881481.svg) |
+
+#### USDC ([0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174](https://polygonscan.com/address/0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174))
+
+| description | value before | value after |
+| --- | --- | --- |
+| reserveFactor | 98 % | 99.99 % |
+| interestRateStrategy | [0x15d31D8a5da6A57Ea8EaDc12261777768b1E8C60](https://polygonscan.com/address/0x15d31D8a5da6A57Ea8EaDc12261777768b1E8C60) | [0x7390a913B99fc3C0C064C2875709E9be7a183669](https://polygonscan.com/address/0x7390a913B99fc3C0C064C2875709E9be7a183669) |
+| variableRateSlope1 | 9.75 % | 11.25 % |
+| interestRate | ![before](/.assets/df4a7d9cc3f6a6d30ec065c93141fe49eee42c4d.svg) | ![after](/.assets/abedf4afd5084c01c3adcdc5b8f4eee6095dcfa8.svg) |
+
+#### WETH ([0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619](https://polygonscan.com/address/0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619))
+
+| description | value before | value after |
+| --- | --- | --- |
+| interestRateStrategy | [0xBc92Ab176019E9670578D029CB638C9b1022Ad30](https://polygonscan.com/address/0xBc92Ab176019E9670578D029CB638C9b1022Ad30) | [0xFfF58Df0DDe40c473aA6558c830D43479f06cb36](https://polygonscan.com/address/0xFfF58Df0DDe40c473aA6558c830D43479f06cb36) |
+| variableRateSlope1 | 4.75 % | 6.25 % |
+| interestRate | ![before](/.assets/5d3a3114d827b817a09ba93dab4a7caff4a768cf.svg) | ![after](/.assets/f78b64acb67ea422abc0a7cab9be859cfaa6851c.svg) |
+
+#### DAI ([0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063](https://polygonscan.com/address/0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063))
+
+| description | value before | value after |
+| --- | --- | --- |
+| reserveFactor | 96 % | 99.99 % |
+| interestRateStrategy | [0x08487E1EB852e06779634A176194192a36894313](https://polygonscan.com/address/0x08487E1EB852e06779634A176194192a36894313) | [0xEe9213B77eD95BDaDcE1aDA5812A3544b159E5E3](https://polygonscan.com/address/0xEe9213B77eD95BDaDcE1aDA5812A3544b159E5E3) |
+| variableRateSlope1 | 9.75 % | 11.25 % |
+| interestRate | ![before](/.assets/4bbdb7d641ac53393afda2d993e24109f61f61a1.svg) | ![after](/.assets/f8796b83937e1ee85d5683643bca20a8da92ece0.svg) |
+
+#### USDT ([0xc2132D05D31c914a87C6611C10748AEb04B58e8F](https://polygonscan.com/address/0xc2132D05D31c914a87C6611C10748AEb04B58e8F))
+
+| description | value before | value after |
+| --- | --- | --- |
+| reserveFactor | 97 % | 99.99 % |
+| interestRateStrategy | [0xC22014C5159bcf56110414A9FB71971974294e98](https://polygonscan.com/address/0xC22014C5159bcf56110414A9FB71971974294e98) | [0x55F33b87f1c8F12DbE1322e841431bBce1572A75](https://polygonscan.com/address/0x55F33b87f1c8F12DbE1322e841431bBce1572A75) |
+| variableRateSlope1 | 9.75 % | 11.25 % |
+| interestRate | ![before](/.assets/629673f8cf1a36a93dc0ebfe1dd5da5b11ead5be.svg) | ![after](/.assets/cbb6d69c16e942f7a9716ce6235797558b476b47.svg) |
+
+## Raw diff
+
+```json
+{
+ "reserves": {
+ "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270": {
+ "interestRateStrategy": {
+ "from": "0xF590246fed67ea88ed1DEaB14605165b6edeA9E3",
+ "to": "0x6a94A6FFbD550316d75741AB895e913F259FFA23"
+ }
+ },
+ "0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6": {
+ "interestRateStrategy": {
+ "from": "0xf121bF9E438A99884476BF1053937b7EdBB179A9",
+ "to": "0x1FE6e3d91a3Bf37731A77B8AB4D50328D8278817"
+ }
+ },
+ "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174": {
+ "interestRateStrategy": {
+ "from": "0x15d31D8a5da6A57Ea8EaDc12261777768b1E8C60",
+ "to": "0x7390a913B99fc3C0C064C2875709E9be7a183669"
+ },
+ "reserveFactor": {
+ "from": 9800,
+ "to": 9999
+ }
+ },
+ "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619": {
+ "interestRateStrategy": {
+ "from": "0xBc92Ab176019E9670578D029CB638C9b1022Ad30",
+ "to": "0xFfF58Df0DDe40c473aA6558c830D43479f06cb36"
+ }
+ },
+ "0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063": {
+ "interestRateStrategy": {
+ "from": "0x08487E1EB852e06779634A176194192a36894313",
+ "to": "0xEe9213B77eD95BDaDcE1aDA5812A3544b159E5E3"
+ },
+ "reserveFactor": {
+ "from": 9600,
+ "to": 9999
+ }
+ },
+ "0xc2132D05D31c914a87C6611C10748AEb04B58e8F": {
+ "interestRateStrategy": {
+ "from": "0xC22014C5159bcf56110414A9FB71971974294e98",
+ "to": "0x55F33b87f1c8F12DbE1322e841431bBce1572A75"
+ },
+ "reserveFactor": {
+ "from": 9700,
+ "to": 9999
+ }
+ }
+ },
+ "strategies": {
+ "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270": {
+ "address": {
+ "from": "0xF590246fed67ea88ed1DEaB14605165b6edeA9E3",
+ "to": "0x6a94A6FFbD550316d75741AB895e913F259FFA23"
+ },
+ "variableRateSlope1": {
+ "from": "67500000000000000000000000",
+ "to": "82500000000000000000000000"
+ }
+ },
+ "0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6": {
+ "address": {
+ "from": "0xf121bF9E438A99884476BF1053937b7EdBB179A9",
+ "to": "0x1FE6e3d91a3Bf37731A77B8AB4D50328D8278817"
+ },
+ "variableRateSlope1": {
+ "from": "47500000000000000000000000",
+ "to": "62500000000000000000000000"
+ }
+ },
+ "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174": {
+ "address": {
+ "from": "0x15d31D8a5da6A57Ea8EaDc12261777768b1E8C60",
+ "to": "0x7390a913B99fc3C0C064C2875709E9be7a183669"
+ },
+ "variableRateSlope1": {
+ "from": "97500000000000000000000000",
+ "to": "112500000000000000000000000"
+ }
+ },
+ "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619": {
+ "address": {
+ "from": "0xBc92Ab176019E9670578D029CB638C9b1022Ad30",
+ "to": "0xFfF58Df0DDe40c473aA6558c830D43479f06cb36"
+ },
+ "variableRateSlope1": {
+ "from": "47500000000000000000000000",
+ "to": "62500000000000000000000000"
+ }
+ },
+ "0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063": {
+ "address": {
+ "from": "0x08487E1EB852e06779634A176194192a36894313",
+ "to": "0xEe9213B77eD95BDaDcE1aDA5812A3544b159E5E3"
+ },
+ "variableRateSlope1": {
+ "from": "97500000000000000000000000",
+ "to": "112500000000000000000000000"
+ }
+ },
+ "0xc2132D05D31c914a87C6611C10748AEb04B58e8F": {
+ "address": {
+ "from": "0xC22014C5159bcf56110414A9FB71971974294e98",
+ "to": "0x55F33b87f1c8F12DbE1322e841431bBce1572A75"
+ },
+ "variableRateSlope1": {
+ "from": "97500000000000000000000000",
+ "to": "112500000000000000000000000"
+ }
+ }
+ }
+}
+```
\ No newline at end of file
diff --git a/diffs/AaveV3Arbitrum_GHOCrossChainLaunchPart2_20240613_before_AaveV3Arbitrum_GHOCrossChainLaunchPart2_20240613_after.md b/diffs/AaveV3Arbitrum_GHOCrossChainLaunchPart2_20240613_before_AaveV3Arbitrum_GHOCrossChainLaunchPart2_20240613_after.md
new file mode 100644
index 000000000..54b063026
--- /dev/null
+++ b/diffs/AaveV3Arbitrum_GHOCrossChainLaunchPart2_20240613_before_AaveV3Arbitrum_GHOCrossChainLaunchPart2_20240613_after.md
@@ -0,0 +1,132 @@
+## Reserve changes
+
+### Reserves added
+
+#### GHO ([0x7dfF72693f6A4149b17e7C6314655f6A9F7c8B33](https://arbiscan.io/address/0x7dfF72693f6A4149b17e7C6314655f6A9F7c8B33))
+
+| description | value |
+| --- | --- |
+| decimals | 18 |
+| isActive | true |
+| isFrozen | false |
+| supplyCap | 1,000,000 GHO |
+| borrowCap | 900,000 GHO |
+| debtCeiling | 0 $ |
+| isSiloed | false |
+| isFlashloanable | true |
+| eModeCategory | 0 |
+| oracle | [0xB05984aD83C20b3ADE7bf97a9a0Cb539DDE28DBb](https://arbiscan.io/address/0xB05984aD83C20b3ADE7bf97a9a0Cb539DDE28DBb) |
+| oracleDecimals | 8 |
+| oracleLatestAnswer | 1 |
+| usageAsCollateralEnabled | false |
+| ltv | 0 % |
+| liquidationThreshold | 0 % |
+| liquidationBonus | 0 % |
+| liquidationProtocolFee | 0 % |
+| reserveFactor | 10 % |
+| aToken | [0xeBe517846d0F36eCEd99C735cbF6131e1fEB775D](https://arbiscan.io/address/0xeBe517846d0F36eCEd99C735cbF6131e1fEB775D) |
+| aTokenImpl | [0x1Be1798b70aEe431c2986f7ff48d9D1fa350786a](https://arbiscan.io/address/0x1Be1798b70aEe431c2986f7ff48d9D1fa350786a) |
+| variableDebtToken | [0x18248226C16BF76c032817854E7C83a2113B4f06](https://arbiscan.io/address/0x18248226C16BF76c032817854E7C83a2113B4f06) |
+| variableDebtTokenImpl | [0x5E76E98E0963EcDC6A065d1435F84065b7523f39](https://arbiscan.io/address/0x5E76E98E0963EcDC6A065d1435F84065b7523f39) |
+| stableDebtToken | [0x687871030477bf974725232F764aa04318A8b9c8](https://arbiscan.io/address/0x687871030477bf974725232F764aa04318A8b9c8) |
+| stableDebtTokenImpl | [0x0c2C95b24529664fE55D4437D7A31175CFE6c4f7](https://arbiscan.io/address/0x0c2C95b24529664fE55D4437D7A31175CFE6c4f7) |
+| borrowingEnabled | true |
+| stableBorrowRateEnabled | false |
+| isBorrowableInIsolation | false |
+| interestRateStrategy | [0x36d32fD7a72AD600be60Ccb71D3718E455025CaA](https://arbiscan.io/address/0x36d32fD7a72AD600be60Ccb71D3718E455025CaA) |
+| liquidityIndex | 1 |
+| variableBorrowIndex | 1 |
+| aTokenName | Aave Arbitrum GHO |
+| aTokenSymbol | aArbGHO |
+| currentLiquidityRate | 0 % |
+| currentVariableBorrowRate | 0 % |
+| isPaused | false |
+| stableDebtTokenName | Aave Arbitrum Stable Debt GHO |
+| stableDebtTokenSymbol | stableDebtArbGHO |
+| variableDebtTokenName | Aave Arbitrum Variable Debt GHO |
+| variableDebtTokenSymbol | variableDebtArbGHO |
+| optimalUsageRatio | 90 % |
+| maxExcessStableToTotalDebtRatio | 100 % |
+| maxExcessUsageRatio | 10 % |
+| optimalStableToTotalDebtRatio | 0 % |
+| baseVariableBorrowRate | 0 % |
+| variableRateSlope1 | 12 % |
+| variableRateSlope2 | 65 % |
+| baseStableBorrowRate | 12 % |
+| stableRateSlope1 | 0 % |
+| stableRateSlope2 | 0 % |
+| interestRate | ![ir](/.assets/014904fabcaa28d579bed688e1e3c35928c86f7c.svg) |
+
+
+## Raw diff
+
+```json
+{
+ "reserves": {
+ "0x7dfF72693f6A4149b17e7C6314655f6A9F7c8B33": {
+ "from": null,
+ "to": {
+ "aToken": "0xeBe517846d0F36eCEd99C735cbF6131e1fEB775D",
+ "aTokenImpl": "0x1Be1798b70aEe431c2986f7ff48d9D1fa350786a",
+ "aTokenName": "Aave Arbitrum GHO",
+ "aTokenSymbol": "aArbGHO",
+ "borrowCap": 900000,
+ "borrowingEnabled": true,
+ "currentLiquidityRate": 0,
+ "currentVariableBorrowRate": 0,
+ "debtCeiling": 0,
+ "decimals": 18,
+ "eModeCategory": 0,
+ "interestRateStrategy": "0x36d32fD7a72AD600be60Ccb71D3718E455025CaA",
+ "isActive": true,
+ "isBorrowableInIsolation": false,
+ "isFlashloanable": true,
+ "isFrozen": false,
+ "isPaused": false,
+ "isSiloed": false,
+ "liquidationBonus": 0,
+ "liquidationProtocolFee": 0,
+ "liquidationThreshold": 0,
+ "liquidityIndex": "1000000000000000000000000000",
+ "ltv": 0,
+ "oracle": "0xB05984aD83C20b3ADE7bf97a9a0Cb539DDE28DBb",
+ "oracleDecimals": 8,
+ "oracleLatestAnswer": 100000000,
+ "reserveFactor": 1000,
+ "stableBorrowRateEnabled": false,
+ "stableDebtToken": "0x687871030477bf974725232F764aa04318A8b9c8",
+ "stableDebtTokenImpl": "0x0c2C95b24529664fE55D4437D7A31175CFE6c4f7",
+ "stableDebtTokenName": "Aave Arbitrum Stable Debt GHO",
+ "stableDebtTokenSymbol": "stableDebtArbGHO",
+ "supplyCap": 1000000,
+ "symbol": "GHO",
+ "underlying": "0x7dfF72693f6A4149b17e7C6314655f6A9F7c8B33",
+ "usageAsCollateralEnabled": false,
+ "variableBorrowIndex": "1000000000000000000000000000",
+ "variableDebtToken": "0x18248226C16BF76c032817854E7C83a2113B4f06",
+ "variableDebtTokenImpl": "0x5E76E98E0963EcDC6A065d1435F84065b7523f39",
+ "variableDebtTokenName": "Aave Arbitrum Variable Debt GHO",
+ "variableDebtTokenSymbol": "variableDebtArbGHO"
+ }
+ }
+ },
+ "strategies": {
+ "0x7dfF72693f6A4149b17e7C6314655f6A9F7c8B33": {
+ "from": null,
+ "to": {
+ "address": "0x36d32fD7a72AD600be60Ccb71D3718E455025CaA",
+ "baseStableBorrowRate": "120000000000000000000000000",
+ "baseVariableBorrowRate": 0,
+ "maxExcessStableToTotalDebtRatio": "1000000000000000000000000000",
+ "maxExcessUsageRatio": "100000000000000000000000000",
+ "optimalStableToTotalDebtRatio": 0,
+ "optimalUsageRatio": "900000000000000000000000000",
+ "stableRateSlope1": 0,
+ "stableRateSlope2": 0,
+ "variableRateSlope1": "120000000000000000000000000",
+ "variableRateSlope2": "650000000000000000000000000"
+ }
+ }
+ }
+}
+```
\ No newline at end of file
diff --git a/diffs/AaveV3Arbitrum_IncreaseUSDCeRF_20240528_before_AaveV3Arbitrum_IncreaseUSDCeRF_20240528_after.md b/diffs/AaveV3Arbitrum_IncreaseUSDCeRF_20240528_before_AaveV3Arbitrum_IncreaseUSDCeRF_20240528_after.md
new file mode 100644
index 000000000..57e3d2f2d
--- /dev/null
+++ b/diffs/AaveV3Arbitrum_IncreaseUSDCeRF_20240528_before_AaveV3Arbitrum_IncreaseUSDCeRF_20240528_after.md
@@ -0,0 +1,25 @@
+## Reserve changes
+
+### Reserves altered
+
+#### USDC ([0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8](https://arbiscan.io/address/0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8))
+
+| description | value before | value after |
+| --- | --- | --- |
+| reserveFactor | 20 % | 25 % |
+
+
+## Raw diff
+
+```json
+{
+ "reserves": {
+ "0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8": {
+ "reserveFactor": {
+ "from": 2000,
+ "to": 2500
+ }
+ }
+ }
+}
+```
\ No newline at end of file
diff --git a/diffs/AaveV3Base_IncreaseUSDCeRF_20240528_before_AaveV3Base_IncreaseUSDCeRF_20240528_after.md b/diffs/AaveV3Base_IncreaseUSDCeRF_20240528_before_AaveV3Base_IncreaseUSDCeRF_20240528_after.md
new file mode 100644
index 000000000..2df4a20ad
--- /dev/null
+++ b/diffs/AaveV3Base_IncreaseUSDCeRF_20240528_before_AaveV3Base_IncreaseUSDCeRF_20240528_after.md
@@ -0,0 +1,25 @@
+## Reserve changes
+
+### Reserves altered
+
+#### USDbC ([0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA](https://basescan.org/address/0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA))
+
+| description | value before | value after |
+| --- | --- | --- |
+| reserveFactor | 20 % | 25 % |
+
+
+## Raw diff
+
+```json
+{
+ "reserves": {
+ "0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA": {
+ "reserveFactor": {
+ "from": 2000,
+ "to": 2500
+ }
+ }
+ }
+}
+```
\ No newline at end of file
diff --git a/diffs/AaveV3Ethereum_V4ALServiceProviderProposal_20240614_before_AaveV3Ethereum_V4ALServiceProviderProposal_20240614_after.md b/diffs/AaveV3Ethereum_V4ALServiceProviderProposal_20240614_before_AaveV3Ethereum_V4ALServiceProviderProposal_20240614_after.md
new file mode 100644
index 000000000..c15d3e2bc
--- /dev/null
+++ b/diffs/AaveV3Ethereum_V4ALServiceProviderProposal_20240614_before_AaveV3Ethereum_V4ALServiceProviderProposal_20240614_after.md
@@ -0,0 +1,5 @@
+## Raw diff
+
+```json
+{}
+```
\ No newline at end of file
diff --git a/diffs/AaveV3Optimism_IncreaseUSDCeRF_20240528_before_AaveV3Optimism_IncreaseUSDCeRF_20240528_after.md b/diffs/AaveV3Optimism_IncreaseUSDCeRF_20240528_before_AaveV3Optimism_IncreaseUSDCeRF_20240528_after.md
new file mode 100644
index 000000000..b43a9ccef
--- /dev/null
+++ b/diffs/AaveV3Optimism_IncreaseUSDCeRF_20240528_before_AaveV3Optimism_IncreaseUSDCeRF_20240528_after.md
@@ -0,0 +1,25 @@
+## Reserve changes
+
+### Reserves altered
+
+#### USDC ([0x7F5c764cBc14f9669B88837ca1490cCa17c31607](https://optimistic.etherscan.io/address/0x7F5c764cBc14f9669B88837ca1490cCa17c31607))
+
+| description | value before | value after |
+| --- | --- | --- |
+| reserveFactor | 20 % | 25 % |
+
+
+## Raw diff
+
+```json
+{
+ "reserves": {
+ "0x7F5c764cBc14f9669B88837ca1490cCa17c31607": {
+ "reserveFactor": {
+ "from": 2000,
+ "to": 2500
+ }
+ }
+ }
+}
+```
\ No newline at end of file
diff --git a/diffs/AaveV3Polygon_IncreaseUSDCeRF_20240528_before_AaveV3Polygon_IncreaseUSDCeRF_20240528_after.md b/diffs/AaveV3Polygon_IncreaseUSDCeRF_20240528_before_AaveV3Polygon_IncreaseUSDCeRF_20240528_after.md
new file mode 100644
index 000000000..614e1706b
--- /dev/null
+++ b/diffs/AaveV3Polygon_IncreaseUSDCeRF_20240528_before_AaveV3Polygon_IncreaseUSDCeRF_20240528_after.md
@@ -0,0 +1,25 @@
+## Reserve changes
+
+### Reserves altered
+
+#### USDC ([0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174](https://polygonscan.com/address/0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174))
+
+| description | value before | value after |
+| --- | --- | --- |
+| reserveFactor | 20 % | 25 % |
+
+
+## Raw diff
+
+```json
+{
+ "reserves": {
+ "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174": {
+ "reserveFactor": {
+ "from": 2000,
+ "to": 2500
+ }
+ }
+ }
+}
+```
\ No newline at end of file
diff --git a/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV2Avalanche_ReserveFactorUpgrades_20240528.sol b/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV2Avalanche_ReserveFactorUpgrades_20240528.sol
new file mode 100644
index 000000000..22bff6e7d
--- /dev/null
+++ b/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV2Avalanche_ReserveFactorUpgrades_20240528.sol
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {IProposalGenericExecutor} from 'aave-helpers/interfaces/IProposalGenericExecutor.sol';
+import {AaveV2Avalanche, AaveV2AvalancheAssets, ILendingPoolConfigurator} from 'aave-address-book/AaveV2Avalanche.sol';
+
+/**
+ * @title Reserve Factor Upgrades
+ * @author karpatkey_TokenLogic
+ * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x770ff4e02634c77aaa09952345551168920f7878b32ab03fcef92763a5fb70ab
+ * - Discussion: https://governance.aave.com/t/arfc-avalanche-v2-reserve-factor-adjustment/17040/4
+ */
+contract AaveV2Avalanche_ReserveFactorUpgrades_20240528 is IProposalGenericExecutor {
+ ILendingPoolConfigurator public constant POOL_CONFIGURATOR =
+ ILendingPoolConfigurator(AaveV2Avalanche.POOL_CONFIGURATOR);
+
+ uint256 public constant DAIe_RF = 55_00;
+ uint256 public constant USDCe_RF = 55_00;
+ uint256 public constant USDTe_RF = 55_00;
+ uint256 public constant WAVAX_RF = 55_00;
+ uint256 public constant WBTCe_RF = 60_00;
+ uint256 public constant WETHe_RF = 55_00;
+
+ function execute() external {
+ POOL_CONFIGURATOR.setReserveFactor(AaveV2AvalancheAssets.DAIe_UNDERLYING, DAIe_RF);
+ POOL_CONFIGURATOR.setReserveFactor(AaveV2AvalancheAssets.USDCe_UNDERLYING, USDCe_RF);
+ POOL_CONFIGURATOR.setReserveFactor(AaveV2AvalancheAssets.USDTe_UNDERLYING, USDTe_RF);
+ POOL_CONFIGURATOR.setReserveFactor(AaveV2AvalancheAssets.WAVAX_UNDERLYING, WAVAX_RF);
+ POOL_CONFIGURATOR.setReserveFactor(AaveV2AvalancheAssets.WBTCe_UNDERLYING, WBTCe_RF);
+ POOL_CONFIGURATOR.setReserveFactor(AaveV2AvalancheAssets.WETHe_UNDERLYING, WETHe_RF);
+ }
+}
diff --git a/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV2Avalanche_ReserveFactorUpgrades_20240528.t.sol b/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV2Avalanche_ReserveFactorUpgrades_20240528.t.sol
new file mode 100644
index 000000000..f1738b639
--- /dev/null
+++ b/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV2Avalanche_ReserveFactorUpgrades_20240528.t.sol
@@ -0,0 +1,78 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {AaveV2Avalanche, AaveV2AvalancheAssets} from 'aave-address-book/AaveV2Avalanche.sol';
+
+import 'forge-std/Test.sol';
+import {ProtocolV2TestBase, ReserveConfig} from 'aave-helpers/ProtocolV2TestBase.sol';
+import {AaveV2Avalanche_ReserveFactorUpgrades_20240528} from './AaveV2Avalanche_ReserveFactorUpgrades_20240528.sol';
+
+/**
+ * @dev Test for AaveV2Avalanche_ReserveFactorUpgrades_20240528
+ * command: make test-contract filter=AaveV2Avalanche_ReserveFactorUpgrades_20240528
+ */
+contract AaveV2Avalanche_ReserveFactorUpgrades_20240528_Test is ProtocolV2TestBase {
+ AaveV2Avalanche_ReserveFactorUpgrades_20240528 internal proposal;
+
+ struct Changes {
+ address asset;
+ uint256 reserveFactor;
+ }
+
+ function setUp() public {
+ vm.createSelectFork(vm.rpcUrl('avalanche'), 46635415);
+ proposal = new AaveV2Avalanche_ReserveFactorUpgrades_20240528();
+ }
+
+ /**
+ * @dev executes the generic test suite including e2e and config snapshots
+ */
+ function test_defaultProposalExecution() public {
+ (ReserveConfig[] memory allConfigsBefore, ReserveConfig[] memory allConfigsAfter) = defaultTest(
+ 'AaveV2Avalanche_ReserveFactorUpgrades_20240528',
+ AaveV2Avalanche.POOL,
+ address(proposal)
+ );
+
+ address[] memory assetsChanged = new address[](6);
+ assetsChanged[0] = AaveV2AvalancheAssets.DAIe_UNDERLYING;
+ assetsChanged[1] = AaveV2AvalancheAssets.USDCe_UNDERLYING;
+ assetsChanged[2] = AaveV2AvalancheAssets.USDTe_UNDERLYING;
+ assetsChanged[3] = AaveV2AvalancheAssets.WAVAX_UNDERLYING;
+ assetsChanged[4] = AaveV2AvalancheAssets.WBTCe_UNDERLYING;
+ assetsChanged[5] = AaveV2AvalancheAssets.WETHe_UNDERLYING;
+
+ Changes[] memory assetChanges = new Changes[](6);
+ assetChanges[0] = Changes({
+ asset: AaveV2AvalancheAssets.DAIe_UNDERLYING,
+ reserveFactor: proposal.DAIe_RF()
+ });
+ assetChanges[1] = Changes({
+ asset: AaveV2AvalancheAssets.USDCe_UNDERLYING,
+ reserveFactor: proposal.USDCe_RF()
+ });
+ assetChanges[2] = Changes({
+ asset: AaveV2AvalancheAssets.USDTe_UNDERLYING,
+ reserveFactor: proposal.USDTe_RF()
+ });
+ assetChanges[3] = Changes({
+ asset: AaveV2AvalancheAssets.WAVAX_UNDERLYING,
+ reserveFactor: proposal.WAVAX_RF()
+ });
+ assetChanges[4] = Changes({
+ asset: AaveV2AvalancheAssets.WBTCe_UNDERLYING,
+ reserveFactor: proposal.WBTCe_RF()
+ });
+ assetChanges[5] = Changes({
+ asset: AaveV2AvalancheAssets.WETHe_UNDERLYING,
+ reserveFactor: proposal.WETHe_RF()
+ });
+
+ _noReservesConfigsChangesApartFrom(allConfigsBefore, allConfigsAfter, assetsChanged);
+
+ for (uint i = 0; i < assetChanges.length; i++) {
+ ReserveConfig memory cfg = _findReserveConfig(allConfigsAfter, assetChanges[i].asset);
+ assertEq(cfg.reserveFactor, assetChanges[i].reserveFactor);
+ }
+ }
+}
diff --git a/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV2Ethereum_ReserveFactorUpgrades_20240528.sol b/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV2Ethereum_ReserveFactorUpgrades_20240528.sol
new file mode 100644
index 000000000..1583d029d
--- /dev/null
+++ b/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV2Ethereum_ReserveFactorUpgrades_20240528.sol
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {IProposalGenericExecutor} from 'aave-helpers/interfaces/IProposalGenericExecutor.sol';
+import {AaveV2Ethereum, AaveV2EthereumAssets, ILendingPoolConfigurator} from 'aave-address-book/AaveV2Ethereum.sol';
+
+/**
+ * @title Reserve Factor Upgrades
+ * @author karpatkey_TokenLogic
+ * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x26a03c08359c340f63b78b0c3e96d37aa0adeda65814643b0886d4719048ea7e
+ * - Discussion: https://governance.aave.com/t/arfc-ethereum-v2-reserve-factor-adjustment/16764/13?u=luigy
+ */
+contract AaveV2Ethereum_ReserveFactorUpgrades_20240528 is IProposalGenericExecutor {
+ ILendingPoolConfigurator public constant POOL_CONFIGURATOR =
+ ILendingPoolConfigurator(AaveV2Ethereum.POOL_CONFIGURATOR);
+
+ uint256 public constant DAI_RF = 60_00;
+ uint256 public constant LINK_RF = 65_00;
+ uint256 public constant USDC_RF = 60_00;
+ uint256 public constant USDT_RF = 60_00;
+ uint256 public constant WBTC_RF = 65_00;
+ uint256 public constant WETH_RF = 60_00;
+
+ function execute() external {
+ POOL_CONFIGURATOR.setReserveFactor(AaveV2EthereumAssets.DAI_UNDERLYING, DAI_RF);
+ POOL_CONFIGURATOR.setReserveFactor(AaveV2EthereumAssets.LINK_UNDERLYING, LINK_RF);
+ POOL_CONFIGURATOR.setReserveFactor(AaveV2EthereumAssets.USDC_UNDERLYING, USDC_RF);
+ POOL_CONFIGURATOR.setReserveFactor(AaveV2EthereumAssets.USDT_UNDERLYING, USDT_RF);
+ POOL_CONFIGURATOR.setReserveFactor(AaveV2EthereumAssets.WBTC_UNDERLYING, WBTC_RF);
+ POOL_CONFIGURATOR.setReserveFactor(AaveV2EthereumAssets.WETH_UNDERLYING, WETH_RF);
+ }
+}
diff --git a/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV2Ethereum_ReserveFactorUpgrades_20240528.t.sol b/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV2Ethereum_ReserveFactorUpgrades_20240528.t.sol
new file mode 100644
index 000000000..5c92ba3a5
--- /dev/null
+++ b/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV2Ethereum_ReserveFactorUpgrades_20240528.t.sol
@@ -0,0 +1,78 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {AaveV2Ethereum, AaveV2EthereumAssets} from 'aave-address-book/AaveV2Ethereum.sol';
+
+import 'forge-std/Test.sol';
+import {ProtocolV2TestBase, ReserveConfig} from 'aave-helpers/ProtocolV2TestBase.sol';
+import {AaveV2Ethereum_ReserveFactorUpgrades_20240528} from './AaveV2Ethereum_ReserveFactorUpgrades_20240528.sol';
+
+/**
+ * @dev Test for AaveV2Ethereum_ReserveFactorUpgrades_20240528
+ * command: make test-contract filter=AaveV2Ethereum_ReserveFactorUpgrades_20240528
+ */
+contract AaveV2Ethereum_ReserveFactorUpgrades_20240528_Test is ProtocolV2TestBase {
+ AaveV2Ethereum_ReserveFactorUpgrades_20240528 internal proposal;
+
+ struct Changes {
+ address asset;
+ uint256 reserveFactor;
+ }
+
+ function setUp() public {
+ vm.createSelectFork(vm.rpcUrl('mainnet'), 20077283);
+ proposal = new AaveV2Ethereum_ReserveFactorUpgrades_20240528();
+ }
+
+ /**
+ * @dev executes the generic test suite including e2e and config snapshots
+ */
+ function test_defaultProposalExecution() public {
+ (ReserveConfig[] memory allConfigsBefore, ReserveConfig[] memory allConfigsAfter) = defaultTest(
+ 'AaveV2Ethereum_ReserveFactorUpgrades_20240528',
+ AaveV2Ethereum.POOL,
+ address(proposal)
+ );
+
+ address[] memory assetsChanged = new address[](6);
+ assetsChanged[0] = AaveV2EthereumAssets.DAI_UNDERLYING;
+ assetsChanged[1] = AaveV2EthereumAssets.LINK_UNDERLYING;
+ assetsChanged[2] = AaveV2EthereumAssets.USDC_UNDERLYING;
+ assetsChanged[3] = AaveV2EthereumAssets.USDT_UNDERLYING;
+ assetsChanged[4] = AaveV2EthereumAssets.WBTC_UNDERLYING;
+ assetsChanged[5] = AaveV2EthereumAssets.WETH_UNDERLYING;
+
+ Changes[] memory assetChanges = new Changes[](6);
+ assetChanges[0] = Changes({
+ asset: AaveV2EthereumAssets.DAI_UNDERLYING,
+ reserveFactor: proposal.DAI_RF()
+ });
+ assetChanges[1] = Changes({
+ asset: AaveV2EthereumAssets.LINK_UNDERLYING,
+ reserveFactor: proposal.LINK_RF()
+ });
+ assetChanges[2] = Changes({
+ asset: AaveV2EthereumAssets.USDC_UNDERLYING,
+ reserveFactor: proposal.USDC_RF()
+ });
+ assetChanges[3] = Changes({
+ asset: AaveV2EthereumAssets.USDT_UNDERLYING,
+ reserveFactor: proposal.USDT_RF()
+ });
+ assetChanges[4] = Changes({
+ asset: AaveV2EthereumAssets.WBTC_UNDERLYING,
+ reserveFactor: proposal.WBTC_RF()
+ });
+ assetChanges[5] = Changes({
+ asset: AaveV2EthereumAssets.WETH_UNDERLYING,
+ reserveFactor: proposal.WETH_RF()
+ });
+
+ _noReservesConfigsChangesApartFrom(allConfigsBefore, allConfigsAfter, assetsChanged);
+
+ for (uint i = 0; i < assetChanges.length; i++) {
+ ReserveConfig memory cfg = _findReserveConfig(allConfigsAfter, assetChanges[i].asset);
+ assertEq(cfg.reserveFactor, assetChanges[i].reserveFactor);
+ }
+ }
+}
diff --git a/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV2Polygon_BorrowRateUpdates_20240528.sol b/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV2Polygon_BorrowRateUpdates_20240528.sol
new file mode 100644
index 000000000..1f90967ac
--- /dev/null
+++ b/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV2Polygon_BorrowRateUpdates_20240528.sol
@@ -0,0 +1,109 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {AaveV2Polygon, AaveV2PolygonAssets} from 'aave-address-book/AaveV2Polygon.sol';
+import {AaveV2PayloadPolygon} from 'aave-helpers/v2-config-engine/AaveV2PayloadPolygon.sol';
+import {EngineFlags} from 'aave-helpers/v3-config-engine/EngineFlags.sol';
+import {IAaveV2ConfigEngine} from 'aave-helpers/v2-config-engine/IAaveV2ConfigEngine.sol';
+import {IV2RateStrategyFactory} from 'aave-helpers/v2-config-engine/IV2RateStrategyFactory.sol';
+
+/**
+ * @title AaveV2Polygon_BorrowRateUpdates_20240528
+ * @author karpatkey_TokenLogic
+ * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x95643085ee16eb0eaa4110a9f0ea8223009f9521e596e1a958303705a5001363
+ * - Discussion: https://governance.aave.com/t/arfc-polygon-v2-borrow-rate-adjustments/17252/3
+ */
+contract AaveV2Polygon_BorrowRateUpdates_20240528 is AaveV2PayloadPolygon {
+ uint256 public constant DAI_RF = 99_99;
+ uint256 public constant USDC_RF = 99_99;
+ uint256 public constant USDT_RF = 99_99;
+
+ function _preExecute() internal override {
+ AaveV2Polygon.POOL_CONFIGURATOR.setReserveFactor(AaveV2PolygonAssets.DAI_UNDERLYING, DAI_RF);
+ AaveV2Polygon.POOL_CONFIGURATOR.setReserveFactor(AaveV2PolygonAssets.USDC_UNDERLYING, USDC_RF);
+ AaveV2Polygon.POOL_CONFIGURATOR.setReserveFactor(AaveV2PolygonAssets.USDT_UNDERLYING, USDT_RF);
+ }
+
+ function rateStrategiesUpdates()
+ public
+ pure
+ override
+ returns (IAaveV2ConfigEngine.RateStrategyUpdate[] memory)
+ {
+ IAaveV2ConfigEngine.RateStrategyUpdate[]
+ memory rateStrategies = new IAaveV2ConfigEngine.RateStrategyUpdate[](6);
+
+ // Active Assets - Stables
+ rateStrategies[0] = IAaveV2ConfigEngine.RateStrategyUpdate({
+ asset: AaveV2PolygonAssets.DAI_UNDERLYING,
+ params: IV2RateStrategyFactory.RateStrategyParams({
+ optimalUtilizationRate: EngineFlags.KEEP_CURRENT,
+ baseVariableBorrowRate: EngineFlags.KEEP_CURRENT,
+ variableRateSlope1: _bpsToRay(11_25),
+ variableRateSlope2: EngineFlags.KEEP_CURRENT,
+ stableRateSlope1: EngineFlags.KEEP_CURRENT,
+ stableRateSlope2: EngineFlags.KEEP_CURRENT
+ })
+ });
+ rateStrategies[1] = IAaveV2ConfigEngine.RateStrategyUpdate({
+ asset: AaveV2PolygonAssets.USDT_UNDERLYING,
+ params: IV2RateStrategyFactory.RateStrategyParams({
+ optimalUtilizationRate: EngineFlags.KEEP_CURRENT,
+ baseVariableBorrowRate: EngineFlags.KEEP_CURRENT,
+ variableRateSlope1: _bpsToRay(11_25),
+ variableRateSlope2: EngineFlags.KEEP_CURRENT,
+ stableRateSlope1: EngineFlags.KEEP_CURRENT,
+ stableRateSlope2: EngineFlags.KEEP_CURRENT
+ })
+ });
+ rateStrategies[2] = IAaveV2ConfigEngine.RateStrategyUpdate({
+ asset: AaveV2PolygonAssets.USDC_UNDERLYING,
+ params: IV2RateStrategyFactory.RateStrategyParams({
+ optimalUtilizationRate: EngineFlags.KEEP_CURRENT,
+ baseVariableBorrowRate: EngineFlags.KEEP_CURRENT,
+ variableRateSlope1: _bpsToRay(11_25),
+ variableRateSlope2: EngineFlags.KEEP_CURRENT,
+ stableRateSlope1: EngineFlags.KEEP_CURRENT,
+ stableRateSlope2: EngineFlags.KEEP_CURRENT
+ })
+ });
+
+ // Active Assets - Volatile
+
+ rateStrategies[3] = IAaveV2ConfigEngine.RateStrategyUpdate({
+ asset: AaveV2PolygonAssets.WBTC_UNDERLYING,
+ params: IV2RateStrategyFactory.RateStrategyParams({
+ optimalUtilizationRate: EngineFlags.KEEP_CURRENT,
+ baseVariableBorrowRate: EngineFlags.KEEP_CURRENT,
+ variableRateSlope1: _bpsToRay(6_25),
+ variableRateSlope2: EngineFlags.KEEP_CURRENT,
+ stableRateSlope1: EngineFlags.KEEP_CURRENT,
+ stableRateSlope2: EngineFlags.KEEP_CURRENT
+ })
+ });
+ rateStrategies[4] = IAaveV2ConfigEngine.RateStrategyUpdate({
+ asset: AaveV2PolygonAssets.WETH_UNDERLYING,
+ params: IV2RateStrategyFactory.RateStrategyParams({
+ optimalUtilizationRate: EngineFlags.KEEP_CURRENT,
+ baseVariableBorrowRate: EngineFlags.KEEP_CURRENT,
+ variableRateSlope1: _bpsToRay(6_25),
+ variableRateSlope2: EngineFlags.KEEP_CURRENT,
+ stableRateSlope1: EngineFlags.KEEP_CURRENT,
+ stableRateSlope2: EngineFlags.KEEP_CURRENT
+ })
+ });
+ rateStrategies[5] = IAaveV2ConfigEngine.RateStrategyUpdate({
+ asset: AaveV2PolygonAssets.WMATIC_UNDERLYING,
+ params: IV2RateStrategyFactory.RateStrategyParams({
+ optimalUtilizationRate: EngineFlags.KEEP_CURRENT,
+ baseVariableBorrowRate: EngineFlags.KEEP_CURRENT,
+ variableRateSlope1: _bpsToRay(8_25),
+ variableRateSlope2: EngineFlags.KEEP_CURRENT,
+ stableRateSlope1: EngineFlags.KEEP_CURRENT,
+ stableRateSlope2: EngineFlags.KEEP_CURRENT
+ })
+ });
+
+ return rateStrategies;
+ }
+}
diff --git a/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV2Polygon_BorrowRateUpdates_20240528.t.sol b/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV2Polygon_BorrowRateUpdates_20240528.t.sol
new file mode 100644
index 000000000..4e501c20b
--- /dev/null
+++ b/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV2Polygon_BorrowRateUpdates_20240528.t.sol
@@ -0,0 +1,59 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {AaveV2Polygon, AaveV2PolygonAssets} from 'aave-address-book/AaveV2Polygon.sol';
+import {ProtocolV2TestBase, ReserveConfig} from 'aave-helpers/ProtocolV2TestBase.sol';
+
+import {AaveV2Polygon_BorrowRateUpdates_20240528} from './AaveV2Polygon_BorrowRateUpdates_20240528.sol';
+
+/**
+ * @dev Test for AaveV2Polygon_BorrowRateUpdates_20240528
+ * command: FOUNDRY_PROFILE=polygon make test-contract filter=AaveV2Polygon_BorrowRateUpdates_20240528
+ */
+contract AaveV2Polygon_BorrowRateUpdates_20240528_Test is ProtocolV2TestBase {
+ struct Changes {
+ address asset;
+ uint256 reserveFactor;
+ }
+ AaveV2Polygon_BorrowRateUpdates_20240528 internal proposal;
+
+ function setUp() public {
+ vm.createSelectFork(vm.rpcUrl('polygon'), 58078849);
+ proposal = new AaveV2Polygon_BorrowRateUpdates_20240528();
+ }
+
+ /**
+ * @dev executes the generic test suite including e2e and config snapshots
+ */
+ function test_defaultProposalExecution() public {
+ (, ReserveConfig[] memory allConfigsAfter) = defaultTest(
+ 'AaveV2Polygon_BorrowRateUpdates_20240528',
+ AaveV2Polygon.POOL,
+ address(proposal)
+ );
+
+ address[] memory assetsChanged = new address[](3);
+ assetsChanged[0] = AaveV2PolygonAssets.DAI_UNDERLYING;
+ assetsChanged[1] = AaveV2PolygonAssets.USDC_UNDERLYING;
+ assetsChanged[2] = AaveV2PolygonAssets.USDT_UNDERLYING;
+
+ Changes[] memory assetChanges = new Changes[](3);
+ assetChanges[0] = Changes({
+ asset: AaveV2PolygonAssets.DAI_UNDERLYING,
+ reserveFactor: proposal.DAI_RF()
+ });
+ assetChanges[1] = Changes({
+ asset: AaveV2PolygonAssets.USDC_UNDERLYING,
+ reserveFactor: proposal.USDC_RF()
+ });
+ assetChanges[2] = Changes({
+ asset: AaveV2PolygonAssets.USDT_UNDERLYING,
+ reserveFactor: proposal.USDT_RF()
+ });
+
+ for (uint i = 0; i < assetChanges.length; i++) {
+ ReserveConfig memory cfg = _findReserveConfig(allConfigsAfter, assetChanges[i].asset);
+ assertEq(cfg.reserveFactor, assetChanges[i].reserveFactor);
+ }
+ }
+}
diff --git a/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Arbitrum_IncreaseUSDCeRF_20240528.sol b/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Arbitrum_IncreaseUSDCeRF_20240528.sol
new file mode 100644
index 000000000..6422bd7de
--- /dev/null
+++ b/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Arbitrum_IncreaseUSDCeRF_20240528.sol
@@ -0,0 +1,37 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {AaveV3Arbitrum, AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol';
+import {AaveV3PayloadArbitrum} from 'aave-helpers/v3-config-engine/AaveV3PayloadArbitrum.sol';
+import {EngineFlags} from 'aave-helpers/v3-config-engine/EngineFlags.sol';
+import {IAaveV3ConfigEngine} from 'aave-helpers/v3-config-engine/IAaveV3ConfigEngine.sol';
+import {IV3RateStrategyFactory} from 'aave-helpers/v3-config-engine/IV3RateStrategyFactory.sol';
+/**
+ * @title IncreaseUSDCeRF
+ * @author karpatkey_TokenLogic
+ * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x9cc7906f04f45cebeaa48a05ed281f49da00d89c4dd988a968272fa179f14d06
+ * - Discussion: https://governance.aave.com/t/arfc-increase-bridged-usdc-reserve-factor-across-all-deployments/17787
+ */
+contract AaveV3Arbitrum_IncreaseUSDCeRF_20240528 is AaveV3PayloadArbitrum {
+ function borrowsUpdates()
+ public
+ pure
+ override
+ returns (IAaveV3ConfigEngine.BorrowUpdate[] memory)
+ {
+ IAaveV3ConfigEngine.BorrowUpdate[]
+ memory borrowUpdates = new IAaveV3ConfigEngine.BorrowUpdate[](1);
+
+ borrowUpdates[0] = IAaveV3ConfigEngine.BorrowUpdate({
+ asset: AaveV3ArbitrumAssets.USDC_UNDERLYING,
+ enabledToBorrow: EngineFlags.KEEP_CURRENT,
+ flashloanable: EngineFlags.KEEP_CURRENT,
+ stableRateModeEnabled: EngineFlags.KEEP_CURRENT,
+ borrowableInIsolation: EngineFlags.KEEP_CURRENT,
+ withSiloedBorrowing: EngineFlags.KEEP_CURRENT,
+ reserveFactor: 25_00
+ });
+
+ return borrowUpdates;
+ }
+}
diff --git a/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Arbitrum_IncreaseUSDCeRF_20240528.t.sol b/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Arbitrum_IncreaseUSDCeRF_20240528.t.sol
new file mode 100644
index 000000000..e9eeaaeee
--- /dev/null
+++ b/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Arbitrum_IncreaseUSDCeRF_20240528.t.sol
@@ -0,0 +1,28 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {AaveV3Arbitrum} from 'aave-address-book/AaveV3Arbitrum.sol';
+
+import 'forge-std/Test.sol';
+import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/ProtocolV3TestBase.sol';
+import {AaveV3Arbitrum_IncreaseUSDCeRF_20240528} from './AaveV3Arbitrum_IncreaseUSDCeRF_20240528.sol';
+
+/**
+ * @dev Test for AaveV3Arbitrum_IncreaseUSDCeRF_20240528
+ * command: make test-contract filter=AaveV3Arbitrum_IncreaseUSDCeRF_20240528
+ */
+contract AaveV3Arbitrum_IncreaseUSDCeRF_20240528_Test is ProtocolV3TestBase {
+ AaveV3Arbitrum_IncreaseUSDCeRF_20240528 internal proposal;
+
+ function setUp() public {
+ vm.createSelectFork(vm.rpcUrl('arbitrum'), 221148973);
+ proposal = new AaveV3Arbitrum_IncreaseUSDCeRF_20240528();
+ }
+
+ /**
+ * @dev executes the generic test suite including e2e and config snapshots
+ */
+ function test_defaultProposalExecution() public {
+ defaultTest('AaveV3Arbitrum_IncreaseUSDCeRF_20240528', AaveV3Arbitrum.POOL, address(proposal));
+ }
+}
diff --git a/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Base_IncreaseUSDCeRF_20240528.sol b/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Base_IncreaseUSDCeRF_20240528.sol
new file mode 100644
index 000000000..673e84c6c
--- /dev/null
+++ b/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Base_IncreaseUSDCeRF_20240528.sol
@@ -0,0 +1,37 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {AaveV3Base, AaveV3BaseAssets} from 'aave-address-book/AaveV3Base.sol';
+import {AaveV3PayloadBase} from 'aave-helpers/v3-config-engine/AaveV3PayloadBase.sol';
+import {EngineFlags} from 'aave-helpers/v3-config-engine/EngineFlags.sol';
+import {IAaveV3ConfigEngine} from 'aave-helpers/v3-config-engine/IAaveV3ConfigEngine.sol';
+import {IV3RateStrategyFactory} from 'aave-helpers/v3-config-engine/IV3RateStrategyFactory.sol';
+/**
+ * @title IncreaseUSDCeRF
+ * @author karpatkey_TokenLogic
+ * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x9cc7906f04f45cebeaa48a05ed281f49da00d89c4dd988a968272fa179f14d06
+ * - Discussion: https://governance.aave.com/t/arfc-increase-bridged-usdc-reserve-factor-across-all-deployments/17787
+ */
+contract AaveV3Base_IncreaseUSDCeRF_20240528 is AaveV3PayloadBase {
+ function borrowsUpdates()
+ public
+ pure
+ override
+ returns (IAaveV3ConfigEngine.BorrowUpdate[] memory)
+ {
+ IAaveV3ConfigEngine.BorrowUpdate[]
+ memory borrowUpdates = new IAaveV3ConfigEngine.BorrowUpdate[](1);
+
+ borrowUpdates[0] = IAaveV3ConfigEngine.BorrowUpdate({
+ asset: AaveV3BaseAssets.USDbC_UNDERLYING,
+ enabledToBorrow: EngineFlags.KEEP_CURRENT,
+ flashloanable: EngineFlags.KEEP_CURRENT,
+ stableRateModeEnabled: EngineFlags.KEEP_CURRENT,
+ borrowableInIsolation: EngineFlags.KEEP_CURRENT,
+ withSiloedBorrowing: EngineFlags.KEEP_CURRENT,
+ reserveFactor: 25_00
+ });
+
+ return borrowUpdates;
+ }
+}
diff --git a/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Base_IncreaseUSDCeRF_20240528.t.sol b/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Base_IncreaseUSDCeRF_20240528.t.sol
new file mode 100644
index 000000000..8b24f60fc
--- /dev/null
+++ b/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Base_IncreaseUSDCeRF_20240528.t.sol
@@ -0,0 +1,28 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {AaveV3Base} from 'aave-address-book/AaveV3Base.sol';
+
+import 'forge-std/Test.sol';
+import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/ProtocolV3TestBase.sol';
+import {AaveV3Base_IncreaseUSDCeRF_20240528} from './AaveV3Base_IncreaseUSDCeRF_20240528.sol';
+
+/**
+ * @dev Test for AaveV3Base_IncreaseUSDCeRF_20240528
+ * command: FOUNDRY_PROFILE=base make test-contract filter=AaveV3Base_IncreaseUSDCeRF_20240528
+ */
+contract AaveV3Base_IncreaseUSDCeRF_20240528_Test is ProtocolV3TestBase {
+ AaveV3Base_IncreaseUSDCeRF_20240528 internal proposal;
+
+ function setUp() public {
+ vm.createSelectFork(vm.rpcUrl('base'), 15714463);
+ proposal = new AaveV3Base_IncreaseUSDCeRF_20240528();
+ }
+
+ /**
+ * @dev executes the generic test suite including e2e and config snapshots
+ */
+ function test_defaultProposalExecution() public {
+ defaultTest('AaveV3Base_IncreaseUSDCeRF_20240528', AaveV3Base.POOL, address(proposal));
+ }
+}
diff --git a/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Optimism_IncreaseUSDCeRF_20240528.sol b/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Optimism_IncreaseUSDCeRF_20240528.sol
new file mode 100644
index 000000000..d8dff7749
--- /dev/null
+++ b/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Optimism_IncreaseUSDCeRF_20240528.sol
@@ -0,0 +1,38 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {AaveV3Optimism, AaveV3OptimismAssets, IPoolConfigurator} from 'aave-address-book/AaveV3Optimism.sol';
+import {AaveV3PayloadOptimism} from 'aave-helpers/v3-config-engine/AaveV3PayloadOptimism.sol';
+import {EngineFlags} from 'aave-helpers/v3-config-engine/EngineFlags.sol';
+import {IAaveV3ConfigEngine} from 'aave-helpers/v3-config-engine/IAaveV3ConfigEngine.sol';
+import {IV3RateStrategyFactory} from 'aave-helpers/v3-config-engine/IV3RateStrategyFactory.sol';
+
+/**
+ * @title IncreaseUSDCeRF
+ * @author karpatkey_TokenLogic
+ * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x9cc7906f04f45cebeaa48a05ed281f49da00d89c4dd988a968272fa179f14d06
+ * - Discussion: https://governance.aave.com/t/arfc-increase-bridged-usdc-reserve-factor-across-all-deployments/17787
+ */
+contract AaveV3Optimism_IncreaseUSDCeRF_20240528 is AaveV3PayloadOptimism {
+ function borrowsUpdates()
+ public
+ pure
+ override
+ returns (IAaveV3ConfigEngine.BorrowUpdate[] memory)
+ {
+ IAaveV3ConfigEngine.BorrowUpdate[]
+ memory borrowUpdates = new IAaveV3ConfigEngine.BorrowUpdate[](1);
+
+ borrowUpdates[0] = IAaveV3ConfigEngine.BorrowUpdate({
+ asset: AaveV3OptimismAssets.USDC_UNDERLYING,
+ enabledToBorrow: EngineFlags.KEEP_CURRENT,
+ flashloanable: EngineFlags.KEEP_CURRENT,
+ stableRateModeEnabled: EngineFlags.KEEP_CURRENT,
+ borrowableInIsolation: EngineFlags.KEEP_CURRENT,
+ withSiloedBorrowing: EngineFlags.KEEP_CURRENT,
+ reserveFactor: 25_00
+ });
+
+ return borrowUpdates;
+ }
+}
diff --git a/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Optimism_IncreaseUSDCeRF_20240528.t.sol b/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Optimism_IncreaseUSDCeRF_20240528.t.sol
new file mode 100644
index 000000000..33a6637eb
--- /dev/null
+++ b/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Optimism_IncreaseUSDCeRF_20240528.t.sol
@@ -0,0 +1,28 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {AaveV3Optimism} from 'aave-address-book/AaveV3Optimism.sol';
+
+import 'forge-std/Test.sol';
+import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/ProtocolV3TestBase.sol';
+import {AaveV3Optimism_IncreaseUSDCeRF_20240528} from './AaveV3Optimism_IncreaseUSDCeRF_20240528.sol';
+
+/**
+ * @dev Test for AaveV3Optimism_IncreaseUSDCeRF_20240528
+ * command: make test-contract filter=AaveV3Optimism_IncreaseUSDCeRF_20240528
+ */
+contract AaveV3Optimism_IncreaseUSDCeRF_20240528_Test is ProtocolV3TestBase {
+ AaveV3Optimism_IncreaseUSDCeRF_20240528 internal proposal;
+
+ function setUp() public {
+ vm.createSelectFork(vm.rpcUrl('optimism'), 121307515);
+ proposal = new AaveV3Optimism_IncreaseUSDCeRF_20240528();
+ }
+
+ /**
+ * @dev executes the generic test suite including e2e and config snapshots
+ */
+ function test_defaultProposalExecution() public {
+ defaultTest('AaveV3Optimism_IncreaseUSDCeRF_20240528', AaveV3Optimism.POOL, address(proposal));
+ }
+}
diff --git a/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Polygon_IncreaseUSDCeRF_20240528.sol b/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Polygon_IncreaseUSDCeRF_20240528.sol
new file mode 100644
index 000000000..71279519a
--- /dev/null
+++ b/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Polygon_IncreaseUSDCeRF_20240528.sol
@@ -0,0 +1,37 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {AaveV3Polygon, AaveV3PolygonAssets} from 'aave-address-book/AaveV3Polygon.sol';
+import {AaveV3PayloadPolygon} from 'aave-helpers/v3-config-engine/AaveV3PayloadPolygon.sol';
+import {EngineFlags} from 'aave-helpers/v3-config-engine/EngineFlags.sol';
+import {IAaveV3ConfigEngine} from 'aave-helpers/v3-config-engine/IAaveV3ConfigEngine.sol';
+import {IV3RateStrategyFactory} from 'aave-helpers/v3-config-engine/IV3RateStrategyFactory.sol';
+/**
+ * @title IncreaseUSDCeRF
+ * @author karpatkey_TokenLogic
+ * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x9cc7906f04f45cebeaa48a05ed281f49da00d89c4dd988a968272fa179f14d06
+ * - Discussion: https://governance.aave.com/t/arfc-increase-bridged-usdc-reserve-factor-across-all-deployments/17787
+ */
+contract AaveV3Polygon_IncreaseUSDCeRF_20240528 is AaveV3PayloadPolygon {
+ function borrowsUpdates()
+ public
+ pure
+ override
+ returns (IAaveV3ConfigEngine.BorrowUpdate[] memory)
+ {
+ IAaveV3ConfigEngine.BorrowUpdate[]
+ memory borrowUpdates = new IAaveV3ConfigEngine.BorrowUpdate[](1);
+
+ borrowUpdates[0] = IAaveV3ConfigEngine.BorrowUpdate({
+ asset: AaveV3PolygonAssets.USDC_UNDERLYING,
+ enabledToBorrow: EngineFlags.KEEP_CURRENT,
+ flashloanable: EngineFlags.KEEP_CURRENT,
+ stableRateModeEnabled: EngineFlags.KEEP_CURRENT,
+ borrowableInIsolation: EngineFlags.KEEP_CURRENT,
+ withSiloedBorrowing: EngineFlags.KEEP_CURRENT,
+ reserveFactor: 25_00
+ });
+
+ return borrowUpdates;
+ }
+}
diff --git a/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Polygon_IncreaseUSDCeRF_20240528.t.sol b/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Polygon_IncreaseUSDCeRF_20240528.t.sol
new file mode 100644
index 000000000..291604673
--- /dev/null
+++ b/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Polygon_IncreaseUSDCeRF_20240528.t.sol
@@ -0,0 +1,28 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {AaveV3Polygon} from 'aave-address-book/AaveV3Polygon.sol';
+
+import 'forge-std/Test.sol';
+import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/ProtocolV3TestBase.sol';
+import {AaveV3Polygon_IncreaseUSDCeRF_20240528} from './AaveV3Polygon_IncreaseUSDCeRF_20240528.sol';
+
+/**
+ * @dev Test for AaveV3Polygon_IncreaseUSDCeRF_20240528
+ * command: make test-contract filter=AaveV3Polygon_IncreaseUSDCeRF_20240528
+ */
+contract AaveV3Polygon_IncreaseUSDCeRF_20240528_Test is ProtocolV3TestBase {
+ AaveV3Polygon_IncreaseUSDCeRF_20240528 internal proposal;
+
+ function setUp() public {
+ vm.createSelectFork(vm.rpcUrl('polygon'), 58078849);
+ proposal = new AaveV3Polygon_IncreaseUSDCeRF_20240528();
+ }
+
+ /**
+ * @dev executes the generic test suite including e2e and config snapshots
+ */
+ function test_defaultProposalExecution() public {
+ defaultTest('AaveV3Polygon_IncreaseUSDCeRF_20240528', AaveV3Polygon.POOL, address(proposal));
+ }
+}
diff --git a/src/20240528_Multi_BridgedUSDCeUpdateRF/IncreaseUSDCeRF.md b/src/20240528_Multi_BridgedUSDCeUpdateRF/IncreaseUSDCeRF.md
new file mode 100644
index 000000000..91e127080
--- /dev/null
+++ b/src/20240528_Multi_BridgedUSDCeUpdateRF/IncreaseUSDCeRF.md
@@ -0,0 +1,75 @@
+---
+title: "Increase Bridged USDC Reserve Factor Across All Deployments"
+author: "karpatkey_TokenLogic"
+discussions: "https://governance.aave.com/t/arfc-increase-bridged-usdc-reserve-factor-across-all-deployments/17787"
+snapshot: "https://snapshot.org/#/aave.eth/proposal/0x9cc7906f04f45cebeaa48a05ed281f49da00d89c4dd988a968272fa179f14d06"
+---
+
+## Simple Summary
+
+This AIP is composed of three actions:
+
+1. To start periodically increasing the Reserve Factor (RF) for Bridged USDC(USDC.e & USDbC) across Arbitrum, Optimism, Polygon and Base Aave deployments.
+2. A continuation of the proposals on Governance V3 that increases the Reserve Factor (RF) for assets on [Ethereum V2](https://governance.aave.com/t/arfc-ethereum-v2-reserve-factor-adjustment/16764), [Avalanche V2](https://governance.aave.com/t/arfc-avalanche-v2-reserve-factor-adjustment/17040), and [Polygon V2](https://governance.aave.com/t/arfc-reserve-factor-updates-polygon-aave-v2/13937/23?u=dd0sxx) by 5.00%, up to a maximum of 99.99%.
+3. A continuation of the [proposal](https://governance.aave.com/t/arfc-polygon-v2-borrow-rate-adjustments/17252) to adjust Polygon v2 Borrow Rate.
+
+## Motivation
+
+Presently, Bridged USDC (USDC.e & USDbC) competes with native USDC on the listed markets. By gradually increasing the RF for Bridged USDC(USDC.e & USDbC), the deposit rate on these markets will become less attractive over time. Similar to other proposals, this action is expected to encourage users to switch to native USDC on the respective market.
+
+Upon implementing this proposal, a subsequent AIP will be submitted that increases the RF by 5.00% up to a maximum of 99.99% every 2 weeks, subject to market conditions. The RF amendments will be incorporated into the fortnightly RF and Borrow Rate adjustment AIP to reduce voting overhead.
+
+This AIP will also reduce deposit yield for assets on Ethereum, Avalanche, and Polygon V2 deployments by increasing the RF. With this upgrade being passed, users will be further encouraged to migrate from Ethereum V2 to V3.
+
+Increasing the RF routes a larger portion of the interest paid by users to Aave DAO's Treasury. User's funds are not at risk of liquidation and the borrowing rate remains unchanged.
+
+## Specification
+
+| Market | Asset | Current RF | New RF |
+| ------------ | ------ | ---------- | ------ |
+| Polygon V3 | USDC.e | 20% | 25% |
+| Optimism V3 | USDC.e | 20% | 25% |
+| Arbitrum V3 | USDC.e | 20% | 25% |
+| Base V3 | USDC.e | 20% | 25% |
+| Ethereum V2 | DAI | 55% | 60% |
+| Ethereum V2 | LINK | 60% | 65% |
+| Ethereum V2 | USDC | 55% | 60% |
+| Ethereum V2 | USDT | 55% | 60% |
+| Ethereum V2 | WBTC | 60% | 65% |
+| Ethereum V2 | WETH | 55% | 60% |
+| Avalanche V2 | DAIe | 50% | 55% |
+| Avalanche V2 | USDCe | 50% | 55% |
+| Avalanche V2 | USDTe | 50% | 55% |
+| Avalanche V2 | WAVAX | 50% | 55% |
+| Avalanche V2 | WBTCe | 55% | 60% |
+| Avalanche V2 | WETHe | 50% | 55% |
+| Polygon V2 | DAI | 96% | 99.99% |
+| Polygon V2 | USDC | 98% | 99.99% |
+| Polygon V2 | USDT | 97% | 99.99% |
+
+| Market | Asset | Current Slope1 | New Slope1 |
+| ---------- | ------ | -------------- | ---------- |
+| Polygon V2 | DAI | 9.75% | 11.25% |
+| Polygon V2 | USDT | 9.75% | 11.25% |
+| Polygon V2 | wBTC | 4.75% | 6.25% |
+| Polygon V2 | wETH | 4.75% | 6.25% |
+| Polygon V2 | wUSDC | 9.75% | 11.25% |
+| Polygon V2 | wMATIC | 4.75% | 8.25% |
+
+## References
+
+- Implementation: [AaveV2Avalanche](https://github.com/bgd-labs/aave-proposals-v3/blob/603d947dd7a5a42181ae694f2efcbc365df02cf3/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV2Avalanche_ReserveFactorUpgrades_20240528.sol),[AaveV2Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/603d947dd7a5a42181ae694f2efcbc365df02cf3/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV2Ethereum_ReserveFactorUpgrades_20240528.sol),[AaveV2Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/603d947dd7a5a42181ae694f2efcbc365df02cf3/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV2Polygon_BorrowRateUpdates_20240528.sol),[AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/603d947dd7a5a42181ae694f2efcbc365df02cf3/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Polygon_IncreaseUSDCeRF_20240528.sol),[AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/603d947dd7a5a42181ae694f2efcbc365df02cf3/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Optimism_IncreaseUSDCeRF_20240528.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/603d947dd7a5a42181ae694f2efcbc365df02cf3/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Arbitrum_IncreaseUSDCeRF_20240528.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/603d947dd7a5a42181ae694f2efcbc365df02cf3/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Base_IncreaseUSDCeRF_20240528.t.sol)
+- Tests: [AaveV2Avalanche](https://github.com/bgd-labs/aave-proposals-v3/blob/603d947dd7a5a42181ae694f2efcbc365df02cf3/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV2Avalanche_ReserveFactorUpgrades_20240528.t.sol),[AaveV2Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/603d947dd7a5a42181ae694f2efcbc365df02cf3/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV2Ethereum_ReserveFactorUpgrades_20240528.t.sol),[AaveV2Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/603d947dd7a5a42181ae694f2efcbc365df02cf3/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV2Polygon_BorrowRateUpdates_20240528.t.sol),[AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/603d947dd7a5a42181ae694f2efcbc365df02cf3/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Polygon_IncreaseUSDCeRF_20240528.t.sol),[AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/603d947dd7a5a42181ae694f2efcbc365df02cf3/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Optimism_IncreaseUSDCeRF_20240528.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/603d947dd7a5a42181ae694f2efcbc365df02cf3/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Arbitrum_IncreaseUSDCeRF_20240528.t.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/603d947dd7a5a42181ae694f2efcbc365df02cf3/src/20240528_Multi_BridgedUSDCeUpdateRF/AaveV3Base_IncreaseUSDCeRF_20240528.t.sol)
+- [Snapshot for USDCe updates](https://snapshot.org/#/aave.eth/proposal/0x9cc7906f04f45cebeaa48a05ed281f49da00d89c4dd988a968272fa179f14d06)
+- [Discussion for USDCe updates](https://governance.aave.com/t/arfc-increase-bridged-usdc-reserve-factor-across-all-deployments/17787)
+- [Discussion for Ethereum V2 Reserve Factor Updates](https://governance.aave.com/t/arfc-ethereum-v2-reserve-factor-adjustment/16764/13?u=luigy)
+- [Snapshot for Ethereum V2 Reserve Factor Updates](https://snapshot.org/#/aave.eth/proposal/0x26a03c08359c340f63b78b0c3e96d37aa0adeda65814643b0886d4719048ea7e)
+- [Discussion for Avalanche V2 Reserve Factor Updates](https://governance.aave.com/t/arfc-avalanche-v2-reserve-factor-adjustment/17040/8?u=luigy)
+- [Snapshot for Avalanche V2 Reserve Factor Updates](https://snapshot.org/#/aave.eth/proposal/0x770ff4e02634c77aaa09952345551168920f7878b32ab03fcef92763a5fb70ab)
+- [Discussion for Polygon V2 Borrow Rate Updates](https://governance.aave.com/t/arfc-polygon-v2-borrow-rate-adjustments/17252/8?u=luigy)
+- [Snapshot for Polygon V2 Borrow Rate Updates](https://snapshot.org/#/aave.eth/proposal/0x95643085ee16eb0eaa4110a9f0ea8223009f9521e596e1a958303705a5001363)
+- [Discussion for Polygon V2 RF update](https://governance.aave.com/t/arfc-reserve-factor-updates-polygon-aave-v2/13937/23?u=dd0sxx)
+
+## Copyright
+
+Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/).
diff --git a/src/20240528_Multi_BridgedUSDCeUpdateRF/IncreaseUSDCeRF_20240528.s.sol b/src/20240528_Multi_BridgedUSDCeUpdateRF/IncreaseUSDCeRF_20240528.s.sol
new file mode 100644
index 000000000..3efe44c90
--- /dev/null
+++ b/src/20240528_Multi_BridgedUSDCeUpdateRF/IncreaseUSDCeRF_20240528.s.sol
@@ -0,0 +1,215 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/GovV3Helpers.sol';
+import {EthereumScript, PolygonScript, OptimismScript, ArbitrumScript, BaseScript, AvalancheScript} from 'aave-helpers/ScriptUtils.sol';
+import {AaveV2Avalanche_ReserveFactorUpgrades_20240528} from './AaveV2Avalanche_ReserveFactorUpgrades_20240528.sol';
+import {AaveV2Ethereum_ReserveFactorUpgrades_20240528} from './AaveV2Ethereum_ReserveFactorUpgrades_20240528.sol';
+import {AaveV2Polygon_BorrowRateUpdates_20240528} from './AaveV2Polygon_BorrowRateUpdates_20240528.sol';
+import {AaveV3Polygon_IncreaseUSDCeRF_20240528} from './AaveV3Polygon_IncreaseUSDCeRF_20240528.sol';
+import {AaveV3Optimism_IncreaseUSDCeRF_20240528} from './AaveV3Optimism_IncreaseUSDCeRF_20240528.sol';
+import {AaveV3Arbitrum_IncreaseUSDCeRF_20240528} from './AaveV3Arbitrum_IncreaseUSDCeRF_20240528.sol';
+import {AaveV3Base_IncreaseUSDCeRF_20240528} from './AaveV3Base_IncreaseUSDCeRF_20240528.sol';
+
+/**
+ * @dev Deploy Ethereum
+ * deploy-command: make deploy-ledger contract=src/20240528_Multi_BridgedUSDCeUpdateRF/IncreaseUSDCeRF_20240528.s.sol:DeployEthereum chain=mainnet
+ * verify-command: npx catapulta-verify -b broadcast/IncreaseUSDCeRF_20240528.s.sol/8453/run-latest.json
+ */
+contract DeployEthereum is EthereumScript {
+ function run() external broadcast {
+ // deploy payloads
+ address payload0 = GovV3Helpers.deployDeterministic(
+ type(AaveV2Ethereum_ReserveFactorUpgrades_20240528).creationCode
+ );
+
+ // compose action
+ IPayloadsControllerCore.ExecutionAction[]
+ memory actions = new IPayloadsControllerCore.ExecutionAction[](1);
+ actions[0] = GovV3Helpers.buildAction(payload0);
+
+ // register action at payloadsController
+ GovV3Helpers.createPayload(actions);
+ }
+}
+
+/**
+ * @dev Deploy Polygon
+ * deploy-command: make deploy-ledger contract=src/20240528_Multi_BridgedUSDCeUpdateRF/IncreaseUSDCeRF_20240528.s.sol:DeployPolygon chain=polygon
+ * verify-command: npx catapulta-verify -b broadcast/IncreaseUSDCeRF_20240528.s.sol/137/run-latest.json
+ */
+contract DeployPolygon is PolygonScript {
+ function run() external broadcast {
+ // deploy payloads
+ address payload0 = GovV3Helpers.deployDeterministic(
+ type(AaveV3Polygon_IncreaseUSDCeRF_20240528).creationCode
+ );
+
+ address payload1 = GovV3Helpers.deployDeterministic(
+ type(AaveV2Polygon_BorrowRateUpdates_20240528).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 Avalanche
+ * deploy-command: make deploy-ledger contract=src/20240528_Multi_BridgedUSDCeUpdateRF/IncreaseUSDCeRF_20240528.s.sol:DeployAvalanche chain=avalanche
+ * verify-command: npx catapulta-verify -b broadcast/IncreaseUSDCeRF_20240528.s.sol/137/run-latest.json
+ */
+contract DeployAvalanche is AvalancheScript {
+ function run() external broadcast {
+ // deploy payloads
+ address payload0 = GovV3Helpers.deployDeterministic(
+ type(AaveV2Avalanche_ReserveFactorUpgrades_20240528).creationCode
+ );
+
+ // compose action
+ IPayloadsControllerCore.ExecutionAction[]
+ memory actions = new IPayloadsControllerCore.ExecutionAction[](1);
+ actions[0] = GovV3Helpers.buildAction(payload0);
+
+ // register action at payloadsController
+ GovV3Helpers.createPayload(actions);
+ }
+}
+
+/**
+ * @dev Deploy Optimism
+ * deploy-command: make deploy-ledger contract=src/20240528_Multi_BridgedUSDCeUpdateRF/IncreaseUSDCeRF_20240528.s.sol:DeployOptimism chain=optimism
+ * verify-command: npx catapulta-verify -b broadcast/IncreaseUSDCeRF_20240528.s.sol/10/run-latest.json
+ */
+contract DeployOptimism is OptimismScript {
+ function run() external broadcast {
+ // deploy payloads
+ address payload0 = GovV3Helpers.deployDeterministic(
+ type(AaveV3Optimism_IncreaseUSDCeRF_20240528).creationCode
+ );
+
+ // compose action
+ IPayloadsControllerCore.ExecutionAction[]
+ memory actions = new IPayloadsControllerCore.ExecutionAction[](1);
+ actions[0] = GovV3Helpers.buildAction(payload0);
+
+ // register action at payloadsController
+ GovV3Helpers.createPayload(actions);
+ }
+}
+
+/**
+ * @dev Deploy Arbitrum
+ * deploy-command: make deploy-ledger contract=src/20240528_Multi_BridgedUSDCeUpdateRF/IncreaseUSDCeRF_20240528.s.sol:DeployArbitrum chain=arbitrum
+ * verify-command: npx catapulta-verify -b broadcast/IncreaseUSDCeRF_20240528.s.sol/42161/run-latest.json
+ */
+contract DeployArbitrum is ArbitrumScript {
+ function run() external broadcast {
+ // deploy payloads
+ address payload0 = GovV3Helpers.deployDeterministic(
+ type(AaveV3Arbitrum_IncreaseUSDCeRF_20240528).creationCode
+ );
+
+ // compose action
+ IPayloadsControllerCore.ExecutionAction[]
+ memory actions = new IPayloadsControllerCore.ExecutionAction[](1);
+ actions[0] = GovV3Helpers.buildAction(payload0);
+
+ // register action at payloadsController
+ GovV3Helpers.createPayload(actions);
+ }
+}
+
+/**
+ * @dev Deploy Base
+ * deploy-command: make deploy-ledger contract=src/20240528_Multi_BridgedUSDCeUpdateRF/IncreaseUSDCeRF_20240528.s.sol:DeployBase chain=base
+ * verify-command: npx catapulta-verify -b broadcast/IncreaseUSDCeRF_20240528.s.sol/8453/run-latest.json
+ */
+contract DeployBase is BaseScript {
+ function run() external broadcast {
+ // deploy payloads
+ address payload0 = GovV3Helpers.deployDeterministic(
+ type(AaveV3Base_IncreaseUSDCeRF_20240528).creationCode
+ );
+
+ // compose action
+ IPayloadsControllerCore.ExecutionAction[]
+ memory actions = new IPayloadsControllerCore.ExecutionAction[](1);
+ actions[0] = GovV3Helpers.buildAction(payload0);
+
+ // register action at payloadsController
+ GovV3Helpers.createPayload(actions);
+ }
+}
+
+/**
+ * @dev Create Proposal
+ * command: make deploy-ledger contract=src/20240528_Multi_BridgedUSDCeUpdateRF/IncreaseUSDCeRF_20240528.s.sol:CreateProposal chain=mainnet
+ */
+contract CreateProposal is EthereumScript {
+ function run() external {
+ // create payloads
+ PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](6);
+
+ // compose actions for validation
+
+ IPayloadsControllerCore.ExecutionAction[]
+ memory actionsEthereum = new IPayloadsControllerCore.ExecutionAction[](1);
+ actionsEthereum[0] = GovV3Helpers.buildAction(
+ type(AaveV2Ethereum_ReserveFactorUpgrades_20240528).creationCode
+ );
+ payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum);
+
+ IPayloadsControllerCore.ExecutionAction[]
+ memory actionsPolygon = new IPayloadsControllerCore.ExecutionAction[](2);
+ actionsPolygon[0] = GovV3Helpers.buildAction(
+ type(AaveV3Polygon_IncreaseUSDCeRF_20240528).creationCode
+ );
+ actionsPolygon[1] = GovV3Helpers.buildAction(
+ type(AaveV2Polygon_BorrowRateUpdates_20240528).creationCode
+ );
+ payloads[1] = GovV3Helpers.buildPolygonPayload(vm, actionsPolygon);
+
+ IPayloadsControllerCore.ExecutionAction[]
+ memory actionsAvalanche = new IPayloadsControllerCore.ExecutionAction[](1);
+ actionsAvalanche[0] = GovV3Helpers.buildAction(
+ type(AaveV2Avalanche_ReserveFactorUpgrades_20240528).creationCode
+ );
+ payloads[2] = GovV3Helpers.buildAvalanchePayload(vm, actionsAvalanche);
+
+ IPayloadsControllerCore.ExecutionAction[]
+ memory actionsOptimism = new IPayloadsControllerCore.ExecutionAction[](1);
+ actionsOptimism[0] = GovV3Helpers.buildAction(
+ type(AaveV3Optimism_IncreaseUSDCeRF_20240528).creationCode
+ );
+ payloads[3] = GovV3Helpers.buildOptimismPayload(vm, actionsOptimism);
+
+ IPayloadsControllerCore.ExecutionAction[]
+ memory actionsArbitrum = new IPayloadsControllerCore.ExecutionAction[](1);
+ actionsArbitrum[0] = GovV3Helpers.buildAction(
+ type(AaveV3Arbitrum_IncreaseUSDCeRF_20240528).creationCode
+ );
+ payloads[4] = GovV3Helpers.buildArbitrumPayload(vm, actionsArbitrum);
+
+ IPayloadsControllerCore.ExecutionAction[]
+ memory actionsBase = new IPayloadsControllerCore.ExecutionAction[](1);
+ actionsBase[0] = GovV3Helpers.buildAction(
+ type(AaveV3Base_IncreaseUSDCeRF_20240528).creationCode
+ );
+ payloads[5] = GovV3Helpers.buildBasePayload(vm, actionsBase);
+
+ // create proposal
+ vm.startBroadcast();
+ GovV3Helpers.createProposal(
+ vm,
+ payloads,
+ GovV3Helpers.ipfsHashFile(vm, 'src/20240528_Multi_BridgedUSDCeUpdateRF/IncreaseUSDCeRF.md')
+ );
+ }
+}
diff --git a/src/20240528_Multi_BridgedUSDCeUpdateRF/config.ts b/src/20240528_Multi_BridgedUSDCeUpdateRF/config.ts
new file mode 100644
index 000000000..c2f3371a7
--- /dev/null
+++ b/src/20240528_Multi_BridgedUSDCeUpdateRF/config.ts
@@ -0,0 +1,333 @@
+import {ConfigFile} from '../../generator/types';
+export const config: ConfigFile = {
+ rootOptions: {
+ configFile: 'config.ts',
+ force: true,
+ pools: [
+ 'AaveV2Ethereum',
+ 'AaveV2Avalanche',
+ 'AaveV2Polygon',
+ 'AaveV3Polygon',
+ 'AaveV3Optimism',
+ 'AaveV3Arbitrum',
+ 'AaveV3Base',
+ ],
+ title: 'Increase Bridged USDC Reserve Factor Across All Deployments',
+ shortName: 'IncreaseUSDCeRF',
+ date: '20240528',
+ author: 'karpatkey_TokenLogic',
+ discussion:
+ 'https://governance.aave.com/t/arfc-increase-bridged-usdc-reserve-factor-across-all-deployments/17787',
+ snapshot:
+ 'https://snapshot.org/#/aave.eth/proposal/0x9cc7906f04f45cebeaa48a05ed281f49da00d89c4dd988a968272fa179f14d06',
+ },
+
+ poolOptions: {
+ AaveV2Ethereum: {
+ configs: {
+ BORROWS_UPDATE: [
+ {
+ enabledToBorrow: 'KEEP_CURRENT',
+ flashloanable: 'KEEP_CURRENT',
+ stableRateModeEnabled: 'KEEP_CURRENT',
+ borrowableInIsolation: 'KEEP_CURRENT',
+ withSiloedBorrowing: 'KEEP_CURRENT',
+ reserveFactor: '60',
+ asset: 'DAI',
+ },
+ {
+ enabledToBorrow: 'KEEP_CURRENT',
+ flashloanable: 'KEEP_CURRENT',
+ stableRateModeEnabled: 'KEEP_CURRENT',
+ borrowableInIsolation: 'KEEP_CURRENT',
+ withSiloedBorrowing: 'KEEP_CURRENT',
+ reserveFactor: '60',
+ asset: 'USDC',
+ },
+ {
+ enabledToBorrow: 'KEEP_CURRENT',
+ flashloanable: 'KEEP_CURRENT',
+ stableRateModeEnabled: 'KEEP_CURRENT',
+ borrowableInIsolation: 'KEEP_CURRENT',
+ withSiloedBorrowing: 'KEEP_CURRENT',
+ reserveFactor: '60',
+ asset: 'USDT',
+ },
+ {
+ enabledToBorrow: 'KEEP_CURRENT',
+ flashloanable: 'KEEP_CURRENT',
+ stableRateModeEnabled: 'KEEP_CURRENT',
+ borrowableInIsolation: 'KEEP_CURRENT',
+ withSiloedBorrowing: 'KEEP_CURRENT',
+ reserveFactor: '65',
+ asset: 'WBTC',
+ },
+ {
+ enabledToBorrow: 'KEEP_CURRENT',
+ flashloanable: 'KEEP_CURRENT',
+ stableRateModeEnabled: 'KEEP_CURRENT',
+ borrowableInIsolation: 'KEEP_CURRENT',
+ withSiloedBorrowing: 'KEEP_CURRENT',
+ reserveFactor: '60',
+ asset: 'WETH',
+ },
+ {
+ enabledToBorrow: 'KEEP_CURRENT',
+ flashloanable: 'KEEP_CURRENT',
+ stableRateModeEnabled: 'KEEP_CURRENT',
+ borrowableInIsolation: 'KEEP_CURRENT',
+ withSiloedBorrowing: 'KEEP_CURRENT',
+ reserveFactor: '65',
+ asset: 'LINK',
+ },
+ ],
+ },
+ cache: {blockNumber: 20077283},
+ },
+ AaveV2Avalanche: {
+ configs: {
+ BORROWS_UPDATE: [
+ {
+ enabledToBorrow: 'KEEP_CURRENT',
+ flashloanable: 'KEEP_CURRENT',
+ stableRateModeEnabled: 'KEEP_CURRENT',
+ borrowableInIsolation: 'KEEP_CURRENT',
+ withSiloedBorrowing: 'KEEP_CURRENT',
+ reserveFactor: '55',
+ asset: 'DAI',
+ },
+ {
+ enabledToBorrow: 'KEEP_CURRENT',
+ flashloanable: 'KEEP_CURRENT',
+ stableRateModeEnabled: 'KEEP_CURRENT',
+ borrowableInIsolation: 'KEEP_CURRENT',
+ withSiloedBorrowing: 'KEEP_CURRENT',
+ reserveFactor: '55',
+ asset: 'USDC',
+ },
+ {
+ enabledToBorrow: 'KEEP_CURRENT',
+ flashloanable: 'KEEP_CURRENT',
+ stableRateModeEnabled: 'KEEP_CURRENT',
+ borrowableInIsolation: 'KEEP_CURRENT',
+ withSiloedBorrowing: 'KEEP_CURRENT',
+ reserveFactor: '55',
+ asset: 'USDT',
+ },
+ {
+ enabledToBorrow: 'KEEP_CURRENT',
+ flashloanable: 'KEEP_CURRENT',
+ stableRateModeEnabled: 'KEEP_CURRENT',
+ borrowableInIsolation: 'KEEP_CURRENT',
+ withSiloedBorrowing: 'KEEP_CURRENT',
+ reserveFactor: '60',
+ asset: 'WBTC',
+ },
+ {
+ enabledToBorrow: 'KEEP_CURRENT',
+ flashloanable: 'KEEP_CURRENT',
+ stableRateModeEnabled: 'KEEP_CURRENT',
+ borrowableInIsolation: 'KEEP_CURRENT',
+ withSiloedBorrowing: 'KEEP_CURRENT',
+ reserveFactor: '55',
+ asset: 'WETH',
+ },
+ {
+ enabledToBorrow: 'KEEP_CURRENT',
+ flashloanable: 'KEEP_CURRENT',
+ stableRateModeEnabled: 'KEEP_CURRENT',
+ borrowableInIsolation: 'KEEP_CURRENT',
+ withSiloedBorrowing: 'KEEP_CURRENT',
+ reserveFactor: '55',
+ asset: 'WAVAX',
+ },
+ ],
+ },
+ cache: {blockNumber: 46635351},
+ },
+ AaveV2Polygon: {
+ configs: {
+ BORROWS_UPDATE: [
+ {
+ enabledToBorrow: 'KEEP_CURRENT',
+ flashloanable: 'KEEP_CURRENT',
+ stableRateModeEnabled: 'KEEP_CURRENT',
+ borrowableInIsolation: 'KEEP_CURRENT',
+ withSiloedBorrowing: 'KEEP_CURRENT',
+ reserveFactor: '99.99',
+ asset: 'DAI',
+ },
+ {
+ enabledToBorrow: 'KEEP_CURRENT',
+ flashloanable: 'KEEP_CURRENT',
+ stableRateModeEnabled: 'KEEP_CURRENT',
+ borrowableInIsolation: 'KEEP_CURRENT',
+ withSiloedBorrowing: 'KEEP_CURRENT',
+ reserveFactor: '99.99',
+ asset: 'USDC',
+ },
+ {
+ enabledToBorrow: 'KEEP_CURRENT',
+ flashloanable: 'KEEP_CURRENT',
+ stableRateModeEnabled: 'KEEP_CURRENT',
+ borrowableInIsolation: 'KEEP_CURRENT',
+ withSiloedBorrowing: 'KEEP_CURRENT',
+ reserveFactor: '99.99',
+ asset: 'USDT',
+ },
+ ],
+ RATE_UPDATE_V3: [
+ {
+ asset: 'USDC',
+ params: {
+ optimalUtilizationRate: '',
+ baseVariableBorrowRate: '',
+ variableRateSlope1: '',
+ variableRateSlope2: '',
+ stableRateSlope1: '11.25',
+ stableRateSlope2: '',
+ baseStableRateOffset: '',
+ stableRateExcessOffset: '',
+ optimalStableToTotalDebtRatio: '',
+ },
+ },
+ {
+ asset: 'DAI',
+ params: {
+ optimalUtilizationRate: '',
+ baseVariableBorrowRate: '',
+ variableRateSlope1: '',
+ variableRateSlope2: '',
+ stableRateSlope1: '11.25',
+ stableRateSlope2: '',
+ baseStableRateOffset: '',
+ stableRateExcessOffset: '',
+ optimalStableToTotalDebtRatio: '',
+ },
+ },
+ {
+ asset: 'USDT',
+ params: {
+ optimalUtilizationRate: '',
+ baseVariableBorrowRate: '',
+ variableRateSlope1: '',
+ variableRateSlope2: '',
+ stableRateSlope1: '11.25',
+ stableRateSlope2: '',
+ baseStableRateOffset: '',
+ stableRateExcessOffset: '',
+ optimalStableToTotalDebtRatio: '',
+ },
+ },
+ {
+ asset: 'WBTC',
+ params: {
+ optimalUtilizationRate: '',
+ baseVariableBorrowRate: '',
+ variableRateSlope1: '',
+ variableRateSlope2: '',
+ stableRateSlope1: '6.25',
+ stableRateSlope2: '',
+ baseStableRateOffset: '',
+ stableRateExcessOffset: '',
+ optimalStableToTotalDebtRatio: '',
+ },
+ },
+ {
+ asset: 'WETH',
+ params: {
+ optimalUtilizationRate: '',
+ baseVariableBorrowRate: '',
+ variableRateSlope1: '',
+ variableRateSlope2: '',
+ stableRateSlope1: '6.25',
+ stableRateSlope2: '',
+ baseStableRateOffset: '',
+ stableRateExcessOffset: '',
+ optimalStableToTotalDebtRatio: '',
+ },
+ },
+ {
+ asset: 'WMATIC',
+ params: {
+ optimalUtilizationRate: '',
+ baseVariableBorrowRate: '',
+ variableRateSlope1: '',
+ variableRateSlope2: '',
+ stableRateSlope1: '8.25',
+ stableRateSlope2: '',
+ baseStableRateOffset: '',
+ stableRateExcessOffset: '',
+ optimalStableToTotalDebtRatio: '',
+ },
+ },
+ ],
+ },
+ cache: {blockNumber: 19437848},
+ },
+ AaveV3Polygon: {
+ configs: {
+ BORROWS_UPDATE: [
+ {
+ enabledToBorrow: 'KEEP_CURRENT',
+ flashloanable: 'KEEP_CURRENT',
+ stableRateModeEnabled: 'KEEP_CURRENT',
+ borrowableInIsolation: 'KEEP_CURRENT',
+ withSiloedBorrowing: 'KEEP_CURRENT',
+ reserveFactor: '25',
+ asset: 'USDC',
+ },
+ ],
+ },
+ cache: {blockNumber: 58078849},
+ },
+ AaveV3Optimism: {
+ configs: {
+ BORROWS_UPDATE: [
+ {
+ enabledToBorrow: 'KEEP_CURRENT',
+ flashloanable: 'KEEP_CURRENT',
+ stableRateModeEnabled: 'KEEP_CURRENT',
+ borrowableInIsolation: 'KEEP_CURRENT',
+ withSiloedBorrowing: 'KEEP_CURRENT',
+ reserveFactor: '25',
+ asset: 'USDC',
+ },
+ ],
+ },
+ cache: {blockNumber: 121307515},
+ },
+ AaveV3Arbitrum: {
+ configs: {
+ BORROWS_UPDATE: [
+ {
+ enabledToBorrow: 'KEEP_CURRENT',
+ flashloanable: 'KEEP_CURRENT',
+ stableRateModeEnabled: 'KEEP_CURRENT',
+ borrowableInIsolation: 'KEEP_CURRENT',
+ withSiloedBorrowing: 'KEEP_CURRENT',
+ reserveFactor: '25',
+ asset: 'USDC',
+ },
+ ],
+ },
+ cache: {blockNumber: 221148973},
+ },
+ AaveV3Base: {
+ configs: {
+ BORROWS_UPDATE: [
+ {
+ enabledToBorrow: 'KEEP_CURRENT',
+ flashloanable: 'KEEP_CURRENT',
+ stableRateModeEnabled: 'KEEP_CURRENT',
+ borrowableInIsolation: 'KEEP_CURRENT',
+ withSiloedBorrowing: 'KEEP_CURRENT',
+ reserveFactor: '25',
+ asset: 'USDbC',
+ },
+ ],
+ },
+ cache: {blockNumber: 15714463},
+ },
+ },
+};
diff --git a/src/20240613_AaveV3Arbitrum_GHOCrossChainLaunchPart2/AaveV3Arbitrum_GHOCrossChainLaunchPart2_20240613.sol b/src/20240613_AaveV3Arbitrum_GHOCrossChainLaunchPart2/AaveV3Arbitrum_GHOCrossChainLaunchPart2_20240613.sol
new file mode 100644
index 000000000..e895e0bca
--- /dev/null
+++ b/src/20240613_AaveV3Arbitrum_GHOCrossChainLaunchPart2/AaveV3Arbitrum_GHOCrossChainLaunchPart2_20240613.sol
@@ -0,0 +1,64 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {AaveV3Arbitrum, AaveV3ArbitrumEModes} from 'aave-address-book/AaveV3Arbitrum.sol';
+import {AaveV3PayloadArbitrum} from 'aave-helpers/v3-config-engine/AaveV3PayloadArbitrum.sol';
+import {EngineFlags} from 'aave-helpers/v3-config-engine/EngineFlags.sol';
+import {IAaveV3ConfigEngine} from 'aave-helpers/v3-config-engine/IAaveV3ConfigEngine.sol';
+import {IV3RateStrategyFactory} from 'aave-helpers/v3-config-engine/IV3RateStrategyFactory.sol';
+import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol';
+import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol';
+/**
+ * @title GHO Cross-Chain Launch Part 2
+ * @author Aave Labs
+ * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x2a6ffbcff41a5ef98b7542f99b207af9c1e79e61f859d0a62f3bf52d3280877a
+ * - Discussion: https://governance.aave.com/t/arfc-gho-cross-chain-launch/17616
+ */
+contract AaveV3Arbitrum_GHOCrossChainLaunchPart2_20240613 is AaveV3PayloadArbitrum {
+ using SafeERC20 for IERC20;
+
+ address public constant GHO = 0x7dfF72693f6A4149b17e7C6314655f6A9F7c8B33;
+ uint256 public constant GHO_SEED_AMOUNT = 1e18;
+
+ function newListings() public pure override returns (IAaveV3ConfigEngine.Listing[] memory) {
+ IAaveV3ConfigEngine.Listing[] memory listings = new IAaveV3ConfigEngine.Listing[](1);
+
+ listings[0] = IAaveV3ConfigEngine.Listing({
+ asset: GHO,
+ assetSymbol: 'GHO',
+ priceFeed: 0xB05984aD83C20b3ADE7bf97a9a0Cb539DDE28DBb,
+ eModeCategory: AaveV3ArbitrumEModes.NONE,
+ enabledToBorrow: EngineFlags.ENABLED,
+ stableRateModeEnabled: EngineFlags.DISABLED,
+ borrowableInIsolation: EngineFlags.DISABLED,
+ withSiloedBorrowing: EngineFlags.DISABLED,
+ flashloanable: EngineFlags.ENABLED,
+ ltv: 0,
+ liqThreshold: 0,
+ liqBonus: 0,
+ reserveFactor: 10_00,
+ supplyCap: 1_000_000,
+ borrowCap: 900_000,
+ debtCeiling: 0,
+ liqProtocolFee: 0,
+ rateStrategyParams: IV3RateStrategyFactory.RateStrategyParams({
+ optimalUsageRatio: _bpsToRay(90_00),
+ baseVariableBorrowRate: _bpsToRay(0),
+ variableRateSlope1: _bpsToRay(12_00),
+ variableRateSlope2: _bpsToRay(65_00),
+ stableRateSlope1: _bpsToRay(0),
+ stableRateSlope2: _bpsToRay(0),
+ baseStableRateOffset: _bpsToRay(0),
+ stableRateExcessOffset: _bpsToRay(0),
+ optimalStableToTotalDebtRatio: _bpsToRay(0)
+ })
+ });
+
+ return listings;
+ }
+
+ function _postExecute() internal override {
+ IERC20(GHO).forceApprove(address(AaveV3Arbitrum.POOL), GHO_SEED_AMOUNT);
+ AaveV3Arbitrum.POOL.supply(GHO, GHO_SEED_AMOUNT, address(0), 0);
+ }
+}
diff --git a/src/20240613_AaveV3Arbitrum_GHOCrossChainLaunchPart2/AaveV3Arbitrum_GHOCrossChainLaunchPart2_20240613.t.sol b/src/20240613_AaveV3Arbitrum_GHOCrossChainLaunchPart2/AaveV3Arbitrum_GHOCrossChainLaunchPart2_20240613.t.sol
new file mode 100644
index 000000000..59fa627dd
--- /dev/null
+++ b/src/20240613_AaveV3Arbitrum_GHOCrossChainLaunchPart2/AaveV3Arbitrum_GHOCrossChainLaunchPart2_20240613.t.sol
@@ -0,0 +1,59 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import 'forge-std/Test.sol';
+import {GovV3Helpers} from 'aave-helpers/GovV3Helpers.sol';
+import {ProtocolV3TestBase} from 'aave-helpers/ProtocolV3TestBase.sol';
+import {AaveV3Arbitrum} from 'aave-address-book/AaveV3Arbitrum.sol';
+import {GovernanceV3Arbitrum} from 'aave-address-book/GovernanceV3Arbitrum.sol';
+import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol';
+
+import {AaveV3Arbitrum_GHOCrossChainLaunchPart2_20240613} from './AaveV3Arbitrum_GHOCrossChainLaunchPart2_20240613.sol';
+
+/**
+ * @dev Test for AaveV3Arbitrum_GHOCrossChainLaunchPart2_20240613
+ * command: FOUNDRY_PROFILE=arbitrum forge test --match-path=src/20240613_AaveV3Arbitrum_GHOCrossChainLaunchPart2/AaveV3Arbitrum_GHOCrossChainLaunchPart2_20240613.t.sol -vv
+ */
+contract AaveV3Arbitrum_GHOCrossChainLaunchPart2_20240613_Test is ProtocolV3TestBase {
+ AaveV3Arbitrum_GHOCrossChainLaunchPart2_20240613 internal proposal;
+
+ function setUp() public {
+ vm.createSelectFork(vm.rpcUrl('arbitrum'), 225178100);
+ proposal = new AaveV3Arbitrum_GHOCrossChainLaunchPart2_20240613();
+ }
+
+ /**
+ * @dev executes the generic test suite including e2e and config snapshots
+ */
+ function test_defaultProposalExecution() public {
+ // Mock Executor receives GHO, also makes sure total supply >= supply cap so e2e tests pass
+ deal(proposal.GHO(), GovernanceV3Arbitrum.EXECUTOR_LVL_1, 1_000_000e18, true);
+
+ defaultTest(
+ 'AaveV3Arbitrum_GHOCrossChainLaunchPart2_20240613',
+ AaveV3Arbitrum.POOL,
+ address(proposal)
+ );
+
+ (address aTokenAddress, , ) = AaveV3Arbitrum
+ .AAVE_PROTOCOL_DATA_PROVIDER
+ .getReserveTokensAddresses(proposal.GHO());
+ assertGe(IERC20(aTokenAddress).balanceOf(address(0)), proposal.GHO_SEED_AMOUNT());
+ }
+
+ function test_defaultProposalExecutionExactSeed() public {
+ // Mock Executor receives GHO seed amount
+ deal(proposal.GHO(), GovernanceV3Arbitrum.EXECUTOR_LVL_1, proposal.GHO_SEED_AMOUNT());
+
+ GovV3Helpers.executePayload(vm, address(proposal));
+
+ (address aTokenAddress, , ) = AaveV3Arbitrum
+ .AAVE_PROTOCOL_DATA_PROVIDER
+ .getReserveTokensAddresses(proposal.GHO());
+ assertGe(IERC20(aTokenAddress).balanceOf(address(0)), proposal.GHO_SEED_AMOUNT());
+ }
+
+ function testFail_defaultProposalExecutionNoSeed() public {
+ GovV3Helpers.executePayload(vm, address(proposal));
+ }
+}
diff --git a/src/20240613_AaveV3Arbitrum_GHOCrossChainLaunchPart2/GHOCrossChainLaunchPart2.md b/src/20240613_AaveV3Arbitrum_GHOCrossChainLaunchPart2/GHOCrossChainLaunchPart2.md
new file mode 100644
index 000000000..7461840ae
--- /dev/null
+++ b/src/20240613_AaveV3Arbitrum_GHOCrossChainLaunchPart2/GHOCrossChainLaunchPart2.md
@@ -0,0 +1,59 @@
+---
+title: "GHO Cross-Chain - Part 2"
+author: "Aave Labs"
+discussions: "https://governance.aave.com/t/arfc-gho-cross-chain-launch/17616"
+snapshot: "https://snapshot.org/#/aave.eth/proposal/0x2a6ffbcff41a5ef98b7542f99b207af9c1e79e61f859d0a62f3bf52d3280877a"
+---
+
+## Simple Summary
+
+This AIP is the Part 2 for the GHO Cross-Chain proposal and proposes the configuration of GHO on Arbitrum Aave V3 Pool in connection with the cross-chain implementation strategy.
+
+Following the successful expansion of GHO to the Arbitrum network, this AIP proposes to onboard GHO into the Arbitrum Aave Pool as a borrowable asset, adopting risk parameters formulated by Chaos Labs.
+
+## Motivation
+
+The implementation of the GHO Cross Chain proposal required the proposal AIP to be split into two separate AIPs. This proposal is the second AIP (“Part 2”) for configuration of GHO on Arbitrum Aave Pool adopting risk parameters formulated by Chaos Labs.
+
+## Specification
+
+The table below illustrates the configured risk parameters for **GHO**
+
+| Parameter | Value |
+| ---------------------------------- | -----------------------------------------: |
+| Isolation Mode | false |
+| Borrowable | ENABLED |
+| Collateral Enabled | false |
+| Supply Cap (GHO) | 1,000,000 |
+| Borrow Cap (GHO) | 900,000 |
+| Debt Ceiling | USD 0 |
+| LTV | 0 % |
+| LT | 0 % |
+| Liquidation Bonus | 0 % |
+| Liquidation Protocol Fee | 0 % |
+| Reserve Factor | 10 % |
+| Base Variable Borrow Rate | 0 % |
+| Variable Slope 1 | 12 % |
+| Variable Slope 2 | 65 % |
+| Uoptimal | 90 % |
+| Stable Borrowing | DISABLED |
+| Stable Slope1 | 0 % |
+| Stable Slope2 | 0 % |
+| Base Stable Rate Offset | 0 % |
+| Stable Rate Excess Offset | 0 % |
+| Optimal Stable To Total Debt Ratio | 0 % |
+| Flashloanable | ENABLED |
+| Siloed Borrowing | DISABLED |
+| Borrowable in Isolation | DISABLED |
+| Oracle | 0xB05984aD83C20b3ADE7bf97a9a0Cb539DDE28DBb |
+
+## References
+
+- Implementation: [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/c7161d8c68339faa78dbb10d6c4d0fce1256306f/src/20240613_AaveV3Arbitrum_GHOCrossChainLaunchPart2/AaveV3Arbitrum_GHOCrossChainLaunchPart2_20240613.sol)
+- Tests: [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/c7161d8c68339faa78dbb10d6c4d0fce1256306f/src/20240613_AaveV3Arbitrum_GHOCrossChainLaunchPart2/AaveV3Arbitrum_GHOCrossChainLaunchPart2_20240613.t.sol)
+- [Snapshot](https://snapshot.org/#/aave.eth/proposal/0x2a6ffbcff41a5ef98b7542f99b207af9c1e79e61f859d0a62f3bf52d3280877a)
+- [Discussion](https://governance.aave.com/t/arfc-gho-cross-chain-launch/17616)
+
+## Copyright
+
+Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/).
diff --git a/src/20240613_AaveV3Arbitrum_GHOCrossChainLaunchPart2/GHOCrossChainLaunchPart2_20240613.s.sol b/src/20240613_AaveV3Arbitrum_GHOCrossChainLaunchPart2/GHOCrossChainLaunchPart2_20240613.s.sol
new file mode 100644
index 000000000..efc538156
--- /dev/null
+++ b/src/20240613_AaveV3Arbitrum_GHOCrossChainLaunchPart2/GHOCrossChainLaunchPart2_20240613.s.sol
@@ -0,0 +1,61 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/GovV3Helpers.sol';
+import {AaveV3Arbitrum} from 'aave-address-book/AaveV3Arbitrum.sol';
+import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol';
+import {EthereumScript, ArbitrumScript} from 'aave-helpers/ScriptUtils.sol';
+import {AaveV3Arbitrum_GHOCrossChainLaunchPart2_20240613} from './AaveV3Arbitrum_GHOCrossChainLaunchPart2_20240613.sol';
+
+/**
+ * @dev Deploy Arbitrum
+ * deploy-command: make deploy-ledger contract=src/20240613_AaveV3Arbitrum_GHOCrossChainLaunchPart2/GHOCrossChainLaunchPart2_20240613.s.sol:DeployArbitrum chain=arbitrum
+ * verify-command: FOUNDRY_PROFILE=arbitrum npx catapulta-verify -b broadcast/GHOCrossChainLaunchPart2_20240613.s.sol/42161/run-latest.json
+ */
+contract DeployArbitrum is ArbitrumScript {
+ function run() external broadcast {
+ // deploy payloads
+ address payload0 = GovV3Helpers.deployDeterministic(
+ type(AaveV3Arbitrum_GHOCrossChainLaunchPart2_20240613).creationCode
+ );
+
+ // compose action
+ IPayloadsControllerCore.ExecutionAction[]
+ memory actions = new IPayloadsControllerCore.ExecutionAction[](1);
+ actions[0] = GovV3Helpers.buildAction(payload0);
+
+ // register action at payloadsController
+ GovV3Helpers.createPayload(actions);
+ }
+}
+
+/**
+ * @dev Create Proposal
+ * command: make deploy-ledger contract=src/20240613_AaveV3Arbitrum_GHOCrossChainLaunchPart2/GHOCrossChainLaunchPart2_20240613.s.sol:CreateProposal chain=mainnet
+ */
+contract CreateProposal is EthereumScript {
+ function run() external {
+ // create payloads
+ PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](1);
+
+ // compose actions for validation
+ IPayloadsControllerCore.ExecutionAction[]
+ memory actionsArbitrum = new IPayloadsControllerCore.ExecutionAction[](1);
+ actionsArbitrum[0] = GovV3Helpers.buildAction(
+ type(AaveV3Arbitrum_GHOCrossChainLaunchPart2_20240613).creationCode
+ );
+ payloads[0] = GovV3Helpers.buildArbitrumPayload(vm, actionsArbitrum);
+
+ // create proposal
+ vm.startBroadcast();
+ GovV3Helpers.createProposal(
+ vm,
+ payloads,
+ GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL,
+ GovV3Helpers.ipfsHashFile(
+ vm,
+ 'src/20240613_AaveV3Arbitrum_GHOCrossChainLaunchPart2/GHOCrossChainLaunchPart2.md'
+ )
+ );
+ }
+}
diff --git a/src/20240613_AaveV3Arbitrum_GHOCrossChainLaunchPart2/config.ts b/src/20240613_AaveV3Arbitrum_GHOCrossChainLaunchPart2/config.ts
new file mode 100644
index 000000000..508000ae6
--- /dev/null
+++ b/src/20240613_AaveV3Arbitrum_GHOCrossChainLaunchPart2/config.ts
@@ -0,0 +1,54 @@
+import {ConfigFile} from '../../generator/types';
+export const config: ConfigFile = {
+ rootOptions: {
+ pools: ['AaveV3Arbitrum'],
+ title: 'GHOCrossChainLaunchPart2',
+ shortName: 'GHOCrossChainLaunchPart2',
+ date: '20240613',
+ author: 'Aave Labs',
+ discussion: 'https://governance.aave.com/t/arfc-gho-cross-chain-launch/17616',
+ snapshot:
+ 'https://snapshot.org/#/aave.eth/proposal/0x2a6ffbcff41a5ef98b7542f99b207af9c1e79e61f859d0a62f3bf52d3280877a',
+ votingNetwork: 'POLYGON',
+ },
+ poolOptions: {
+ AaveV3Arbitrum: {
+ configs: {
+ ASSET_LISTING: [
+ {
+ assetSymbol: 'GHO',
+ decimals: 18,
+ priceFeed: '0xB05984aD83C20b3ADE7bf97a9a0Cb539DDE28DBb',
+ ltv: '0',
+ liqThreshold: '0',
+ liqBonus: '0',
+ debtCeiling: '0',
+ liqProtocolFee: '0',
+ enabledToBorrow: 'ENABLED',
+ flashloanable: 'ENABLED',
+ stableRateModeEnabled: 'DISABLED',
+ borrowableInIsolation: 'DISABLED',
+ withSiloedBorrowing: 'DISABLED',
+ reserveFactor: '10',
+ supplyCap: '1000000',
+ borrowCap: '900000',
+ rateStrategyParams: {
+ optimalUtilizationRate: '90',
+ baseVariableBorrowRate: '0',
+ variableRateSlope1: '12',
+ variableRateSlope2: '65',
+ stableRateSlope1: '0',
+ stableRateSlope2: '0',
+ baseStableRateOffset: '0',
+ stableRateExcessOffset: '0',
+ optimalStableToTotalDebtRatio: '0',
+ },
+ eModeCategory: 'AaveV3ArbitrumEModes.NONE',
+ asset: '0x7dfF72693f6A4149b17e7C6314655f6A9F7c8B33',
+ },
+ ],
+ },
+ cache: {blockNumber: 221463835},
+ },
+ },
+};
diff --git a/src/20240614_AaveV3Ethereum_V4ALServiceProviderProposal/AaveV3Ethereum_V4ALServiceProviderProposal_20240614.sol b/src/20240614_AaveV3Ethereum_V4ALServiceProviderProposal/AaveV3Ethereum_V4ALServiceProviderProposal_20240614.sol
new file mode 100644
index 000000000..6d9005b5c
--- /dev/null
+++ b/src/20240614_AaveV3Ethereum_V4ALServiceProviderProposal/AaveV3Ethereum_V4ALServiceProviderProposal_20240614.sol
@@ -0,0 +1,41 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {IProposalGenericExecutor} from 'aave-helpers/interfaces/IProposalGenericExecutor.sol';
+import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol';
+
+/**
+ * @title V4 AL Service Provider Proposal
+ * @author Aave Labs
+ * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x70dfd865b78c4c391e2b0729b907d152e6e8a0da683416d617d8f84782036349
+ * - Discussion: https://governance.aave.com/t/arfc-al-service-provider-proposal/17974
+ */
+contract AaveV3Ethereum_V4ALServiceProviderProposal_20240614 is IProposalGenericExecutor {
+ address public constant AAVE_LABS = 0x1c037b3C22240048807cC9d7111be5d455F640bd;
+
+ // 3 million GHO upfront
+ uint256 public constant GHO_UPFRONT_AMOUNT = 3_000_000 ether;
+
+ // 9 million GHO streamed over the year
+ uint256 public constant GHO_STREAM_AMOUNT = 9_000_000 ether;
+ uint256 public constant GHO_STREAM_DURATION = 365 days;
+
+ uint256 public constant ACTUAL_STREAM =
+ (GHO_STREAM_AMOUNT / GHO_STREAM_DURATION) * GHO_STREAM_DURATION;
+
+ function execute() external {
+ AaveV3Ethereum.COLLECTOR.createStream(
+ AAVE_LABS,
+ ACTUAL_STREAM,
+ AaveV3EthereumAssets.GHO_UNDERLYING,
+ block.timestamp,
+ block.timestamp + GHO_STREAM_DURATION
+ );
+
+ AaveV3Ethereum.COLLECTOR.transfer(
+ AaveV3EthereumAssets.GHO_UNDERLYING,
+ AAVE_LABS,
+ GHO_UPFRONT_AMOUNT
+ );
+ }
+}
diff --git a/src/20240614_AaveV3Ethereum_V4ALServiceProviderProposal/AaveV3Ethereum_V4ALServiceProviderProposal_20240614.t.sol b/src/20240614_AaveV3Ethereum_V4ALServiceProviderProposal/AaveV3Ethereum_V4ALServiceProviderProposal_20240614.t.sol
new file mode 100644
index 000000000..0b0132243
--- /dev/null
+++ b/src/20240614_AaveV3Ethereum_V4ALServiceProviderProposal/AaveV3Ethereum_V4ALServiceProviderProposal_20240614.t.sol
@@ -0,0 +1,311 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol';
+
+import 'forge-std/Test.sol';
+import 'forge-std/StdUtils.sol';
+import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/ProtocolV3TestBase.sol';
+import {AaveV3Ethereum_V4ALServiceProviderProposal_20240614} from './AaveV3Ethereum_V4ALServiceProviderProposal_20240614.sol';
+import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol';
+
+/**
+ * @dev Test for AaveV3Ethereum_V4ALServiceProviderProposal_20240614
+ * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20240614_AaveV3Ethereum_V4ALServiceProviderProposal/AaveV3Ethereum_V4ALServiceProviderProposal_20240614.t.sol -vv
+ */
+contract AaveV3Ethereum_V4ALServiceProviderProposal_20240614_Test is ProtocolV3TestBase {
+ AaveV3Ethereum_V4ALServiceProviderProposal_20240614 internal proposal;
+
+ address public constant AAVE_LABS = 0x1c037b3C22240048807cC9d7111be5d455F640bd;
+ uint256 public constant GHO_UPFRONT_AMOUNT = 3_000_000 ether;
+ uint256 public constant GHO_STREAM_AMOUNT = 9_000_000 ether;
+ uint256 public constant GHO_STREAM_DURATION = 365 days;
+ uint256 public constant ACTUAL_STREAM_AMOUNT_GHO =
+ (GHO_STREAM_AMOUNT / GHO_STREAM_DURATION) * GHO_STREAM_DURATION;
+
+ function setUp() public {
+ vm.createSelectFork(vm.rpcUrl('mainnet'), 20092863);
+ proposal = new AaveV3Ethereum_V4ALServiceProviderProposal_20240614();
+ }
+
+ /**
+ * @dev executes the generic test suite including e2e and config snapshots
+ */
+ function test_defaultProposalExecution() public {
+ defaultTest(
+ 'AaveV3Ethereum_V4ALServiceProviderProposal_20240614',
+ AaveV3Ethereum.POOL,
+ address(proposal)
+ );
+ }
+
+ function testProposalExecution() public {
+ uint256 nextCollectorStreamID = AaveV3Ethereum.COLLECTOR.getNextStreamId();
+ uint256 ALGHOBalanceBefore = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(AAVE_LABS);
+ uint256 CollectorV3GHOBalanceBefore = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(
+ address(AaveV3Ethereum.COLLECTOR)
+ );
+
+ executePayload(vm, address(proposal));
+
+ // Check balances directly after proposal execution (upfront payment distributed to Aave Labs)
+ assertEq(
+ IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(AAVE_LABS),
+ ALGHOBalanceBefore + GHO_UPFRONT_AMOUNT
+ );
+ assertEq(
+ IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(address(AaveV3Ethereum.COLLECTOR)),
+ CollectorV3GHOBalanceBefore - GHO_UPFRONT_AMOUNT
+ );
+
+ // Checking if the streams have been created properly
+ // Scoping to avoid "stack too deep" error
+ {
+ (
+ address senderGHO,
+ address recipientGHO,
+ uint256 depositGHO,
+ address tokenAddressGHO,
+ uint256 startTimeGHO,
+ uint256 stopTimeGHO,
+ uint256 remainingBalanceGHO,
+
+ ) = AaveV3Ethereum.COLLECTOR.getStream(nextCollectorStreamID);
+
+ assertEq(senderGHO, address(AaveV3Ethereum.COLLECTOR));
+ assertEq(recipientGHO, AAVE_LABS);
+ assertEq(depositGHO, ACTUAL_STREAM_AMOUNT_GHO);
+ assertEq(tokenAddressGHO, AaveV3EthereumAssets.GHO_UNDERLYING);
+ assertEq(stopTimeGHO - startTimeGHO, GHO_STREAM_DURATION);
+ assertEq(remainingBalanceGHO, ACTUAL_STREAM_AMOUNT_GHO);
+ }
+
+ // Checking if Aave Labs can withdraw from the stream
+ vm.startPrank(AAVE_LABS);
+ vm.warp(block.timestamp + GHO_STREAM_DURATION);
+
+ // Currently Collector has less funds than stream amount
+ assertLe(
+ IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(address(AaveV3Ethereum.COLLECTOR)),
+ ACTUAL_STREAM_AMOUNT_GHO
+ );
+
+ // Partial withdrawal of Collector's remaining balance
+ AaveV3Ethereum.COLLECTOR.withdrawFromStream(
+ nextCollectorStreamID,
+ CollectorV3GHOBalanceBefore - GHO_UPFRONT_AMOUNT
+ );
+ uint256 nextALGHOBalance = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(AAVE_LABS);
+
+ // Aave Labs received the entirety of Collector's balance
+ assertEq(ALGHOBalanceBefore, nextALGHOBalance - CollectorV3GHOBalanceBefore);
+
+ // Check Collector balance after stream withdrawal
+ uint256 CollectorV3GHOBalanceAfter = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(
+ address(AaveV3Ethereum.COLLECTOR)
+ );
+
+ assertEq(CollectorV3GHOBalanceAfter, 0);
+
+ vm.stopPrank();
+ }
+
+ // Test giving V2 Collector more funds and full withdrawing
+ function testProposalExecutionPrankFunds() public {
+ uint256 nextCollectorStreamID = AaveV3Ethereum.COLLECTOR.getNextStreamId();
+ uint256 ALGHOBalanceBefore = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(AAVE_LABS);
+
+ // Giving the Collector enough funds to cover the stream
+ deal(
+ AaveV3EthereumAssets.GHO_UNDERLYING,
+ address(AaveV3Ethereum.COLLECTOR),
+ GHO_UPFRONT_AMOUNT + GHO_STREAM_AMOUNT
+ );
+
+ uint256 CollectorV3GHOBalanceBefore = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(
+ address(AaveV3Ethereum.COLLECTOR)
+ );
+
+ executePayload(vm, address(proposal));
+
+ // Check balances directly after proposal execution (upfront payment distributed to Aave Labs)
+ assertEq(
+ IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(AAVE_LABS),
+ ALGHOBalanceBefore + GHO_UPFRONT_AMOUNT
+ );
+ assertEq(
+ IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(address(AaveV3Ethereum.COLLECTOR)),
+ CollectorV3GHOBalanceBefore - GHO_UPFRONT_AMOUNT
+ );
+
+ // Checking if the streams have been created properly
+ // Scoping to avoid "stack too deep" error
+ {
+ (
+ address senderGHO,
+ address recipientGHO,
+ uint256 depositGHO,
+ address tokenAddressGHO,
+ uint256 startTimeGHO,
+ uint256 stopTimeGHO,
+ uint256 remainingBalanceGHO,
+
+ ) = AaveV3Ethereum.COLLECTOR.getStream(nextCollectorStreamID);
+
+ assertEq(senderGHO, address(AaveV3Ethereum.COLLECTOR));
+ assertEq(recipientGHO, AAVE_LABS);
+ assertEq(depositGHO, ACTUAL_STREAM_AMOUNT_GHO);
+ assertEq(tokenAddressGHO, AaveV3EthereumAssets.GHO_UNDERLYING);
+ assertEq(stopTimeGHO - startTimeGHO, GHO_STREAM_DURATION);
+ assertEq(remainingBalanceGHO, ACTUAL_STREAM_AMOUNT_GHO);
+ }
+
+ // Checking if Aave Labs can withdraw from the stream
+ vm.startPrank(AAVE_LABS);
+ vm.warp(block.timestamp + GHO_STREAM_DURATION);
+
+ assertGe(
+ IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(address(AaveV3Ethereum.COLLECTOR)),
+ ACTUAL_STREAM_AMOUNT_GHO
+ );
+
+ AaveV3Ethereum.COLLECTOR.withdrawFromStream(nextCollectorStreamID, ACTUAL_STREAM_AMOUNT_GHO);
+ uint256 nextALGHOBalance = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(AAVE_LABS);
+
+ assertEq(
+ ALGHOBalanceBefore,
+ nextALGHOBalance - (ACTUAL_STREAM_AMOUNT_GHO + GHO_UPFRONT_AMOUNT)
+ );
+
+ // Check Collector balance after stream withdrawal
+ uint256 CollectorV3GHOBalanceAfter = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(
+ address(AaveV3Ethereum.COLLECTOR)
+ );
+
+ assertEq(
+ CollectorV3GHOBalanceAfter,
+ CollectorV3GHOBalanceBefore - (ACTUAL_STREAM_AMOUNT_GHO + GHO_UPFRONT_AMOUNT)
+ );
+
+ vm.stopPrank();
+ }
+
+ // Test showing V2 Collector currently doesn't have enough funds
+ function testProposalExecutionFailureFunding() public {
+ uint256 nextCollectorStreamID = AaveV3Ethereum.COLLECTOR.getNextStreamId();
+ uint256 ALGHOBalanceBefore = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(AAVE_LABS);
+
+ uint256 CollectorV3GHOBalanceBefore = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(
+ address(AaveV3Ethereum.COLLECTOR)
+ );
+
+ executePayload(vm, address(proposal));
+
+ // Check balances directly after proposal execution (upfront payment distributed to Aave Labs)
+ assertEq(
+ IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(AAVE_LABS),
+ ALGHOBalanceBefore + GHO_UPFRONT_AMOUNT
+ );
+ assertEq(
+ IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(address(AaveV3Ethereum.COLLECTOR)),
+ CollectorV3GHOBalanceBefore - GHO_UPFRONT_AMOUNT
+ );
+
+ // Checking if the streams have been created properly
+ // Scoping to avoid "stack too deep" error
+ {
+ (
+ address senderGHO,
+ address recipientGHO,
+ uint256 depositGHO,
+ address tokenAddressGHO,
+ uint256 startTimeGHO,
+ uint256 stopTimeGHO,
+ uint256 remainingBalanceGHO,
+
+ ) = AaveV3Ethereum.COLLECTOR.getStream(nextCollectorStreamID);
+
+ assertEq(senderGHO, address(AaveV3Ethereum.COLLECTOR));
+ assertEq(recipientGHO, AAVE_LABS);
+ assertEq(depositGHO, ACTUAL_STREAM_AMOUNT_GHO);
+ assertEq(tokenAddressGHO, AaveV3EthereumAssets.GHO_UNDERLYING);
+ assertEq(stopTimeGHO - startTimeGHO, GHO_STREAM_DURATION);
+ assertEq(remainingBalanceGHO, ACTUAL_STREAM_AMOUNT_GHO);
+ }
+
+ // Checking if Aave Labs can withdraw from the stream
+ vm.startPrank(AAVE_LABS);
+ vm.warp(block.timestamp + GHO_STREAM_DURATION);
+
+ assertLe(
+ IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(address(AaveV3Ethereum.COLLECTOR)),
+ ACTUAL_STREAM_AMOUNT_GHO
+ );
+
+ vm.expectRevert(stdError.arithmeticError);
+ AaveV3Ethereum.COLLECTOR.withdrawFromStream(nextCollectorStreamID, ACTUAL_STREAM_AMOUNT_GHO);
+
+ vm.stopPrank();
+ }
+
+ function testProposalExecutionFuzzWithdrawalAmounts(
+ uint256 withdrawalAmount,
+ uint256 waitPeriod
+ ) public {
+ waitPeriod = bound(waitPeriod, 1, GHO_STREAM_DURATION);
+ withdrawalAmount = bound(
+ withdrawalAmount,
+ 1,
+ waitPeriod * (ACTUAL_STREAM_AMOUNT_GHO / GHO_STREAM_DURATION)
+ );
+
+ // Giving the Collector enough funds to cover the stream
+ deal(
+ AaveV3EthereumAssets.GHO_UNDERLYING,
+ address(AaveV3Ethereum.COLLECTOR),
+ GHO_UPFRONT_AMOUNT + GHO_STREAM_AMOUNT
+ );
+
+ assertGe(
+ IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(address(AaveV3Ethereum.COLLECTOR)),
+ ACTUAL_STREAM_AMOUNT_GHO
+ );
+
+ uint256 ALGHOBalanceBefore = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(AAVE_LABS);
+ uint256 CollectorV3GHOBalanceBefore = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(
+ address(AaveV3Ethereum.COLLECTOR)
+ );
+
+ uint256 nextCollectorStreamID = AaveV3Ethereum.COLLECTOR.getNextStreamId();
+ executePayload(vm, address(proposal));
+
+ // Check balances directly after proposal execution (upfront payment distributed to Aave Labs)
+ assertEq(
+ IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(AAVE_LABS),
+ ALGHOBalanceBefore + GHO_UPFRONT_AMOUNT
+ );
+ assertEq(
+ IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(address(AaveV3Ethereum.COLLECTOR)),
+ CollectorV3GHOBalanceBefore - GHO_UPFRONT_AMOUNT
+ );
+
+ vm.startPrank(AAVE_LABS);
+ vm.warp(block.timestamp + waitPeriod);
+
+ // Withdraw fuzzed amount from stream
+ AaveV3Ethereum.COLLECTOR.withdrawFromStream(nextCollectorStreamID, withdrawalAmount);
+
+ uint256 ALGHOBalanceAfter = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(AAVE_LABS);
+ uint256 CollectorV3GHOBalanceAfter = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(
+ address(AaveV3Ethereum.COLLECTOR)
+ );
+
+ assertEq(ALGHOBalanceAfter - ALGHOBalanceBefore, withdrawalAmount + GHO_UPFRONT_AMOUNT);
+ assertEq(
+ CollectorV3GHOBalanceAfter,
+ CollectorV3GHOBalanceBefore - (withdrawalAmount + GHO_UPFRONT_AMOUNT)
+ );
+
+ vm.stopPrank();
+ }
+}
diff --git a/src/20240614_AaveV3Ethereum_V4ALServiceProviderProposal/V4ALServiceProviderProposal.md b/src/20240614_AaveV3Ethereum_V4ALServiceProviderProposal/V4ALServiceProviderProposal.md
new file mode 100644
index 000000000..06586e54a
--- /dev/null
+++ b/src/20240614_AaveV3Ethereum_V4ALServiceProviderProposal/V4ALServiceProviderProposal.md
@@ -0,0 +1,119 @@
+---
+title: "AL Service Provider Proposal"
+author: "Aave Labs"
+discussions: "https://governance.aave.com/t/arfc-al-service-provider-proposal/17974"
+snapshot: "https://snapshot.org/#/aave.eth/proposal/0x70dfd865b78c4c391e2b0729b907d152e6e8a0da683416d617d8f84782036349"
+---
+
+## Summary
+
+This AIP proposes a one-year technical contributor engagement for the Aave Labs to act as a service provider for development of Aave V4 and a new visual identity.
+
+## Motivation
+
+Aave Labs seeks to be onboarded as a service provider to be one of the technical contributors to the Aave DAO. The specification below outlines the scope of the technical contributions of Aave Labs.
+
+## Specification
+
+The following are the key deliverables within the grant:
+
+### Aave Protocol V4
+
+Key deliverables for the 1 year scope of development include:
+
+- New Modular Architecture
+
+ - An innovative design to enhance flexibility and efficiency, minimizing disruption for integrators.
+
+- Unified Liquidity Layer
+
+ - A flexible liquidity management approach that allows for module modifications without needing to migrate liquidity.
+
+- Fuzzy-controlled Interest Rates
+
+ - Automated rate adjustments based on market conditions, optimizing for both suppliers and borrowers. Utilizing Chainlink for precise data feeds, setting new standards in capital efficiency.
+
+- Liquidity Premiums
+
+ - Adjusted borrowing costs based on collateral risk, ensuring fairer pricing. Higher risks incur higher premiums, while lower risks reduce costs.
+
+- Dynamic Risk Configuration
+
+ - Allows dynamic adjustments to risk parameters based on market conditions without governance overhead.
+
+- Smart Accounts and Vaults
+
+ - Simplifies user interactions with the protocol by allowing multiple smart accounts per wallet and enabling borrowing without direct collateral supply.
+
+- Automated Assets Offboarding
+
+ - Streamlines the process of offboarding assets, reducing governance workload and ensuring predictable offboarding plans.
+
+- Enhanced Liquidation Engine
+
+ - Introduces a variable liquidation factor, liquidation strategies, and batch liquidations to improve efficiency and borrower experience.
+
+- Automated Treasury Management
+
+ - Implements a reverse auction mechanism for reserve factor assets, reducing governance overhead.
+
+- GHO Features
+
+ - Native GHO Minting
+
+ - Allows for more efficient minting of GHO directly from the liquidity layer.
+
+ - GHO “Soft” Liquidations
+
+ - Utilizes a LLAMM model to ease liquidations and manage market downturns, providing options for users to choose which collateral to liquidate to GHO.
+
+ - Stablecoin Interest Paid in GHO
+
+ - Suppliers can opt to receive interest payments in GHO, enhancing capital efficiency and providing additional benefits to the protocol.
+
+ - Emergency Redemption Mechanism
+ - A feature to handle prolonged and heavy depegging of GHO, ensuring stability and reliability.
+
+### Visual Identity Assets
+
+[Aave Visual Identity Guidelines | 2024](https://www.youtube.com/watch?v=TQHLCACwnbE)
+
+Deliverables include:
+
+- Provision of Visual Identity Assets: Compiling and delivering a package of visual identity assets, including, but are not limited to, logos, color schemes, typography guidelines, various Ronnie illustrations and other graphical elements.
+
+- Usage Guidelines: Instructions on how to implement the visual identity assets across various platforms and media, including digital and print formats. Practical examples and best practice scenarios demonstrating the potential usage of the visual identity assets.
+
+- Delivery: The assets will be delivered and packaged in a Github repository accessible to everyone and hosted within the Aave DAO Origin organization.
+
+## Pospective Second and Third Year Scope
+
+The DAO may renew the engagement with Aave Labs as a service provider for a technical contributor for a second and third year with that scope of work to be determined at a later date and subject to community input and ARFC approval.
+
+## Grant
+
+$12m GHO, including $3m upfront and $9m streamed over the year.
+
+## Evaluation Metrics
+
+- Monthly reporting of contributions to the Aave DAO.
+- Solicitation of feedback from other service providers working as technical contributors and DAO members.
+- Direct and transparent engagement with the DAO via the governance forum.
+
+## Principles
+
+- Aave Labs shall strictly adhere to the scope of its designated role as one of the service providers working as a technical contributor, ensuring all decisions and actions remain within our areas of the engagement.
+- Aave Labs shall prioritize the security and robustness of its technical contributions.
+- Any production-ready code written within the scope of the proposal will be moved to the Aave DAO’s GitHub repository.
+- Aave Labs shall engage with the DAO like all other contributors within the established working relationships and procedures of the Aave DAO. For example, decisions concerning risk configurations, DAO treasury, code audits, and other matters not covered by this proposal will need to be separately approved by the Aave DAO via TEMP CHECKs and Snapshots.
+
+## References
+
+- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/02a12b149705d2ab32bdec871058d5b8a956c0f0/src/20240614_AaveV3Ethereum_V4ALServiceProviderProposal/AaveV3Ethereum_V4ALServiceProviderProposal_20240614.sol)
+- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/02a12b149705d2ab32bdec871058d5b8a956c0f0/src/20240614_AaveV3Ethereum_V4ALServiceProviderProposal/AaveV3Ethereum_V4ALServiceProviderProposal_20240614.t.sol)
+- [Snapshot](https://snapshot.org/#/aave.eth/proposal/0x70dfd865b78c4c391e2b0729b907d152e6e8a0da683416d617d8f84782036349)
+- [Discussion](https://governance.aave.com/t/arfc-al-service-provider-proposal/17974)
+
+## Copyright
+
+The text of this AIP is released under the [CC0 license](https://creativecommons.org/publicdomain/zero/1.0/). The visuals and the New Visual identity are subject to and governed by the license specified in the approved governance proposal by the Aave DAO.
diff --git a/src/20240614_AaveV3Ethereum_V4ALServiceProviderProposal/V4ALServiceProviderProposal_20240614.s.sol b/src/20240614_AaveV3Ethereum_V4ALServiceProviderProposal/V4ALServiceProviderProposal_20240614.s.sol
new file mode 100644
index 000000000..7e2a18682
--- /dev/null
+++ b/src/20240614_AaveV3Ethereum_V4ALServiceProviderProposal/V4ALServiceProviderProposal_20240614.s.sol
@@ -0,0 +1,60 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/GovV3Helpers.sol';
+import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol';
+import {EthereumScript} from 'aave-helpers/ScriptUtils.sol';
+import {AaveV3Ethereum_V4ALServiceProviderProposal_20240614} from './AaveV3Ethereum_V4ALServiceProviderProposal_20240614.sol';
+
+/**
+ * @dev Deploy Ethereum
+ * deploy-command: make deploy-ledger contract=src/20240614_AaveV3Ethereum_V4ALServiceProviderProposal/V4ALServiceProviderProposal_20240614.s.sol:DeployEthereum chain=mainnet
+ * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/V4ALServiceProviderProposal_20240614.s.sol/1/run-latest.json
+ */
+contract DeployEthereum is EthereumScript {
+ function run() external broadcast {
+ // deploy payloads
+ address payload0 = GovV3Helpers.deployDeterministic(
+ type(AaveV3Ethereum_V4ALServiceProviderProposal_20240614).creationCode
+ );
+
+ // compose action
+ IPayloadsControllerCore.ExecutionAction[]
+ memory actions = new IPayloadsControllerCore.ExecutionAction[](1);
+ actions[0] = GovV3Helpers.buildAction(payload0);
+
+ // register action at payloadsController
+ GovV3Helpers.createPayload(actions);
+ }
+}
+
+/**
+ * @dev Create Proposal
+ * command: make deploy-ledger contract=src/20240614_AaveV3Ethereum_V4ALServiceProviderProposal/V4ALServiceProviderProposal_20240614.s.sol:CreateProposal chain=mainnet
+ */
+contract CreateProposal is EthereumScript {
+ function run() external {
+ // create payloads
+ PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](1);
+
+ // compose actions for validation
+ IPayloadsControllerCore.ExecutionAction[]
+ memory actionsEthereum = new IPayloadsControllerCore.ExecutionAction[](1);
+ actionsEthereum[0] = GovV3Helpers.buildAction(
+ type(AaveV3Ethereum_V4ALServiceProviderProposal_20240614).creationCode
+ );
+ payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum);
+
+ // create proposal
+ vm.startBroadcast();
+ GovV3Helpers.createProposal(
+ vm,
+ payloads,
+ GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL,
+ GovV3Helpers.ipfsHashFile(
+ vm,
+ 'src/20240614_AaveV3Ethereum_V4ALServiceProviderProposal/ALServiceProviderProposal.md'
+ )
+ );
+ }
+}
diff --git a/src/20240614_AaveV3Ethereum_V4ALServiceProviderProposal/config.ts b/src/20240614_AaveV3Ethereum_V4ALServiceProviderProposal/config.ts
new file mode 100644
index 000000000..c2c7a9c21
--- /dev/null
+++ b/src/20240614_AaveV3Ethereum_V4ALServiceProviderProposal/config.ts
@@ -0,0 +1,14 @@
+import {ConfigFile} from '../../generator/types';
+export const config: ConfigFile = {
+ rootOptions: {
+ title: 'V4 AL Service Provider Proposal',
+ author: 'Aave Labs',
+ discussion: 'https://governance.aave.com/t/arfc-al-service-provider-proposal/17974',
+ snapshot:
+ 'https://snapshot.org/#/aave.eth/proposal/0x70dfd865b78c4c391e2b0729b907d152e6e8a0da683416d617d8f84782036349',
+ pools: ['AaveV3Ethereum'],
+ shortName: 'V4ALServiceProviderProposal',
+ date: '20240614',
+ },
+ poolOptions: {AaveV3Ethereum: {configs: {}, cache: {blockNumber: 20092863}}},
+};