diff --git a/.assets/266cb15d48681d72fe262fbf1e9a82effed54078.svg b/.assets/266cb15d48681d72fe262fbf1e9a82effed54078.svg
new file mode 100644
index 000000000..f920b04ff
--- /dev/null
+++ b/.assets/266cb15d48681d72fe262fbf1e9a82effed54078.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/.assets/7af3d32d5b53ea30044e549f0c9e403bbecdaaf1.svg b/.assets/7af3d32d5b53ea30044e549f0c9e403bbecdaaf1.svg
new file mode 100644
index 000000000..1feb70879
--- /dev/null
+++ b/.assets/7af3d32d5b53ea30044e549f0c9e403bbecdaaf1.svg
@@ -0,0 +1 @@
+ Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%10%20%Optimal 80%Optimal 80%
\ No newline at end of file
diff --git a/.assets/7dc62027c00efdf4a27a7ad723f8f7ca99f89d77.svg b/.assets/7dc62027c00efdf4a27a7ad723f8f7ca99f89d77.svg
new file mode 100644
index 000000000..e848fb04d
--- /dev/null
+++ b/.assets/7dc62027c00efdf4a27a7ad723f8f7ca99f89d77.svg
@@ -0,0 +1 @@
+ Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%200%400%Optimal 80%Optimal 80%
\ No newline at end of file
diff --git a/.env.example b/.env.example
index b74b93393..2cc581d92 100644
--- a/.env.example
+++ b/.env.example
@@ -18,6 +18,7 @@ RPC_BASE=https://base.llamarpc.com
RPC_ZKEVM=https://zkevm-rpc.com
RPC_GNOSIS=https://rpc.ankr.com/gnosis
RPC_BNB=https://binance.llamarpc.com
+RPC_SCROLL=https://rpc.scroll.io
# Etherscan api keys for verification & download utils
ETHERSCAN_API_KEY_MAINNET=
@@ -30,6 +31,7 @@ ETHERSCAN_API_KEY_BASE=
ETHERSCAN_API_KEY_ZKEVM=
ETHERSCAN_API_KEY_GNOSIS=
ETHERSCAN_API_KEY_BNB=
+ETHERSCAN_API_KEY_SCROLL=
# Simulation/fork creation
TENDERLY_ACCESS_TOKEN=
diff --git a/diffs/AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2_20240205_before_AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2_20240205_after.md b/diffs/AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2_20240205_before_AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2_20240205_after.md
new file mode 100644
index 000000000..5988df978
--- /dev/null
+++ b/diffs/AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2_20240205_before_AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2_20240205_after.md
@@ -0,0 +1,77 @@
+## Reserve changes
+
+### Reserve altered
+
+#### WBTC ([0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599](https://etherscan.io/address/0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599))
+
+| description | value before | value after |
+| --- | --- | --- |
+| reserveFactor | 20 % | 99 % |
+
+
+#### DAI ([0x6B175474E89094C44Da98b954EedeAC495271d0F](https://etherscan.io/address/0x6B175474E89094C44Da98b954EedeAC495271d0F))
+
+| description | value before | value after |
+| --- | --- | --- |
+| reserveFactor | 10 % | 99 % |
+
+
+#### USDC ([0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48](https://etherscan.io/address/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48))
+
+| description | value before | value after |
+| --- | --- | --- |
+| reserveFactor | 10 % | 99 % |
+
+
+#### WETH ([0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2](https://etherscan.io/address/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2))
+
+| description | value before | value after |
+| --- | --- | --- |
+| reserveFactor | 10 % | 99 % |
+
+
+#### USDT ([0xdAC17F958D2ee523a2206206994597C13D831ec7](https://etherscan.io/address/0xdAC17F958D2ee523a2206206994597C13D831ec7))
+
+| description | value before | value after |
+| --- | --- | --- |
+| reserveFactor | 10 % | 99 % |
+
+
+## Raw diff
+
+```json
+{
+ "reserves": {
+ "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599": {
+ "reserveFactor": {
+ "from": 2000,
+ "to": 9900
+ }
+ },
+ "0x6B175474E89094C44Da98b954EedeAC495271d0F": {
+ "reserveFactor": {
+ "from": 1000,
+ "to": 9900
+ }
+ },
+ "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48": {
+ "reserveFactor": {
+ "from": 1000,
+ "to": 9900
+ }
+ },
+ "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2": {
+ "reserveFactor": {
+ "from": 1000,
+ "to": 9900
+ }
+ },
+ "0xdAC17F958D2ee523a2206206994597C13D831ec7": {
+ "reserveFactor": {
+ "from": 1000,
+ "to": 9900
+ }
+ }
+ }
+}
+```
\ No newline at end of file
diff --git a/diffs/AaveV2Ethereum_ChaosLabsV2EthereumLTReductions_20240201_before_AaveV2Ethereum_ChaosLabsV2EthereumLTReductions_20240201_after.md b/diffs/AaveV2Ethereum_ChaosLabsV2EthereumLTReductions_20240201_before_AaveV2Ethereum_ChaosLabsV2EthereumLTReductions_20240201_after.md
new file mode 100644
index 000000000..9e142f5a5
--- /dev/null
+++ b/diffs/AaveV2Ethereum_ChaosLabsV2EthereumLTReductions_20240201_before_AaveV2Ethereum_ChaosLabsV2EthereumLTReductions_20240201_after.md
@@ -0,0 +1,90 @@
+## Reserve changes
+
+### Reserve altered
+
+#### UNI ([0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984](https://etherscan.io/address/0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984))
+
+| description | value before | value after |
+| --- | --- | --- |
+| liquidationThreshold | 20 % | 14 % |
+
+
+#### LINK ([0x514910771AF9Ca656af840dff83E8264EcF986CA](https://etherscan.io/address/0x514910771AF9Ca656af840dff83E8264EcF986CA))
+
+| description | value before | value after |
+| --- | --- | --- |
+| liquidationThreshold | 74 % | 72 % |
+
+
+#### MKR ([0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2](https://etherscan.io/address/0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2))
+
+| description | value before | value after |
+| --- | --- | --- |
+| liquidationThreshold | 18 % | 14 % |
+
+
+#### ENS ([0xC18360217D8F7Ab5e7c516566761Ea12Ce7F9D72](https://etherscan.io/address/0xC18360217D8F7Ab5e7c516566761Ea12Ce7F9D72))
+
+| description | value before | value after |
+| --- | --- | --- |
+| liquidationThreshold | 24 % | 0.05 % |
+
+
+#### CRV ([0xD533a949740bb3306d119CC777fa900bA034cd52](https://etherscan.io/address/0xD533a949740bb3306d119CC777fa900bA034cd52))
+
+| description | value before | value after |
+| --- | --- | --- |
+| liquidationThreshold | 18 % | 14 % |
+
+
+#### ZRX ([0xE41d2489571d322189246DaFA5ebDe1F4699F498](https://etherscan.io/address/0xE41d2489571d322189246DaFA5ebDe1F4699F498))
+
+| description | value before | value after |
+| --- | --- | --- |
+| liquidationThreshold | 12 % | 8 % |
+
+
+## Raw diff
+
+```json
+{
+ "reserves": {
+ "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984": {
+ "liquidationThreshold": {
+ "from": 2000,
+ "to": 1400
+ }
+ },
+ "0x514910771AF9Ca656af840dff83E8264EcF986CA": {
+ "liquidationThreshold": {
+ "from": 7400,
+ "to": 7200
+ }
+ },
+ "0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2": {
+ "liquidationThreshold": {
+ "from": 1800,
+ "to": 1400
+ }
+ },
+ "0xC18360217D8F7Ab5e7c516566761Ea12Ce7F9D72": {
+ "liquidationThreshold": {
+ "from": 2400,
+ "to": 5
+ }
+ },
+ "0xD533a949740bb3306d119CC777fa900bA034cd52": {
+ "liquidationThreshold": {
+ "from": 1800,
+ "to": 1400
+ }
+ },
+ "0xE41d2489571d322189246DaFA5ebDe1F4699F498": {
+ "liquidationThreshold": {
+ "from": 1200,
+ "to": 800
+ }
+ }
+ }
+}
+```
\ No newline at end of file
diff --git a/diffs/AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket_20240125_before_AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket_20240125_after.md b/diffs/AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket_20240125_before_AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket_20240125_after.md
new file mode 100644
index 000000000..516ddb476
--- /dev/null
+++ b/diffs/AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket_20240125_before_AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket_20240125_after.md
@@ -0,0 +1,125 @@
+## Reserve changes
+
+### Reserves added
+
+#### PYUSD ([0x6c3ea9036406852006290770BEdFcAbA0e23A0e8](https://etherscan.io/address/0x6c3ea9036406852006290770BEdFcAbA0e23A0e8))
+
+| description | value |
+| --- | --- |
+| decimals | 6 |
+| isActive | true |
+| isFrozen | false |
+| supplyCap | 10,000,000 PYUSD |
+| borrowCap | 9,000,000 PYUSD |
+| debtCeiling | 0 $ |
+| isSiloed | false |
+| isFlashloanable | true |
+| eModeCategory | 0 |
+| oracle | [0x8f1dF6D7F2db73eECE86a18b4381F4707b918FB1](https://etherscan.io/address/0x8f1dF6D7F2db73eECE86a18b4381F4707b918FB1) |
+| oracleDecimals | 8 |
+| oracleDescription | PYUSD / USD |
+| oracleLatestAnswer | 0.99946 |
+| usageAsCollateralEnabled | false |
+| ltv | 0 % |
+| liquidationThreshold | 0 % |
+| liquidationBonus | 0 % |
+| liquidationProtocolFee | 0 % |
+| reserveFactor | 20 % |
+| aToken | [0x0C0d01AbF3e6aDfcA0989eBbA9d6e85dD58EaB1E](https://etherscan.io/address/0x0C0d01AbF3e6aDfcA0989eBbA9d6e85dD58EaB1E) |
+| aTokenImpl | [0x7EfFD7b47Bfd17e52fB7559d3f924201b9DbfF3d](https://etherscan.io/address/0x7EfFD7b47Bfd17e52fB7559d3f924201b9DbfF3d) |
+| variableDebtToken | [0x57B67e4DE077085Fd0AF2174e9c14871BE664546](https://etherscan.io/address/0x57B67e4DE077085Fd0AF2174e9c14871BE664546) |
+| variableDebtTokenImpl | [0xaC725CB59D16C81061BDeA61041a8A5e73DA9EC6](https://etherscan.io/address/0xaC725CB59D16C81061BDeA61041a8A5e73DA9EC6) |
+| stableDebtToken | [0x5B393DB4c72B1Bd82CE2834F6485d61b137Bc7aC](https://etherscan.io/address/0x5B393DB4c72B1Bd82CE2834F6485d61b137Bc7aC) |
+| stableDebtTokenImpl | [0x15C5620dfFaC7c7366EED66C20Ad222DDbB1eD57](https://etherscan.io/address/0x15C5620dfFaC7c7366EED66C20Ad222DDbB1eD57) |
+| borrowingEnabled | true |
+| stableBorrowRateEnabled | false |
+| isBorrowableInIsolation | false |
+| interestRateStrategy | [0xAC4f9019608f3A359Ba6a576DC4deC9561D2e514](https://etherscan.io/address/0xAC4f9019608f3A359Ba6a576DC4deC9561D2e514) |
+| aTokenName | Aave Ethereum PYUSD |
+| aTokenSymbol | aEthPYUSD |
+| isPaused | false |
+| stableDebtTokenName | Aave Ethereum Stable Debt PYUSD |
+| stableDebtTokenSymbol | stableDebtEthPYUSD |
+| variableDebtTokenName | Aave Ethereum Variable Debt PYUSD |
+| variableDebtTokenSymbol | variableDebtEthPYUSD |
+| optimalUsageRatio | 80 % |
+| maxExcessUsageRatio | 20 % |
+| baseVariableBorrowRate | 0 % |
+| variableRateSlope1 | 6 % |
+| variableRateSlope2 | 80 % |
+| baseStableBorrowRate | 9 % |
+| stableRateSlope1 | 13 % |
+| stableRateSlope2 | 300 % |
+| optimalStableToTotalDebtRatio | 20 % |
+| maxExcessStableToTotalDebtRatio | 80 % |
+| interestRate | ![ir](/.assets/7dc62027c00efdf4a27a7ad723f8f7ca99f89d77.svg) |
+
+
+## Raw diff
+
+```json
+{
+ "reserves": {
+ "0x6c3ea9036406852006290770BEdFcAbA0e23A0e8": {
+ "from": null,
+ "to": {
+ "aToken": "0x0C0d01AbF3e6aDfcA0989eBbA9d6e85dD58EaB1E",
+ "aTokenImpl": "0x7EfFD7b47Bfd17e52fB7559d3f924201b9DbfF3d",
+ "aTokenName": "Aave Ethereum PYUSD",
+ "aTokenSymbol": "aEthPYUSD",
+ "borrowCap": 9000000,
+ "borrowingEnabled": true,
+ "debtCeiling": 0,
+ "decimals": 6,
+ "eModeCategory": 0,
+ "interestRateStrategy": "0xAC4f9019608f3A359Ba6a576DC4deC9561D2e514",
+ "isActive": true,
+ "isBorrowableInIsolation": false,
+ "isFlashloanable": true,
+ "isFrozen": false,
+ "isPaused": false,
+ "isSiloed": false,
+ "liquidationBonus": 0,
+ "liquidationProtocolFee": 0,
+ "liquidationThreshold": 0,
+ "ltv": 0,
+ "oracle": "0x8f1dF6D7F2db73eECE86a18b4381F4707b918FB1",
+ "oracleDecimals": 8,
+ "oracleDescription": "PYUSD / USD",
+ "oracleLatestAnswer": 99946000,
+ "reserveFactor": 2000,
+ "stableBorrowRateEnabled": false,
+ "stableDebtToken": "0x5B393DB4c72B1Bd82CE2834F6485d61b137Bc7aC",
+ "stableDebtTokenImpl": "0x15C5620dfFaC7c7366EED66C20Ad222DDbB1eD57",
+ "stableDebtTokenName": "Aave Ethereum Stable Debt PYUSD",
+ "stableDebtTokenSymbol": "stableDebtEthPYUSD",
+ "supplyCap": 10000000,
+ "symbol": "PYUSD",
+ "underlying": "0x6c3ea9036406852006290770BEdFcAbA0e23A0e8",
+ "usageAsCollateralEnabled": false,
+ "variableDebtToken": "0x57B67e4DE077085Fd0AF2174e9c14871BE664546",
+ "variableDebtTokenImpl": "0xaC725CB59D16C81061BDeA61041a8A5e73DA9EC6",
+ "variableDebtTokenName": "Aave Ethereum Variable Debt PYUSD",
+ "variableDebtTokenSymbol": "variableDebtEthPYUSD"
+ }
+ }
+ },
+ "strategies": {
+ "0xAC4f9019608f3A359Ba6a576DC4deC9561D2e514": {
+ "from": null,
+ "to": {
+ "baseStableBorrowRate": "90000000000000000000000000",
+ "baseVariableBorrowRate": 0,
+ "maxExcessStableToTotalDebtRatio": "800000000000000000000000000",
+ "maxExcessUsageRatio": "200000000000000000000000000",
+ "optimalStableToTotalDebtRatio": "200000000000000000000000000",
+ "optimalUsageRatio": "800000000000000000000000000",
+ "stableRateSlope1": "130000000000000000000000000",
+ "stableRateSlope2": "3000000000000000000000000000",
+ "variableRateSlope1": "60000000000000000000000000",
+ "variableRateSlope2": "800000000000000000000000000"
+ }
+ }
+ }
+}
+```
\ No newline at end of file
diff --git a/diffs/AaveV3Scroll_AaveV3ScrollActivation_20240122_before_AaveV3Scroll_AaveV3ScrollActivation_20240122_after.md b/diffs/AaveV3Scroll_AaveV3ScrollActivation_20240122_before_AaveV3Scroll_AaveV3ScrollActivation_20240122_after.md
new file mode 100644
index 000000000..6230ff10a
--- /dev/null
+++ b/diffs/AaveV3Scroll_AaveV3ScrollActivation_20240122_before_AaveV3Scroll_AaveV3ScrollActivation_20240122_after.md
@@ -0,0 +1,370 @@
+## Reserve changes
+
+### Reserve added
+
+#### USDC (0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4)
+
+| description | value |
+| --- | --- |
+| decimals | 6 |
+| isActive | true |
+| isFrozen | false |
+| supplyCap | 1,000,000 USDC |
+| borrowCap | 900,000 USDC |
+| debtCeiling | 0 $ |
+| isSiloed | false |
+| isFlashloanable | true |
+| eModeCategory | 0 |
+| oracle | 0x43d12Fb3AfCAd5347fA764EeAB105478337b7200 |
+| oracleDecimals | 8 |
+| oracleDescription | USDC / USD |
+| oracleLatestAnswer | 1.00010854 |
+| usageAsCollateralEnabled | true |
+| ltv | 77 % |
+| liquidationThreshold | 80 % |
+| liquidationBonus | 5 % |
+| liquidationProtocolFee | 10 % |
+| reserveFactor | 10 % |
+| aToken | 0x1D738a3436A8C49CefFbaB7fbF04B660fb528CbD |
+| aTokenImpl | 0x92EDe4ABd9df4Bfb49b4d723e4c932e35c47C54C |
+| variableDebtToken | 0x3d2E209af5BFa79297C88D6b57F89d792F6E28EE |
+| variableDebtTokenImpl | 0x49bA16C08130FF8cFADE263B49387A8555bc057B |
+| stableDebtToken | 0x59F359aA263f7Ac09876E869AF1F75b558904ed4 |
+| stableDebtTokenImpl | 0x8Ff5f08EDB2E5e1A51bd14d0494320bdB436a149 |
+| borrowingEnabled | true |
+| stableBorrowRateEnabled | false |
+| isBorrowableInIsolation | true |
+| interestRateStrategy | 0x9205B37978aC983A297dFB53b3f3D2cCC7DDDADa |
+| aTokenName | Aave Scroll USDC |
+| aTokenSymbol | aScrUSDC |
+| isPaused | false |
+| stableDebtTokenName | Aave Scroll Stable Debt USDC |
+| stableDebtTokenSymbol | stableDebtScrUSDC |
+| variableDebtTokenName | Aave Scroll Variable Debt USDC |
+| variableDebtTokenSymbol | variableDebtScrUSDC |
+| optimalUsageRatio | 90 % |
+| maxExcessUsageRatio | 10 % |
+| baseVariableBorrowRate | 0 % |
+| variableRateSlope1 | 6 % |
+| variableRateSlope2 | 60 % |
+| baseStableBorrowRate | 7 % |
+| stableRateSlope1 | 6 % |
+| stableRateSlope2 | 60 % |
+| optimalStableToTotalDebtRatio | 20 % |
+| maxExcessStableToTotalDebtRatio | 80 % |
+| interestRate | ![ir](/.assets/4c5958ae482feac8d910d7dab706b3b1cfd28679.svg) |
+
+
+#### WETH (0x5300000000000000000000000000000000000004)
+
+| description | value |
+| --- | --- |
+| decimals | 18 |
+| isActive | true |
+| isFrozen | false |
+| supplyCap | 240 WETH |
+| borrowCap | 200 WETH |
+| debtCeiling | 0 $ |
+| isSiloed | false |
+| isFlashloanable | true |
+| eModeCategory | 1 |
+| oracle | 0x6bF14CB0A831078629D993FDeBcB182b21A8774C |
+| oracleDecimals | 8 |
+| oracleDescription | ETH / USD |
+| oracleLatestAnswer | 2379.36 |
+| usageAsCollateralEnabled | true |
+| ltv | 75 % |
+| liquidationThreshold | 78 % |
+| liquidationBonus | 6 % |
+| liquidationProtocolFee | 10 % |
+| reserveFactor | 15 % |
+| aToken | 0xf301805bE1Df81102C957f6d4Ce29d2B8c056B2a |
+| aTokenImpl | 0x92EDe4ABd9df4Bfb49b4d723e4c932e35c47C54C |
+| variableDebtToken | 0xfD7344CeB1Df9Cf238EcD667f4A6F99c6Ef44a56 |
+| variableDebtTokenImpl | 0x49bA16C08130FF8cFADE263B49387A8555bc057B |
+| stableDebtToken | 0x117d9cF336287F46DBE509a43925cFF115Aa563c |
+| stableDebtTokenImpl | 0x8Ff5f08EDB2E5e1A51bd14d0494320bdB436a149 |
+| borrowingEnabled | true |
+| stableBorrowRateEnabled | false |
+| isBorrowableInIsolation | false |
+| interestRateStrategy | 0xD828F2f9Da85b190721797bEaD5Eb0acC4150f05 |
+| aTokenName | Aave Scroll WETH |
+| aTokenSymbol | aScrWETH |
+| isPaused | false |
+| stableDebtTokenName | Aave Scroll Stable Debt WETH |
+| stableDebtTokenSymbol | stableDebtScrWETH |
+| variableDebtTokenName | Aave Scroll Variable Debt WETH |
+| variableDebtTokenSymbol | variableDebtScrWETH |
+| optimalUsageRatio | 80 % |
+| maxExcessUsageRatio | 20 % |
+| baseVariableBorrowRate | 0 % |
+| variableRateSlope1 | 3.3 % |
+| variableRateSlope2 | 8 % |
+| baseStableBorrowRate | 5.3 % |
+| stableRateSlope1 | 3.3 % |
+| stableRateSlope2 | 8 % |
+| optimalStableToTotalDebtRatio | 20 % |
+| maxExcessStableToTotalDebtRatio | 80 % |
+| interestRate | ![ir](/.assets/7af3d32d5b53ea30044e549f0c9e403bbecdaaf1.svg) |
+| eMode.label | ETH correlated |
+| eMode.ltv | 90 % |
+| eMode.liquidationThreshold | 93 % |
+| eMode.liquidationBonus | 1 % |
+| eMode.priceSource | 0x0000000000000000000000000000000000000000 |
+
+
+#### wstETH (0xf610A9dfB7C89644979b4A0f27063E9e7d7Cda32)
+
+| description | value |
+| --- | --- |
+| decimals | 18 |
+| isActive | true |
+| isFrozen | false |
+| supplyCap | 130 wstETH |
+| borrowCap | 45 wstETH |
+| debtCeiling | 0 $ |
+| isSiloed | false |
+| isFlashloanable | true |
+| eModeCategory | 1 |
+| oracle | 0xdb93e2712a8B36835078f8D28c70fCC95FD6d37c |
+| oracleDecimals | 8 |
+| oracleDescription | wstETH/ETH/USD |
+| oracleLatestAnswer | 2746.89605153 |
+| usageAsCollateralEnabled | true |
+| ltv | 75 % |
+| liquidationThreshold | 78 % |
+| liquidationBonus | 7 % |
+| liquidationProtocolFee | 10 % |
+| reserveFactor | 15 % |
+| aToken | 0x5B1322eeb46240b02e20062b8F0F9908d525B09c |
+| aTokenImpl | 0x92EDe4ABd9df4Bfb49b4d723e4c932e35c47C54C |
+| variableDebtToken | 0x8a035644322129800C3f747f54Db0F4d3c0A2877 |
+| variableDebtTokenImpl | 0x49bA16C08130FF8cFADE263B49387A8555bc057B |
+| stableDebtToken | 0x18e3f125ce85e8D65AD2bb4f6b5fff110772A078 |
+| stableDebtTokenImpl | 0x8Ff5f08EDB2E5e1A51bd14d0494320bdB436a149 |
+| borrowingEnabled | true |
+| stableBorrowRateEnabled | false |
+| isBorrowableInIsolation | false |
+| interestRateStrategy | 0xCB032D7e38a10503c0b2F9f7bE8c1A81bBBEe2A8 |
+| aTokenName | Aave Scroll wstETH |
+| aTokenSymbol | aScrwstETH |
+| isPaused | false |
+| stableDebtTokenName | Aave Scroll Stable Debt wstETH |
+| stableDebtTokenSymbol | stableDebtScrwstETH |
+| variableDebtTokenName | Aave Scroll Variable Debt wstETH |
+| variableDebtTokenSymbol | variableDebtScrwstETH |
+| optimalUsageRatio | 45 % |
+| maxExcessUsageRatio | 55 % |
+| baseVariableBorrowRate | 0 % |
+| variableRateSlope1 | 7 % |
+| variableRateSlope2 | 300 % |
+| baseStableBorrowRate | 9 % |
+| stableRateSlope1 | 7 % |
+| stableRateSlope2 | 300 % |
+| optimalStableToTotalDebtRatio | 20 % |
+| maxExcessStableToTotalDebtRatio | 80 % |
+| interestRate | ![ir](/.assets/b5cb0fd07fde8594230045982589445fc02ace52.svg) |
+| eMode.label | ETH correlated |
+| eMode.ltv | 90 % |
+| eMode.liquidationThreshold | 93 % |
+| eMode.liquidationBonus | 1 % |
+| eMode.priceSource | 0x0000000000000000000000000000000000000000 |
+
+
+## Raw diff
+
+```json
+{
+ "eModes": {
+ "1": {
+ "from": null,
+ "to": {
+ "eModeCategory": 1,
+ "label": "ETH correlated",
+ "liquidationBonus": 10100,
+ "liquidationThreshold": 9300,
+ "ltv": 9000,
+ "priceSource": "0x0000000000000000000000000000000000000000"
+ }
+ }
+ },
+ "reserves": {
+ "0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4": {
+ "from": null,
+ "to": {
+ "aToken": "0x1D738a3436A8C49CefFbaB7fbF04B660fb528CbD",
+ "aTokenImpl": "0x92EDe4ABd9df4Bfb49b4d723e4c932e35c47C54C",
+ "aTokenName": "Aave Scroll USDC",
+ "aTokenSymbol": "aScrUSDC",
+ "borrowCap": 900000,
+ "borrowingEnabled": true,
+ "debtCeiling": 0,
+ "decimals": 6,
+ "eModeCategory": 0,
+ "interestRateStrategy": "0x9205B37978aC983A297dFB53b3f3D2cCC7DDDADa",
+ "isActive": true,
+ "isBorrowableInIsolation": true,
+ "isFlashloanable": true,
+ "isFrozen": false,
+ "isPaused": false,
+ "isSiloed": false,
+ "liquidationBonus": 10500,
+ "liquidationProtocolFee": 1000,
+ "liquidationThreshold": 8000,
+ "ltv": 7700,
+ "oracle": "0x43d12Fb3AfCAd5347fA764EeAB105478337b7200",
+ "oracleDecimals": 8,
+ "oracleDescription": "USDC / USD",
+ "oracleLatestAnswer": 100010854,
+ "reserveFactor": 1000,
+ "stableBorrowRateEnabled": false,
+ "stableDebtToken": "0x59F359aA263f7Ac09876E869AF1F75b558904ed4",
+ "stableDebtTokenImpl": "0x8Ff5f08EDB2E5e1A51bd14d0494320bdB436a149",
+ "stableDebtTokenName": "Aave Scroll Stable Debt USDC",
+ "stableDebtTokenSymbol": "stableDebtScrUSDC",
+ "supplyCap": 1000000,
+ "symbol": "USDC",
+ "underlying": "0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4",
+ "usageAsCollateralEnabled": true,
+ "variableDebtToken": "0x3d2E209af5BFa79297C88D6b57F89d792F6E28EE",
+ "variableDebtTokenImpl": "0x49bA16C08130FF8cFADE263B49387A8555bc057B",
+ "variableDebtTokenName": "Aave Scroll Variable Debt USDC",
+ "variableDebtTokenSymbol": "variableDebtScrUSDC"
+ }
+ },
+ "0x5300000000000000000000000000000000000004": {
+ "from": null,
+ "to": {
+ "aToken": "0xf301805bE1Df81102C957f6d4Ce29d2B8c056B2a",
+ "aTokenImpl": "0x92EDe4ABd9df4Bfb49b4d723e4c932e35c47C54C",
+ "aTokenName": "Aave Scroll WETH",
+ "aTokenSymbol": "aScrWETH",
+ "borrowCap": 200,
+ "borrowingEnabled": true,
+ "debtCeiling": 0,
+ "decimals": 18,
+ "eModeCategory": 1,
+ "interestRateStrategy": "0xD828F2f9Da85b190721797bEaD5Eb0acC4150f05",
+ "isActive": true,
+ "isBorrowableInIsolation": false,
+ "isFlashloanable": true,
+ "isFrozen": false,
+ "isPaused": false,
+ "isSiloed": false,
+ "liquidationBonus": 10600,
+ "liquidationProtocolFee": 1000,
+ "liquidationThreshold": 7800,
+ "ltv": 7500,
+ "oracle": "0x6bF14CB0A831078629D993FDeBcB182b21A8774C",
+ "oracleDecimals": 8,
+ "oracleDescription": "ETH / USD",
+ "oracleLatestAnswer": 237936000000,
+ "reserveFactor": 1500,
+ "stableBorrowRateEnabled": false,
+ "stableDebtToken": "0x117d9cF336287F46DBE509a43925cFF115Aa563c",
+ "stableDebtTokenImpl": "0x8Ff5f08EDB2E5e1A51bd14d0494320bdB436a149",
+ "stableDebtTokenName": "Aave Scroll Stable Debt WETH",
+ "stableDebtTokenSymbol": "stableDebtScrWETH",
+ "supplyCap": 240,
+ "symbol": "WETH",
+ "underlying": "0x5300000000000000000000000000000000000004",
+ "usageAsCollateralEnabled": true,
+ "variableDebtToken": "0xfD7344CeB1Df9Cf238EcD667f4A6F99c6Ef44a56",
+ "variableDebtTokenImpl": "0x49bA16C08130FF8cFADE263B49387A8555bc057B",
+ "variableDebtTokenName": "Aave Scroll Variable Debt WETH",
+ "variableDebtTokenSymbol": "variableDebtScrWETH"
+ }
+ },
+ "0xf610A9dfB7C89644979b4A0f27063E9e7d7Cda32": {
+ "from": null,
+ "to": {
+ "aToken": "0x5B1322eeb46240b02e20062b8F0F9908d525B09c",
+ "aTokenImpl": "0x92EDe4ABd9df4Bfb49b4d723e4c932e35c47C54C",
+ "aTokenName": "Aave Scroll wstETH",
+ "aTokenSymbol": "aScrwstETH",
+ "borrowCap": 45,
+ "borrowingEnabled": true,
+ "debtCeiling": 0,
+ "decimals": 18,
+ "eModeCategory": 1,
+ "interestRateStrategy": "0xCB032D7e38a10503c0b2F9f7bE8c1A81bBBEe2A8",
+ "isActive": true,
+ "isBorrowableInIsolation": false,
+ "isFlashloanable": true,
+ "isFrozen": false,
+ "isPaused": false,
+ "isSiloed": false,
+ "liquidationBonus": 10700,
+ "liquidationProtocolFee": 1000,
+ "liquidationThreshold": 7800,
+ "ltv": 7500,
+ "oracle": "0xdb93e2712a8B36835078f8D28c70fCC95FD6d37c",
+ "oracleDecimals": 8,
+ "oracleDescription": "wstETH/ETH/USD",
+ "oracleLatestAnswer": 274689605153,
+ "reserveFactor": 1500,
+ "stableBorrowRateEnabled": false,
+ "stableDebtToken": "0x18e3f125ce85e8D65AD2bb4f6b5fff110772A078",
+ "stableDebtTokenImpl": "0x8Ff5f08EDB2E5e1A51bd14d0494320bdB436a149",
+ "stableDebtTokenName": "Aave Scroll Stable Debt wstETH",
+ "stableDebtTokenSymbol": "stableDebtScrwstETH",
+ "supplyCap": 130,
+ "symbol": "wstETH",
+ "underlying": "0xf610A9dfB7C89644979b4A0f27063E9e7d7Cda32",
+ "usageAsCollateralEnabled": true,
+ "variableDebtToken": "0x8a035644322129800C3f747f54Db0F4d3c0A2877",
+ "variableDebtTokenImpl": "0x49bA16C08130FF8cFADE263B49387A8555bc057B",
+ "variableDebtTokenName": "Aave Scroll Variable Debt wstETH",
+ "variableDebtTokenSymbol": "variableDebtScrwstETH"
+ }
+ }
+ },
+ "strategies": {
+ "0x9205B37978aC983A297dFB53b3f3D2cCC7DDDADa": {
+ "from": null,
+ "to": {
+ "baseStableBorrowRate": "70000000000000000000000000",
+ "baseVariableBorrowRate": 0,
+ "maxExcessStableToTotalDebtRatio": "800000000000000000000000000",
+ "maxExcessUsageRatio": "100000000000000000000000000",
+ "optimalStableToTotalDebtRatio": "200000000000000000000000000",
+ "optimalUsageRatio": "900000000000000000000000000",
+ "stableRateSlope1": "60000000000000000000000000",
+ "stableRateSlope2": "600000000000000000000000000",
+ "variableRateSlope1": "60000000000000000000000000",
+ "variableRateSlope2": "600000000000000000000000000"
+ }
+ },
+ "0xCB032D7e38a10503c0b2F9f7bE8c1A81bBBEe2A8": {
+ "from": null,
+ "to": {
+ "baseStableBorrowRate": "90000000000000000000000000",
+ "baseVariableBorrowRate": 0,
+ "maxExcessStableToTotalDebtRatio": "800000000000000000000000000",
+ "maxExcessUsageRatio": "550000000000000000000000000",
+ "optimalStableToTotalDebtRatio": "200000000000000000000000000",
+ "optimalUsageRatio": "450000000000000000000000000",
+ "stableRateSlope1": "70000000000000000000000000",
+ "stableRateSlope2": "3000000000000000000000000000",
+ "variableRateSlope1": "70000000000000000000000000",
+ "variableRateSlope2": "3000000000000000000000000000"
+ }
+ },
+ "0xD828F2f9Da85b190721797bEaD5Eb0acC4150f05": {
+ "from": null,
+ "to": {
+ "baseStableBorrowRate": "53000000000000000000000000",
+ "baseVariableBorrowRate": 0,
+ "maxExcessStableToTotalDebtRatio": "800000000000000000000000000",
+ "maxExcessUsageRatio": "200000000000000000000000000",
+ "optimalStableToTotalDebtRatio": "200000000000000000000000000",
+ "optimalUsageRatio": "800000000000000000000000000",
+ "stableRateSlope1": "33000000000000000000000000",
+ "stableRateSlope2": "80000000000000000000000000",
+ "variableRateSlope1": "33000000000000000000000000",
+ "variableRateSlope2": "80000000000000000000000000"
+ }
+ }
+ }
+}
+```
\ No newline at end of file
diff --git a/generator/common.ts b/generator/common.ts
index 0264dc2a5..809843c28 100644
--- a/generator/common.ts
+++ b/generator/common.ts
@@ -10,6 +10,7 @@ import {
base,
bsc,
gnosis,
+ scroll,
} from 'viem/chains';
export const AVAILABLE_CHAINS = [
@@ -24,6 +25,7 @@ export const AVAILABLE_CHAINS = [
'Base',
'BNB',
'Gnosis',
+ 'Scroll',
] as const;
export function getAssets(pool: PoolIdentifier): string[] {
@@ -105,6 +107,7 @@ export const CHAIN_TO_CHAIN_ID = {
Base: base.id,
BNB: bsc.id,
Gnosis: gnosis.id,
+ Scroll: scroll.id,
};
export function flagAsRequired(message: string, required?: boolean) {
diff --git a/generator/types.ts b/generator/types.ts
index 99a4f96f2..2a1a7828f 100644
--- a/generator/types.ts
+++ b/generator/types.ts
@@ -30,6 +30,7 @@ export const V3_POOLS = [
'AaveV3Metis',
'AaveV3Base',
'AaveV3Gnosis',
+ 'AaveV3Scroll',
'AaveV3BNB',
] as const satisfies readonly (keyof typeof addressBook)[];
diff --git a/package.json b/package.json
index f9eb77a4c..062ae4fe8 100644
--- a/package.json
+++ b/package.json
@@ -36,7 +36,7 @@
"@bgd-labs/js-utils": "^1.1.1",
"@inquirer/prompts": "^3.3.0",
"@inquirer/testing": "^2.1.9",
- "catapulta-verify": "^0.1.12",
+ "catapulta-verify": "^1.0.4",
"commander": "^11.1.0",
"husky": "^8.0.3",
"lint-staged": "^15.2.0",
diff --git a/src/20240118_AaveSafetyModule_StkABPTBalancerV2Migration/StkABPTBalancerV2Migration.md b/src/20240118_AaveSafetyModule_StkABPTBalancerV2Migration/StkABPTBalancerV2Migration.md
new file mode 100644
index 000000000..61e2e1dab
--- /dev/null
+++ b/src/20240118_AaveSafetyModule_StkABPTBalancerV2Migration/StkABPTBalancerV2Migration.md
@@ -0,0 +1,34 @@
+---
+title: "stkABPT Balancer V2 migration"
+author: "BGD Labs @bgdlabs"
+discussions: "https://governance.aave.com/t/bgd-abpt-balancer-v2-migration-plan/8381/7#abpt-balancer-v1-v2-migration-update-1"
+snapshot: "https://snapshot.org/#/aave.eth/proposal/0x33cdbe42706aa449c2e7d55d6c1e81da4bf3f153bb5c1010df71e8ab296fe525"
+---
+
+## Simple Summary
+
+Deprecate the `stkABPT` Balancer v1 safety module in favor of a new `AAVE_wstETH_BPT_V2` Balancer v2 safety module.
+
+## Motivation
+
+The ABPT(AAVE/WETH) pool was created in January 2021, so it runs on the Balancer v1 system.
+The community decided that an upgrade to Balancer v2 and a yield optimized AAVE/wstETH pool.
+
+## Specification
+
+Therefore this proposal:
+
+- Upgrades the existing `stkABPT` to allow immediate withdrawal without cooldown and disable slashing.
+- Stops AAVE reward emission on `stkABPT`.
+- Starts AAVE reward emission on the new `stkAAVE_wstETH_BPT_V2`.
+
+## References
+
+- Implementation: [StakeToken](https://github.com/bgd-labs/stake-token/blob/main/src/contracts/StakeToken.sol),[Payload](https://github.com/bgd-labs/abpt-migration/blob/main/src/contracts/ProposalPayload.sol)
+- Tests: [StakeToken](https://github.com/bgd-labs/stake-token/tree/main/tests), [Payload](https://github.com/bgd-labs/abpt-migration/tree/main/tests)
+- [Snapshot](https://snapshot.org/#/aave.eth/proposal/0x33cdbe42706aa449c2e7d55d6c1e81da4bf3f153bb5c1010df71e8ab296fe525)
+- [Discussion](https://governance.aave.com/t/bgd-abpt-balancer-v2-migration-plan/8381/7#abpt-balancer-v1-v2-migration-update-1)
+
+## Copyright
+
+Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/).
diff --git a/src/20240118_AaveSafetyModule_StkABPTBalancerV2Migration/StkABPTBalancerV2Migration_20240118.s.sol b/src/20240118_AaveSafetyModule_StkABPTBalancerV2Migration/StkABPTBalancerV2Migration_20240118.s.sol
new file mode 100644
index 000000000..24521f3d1
--- /dev/null
+++ b/src/20240118_AaveSafetyModule_StkABPTBalancerV2Migration/StkABPTBalancerV2Migration_20240118.s.sol
@@ -0,0 +1,50 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/GovV3Helpers.sol';
+import {EthereumScript} from 'aave-helpers/ScriptUtils.sol';
+
+/**
+ * @dev Deploy Ethereum
+ * deploy-command: make deploy-ledger contract=src/20240118_AaveSafetyModule_StkABPTBalancerV2Migration/StkABPTBalancerV2Migration_20240118.s.sol:DeployEthereum chain=mainnet
+ * verify-command: npx catapulta-verify -b broadcast/StkABPTBalancerV2Migration_20240118.s.sol/1/run-latest.json
+ */
+contract DeployEthereum is EthereumScript {
+ function run() external broadcast {
+ // compose action
+ IPayloadsControllerCore.ExecutionAction[]
+ memory actions = new IPayloadsControllerCore.ExecutionAction[](1);
+ actions[0] = GovV3Helpers.buildAction(0xFfC6788753444Ad4023C9fc0D5820E3a1887519B);
+
+ // register action at payloadsController
+ GovV3Helpers.createPayload(actions);
+ }
+}
+
+/**
+ * @dev Create Proposal
+ * command: make deploy-ledger contract=src/20240118_AaveSafetyModule_StkABPTBalancerV2Migration/StkABPTBalancerV2Migration_20240118.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(0xFfC6788753444Ad4023C9fc0D5820E3a1887519B);
+ payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum);
+
+ // create proposal
+ vm.startBroadcast();
+ GovV3Helpers.createProposal(
+ vm,
+ payloads,
+ GovV3Helpers.ipfsHashFile(
+ vm,
+ 'src/20240118_AaveSafetyModule_StkABPTBalancerV2Migration/StkABPTBalancerV2Migration.md'
+ )
+ );
+ }
+}
diff --git a/src/20240118_AaveSafetyModule_StkABPTBalancerV2Migration/config.ts b/src/20240118_AaveSafetyModule_StkABPTBalancerV2Migration/config.ts
new file mode 100644
index 000000000..61b37b953
--- /dev/null
+++ b/src/20240118_AaveSafetyModule_StkABPTBalancerV2Migration/config.ts
@@ -0,0 +1,15 @@
+import {ConfigFile} from '../../generator/types';
+export const config: ConfigFile = {
+ rootOptions: {
+ author: 'BGD Labs @bgdlabs',
+ pools: ['AaveSafetyModule'],
+ title: 'stkABPT Balancer V2 migration',
+ shortName: 'StkABPTBalancerV2Migration',
+ date: '20240118',
+ discussion:
+ 'https://governance.aave.com/t/bgd-abpt-balancer-v2-migration-plan/8381/7#abpt-balancer-v1-v2-migration-update-1',
+ snapshot:
+ 'https://snapshot.org/#/aave.eth/proposal/0x33cdbe42706aa449c2e7d55d6c1e81da4bf3f153bb5c1010df71e8ab296fe525',
+ },
+ poolOptions: {AaveSafetyModule: {configs: {OTHERS: {}}, cache: {blockNumber: 19034613}}},
+};
diff --git a/src/20240122_AaveV3Scroll_AaveV3ScrollActivation/AaveV3ScrollActivation.md b/src/20240122_AaveV3Scroll_AaveV3ScrollActivation/AaveV3ScrollActivation.md
new file mode 100644
index 000000000..f7b7b008f
--- /dev/null
+++ b/src/20240122_AaveV3Scroll_AaveV3ScrollActivation/AaveV3ScrollActivation.md
@@ -0,0 +1,69 @@
+---
+title: "Aave v3 Scroll Activation"
+author: "BGD Labs (@bgdlabs)"
+discussions: "https://governance.aave.com/t/arfc-aave-v3-deployment-on-scroll-mainnet/16126/"
+---
+
+## Simple Summary
+
+This proposal allows the Aave governance to activate the Aave V3 Scroll pool (3.0.2) by completing all the initial setup and listing WETH, USDC, wstETH as suggested by the risk service providers engaged with the DAO (Gauntlet and Chaos Labs) on the [governance forum](https://governance.aave.com/t/arfc-aave-v3-deployment-on-scroll-mainnet/16126/6).
+
+All the Aave Scroll V3 addresses can be found in the [aave-address-book](https://github.com/bgd-labs/aave-address-book/blob/main/src/AaveV3Scroll.sol).
+
+## Motivation
+
+All the governance procedures for the expansion of Aave v3 to Scroll have been finished, said:
+
+- Positive signaling and approval regarding the expansion on the [governance forum](https://governance.aave.com/t/tempcheck-aave-v3-mvp-deployment-on-scroll-mainnet/13265), [temp check snapshot](https://snapshot.org/#/aave.eth/proposal/0x0c9447367d5223863e829393a9e8937a54b2af85adef883542f063df4fb86db6), and [final snapshot](https://snapshot.org/#/aave.eth/proposal/0x8110de95ff2827946ede0a9b8c5b9c1876605163bb1e7f8c637b6b80848224c8).
+- Positive technical evaluation done by BGD Labs of the Scroll chain network, as described in the [forum](https://governance.aave.com/t/bgd-aave-scroll-infrastructure-technical-evaluation/15854) in detail.
+- Positive risk analysis and assets/parameters recommendation by the service providers Gauntlet and Chaos Labs.
+
+## Specification
+
+The proposal will do the following:
+
+- Set risk steward and freezing steward as the risk admin by executing `ACL_MANAGER.addRiskAdmin()`.
+- Set the guardian address as the pool admin by executing `ACL_MANAGER.addPoolAdmin()`.
+ This is following the standard procedure of keeping pool admin on the Aave Guardian during the bootstrap period, for security.
+- List the following assets on Aave V3 Scroll: WETH, USDC, wstETH.
+
+The table below illustrates the initial suggested risk parameters for each asset:
+
+| Parameter | WETH | USDC | wstETH |
+| ---------------------------------- | -----------------------------------------------------------------------------------: | ------------------------------------------------------------------------------------: | --------------------------------------------------------------------------------------: |
+| Isolation Mode | false | true | true |
+| Borrowable | ENABLED | ENABLED | ENABLED |
+| Collateral Enabled | true | true | true |
+| Supply Cap | 240 | 1,000,000 | 130 |
+| Borrow Cap | 200 | 900,000 | 45 |
+| Debt Ceiling | USD 0 | USD 0 | USD 0 |
+| LTV | 75 % | 77 % | 75 % |
+| LT | 78 % | 80 % | 78 % |
+| Liquidation Bonus | 6 % | 5 % | 7 % |
+| Liquidation Protocol Fee | 10 % | 10 % | 10 % |
+| Reserve Factor | 15 % | 10 % | 15 % |
+| Base Variable Borrow Rate | 0 % | 0 % | 0 % |
+| Variable Slope 1 | 3.3 % | 6 % | 7 % |
+| Variable Slope 2 | 8 % | 60 % | 300 % |
+| Uoptimal | 80 % | 90 % | 45 % |
+| Stable Borrowing | DISABLED | DISABLED | DISABLED |
+| Stable Slope1 | 3.3 % | 6 % | 7 % |
+| Stable Slope2 | 8 % | 60 % | 300 % |
+| Base Stable Rate Offset | 2 % | 1 % | 2 % |
+| Stable Rate Excess Offset | 8 % | 8 % | 8 % |
+| Optimal Stable To Total Debt Ratio | 20 % | 20 % | 20 % |
+| Flashloanable | ENABLED | ENABLED | ENABLED |
+| Siloed Borrowing | DISABLED | DISABLED | DISABLED |
+| Borrowable in Isolation | DISABLED | ENABLED | DISABLED |
+| Oracle | [ETH/USD](https://scrollscan.com/address/0x6bF14CB0A831078629D993FDeBcB182b21A8774C) | [USDC/USD](https://scrollscan.com/address/0x43d12Fb3AfCAd5347fA764EeAB105478337b7200) | [wstETH/USD](https://scrollscan.com/address/0xdb93e2712a8b36835078f8d28c70fcc95fd6d37c) |
+
+## References
+
+- Implementation: [AaveV3Scroll](https://github.com/bgd-labs/aave-proposals-v3/blob/1264249853c64ae4602f6abf40822cb8e6890395/src/20240122_AaveV3Scroll_AaveV3ScrollActivation/AaveV3Scroll_AaveV3ScrollActivation_20240122.sol)
+- Tests: [AaveV3Scroll](https://github.com/bgd-labs/aave-proposals-v3/blob/1264249853c64ae4602f6abf40822cb8e6890395/src/20240122_AaveV3Scroll_AaveV3ScrollActivation/AaveV3Scroll_AaveV3ScrollActivation_20240122.t.sol)
+- [Snapshot](https://snapshot.org/#/aave.eth/proposal/0x8110de95ff2827946ede0a9b8c5b9c1876605163bb1e7f8c637b6b80848224c8)
+- [Discussion](https://governance.aave.com/t/arfc-aave-v3-deployment-on-scroll-mainnet/16126/)
+
+## Copyright
+
+Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/).
diff --git a/src/20240122_AaveV3Scroll_AaveV3ScrollActivation/AaveV3ScrollActivation_20240122.s.sol b/src/20240122_AaveV3Scroll_AaveV3ScrollActivation/AaveV3ScrollActivation_20240122.s.sol
new file mode 100644
index 000000000..bf17a42af
--- /dev/null
+++ b/src/20240122_AaveV3Scroll_AaveV3ScrollActivation/AaveV3ScrollActivation_20240122.s.sol
@@ -0,0 +1,58 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/GovV3Helpers.sol';
+import {EthereumScript, ScrollScript} from 'aave-helpers/ScriptUtils.sol';
+import {AaveV3Scroll_AaveV3ScrollActivation_20240122} from './AaveV3Scroll_AaveV3ScrollActivation_20240122.sol';
+
+/**
+ * @dev Deploy Scroll
+ * deploy-command: make deploy-ledger contract=src/20240122_AaveV3Scroll_AaveV3ScrollActivation/AaveV3ScrollActivation_20240122.s.sol:DeployScroll chain=scroll
+ * verify-command: npx catapulta-verify -b broadcast/AaveV3ScrollActivation_20240122.s.sol/534352/run-latest.json
+ */
+contract DeployScroll is ScrollScript {
+ function run() external broadcast {
+ // deploy payloads
+ address payload0 = GovV3Helpers.deployDeterministic(
+ type(AaveV3Scroll_AaveV3ScrollActivation_20240122).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/20240122_AaveV3Scroll_AaveV3ScrollActivation/AaveV3ScrollActivation_20240122.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 actionsScroll = new IPayloadsControllerCore.ExecutionAction[](1);
+ actionsScroll[0] = GovV3Helpers.buildAction(
+ type(AaveV3Scroll_AaveV3ScrollActivation_20240122).creationCode
+ );
+ payloads[0] = GovV3Helpers.buildScrollPayload(vm, actionsScroll);
+
+ // create proposal
+ vm.startBroadcast();
+ GovV3Helpers.createProposal(
+ vm,
+ payloads,
+ GovV3Helpers.ipfsHashFile(
+ vm,
+ 'src/20240122_AaveV3Scroll_AaveV3ScrollActivation/AaveV3ScrollActivation.md'
+ )
+ );
+ }
+}
diff --git a/src/20240122_AaveV3Scroll_AaveV3ScrollActivation/AaveV3Scroll_AaveV3ScrollActivation_20240122.sol b/src/20240122_AaveV3Scroll_AaveV3ScrollActivation/AaveV3Scroll_AaveV3ScrollActivation_20240122.sol
new file mode 100644
index 000000000..bcfe4ed7d
--- /dev/null
+++ b/src/20240122_AaveV3Scroll_AaveV3ScrollActivation/AaveV3Scroll_AaveV3ScrollActivation_20240122.sol
@@ -0,0 +1,167 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {AaveV3Scroll} from 'aave-address-book/AaveV3Scroll.sol';
+import {MiscScroll} from 'aave-address-book/MiscScroll.sol';
+import {AaveV3PayloadScroll} from 'aave-helpers/v3-config-engine/AaveV3PayloadScroll.sol';
+import {EngineFlags} from 'aave-helpers/v3-config-engine/EngineFlags.sol';
+import {IAaveV3ConfigEngine} from 'aave-helpers/v3-config-engine/IAaveV3ConfigEngine.sol';
+import {IPool} from 'aave-address-book/AaveV3.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 Aave v3 Scroll Activation
+ * @author BGD Labs (@bgdlabs)
+ * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x8110de95ff2827946ede0a9b8c5b9c1876605163bb1e7f8c637b6b80848224c8
+ * - Discussion: https://governance.aave.com/t/arfc-aave-v3-deployment-on-scroll-mainnet/16126/
+ */
+contract AaveV3Scroll_AaveV3ScrollActivation_20240122 is AaveV3PayloadScroll {
+ using SafeERC20 for IERC20;
+
+ address public constant WETH = 0x5300000000000000000000000000000000000004;
+ uint256 public constant WETH_SEED_AMOUNT = 0.005e18;
+ address public constant USDC = 0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4;
+ uint256 public constant USDC_SEED_AMOUNT = 10e6;
+ address public constant wstETH = 0xf610A9dfB7C89644979b4A0f27063E9e7d7Cda32;
+ uint256 public constant wstETH_SEED_AMOUNT = 0.005e18;
+
+ function _postExecute() internal override {
+ AaveV3Scroll.ACL_MANAGER.addPoolAdmin(MiscScroll.PROTOCOL_GUARDIAN);
+ AaveV3Scroll.ACL_MANAGER.addRiskAdmin(AaveV3Scroll.FREEZING_STEWARD);
+ AaveV3Scroll.ACL_MANAGER.addRiskAdmin(AaveV3Scroll.CAPS_PLUS_RISK_STEWARD);
+
+ _supply(AaveV3Scroll.POOL, WETH, WETH_SEED_AMOUNT, 0x000000000000000000000000000000000000dEaD);
+ _supply(AaveV3Scroll.POOL, USDC, USDC_SEED_AMOUNT, 0x000000000000000000000000000000000000dEaD);
+ _supply(
+ AaveV3Scroll.POOL,
+ wstETH,
+ wstETH_SEED_AMOUNT,
+ 0x000000000000000000000000000000000000dEaD
+ );
+ }
+
+ function eModeCategoriesUpdates()
+ public
+ pure
+ override
+ returns (IAaveV3ConfigEngine.EModeCategoryUpdate[] memory)
+ {
+ IAaveV3ConfigEngine.EModeCategoryUpdate[]
+ memory eModeUpdates = new IAaveV3ConfigEngine.EModeCategoryUpdate[](1);
+
+ eModeUpdates[0] = IAaveV3ConfigEngine.EModeCategoryUpdate({
+ eModeCategory: 1,
+ ltv: 90_00,
+ liqThreshold: 93_00,
+ liqBonus: 1_00,
+ priceSource: 0x0000000000000000000000000000000000000000,
+ label: 'ETH correlated'
+ });
+
+ return eModeUpdates;
+ }
+
+ function newListings() public pure override returns (IAaveV3ConfigEngine.Listing[] memory) {
+ IAaveV3ConfigEngine.Listing[] memory listings = new IAaveV3ConfigEngine.Listing[](3);
+
+ listings[0] = IAaveV3ConfigEngine.Listing({
+ asset: WETH,
+ assetSymbol: 'WETH',
+ priceFeed: 0x6bF14CB0A831078629D993FDeBcB182b21A8774C,
+ eModeCategory: 1,
+ enabledToBorrow: EngineFlags.ENABLED,
+ stableRateModeEnabled: EngineFlags.DISABLED,
+ borrowableInIsolation: EngineFlags.DISABLED,
+ withSiloedBorrowing: EngineFlags.DISABLED,
+ flashloanable: EngineFlags.ENABLED,
+ ltv: 75_00,
+ liqThreshold: 78_00,
+ liqBonus: 6_00,
+ reserveFactor: 15_00,
+ supplyCap: 240,
+ borrowCap: 200,
+ debtCeiling: 0,
+ liqProtocolFee: 10_00,
+ rateStrategyParams: IV3RateStrategyFactory.RateStrategyParams({
+ optimalUsageRatio: _bpsToRay(80_00),
+ baseVariableBorrowRate: _bpsToRay(0),
+ variableRateSlope1: _bpsToRay(3_30),
+ variableRateSlope2: _bpsToRay(8_00),
+ stableRateSlope1: _bpsToRay(3_30),
+ stableRateSlope2: _bpsToRay(8_00),
+ baseStableRateOffset: _bpsToRay(2_00),
+ stableRateExcessOffset: _bpsToRay(8_00),
+ optimalStableToTotalDebtRatio: _bpsToRay(20_00)
+ })
+ });
+ listings[1] = IAaveV3ConfigEngine.Listing({
+ asset: USDC,
+ assetSymbol: 'USDC',
+ priceFeed: 0x43d12Fb3AfCAd5347fA764EeAB105478337b7200,
+ eModeCategory: 0,
+ enabledToBorrow: EngineFlags.ENABLED,
+ stableRateModeEnabled: EngineFlags.DISABLED,
+ borrowableInIsolation: EngineFlags.ENABLED,
+ withSiloedBorrowing: EngineFlags.DISABLED,
+ flashloanable: EngineFlags.ENABLED,
+ ltv: 77_00,
+ liqThreshold: 80_00,
+ liqBonus: 5_00,
+ reserveFactor: 10_00,
+ supplyCap: 1_000_000,
+ borrowCap: 900_000,
+ debtCeiling: 0,
+ liqProtocolFee: 10_00,
+ rateStrategyParams: IV3RateStrategyFactory.RateStrategyParams({
+ optimalUsageRatio: _bpsToRay(90_00),
+ baseVariableBorrowRate: _bpsToRay(0),
+ variableRateSlope1: _bpsToRay(6_00),
+ variableRateSlope2: _bpsToRay(60_00),
+ stableRateSlope1: _bpsToRay(6_00),
+ stableRateSlope2: _bpsToRay(60_00),
+ baseStableRateOffset: _bpsToRay(1_00),
+ stableRateExcessOffset: _bpsToRay(8_00),
+ optimalStableToTotalDebtRatio: _bpsToRay(20_00)
+ })
+ });
+ listings[2] = IAaveV3ConfigEngine.Listing({
+ asset: wstETH,
+ assetSymbol: 'wstETH',
+ priceFeed: 0xdb93e2712a8B36835078f8D28c70fCC95FD6d37c,
+ eModeCategory: 1,
+ enabledToBorrow: EngineFlags.ENABLED,
+ stableRateModeEnabled: EngineFlags.DISABLED,
+ borrowableInIsolation: EngineFlags.DISABLED,
+ withSiloedBorrowing: EngineFlags.DISABLED,
+ flashloanable: EngineFlags.ENABLED,
+ ltv: 75_00,
+ liqThreshold: 78_00,
+ liqBonus: 7_00,
+ reserveFactor: 15_00,
+ supplyCap: 130,
+ borrowCap: 45,
+ debtCeiling: 0,
+ liqProtocolFee: 10_00,
+ rateStrategyParams: IV3RateStrategyFactory.RateStrategyParams({
+ optimalUsageRatio: _bpsToRay(45_00),
+ baseVariableBorrowRate: _bpsToRay(0),
+ variableRateSlope1: _bpsToRay(7_00),
+ variableRateSlope2: _bpsToRay(300_00),
+ stableRateSlope1: _bpsToRay(7_00),
+ stableRateSlope2: _bpsToRay(300_00),
+ baseStableRateOffset: _bpsToRay(2_00),
+ stableRateExcessOffset: _bpsToRay(8_00),
+ optimalStableToTotalDebtRatio: _bpsToRay(20_00)
+ })
+ });
+
+ return listings;
+ }
+
+ function _supply(IPool pool, address asset, uint256 amount, address onBehalfOf) internal {
+ IERC20(asset).forceApprove(address(pool), amount);
+ pool.supply(asset, amount, onBehalfOf, 0);
+ }
+}
diff --git a/src/20240122_AaveV3Scroll_AaveV3ScrollActivation/AaveV3Scroll_AaveV3ScrollActivation_20240122.t.sol b/src/20240122_AaveV3Scroll_AaveV3ScrollActivation/AaveV3Scroll_AaveV3ScrollActivation_20240122.t.sol
new file mode 100644
index 000000000..ae2e211d7
--- /dev/null
+++ b/src/20240122_AaveV3Scroll_AaveV3ScrollActivation/AaveV3Scroll_AaveV3ScrollActivation_20240122.t.sol
@@ -0,0 +1,72 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {GovV3Helpers} from 'aave-helpers/GovV3Helpers.sol';
+import {AaveV3Scroll} from 'aave-address-book/AaveV3Scroll.sol';
+import {MiscScroll} from 'aave-address-book/MiscScroll.sol';
+import {GovernanceV3Scroll} from 'aave-address-book/GovernanceV3Scroll.sol';
+import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol';
+
+import 'forge-std/Test.sol';
+import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/ProtocolV3TestBase.sol';
+import {AaveV3Scroll_AaveV3ScrollActivation_20240122} from './AaveV3Scroll_AaveV3ScrollActivation_20240122.sol';
+
+/**
+ * @dev Test for AaveV3Scroll_AaveV3ScrollActivation_20240122
+ * command: make test-contract filter=AaveV3Scroll_AaveV3ScrollActivation_20240122
+ */
+contract AaveV3Scroll_AaveV3ScrollActivation_20240122_Test is ProtocolV3TestBase {
+ AaveV3Scroll_AaveV3ScrollActivation_20240122 internal proposal;
+ address constant NULL_ADDRESS = 0x000000000000000000000000000000000000dEaD;
+
+ function setUp() public {
+ vm.createSelectFork(vm.rpcUrl('scroll'), 2675703);
+ proposal = new AaveV3Scroll_AaveV3ScrollActivation_20240122();
+ }
+
+ /**
+ * @dev executes the generic test suite including e2e and config snapshots
+ */
+ function test_defaultProposalExecution_scroll() public {
+ defaultTest(
+ 'AaveV3Scroll_AaveV3ScrollActivation_20240122',
+ AaveV3Scroll.POOL,
+ address(proposal)
+ );
+ }
+
+ function test_AdminPermissions() public {
+ GovV3Helpers.executePayload(vm, address(proposal));
+ assertTrue(AaveV3Scroll.ACL_MANAGER.isRiskAdmin(AaveV3Scroll.CAPS_PLUS_RISK_STEWARD));
+ assertTrue(AaveV3Scroll.ACL_MANAGER.isRiskAdmin(AaveV3Scroll.FREEZING_STEWARD));
+ assertTrue(AaveV3Scroll.ACL_MANAGER.isPoolAdmin(MiscScroll.PROTOCOL_GUARDIAN));
+ }
+
+ function test_SeedWETHFunds() public {
+ GovV3Helpers.executePayload(vm, address(proposal));
+ (address aTokenAddress, , ) = AaveV3Scroll
+ .AAVE_PROTOCOL_DATA_PROVIDER
+ .getReserveTokensAddresses(proposal.WETH());
+ assertGe(IERC20(aTokenAddress).balanceOf(NULL_ADDRESS), proposal.WETH_SEED_AMOUNT());
+ }
+
+ function test_SeedUSDCFunds() public {
+ GovV3Helpers.executePayload(vm, address(proposal));
+ (address aTokenAddress, , ) = AaveV3Scroll
+ .AAVE_PROTOCOL_DATA_PROVIDER
+ .getReserveTokensAddresses(proposal.USDC());
+ assertGe(IERC20(aTokenAddress).balanceOf(NULL_ADDRESS), proposal.USDC_SEED_AMOUNT());
+ }
+
+ function test_SeedwstETHFunds() public {
+ GovV3Helpers.executePayload(vm, address(proposal));
+ (address aTokenAddress, , ) = AaveV3Scroll
+ .AAVE_PROTOCOL_DATA_PROVIDER
+ .getReserveTokensAddresses(proposal.wstETH());
+ assertGe(IERC20(aTokenAddress).balanceOf(NULL_ADDRESS), proposal.wstETH_SEED_AMOUNT());
+ }
+}
+
+interface IOwnable {
+ function transferOwnership(address newOwner) external;
+}
diff --git a/src/20240122_AaveV3Scroll_AaveV3ScrollActivation/config.ts b/src/20240122_AaveV3Scroll_AaveV3ScrollActivation/config.ts
new file mode 100644
index 000000000..7f01b512a
--- /dev/null
+++ b/src/20240122_AaveV3Scroll_AaveV3ScrollActivation/config.ts
@@ -0,0 +1,125 @@
+import {ConfigFile} from '../../generator/types';
+export const config: ConfigFile = {
+ rootOptions: {
+ pools: ['AaveV3Scroll'],
+ title: 'Aave v3 Scroll Activation',
+ shortName: 'AaveV3ScrollActivation',
+ date: '20240122',
+ author: 'BGD Labs (@bgdlabs)',
+ discussion: 'https://governance.aave.com/t/arfc-aave-v3-deployment-on-scroll-mainnet/16126/',
+ snapshot:
+ 'https://snapshot.org/#/aave.eth/proposal/0x8110de95ff2827946ede0a9b8c5b9c1876605163bb1e7f8c637b6b80848224c8',
+ },
+ poolOptions: {
+ AaveV3Scroll: {
+ configs: {
+ EMODES_UPDATES: [
+ {
+ eModeCategory: 1,
+ ltv: '90',
+ liqThreshold: '93',
+ liqBonus: '1',
+ priceSource: '0x0000000000000000000000000000000000000000',
+ label: 'ETH correlated',
+ },
+ ],
+ ASSET_LISTING: [
+ {
+ assetSymbol: 'WETH',
+ decimals: 18,
+ priceFeed: '0x6bF14CB0A831078629D993FDeBcB182b21A8774C',
+ ltv: '75',
+ liqThreshold: '78',
+ liqBonus: '6',
+ debtCeiling: '0',
+ liqProtocolFee: '10',
+ enabledToBorrow: 'ENABLED',
+ flashloanable: 'ENABLED',
+ stableRateModeEnabled: 'DISABLED',
+ borrowableInIsolation: 'DISABLED',
+ withSiloedBorrowing: 'DISABLED',
+ reserveFactor: '15',
+ supplyCap: '240',
+ borrowCap: '200',
+ rateStrategyParams: {
+ optimalUtilizationRate: '80',
+ baseVariableBorrowRate: '0',
+ variableRateSlope1: '3.3',
+ variableRateSlope2: '8',
+ stableRateSlope1: '3.3',
+ stableRateSlope2: '8',
+ baseStableRateOffset: '2',
+ stableRateExcessOffset: '8',
+ optimalStableToTotalDebtRatio: '20',
+ },
+ eModeCategory: '0',
+ asset: '0x5300000000000000000000000000000000000004',
+ },
+ {
+ assetSymbol: 'USDC',
+ decimals: 6,
+ priceFeed: '0x43d12Fb3AfCAd5347fA764EeAB105478337b7200',
+ ltv: '77',
+ liqThreshold: '80',
+ liqBonus: '5',
+ debtCeiling: '0',
+ liqProtocolFee: '10',
+ enabledToBorrow: 'ENABLED',
+ flashloanable: 'ENABLED',
+ stableRateModeEnabled: 'DISABLED',
+ borrowableInIsolation: 'ENABLED',
+ withSiloedBorrowing: 'DISABLED',
+ reserveFactor: '10',
+ supplyCap: '1000000',
+ borrowCap: '900000',
+ rateStrategyParams: {
+ optimalUtilizationRate: '90',
+ baseVariableBorrowRate: '0',
+ variableRateSlope1: '6',
+ variableRateSlope2: '60',
+ stableRateSlope1: '6',
+ stableRateSlope2: '60',
+ baseStableRateOffset: '1',
+ stableRateExcessOffset: '8',
+ optimalStableToTotalDebtRatio: '20',
+ },
+ eModeCategory: '0',
+ asset: '0x06efdbff2a14a7c8e15944d1f4a48f9f95f663a4',
+ },
+ {
+ assetSymbol: 'wstETH',
+ decimals: 18,
+ priceFeed: '0xdb93e2712a8b36835078f8d28c70fcc95fd6d37c',
+ ltv: '75',
+ liqThreshold: '78',
+ liqBonus: '7',
+ debtCeiling: '0',
+ liqProtocolFee: '10',
+ enabledToBorrow: 'ENABLED',
+ flashloanable: 'ENABLED',
+ stableRateModeEnabled: 'DISABLED',
+ borrowableInIsolation: 'DISABLED',
+ withSiloedBorrowing: 'DISABLED',
+ reserveFactor: '15',
+ supplyCap: '130',
+ borrowCap: '45',
+ rateStrategyParams: {
+ optimalUtilizationRate: '45',
+ baseVariableBorrowRate: '0',
+ variableRateSlope1: '7',
+ variableRateSlope2: '300',
+ stableRateSlope1: '7',
+ stableRateSlope2: '300',
+ baseStableRateOffset: '2',
+ stableRateExcessOffset: '8',
+ optimalStableToTotalDebtRatio: '20',
+ },
+ eModeCategory: '0',
+ asset: '0xf610A9dfB7C89644979b4A0f27063E9e7d7Cda32',
+ },
+ ],
+ },
+ cache: {blockNumber: 2669127},
+ },
+ },
+};
diff --git a/src/20240125_AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket/AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket_20240125.sol b/src/20240125_AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket/AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket_20240125.sol
new file mode 100644
index 000000000..8fbb11cb1
--- /dev/null
+++ b/src/20240125_AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket/AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket_20240125.sol
@@ -0,0 +1,65 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {AaveV3Ethereum, AaveV3EthereumEModes} from 'aave-address-book/AaveV3Ethereum.sol';
+import {AaveV3PayloadEthereum} from 'aave-helpers/v3-config-engine/AaveV3PayloadEthereum.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 Add PYUSD to Aave v3 Ethereum Market
+ * @author JosepBove (ACI)
+ * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0xb91949efad61b134b913d93b00f73ca8a122259e6d1458cf793f22a0eebfd5d5
+ * - Discussion: https://governance.aave.com/t/arfc-add-pyusd-to-aave-v3-ethereum-market/16218/
+ */
+contract AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket_20240125 is AaveV3PayloadEthereum {
+ using SafeERC20 for IERC20;
+
+ address public constant PYUSD = 0x6c3ea9036406852006290770BEdFcAbA0e23A0e8;
+ uint256 public constant PYUSD_SEED_AMOUNT = 1e6;
+
+ function _postExecute() internal override {
+ IERC20(PYUSD).forceApprove(address(AaveV3Ethereum.POOL), PYUSD_SEED_AMOUNT);
+ AaveV3Ethereum.POOL.supply(PYUSD, PYUSD_SEED_AMOUNT, address(AaveV3Ethereum.COLLECTOR), 0);
+ }
+
+ function newListings() public pure override returns (IAaveV3ConfigEngine.Listing[] memory) {
+ IAaveV3ConfigEngine.Listing[] memory listings = new IAaveV3ConfigEngine.Listing[](1);
+
+ listings[0] = IAaveV3ConfigEngine.Listing({
+ asset: PYUSD,
+ assetSymbol: 'PYUSD',
+ priceFeed: 0x8f1dF6D7F2db73eECE86a18b4381F4707b918FB1,
+ eModeCategory: AaveV3EthereumEModes.NONE,
+ enabledToBorrow: EngineFlags.ENABLED,
+ stableRateModeEnabled: EngineFlags.DISABLED,
+ borrowableInIsolation: EngineFlags.DISABLED,
+ withSiloedBorrowing: EngineFlags.DISABLED,
+ flashloanable: EngineFlags.ENABLED,
+ ltv: 0,
+ liqThreshold: 0,
+ liqBonus: 0,
+ reserveFactor: 20_00,
+ supplyCap: 10_000_000,
+ borrowCap: 9_000_000,
+ debtCeiling: 0,
+ liqProtocolFee: 10_00,
+ rateStrategyParams: IV3RateStrategyFactory.RateStrategyParams({
+ optimalUsageRatio: _bpsToRay(80_00),
+ baseVariableBorrowRate: _bpsToRay(0),
+ variableRateSlope1: _bpsToRay(6_00),
+ variableRateSlope2: _bpsToRay(80_00),
+ stableRateSlope1: _bpsToRay(13_00),
+ stableRateSlope2: _bpsToRay(300_00),
+ baseStableRateOffset: _bpsToRay(3_00),
+ stableRateExcessOffset: _bpsToRay(8_00),
+ optimalStableToTotalDebtRatio: _bpsToRay(20_00)
+ })
+ });
+
+ return listings;
+ }
+}
diff --git a/src/20240125_AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket/AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket_20240125.t.sol b/src/20240125_AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket/AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket_20240125.t.sol
new file mode 100644
index 000000000..ace7b4d2d
--- /dev/null
+++ b/src/20240125_AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket/AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket_20240125.t.sol
@@ -0,0 +1,42 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {GovV3Helpers} from 'aave-helpers/GovV3Helpers.sol';
+import {AaveV3Ethereum} from 'aave-address-book/AaveV3Ethereum.sol';
+import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol';
+
+import 'forge-std/Test.sol';
+import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/ProtocolV3TestBase.sol';
+import {AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket_20240125} from './AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket_20240125.sol';
+
+/**
+ * @dev Test for AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket_20240125
+ * command: make test-contract filter=AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket_20240125
+ */
+contract AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket_20240125_Test is ProtocolV3TestBase {
+ AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket_20240125 internal proposal;
+
+ function setUp() public {
+ vm.createSelectFork(vm.rpcUrl('mainnet'), 19161904);
+ proposal = new AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket_20240125();
+ }
+
+ /**
+ * @dev executes the generic test suite including e2e and config snapshots
+ */
+ function test_defaultProposalExecution() public {
+ defaultTest(
+ 'AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket_20240125',
+ AaveV3Ethereum.POOL,
+ address(proposal)
+ );
+ }
+
+ function test_collectorHasPYUSDFunds() public {
+ GovV3Helpers.executePayload(vm, address(proposal));
+ (address aTokenAddress, , ) = AaveV3Ethereum
+ .AAVE_PROTOCOL_DATA_PROVIDER
+ .getReserveTokensAddresses(proposal.PYUSD());
+ assertGe(IERC20(aTokenAddress).balanceOf(address(AaveV3Ethereum.COLLECTOR)), 10 ** 6);
+ }
+}
diff --git a/src/20240125_AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket/AddPYUSDToAaveV3EthereumMarket.md b/src/20240125_AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket/AddPYUSDToAaveV3EthereumMarket.md
new file mode 100644
index 000000000..c9ea50f23
--- /dev/null
+++ b/src/20240125_AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket/AddPYUSDToAaveV3EthereumMarket.md
@@ -0,0 +1,61 @@
+---
+title: "Add PYUSD to Aave v3 Ethereum Pool"
+author: "JosepBove (ACI)"
+discussions: "https://governance.aave.com/t/arfc-add-pyusd-to-aave-v3-ethereum-market/16218/"
+---
+
+## Simple Summary
+
+This AIP proposes the onboarding of the PYUSD stablecoin, minted by Paxos Trust Company, into the Aave V3 Ethereum pool.
+
+## Motivation
+
+PYUSD is a USD-pegged stablecoin minted through Paxos. While it’s still young, it has grown to a circulating supply of over $230M with strong peg resilience. Onboarding this asset into Aave will:
+
+Build synergies between Aave and PYUSD.
+Offer Aave users an additional stablecoin option.
+Strengthen the relationship between the PYUSD & the GHO stablecoin. (Trident may explore the deployment of a PYUSD/GHO pool)
+We propose a PYUSD onboarding outside isolation mode but without collateral properties.
+
+## Specification
+
+Ticker: PYUSD
+Contract address: 0x6c3ea9036406852006290770bedfcaba0e23a0e8
+Price Feed: 0x8f1df6d7f2db73eece86a18b4381f4707b918fb1
+
+Chainlink Oracle: https://data.chain.link/ethereum/mainnet/stablecoins/PYUSD-usd
+
+The table below illustrates the configured risk parameters for **PYUSD**
+
+| Parameter | Value |
+| ------------------------- | -----------------------------------------: |
+| Isolation Mode | false |
+| Borrowable | ENABLED |
+| Collateral Enabled | false |
+| Supply Cap (PYUSD) | 10,000,000 |
+| Borrow Cap (PYUSD) | 9,000,000 |
+| Debt Ceiling | USD 0 |
+| LTV | 0 % |
+| LT | 0 % |
+| Liquidation Bonus | 0 % |
+| Liquidation Protocol Fee | 10 % |
+| Reserve Factor | 20 % |
+| Base Variable Borrow Rate | 0 % |
+| Variable Slope 1 | 6 % |
+| Variable Slope 2 | 80 % |
+| Uoptimal | 80 % |
+| Flashloanable | ENABLED |
+| Siloed Borrowing | DISABLED |
+| Borrowable in Isolation | DISABLED |
+| Oracle | 0x8f1df6d7f2db73eece86a18b4381f4707b918fb1 |
+
+## References
+
+- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/6ce4cb92b4fb7dc9a857357c26d9cdb529b9ea30/src/20240125_AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket/AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket_20240125.sol)
+- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/6ce4cb92b4fb7dc9a857357c26d9cdb529b9ea30/src/20240125_AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket/AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket_20240125.t.sol)
+- [Snapshot](https://snapshot.org/#/aave.eth/proposal/0xb91949efad61b134b913d93b00f73ca8a122259e6d1458cf793f22a0eebfd5d5)
+- [Discussion](https://governance.aave.com/t/arfc-add-pyusd-to-aave-v3-ethereum-market/16218/)
+
+## Copyright
+
+Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/).
diff --git a/src/20240125_AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket/AddPYUSDToAaveV3EthereumMarket_20240125.s.sol b/src/20240125_AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket/AddPYUSDToAaveV3EthereumMarket_20240125.s.sol
new file mode 100644
index 000000000..aa5964045
--- /dev/null
+++ b/src/20240125_AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket/AddPYUSDToAaveV3EthereumMarket_20240125.s.sol
@@ -0,0 +1,58 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/GovV3Helpers.sol';
+import {EthereumScript} from 'aave-helpers/ScriptUtils.sol';
+import {AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket_20240125} from './AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket_20240125.sol';
+
+/**
+ * @dev Deploy Ethereum
+ * deploy-command: make deploy-ledger contract=src/20240125_AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket/AddPYUSDToAaveV3EthereumMarket_20240125.s.sol:DeployEthereum chain=mainnet
+ * verify-command: npx catapulta-verify -b broadcast/AddPYUSDToAaveV3EthereumMarket_20240125.s.sol/1/run-latest.json
+ */
+contract DeployEthereum is EthereumScript {
+ function run() external broadcast {
+ // deploy payloads
+ address payload0 = GovV3Helpers.deployDeterministic(
+ type(AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket_20240125).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/20240125_AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket/AddPYUSDToAaveV3EthereumMarket_20240125.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_AddPYUSDToAaveV3EthereumMarket_20240125).creationCode
+ );
+ payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum);
+
+ // create proposal
+ vm.startBroadcast();
+ GovV3Helpers.createProposal(
+ vm,
+ payloads,
+ GovV3Helpers.ipfsHashFile(
+ vm,
+ 'src/20240125_AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket/AddPYUSDToAaveV3EthereumMarket.md'
+ )
+ );
+ }
+}
diff --git a/src/20240125_AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket/config.ts b/src/20240125_AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket/config.ts
new file mode 100644
index 000000000..9d7fcb0c1
--- /dev/null
+++ b/src/20240125_AaveV3Ethereum_AddPYUSDToAaveV3EthereumMarket/config.ts
@@ -0,0 +1,53 @@
+import {ConfigFile} from '../../generator/types';
+export const config: ConfigFile = {
+ rootOptions: {
+ pools: ['AaveV3Ethereum'],
+ title: 'Add PYUSD to Aave v3 Ethereum Market',
+ shortName: 'AddPYUSDToAaveV3EthereumMarket',
+ date: '20240125',
+ author: 'JosepBove (ACI)',
+ discussion: 'https://governance.aave.com/t/arfc-add-pyusd-to-aave-v3-ethereum-market/16218/',
+ snapshot:
+ 'https://snapshot.org/#/aave.eth/proposal/0xb91949efad61b134b913d93b00f73ca8a122259e6d1458cf793f22a0eebfd5d5',
+ },
+ poolOptions: {
+ AaveV3Ethereum: {
+ configs: {
+ ASSET_LISTING: [
+ {
+ assetSymbol: 'PYUSD',
+ decimals: 6,
+ priceFeed: '0x8f1df6d7f2db73eece86a18b4381f4707b918fb1',
+ ltv: '0',
+ liqThreshold: '0',
+ liqBonus: '0',
+ debtCeiling: '0',
+ liqProtocolFee: '10',
+ enabledToBorrow: 'ENABLED',
+ flashloanable: 'DISABLED',
+ stableRateModeEnabled: 'DISABLED',
+ borrowableInIsolation: 'DISABLED',
+ withSiloedBorrowing: 'DISABLED',
+ reserveFactor: '20',
+ supplyCap: '10000000',
+ borrowCap: '9000000',
+ rateStrategyParams: {
+ optimalUtilizationRate: '80',
+ baseVariableBorrowRate: '0',
+ variableRateSlope1: '6',
+ variableRateSlope2: '80',
+ stableRateSlope1: '13',
+ stableRateSlope2: '300',
+ baseStableRateOffset: '3',
+ stableRateExcessOffset: '8',
+ optimalStableToTotalDebtRatio: '20',
+ },
+ eModeCategory: 'AaveV3EthereumEModes.NONE',
+ asset: '0x6c3ea9036406852006290770bedfcaba0e23a0e8',
+ },
+ ],
+ },
+ cache: {blockNumber: 19084159},
+ },
+ },
+};
diff --git a/src/20240130_AaveV2Ethereum_MigrationOfRemainingGovV2Permissions/AaveV2Ethereum_MigrationOfRemainingGovV2Permissions_20240130.t.sol b/src/20240130_AaveV2Ethereum_MigrationOfRemainingGovV2Permissions/AaveV2Ethereum_MigrationOfRemainingGovV2Permissions_20240130.t.sol
index e35600c7d..8869b4ffa 100644
--- a/src/20240130_AaveV2Ethereum_MigrationOfRemainingGovV2Permissions/AaveV2Ethereum_MigrationOfRemainingGovV2Permissions_20240130.t.sol
+++ b/src/20240130_AaveV2Ethereum_MigrationOfRemainingGovV2Permissions/AaveV2Ethereum_MigrationOfRemainingGovV2Permissions_20240130.t.sol
@@ -7,6 +7,7 @@ import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol';
import 'forge-std/Test.sol';
import {GovHelpers} from 'aave-helpers/GovHelpers.sol';
+import {GovV3Helpers} from 'aave-helpers/GovV3Helpers.sol';
import {AaveGovernanceV2} from 'aave-address-book/AaveGovernanceV2.sol';
import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol';
import {ProtocolV2TestBase, ReserveConfig} from 'aave-helpers/ProtocolV2TestBase.sol';
@@ -24,12 +25,12 @@ contract AaveV2Ethereum_MigrationOfRemainingGovV2Permissions_20240130_Test is Pr
AaveV2Ethereum_MigrationOfRemainingGovV2Permissions_Part2_20240130 internal proposalPart2;
function setUp() public {
- vm.createSelectFork(vm.rpcUrl('mainnet'), 19119958);
+ vm.createSelectFork(vm.rpcUrl('mainnet'), 19162360);
proposal = AaveV2Ethereum_MigrationOfRemainingGovV2Permissions_20240130(
- PayloadsToDeploy.part1(address(new MainnetPayload()), address(0))
+ 0xd15280055CfE8A8AD69EBC5108582fE5CF9e72ae // PayloadsToDeploy.part1(address(new MainnetPayload()), address(0))
);
proposalPart2 = AaveV2Ethereum_MigrationOfRemainingGovV2Permissions_Part2_20240130(
- PayloadsToDeploy.part2(address(proposal))
+ 0xb26EF5Fcef56262A5a21565b7665ffe2068DaE7C // PayloadsToDeploy.part2(address(proposal))
);
}
@@ -40,11 +41,11 @@ contract AaveV2Ethereum_MigrationOfRemainingGovV2Permissions_20240130_Test is Pr
uint256 wETHBalance = IERC20(AaveV2EthereumAssets.WETH_UNDERLYING).balanceOf(
address(AaveV2Ethereum.COLLECTOR)
);
- assert(proposal.EXECUTION_TIME() == block.timestamp + 7 days);
+ assert(proposal.EXECUTION_TIME() >= block.timestamp + 5 days);
vm.warp(proposal.EXECUTION_TIME() - 2 days);
- executePayload(vm, address(proposal));
+ GovV3Helpers.executePayload(vm, 57);
vm.warp(proposal.EXECUTION_TIME());
- executePayload(vm, address(proposalPart2));
+ GovV3Helpers.executePayload(vm, 58);
uint256 wETHBalanceAfter = IERC20(AaveV2EthereumAssets.WETH_UNDERLYING).balanceOf(
address(AaveV2Ethereum.COLLECTOR)
);
@@ -79,8 +80,8 @@ contract AaveV2Ethereum_MigrationOfRemainingGovV2Permissions_20240130_Polygon_Te
PolygonPayload proposal;
function setUp() public {
- vm.createSelectFork(vm.rpcUrl('polygon'), 52961125);
- proposal = new PolygonPayload();
+ vm.createSelectFork(vm.rpcUrl('polygon'), 53153947);
+ proposal = PolygonPayload(0x40F9a4FB0E9E2a982c0A7547A6a48965BD480235);
}
/**
diff --git a/src/20240130_AaveV2Ethereum_MigrationOfRemainingGovV2Permissions/MigrationOfRemainingGovV2Permissions_20240130.s.sol b/src/20240130_AaveV2Ethereum_MigrationOfRemainingGovV2Permissions/MigrationOfRemainingGovV2Permissions_20240130.s.sol
index 96651fc76..9875fb137 100644
--- a/src/20240130_AaveV2Ethereum_MigrationOfRemainingGovV2Permissions/MigrationOfRemainingGovV2Permissions_20240130.s.sol
+++ b/src/20240130_AaveV2Ethereum_MigrationOfRemainingGovV2Permissions/MigrationOfRemainingGovV2Permissions_20240130.s.sol
@@ -50,14 +50,15 @@ contract DeployPolygon is PolygonScript {
* verify-command: npx catapulta-verify -b broadcast/MigrationOfRemainingGovV2Permissions_20240130.s.sol/1/run-latest.json
*/
contract DeployEthereum is EthereumScript {
- address internal constant POLYGON_PAYLOAD = address(0);
+ address internal constant POLYGON_PAYLOAD = address(0x40F9a4FB0E9E2a982c0A7547A6a48965BD480235);
function run() external broadcast {
require(POLYGON_PAYLOAD != address(0));
+ MainnetPayload payload = new MainnetPayload();
// deploy payloads
- address payload0 = PayloadsToDeploy.part1(address(0), POLYGON_PAYLOAD);
+ address payload0 = PayloadsToDeploy.part1(address(payload), POLYGON_PAYLOAD);
- address payload1 = PayloadsToDeploy.part2(address(new MainnetPayload()));
+ address payload1 = PayloadsToDeploy.part2(address(payload0));
// compose action
IPayloadsControllerCore.ExecutionAction[]
@@ -86,12 +87,16 @@ contract CreateProposal is EthereumScript {
// compose actions for validation
IPayloadsControllerCore.ExecutionAction[]
memory actionsEthereum0 = new IPayloadsControllerCore.ExecutionAction[](1);
- actionsEthereum0[0] = GovV3Helpers.buildAction(address(0)); // TODO: replace with part1
+ actionsEthereum0[0] = GovV3Helpers.buildAction(
+ address(0xd15280055CfE8A8AD69EBC5108582fE5CF9e72ae)
+ );
payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum0);
IPayloadsControllerCore.ExecutionAction[]
memory actionsEthereum1 = new IPayloadsControllerCore.ExecutionAction[](1);
- actionsEthereum1[0] = GovV3Helpers.buildAction(address(0)); // TODO: replace with part2
+ actionsEthereum1[0] = GovV3Helpers.buildAction(
+ address(0xb26EF5Fcef56262A5a21565b7665ffe2068DaE7C)
+ );
payloads[1] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum1);
// create proposal
vm.startBroadcast();
diff --git a/src/20240201_AaveV2Ethereum_ChaosLabsV2EthereumLTReductions/AaveV2Ethereum_ChaosLabsV2EthereumLTReductions_20240201.sol b/src/20240201_AaveV2Ethereum_ChaosLabsV2EthereumLTReductions/AaveV2Ethereum_ChaosLabsV2EthereumLTReductions_20240201.sol
new file mode 100644
index 000000000..c44a7dd56
--- /dev/null
+++ b/src/20240201_AaveV2Ethereum_ChaosLabsV2EthereumLTReductions/AaveV2Ethereum_ChaosLabsV2EthereumLTReductions_20240201.sol
@@ -0,0 +1,57 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {IProposalGenericExecutor} from 'aave-helpers/interfaces/IProposalGenericExecutor.sol';
+import {AaveV2Ethereum, AaveV2EthereumAssets} from 'aave-address-book/AaveV2Ethereum.sol';
+
+/**
+ * @title Chaos Labs V2 Ethereum LT Reductions
+ * @author Chaos Labs - Eyal Ovadya
+ * - Snapshot: No snapshot for Direct-to-AIP
+ * - Discussion: https://governance.aave.com/t/arfc-v2-ethereum-lt-reductions-01-30-2024/16468
+ */
+contract AaveV2Ethereum_ChaosLabsV2EthereumLTReductions_20240201 is IProposalGenericExecutor {
+ function execute() external {
+ AaveV2Ethereum.POOL_CONFIGURATOR.configureReserveAsCollateral(
+ AaveV2EthereumAssets.CRV_UNDERLYING,
+ 0,
+ 14_00,
+ 108_00
+ );
+
+ AaveV2Ethereum.POOL_CONFIGURATOR.configureReserveAsCollateral(
+ AaveV2EthereumAssets.ENS_UNDERLYING,
+ 0,
+ 5,
+ 108_00
+ );
+
+ AaveV2Ethereum.POOL_CONFIGURATOR.configureReserveAsCollateral(
+ AaveV2EthereumAssets.LINK_UNDERLYING,
+ 0,
+ 72_00,
+ 107_00
+ );
+
+ AaveV2Ethereum.POOL_CONFIGURATOR.configureReserveAsCollateral(
+ AaveV2EthereumAssets.MKR_UNDERLYING,
+ 0,
+ 14_00,
+ 107_50
+ );
+
+ AaveV2Ethereum.POOL_CONFIGURATOR.configureReserveAsCollateral(
+ AaveV2EthereumAssets.UNI_UNDERLYING,
+ 0,
+ 14_00,
+ 109_00
+ );
+
+ AaveV2Ethereum.POOL_CONFIGURATOR.configureReserveAsCollateral(
+ AaveV2EthereumAssets.ZRX_UNDERLYING,
+ 0,
+ 8_00,
+ 110_00
+ );
+ }
+}
diff --git a/src/20240201_AaveV2Ethereum_ChaosLabsV2EthereumLTReductions/AaveV2Ethereum_ChaosLabsV2EthereumLTReductions_20240201.t.sol b/src/20240201_AaveV2Ethereum_ChaosLabsV2EthereumLTReductions/AaveV2Ethereum_ChaosLabsV2EthereumLTReductions_20240201.t.sol
new file mode 100644
index 000000000..8e052b427
--- /dev/null
+++ b/src/20240201_AaveV2Ethereum_ChaosLabsV2EthereumLTReductions/AaveV2Ethereum_ChaosLabsV2EthereumLTReductions_20240201.t.sol
@@ -0,0 +1,89 @@
+// 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_ChaosLabsV2EthereumLTReductions_20240201} from './AaveV2Ethereum_ChaosLabsV2EthereumLTReductions_20240201.sol';
+
+/**
+ * @dev Test for AaveV2Ethereum_ChaosLabsV2EthereumLTReductions_20240201
+ * command: make test-contract filter=AaveV2Ethereum_ChaosLabsV2EthereumLTReductions_20240201
+ */
+contract AaveV2Ethereum_ChaosLabsV2EthereumLTReductions_20240201_Test is ProtocolV2TestBase {
+ AaveV2Ethereum_ChaosLabsV2EthereumLTReductions_20240201 internal proposal;
+
+ function setUp() public {
+ vm.createSelectFork(vm.rpcUrl('mainnet'), 19133686);
+ proposal = new AaveV2Ethereum_ChaosLabsV2EthereumLTReductions_20240201();
+ }
+
+ /**
+ * @dev executes the generic test suite including e2e and config snapshots
+ */
+ function test_defaultProposalExecution() public {
+ (ReserveConfig[] memory allConfigsBefore, ReserveConfig[] memory allConfigsAfter) = defaultTest(
+ 'AaveV2Ethereum_ChaosLabsV2EthereumLTReductions_20240201',
+ AaveV2Ethereum.POOL,
+ address(proposal)
+ );
+
+ address[] memory assetsChanged = new address[](6);
+
+ assetsChanged[0] = AaveV2EthereumAssets.CRV_UNDERLYING;
+ assetsChanged[1] = AaveV2EthereumAssets.ENS_UNDERLYING;
+ assetsChanged[2] = AaveV2EthereumAssets.LINK_UNDERLYING;
+ assetsChanged[3] = AaveV2EthereumAssets.MKR_UNDERLYING;
+ assetsChanged[4] = AaveV2EthereumAssets.UNI_UNDERLYING;
+ assetsChanged[5] = AaveV2EthereumAssets.ZRX_UNDERLYING;
+
+ _noReservesConfigsChangesApartFrom(allConfigsBefore, allConfigsAfter, assetsChanged);
+
+ {
+ ReserveConfig memory CRV_UNDERLYING_CONFIG = _findReserveConfig(
+ allConfigsBefore,
+ AaveV2EthereumAssets.CRV_UNDERLYING
+ );
+ CRV_UNDERLYING_CONFIG.liquidationThreshold = 14_00;
+ _validateReserveConfig(CRV_UNDERLYING_CONFIG, allConfigsAfter);
+
+ ReserveConfig memory ENS_UNDERLYING_CONFIG = _findReserveConfig(
+ allConfigsBefore,
+ AaveV2EthereumAssets.ENS_UNDERLYING
+ );
+ ENS_UNDERLYING_CONFIG.liquidationThreshold = 5;
+ _validateReserveConfig(ENS_UNDERLYING_CONFIG, allConfigsAfter);
+
+ ReserveConfig memory LINK_UNDERLYING_CONFIG = _findReserveConfig(
+ allConfigsBefore,
+ AaveV2EthereumAssets.LINK_UNDERLYING
+ );
+ LINK_UNDERLYING_CONFIG.liquidationThreshold = 72_00;
+ _validateReserveConfig(LINK_UNDERLYING_CONFIG, allConfigsAfter);
+ }
+
+ {
+ ReserveConfig memory MKR_UNDERLYING_CONFIG = _findReserveConfig(
+ allConfigsBefore,
+ AaveV2EthereumAssets.MKR_UNDERLYING
+ );
+ MKR_UNDERLYING_CONFIG.liquidationThreshold = 14_00;
+ _validateReserveConfig(MKR_UNDERLYING_CONFIG, allConfigsAfter);
+
+ ReserveConfig memory UNI_UNDERLYING_CONFIG = _findReserveConfig(
+ allConfigsBefore,
+ AaveV2EthereumAssets.UNI_UNDERLYING
+ );
+ UNI_UNDERLYING_CONFIG.liquidationThreshold = 14_00;
+ _validateReserveConfig(UNI_UNDERLYING_CONFIG, allConfigsAfter);
+
+ ReserveConfig memory ZRX_UNDERLYING_CONFIG = _findReserveConfig(
+ allConfigsBefore,
+ AaveV2EthereumAssets.ZRX_UNDERLYING
+ );
+ ZRX_UNDERLYING_CONFIG.liquidationThreshold = 8_00;
+ _validateReserveConfig(ZRX_UNDERLYING_CONFIG, allConfigsAfter);
+ }
+ }
+}
diff --git a/src/20240201_AaveV2Ethereum_ChaosLabsV2EthereumLTReductions/ChaosLabsV2EthereumLTReductions.md b/src/20240201_AaveV2Ethereum_ChaosLabsV2EthereumLTReductions/ChaosLabsV2EthereumLTReductions.md
new file mode 100644
index 000000000..4f25d7a76
--- /dev/null
+++ b/src/20240201_AaveV2Ethereum_ChaosLabsV2EthereumLTReductions/ChaosLabsV2EthereumLTReductions.md
@@ -0,0 +1,45 @@
+---
+title: "V2 Ethereum LT Reductions"
+author: "Chaos Labs - Eyal Ovadya"
+discussions: "https://governance.aave.com/t/arfc-v2-ethereum-lt-reductions-01-30-2024/16468"
+---
+
+## Simple Summary
+
+A proposal to reduce Liquidation Thresholds on Aave V2 Ethereum.
+
+## Motivation
+
+Following the v2 deprecation framework, Chaos Labs and Gauntlet advise implementing the subsequent parameter changes to the frozen assets on Aave v2 Ethereum and Polygon
+
+As Liquidation Threshold reductions may lead to user accounts being eligible for liquidations upon their approval, we want to clarify the full implications to the community at each step. We will publicly communicate the planned amendments and list of affected accounts leading to the on-chain execution.
+
+## Specification
+
+Chaos and Gauntlet align on following recommendations, choosing the higher value between Gauntlet’s aggressive and Chaos’s moderate approach for each asset:
+
+##### Aave v2 Ethereum
+
+| Asset | Current LT | Recommended LT |
+| ----- | ---------- | -------------- |
+| CRV | 18% | 14% |
+| ENS | 24% | 0.05% |
+| LINK | 74% | 72% |
+| MKR | 18% | 14% |
+| UNI | 20% | 14% |
+| ZRX | 12% | 8% |
+
+| | Value liquidated | Accounts liquidated |
+| ----- | ---------------- | ------------------- |
+| Total | $67,480 | 47 |
+
+## References
+
+- Implementation: [AaveV2Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/295f9414834c29c4250b6da9d52c2c3e958b0728/src/20240201_AaveV2Ethereum_ChaosLabsV2EthereumLTReductions/AaveV2Ethereum_ChaosLabsV2EthereumLTReductions_20240201.sol)
+- Tests: [AaveV2Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/295f9414834c29c4250b6da9d52c2c3e958b0728/src/20240201_AaveV2Ethereum_ChaosLabsV2EthereumLTReductions/AaveV2Ethereum_ChaosLabsV2EthereumLTReductions_20240201.t.sol)
+- [Snapshot](No snapshot for Direct-to-AIP)
+- [Discussion](https://governance.aave.com/t/arfc-v2-ethereum-lt-reductions-01-30-2024/16468)
+
+## Copyright
+
+Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/).
diff --git a/src/20240201_AaveV2Ethereum_ChaosLabsV2EthereumLTReductions/ChaosLabsV2EthereumLTReductions_20240201.s.sol b/src/20240201_AaveV2Ethereum_ChaosLabsV2EthereumLTReductions/ChaosLabsV2EthereumLTReductions_20240201.s.sol
new file mode 100644
index 000000000..ff4dd00cb
--- /dev/null
+++ b/src/20240201_AaveV2Ethereum_ChaosLabsV2EthereumLTReductions/ChaosLabsV2EthereumLTReductions_20240201.s.sol
@@ -0,0 +1,58 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/GovV3Helpers.sol';
+import {EthereumScript} from 'aave-helpers/ScriptUtils.sol';
+import {AaveV2Ethereum_ChaosLabsV2EthereumLTReductions_20240201} from './AaveV2Ethereum_ChaosLabsV2EthereumLTReductions_20240201.sol';
+
+/**
+ * @dev Deploy Ethereum
+ * deploy-command: make deploy-ledger contract=src/20240201_AaveV2Ethereum_ChaosLabsV2EthereumLTReductions/ChaosLabsV2EthereumLTReductions_20240201.s.sol:DeployEthereum chain=mainnet
+ * verify-command: npx catapulta-verify -b broadcast/ChaosLabsV2EthereumLTReductions_20240201.s.sol/1/run-latest.json
+ */
+contract DeployEthereum is EthereumScript {
+ function run() external broadcast {
+ // deploy payloads
+ address payload0 = GovV3Helpers.deployDeterministic(
+ type(AaveV2Ethereum_ChaosLabsV2EthereumLTReductions_20240201).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/20240201_AaveV2Ethereum_ChaosLabsV2EthereumLTReductions/ChaosLabsV2EthereumLTReductions_20240201.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(AaveV2Ethereum_ChaosLabsV2EthereumLTReductions_20240201).creationCode
+ );
+ payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum);
+
+ // create proposal
+ vm.startBroadcast();
+ GovV3Helpers.createProposal(
+ vm,
+ payloads,
+ GovV3Helpers.ipfsHashFile(
+ vm,
+ 'src/20240201_AaveV2Ethereum_ChaosLabsV2EthereumLTReductions/ChaosLabsV2EthereumLTReductions.md'
+ )
+ );
+ }
+}
diff --git a/src/20240201_AaveV2Ethereum_ChaosLabsV2EthereumLTReductions/config.ts b/src/20240201_AaveV2Ethereum_ChaosLabsV2EthereumLTReductions/config.ts
new file mode 100644
index 000000000..e9ee0a688
--- /dev/null
+++ b/src/20240201_AaveV2Ethereum_ChaosLabsV2EthereumLTReductions/config.ts
@@ -0,0 +1,13 @@
+import {ConfigFile} from '../../generator/types';
+export const config: ConfigFile = {
+ rootOptions: {
+ author: 'Chaos Labs - Eyal Ovadya',
+ pools: ['AaveV2Ethereum'],
+ title: 'Chaos Labs V2 Ethereum LT Reductions',
+ discussion: 'https://governance.aave.com/t/arfc-v2-ethereum-lt-reductions-01-30-2024/16468',
+ shortName: 'ChaosLabsV2EthereumLTReductions',
+ date: '20240201',
+ snapshot: 'No snapshot for Direct-to-AIP',
+ },
+ poolOptions: {AaveV2Ethereum: {configs: {OTHERS: {}}, cache: {blockNumber: 19133686}}},
+};
diff --git a/src/20240205_AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2/ARFCDeprecateAaveV2AMMMarketStep2.md b/src/20240205_AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2/ARFCDeprecateAaveV2AMMMarketStep2.md
new file mode 100644
index 000000000..e98050bf0
--- /dev/null
+++ b/src/20240205_AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2/ARFCDeprecateAaveV2AMMMarketStep2.md
@@ -0,0 +1,23 @@
+---
+title: "[ARFC] Deprecate Aave V2 AMM Market - Step 2"
+author: "Gauntlet"
+discussions: "https://governance.aave.com/t/arfc-deprecate-aave-v2-amm-market-step-2/16408/1"
+snapshot: "https://snapshot.org/#/aave.eth/proposal/0x0ade316f52d5f763160ea15538a71a4682ae1b708864e8d33497d8de40ad9973"
+---
+
+## Simple Summary
+
+## Motivation
+
+## Specification
+
+## References
+
+- Implementation: [AaveV2EthereumAMM](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240205_AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2/AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2_20240205.sol)
+- Tests: [AaveV2EthereumAMM](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20240205_AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2/AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2_20240205.t.sol)
+- [Snapshot](https://snapshot.org/#/aave.eth/proposal/0x0ade316f52d5f763160ea15538a71a4682ae1b708864e8d33497d8de40ad9973)
+- [Discussion](https://governance.aave.com/t/arfc-deprecate-aave-v2-amm-market-step-2/16408/1)
+
+## Copyright
+
+Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/).
diff --git a/src/20240205_AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2/ARFCDeprecateAaveV2AMMMarketStep2_20240205.s.sol b/src/20240205_AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2/ARFCDeprecateAaveV2AMMMarketStep2_20240205.s.sol
new file mode 100644
index 000000000..1dcc4e5f0
--- /dev/null
+++ b/src/20240205_AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2/ARFCDeprecateAaveV2AMMMarketStep2_20240205.s.sol
@@ -0,0 +1,58 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/GovV3Helpers.sol';
+import {EthereumScript} from 'aave-helpers/ScriptUtils.sol';
+import {AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2_20240205} from './AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2_20240205.sol';
+
+/**
+ * @dev Deploy Ethereum
+ * deploy-command: make deploy-ledger contract=src/20240205_AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2/ARFCDeprecateAaveV2AMMMarketStep2_20240205.s.sol:DeployEthereum chain=mainnet
+ * verify-command: npx catapulta-verify -b broadcast/ARFCDeprecateAaveV2AMMMarketStep2_20240205.s.sol/1/run-latest.json
+ */
+contract DeployEthereum is EthereumScript {
+ function run() external broadcast {
+ // deploy payloads
+ address payload0 = GovV3Helpers.deployDeterministic(
+ type(AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2_20240205).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/20240205_AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2/ARFCDeprecateAaveV2AMMMarketStep2_20240205.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(AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2_20240205).creationCode
+ );
+ payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum);
+
+ // create proposal
+ vm.startBroadcast();
+ GovV3Helpers.createProposal(
+ vm,
+ payloads,
+ GovV3Helpers.ipfsHashFile(
+ vm,
+ 'src/20240205_AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2/ARFCDeprecateAaveV2AMMMarketStep2.md'
+ )
+ );
+ }
+}
diff --git a/src/20240205_AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2/AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2_20240205.sol b/src/20240205_AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2/AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2_20240205.sol
new file mode 100644
index 000000000..ca0dc96ae
--- /dev/null
+++ b/src/20240205_AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2/AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2_20240205.sol
@@ -0,0 +1,106 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {AaveV2EthereumAMM, AaveV2EthereumAMMAssets} from 'aave-address-book/AaveV2EthereumAMM.sol';
+import {AaveV2PayloadEthereum} from 'aave-helpers/v2-config-engine/AaveV2PayloadEthereum.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 [ARFC] Deprecate Aave V2 AMM Market - Step 2
+ * @author Gauntlet
+ * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x0ade316f52d5f763160ea15538a71a4682ae1b708864e8d33497d8de40ad9973
+ * - Discussion: https://governance.aave.com/t/arfc-deprecate-aave-v2-amm-market-step-2/16408/1
+ */
+contract AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2_20240205 is AaveV2PayloadEthereum {
+ function _postExecute() internal override {
+ AaveV2EthereumAMM.POOL_CONFIGURATOR.setReserveFactor(
+ AaveV2EthereumAMMAssets.WETH_UNDERLYING,
+ 99_00
+ );
+ AaveV2EthereumAMM.POOL_CONFIGURATOR.setReserveFactor(
+ AaveV2EthereumAMMAssets.DAI_UNDERLYING,
+ 99_00
+ );
+ AaveV2EthereumAMM.POOL_CONFIGURATOR.setReserveFactor(
+ AaveV2EthereumAMMAssets.USDC_UNDERLYING,
+ 99_00
+ );
+ AaveV2EthereumAMM.POOL_CONFIGURATOR.setReserveFactor(
+ AaveV2EthereumAMMAssets.WBTC_UNDERLYING,
+ 99_00
+ );
+ AaveV2EthereumAMM.POOL_CONFIGURATOR.setReserveFactor(
+ AaveV2EthereumAMMAssets.USDT_UNDERLYING,
+ 99_00
+ );
+ }
+
+ function rateStrategiesUpdates()
+ public
+ pure
+ override
+ returns (IAaveV2ConfigEngine.RateStrategyUpdate[] memory)
+ {
+ IAaveV2ConfigEngine.RateStrategyUpdate[]
+ memory rateStrategies = new IAaveV2ConfigEngine.RateStrategyUpdate[](5);
+ rateStrategies[0] = IAaveV2ConfigEngine.RateStrategyUpdate({
+ asset: AaveV2EthereumAMMAssets.WETH_UNDERLYING,
+ params: IV2RateStrategyFactory.RateStrategyParams({
+ optimalUtilizationRate: EngineFlags.KEEP_CURRENT,
+ baseVariableBorrowRate: _bpsToRay(6_00),
+ variableRateSlope1: EngineFlags.KEEP_CURRENT,
+ variableRateSlope2: EngineFlags.KEEP_CURRENT,
+ stableRateSlope1: EngineFlags.KEEP_CURRENT,
+ stableRateSlope2: EngineFlags.KEEP_CURRENT
+ })
+ });
+ rateStrategies[1] = IAaveV2ConfigEngine.RateStrategyUpdate({
+ asset: AaveV2EthereumAMMAssets.DAI_UNDERLYING,
+ params: IV2RateStrategyFactory.RateStrategyParams({
+ optimalUtilizationRate: EngineFlags.KEEP_CURRENT,
+ baseVariableBorrowRate: _bpsToRay(4_00),
+ variableRateSlope1: _bpsToRay(10_00),
+ variableRateSlope2: EngineFlags.KEEP_CURRENT,
+ stableRateSlope1: EngineFlags.KEEP_CURRENT,
+ stableRateSlope2: EngineFlags.KEEP_CURRENT
+ })
+ });
+ rateStrategies[2] = IAaveV2ConfigEngine.RateStrategyUpdate({
+ asset: AaveV2EthereumAMMAssets.USDC_UNDERLYING,
+ params: IV2RateStrategyFactory.RateStrategyParams({
+ optimalUtilizationRate: EngineFlags.KEEP_CURRENT,
+ baseVariableBorrowRate: _bpsToRay(4_00),
+ variableRateSlope1: _bpsToRay(10_00),
+ variableRateSlope2: EngineFlags.KEEP_CURRENT,
+ stableRateSlope1: EngineFlags.KEEP_CURRENT,
+ stableRateSlope2: EngineFlags.KEEP_CURRENT
+ })
+ });
+ rateStrategies[3] = IAaveV2ConfigEngine.RateStrategyUpdate({
+ asset: AaveV2EthereumAMMAssets.USDT_UNDERLYING,
+ params: IV2RateStrategyFactory.RateStrategyParams({
+ optimalUtilizationRate: EngineFlags.KEEP_CURRENT,
+ baseVariableBorrowRate: _bpsToRay(6_00),
+ variableRateSlope1: _bpsToRay(10_00),
+ variableRateSlope2: EngineFlags.KEEP_CURRENT,
+ stableRateSlope1: EngineFlags.KEEP_CURRENT,
+ stableRateSlope2: EngineFlags.KEEP_CURRENT
+ })
+ });
+ rateStrategies[4] = IAaveV2ConfigEngine.RateStrategyUpdate({
+ asset: AaveV2EthereumAMMAssets.WBTC_UNDERLYING,
+ params: IV2RateStrategyFactory.RateStrategyParams({
+ optimalUtilizationRate: EngineFlags.KEEP_CURRENT,
+ baseVariableBorrowRate: _bpsToRay(5_00),
+ variableRateSlope1: EngineFlags.KEEP_CURRENT,
+ variableRateSlope2: EngineFlags.KEEP_CURRENT,
+ stableRateSlope1: EngineFlags.KEEP_CURRENT,
+ stableRateSlope2: EngineFlags.KEEP_CURRENT
+ })
+ });
+
+ return rateStrategies;
+ }
+}
diff --git a/src/20240205_AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2/AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2_20240205.t.sol b/src/20240205_AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2/AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2_20240205.t.sol
new file mode 100644
index 000000000..80926fbc7
--- /dev/null
+++ b/src/20240205_AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2/AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2_20240205.t.sol
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import {AaveV2EthereumAMM} from 'aave-address-book/AaveV2EthereumAMM.sol';
+
+import 'forge-std/Test.sol';
+import {ProtocolV2TestBase, ReserveConfig} from 'aave-helpers/ProtocolV2TestBase.sol';
+import {AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2_20240205} from './AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2_20240205.sol';
+
+/**
+ * @dev Test for AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2_20240205
+ * command: make test-contract filter=AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2_20240205
+ */
+contract AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2_20240205_Test is ProtocolV2TestBase {
+ AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2_20240205 internal proposal;
+
+ function setUp() public {
+ vm.createSelectFork(vm.rpcUrl('mainnet'), 19164401);
+ proposal = new AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2_20240205();
+ }
+
+ /**
+ * @dev executes the generic test suite including e2e and config snapshots
+ */
+ function test_defaultProposalExecution() public {
+ defaultTest(
+ 'AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2_20240205',
+ AaveV2EthereumAMM.POOL,
+ address(proposal)
+ );
+ }
+}
diff --git a/src/20240205_AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2/config.ts b/src/20240205_AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2/config.ts
new file mode 100644
index 000000000..f357a1444
--- /dev/null
+++ b/src/20240205_AaveV2EthereumAMM_ARFCDeprecateAaveV2AMMMarketStep2/config.ts
@@ -0,0 +1,78 @@
+import {ConfigFile} from '../../generator/types';
+export const config: ConfigFile = {
+ rootOptions: {
+ pools: ['AaveV2EthereumAMM'],
+ title: '[ARFC] Deprecate Aave V2 AMM Market - Step 2',
+ shortName: 'ARFCDeprecateAaveV2AMMMarketStep2',
+ date: '20240205',
+ author: 'Gauntlet',
+ discussion: 'https://governance.aave.com/t/arfc-deprecate-aave-v2-amm-market-step-2/16408/1',
+ snapshot:
+ 'https://snapshot.org/#/aave.eth/proposal/0x0ade316f52d5f763160ea15538a71a4682ae1b708864e8d33497d8de40ad9973',
+ },
+ poolOptions: {
+ AaveV2EthereumAMM: {
+ configs: {
+ RATE_UPDATE_V2: [
+ {
+ asset: 'WETH',
+ params: {
+ optimalUtilizationRate: '',
+ baseVariableBorrowRate: '6',
+ variableRateSlope1: '',
+ variableRateSlope2: '',
+ stableRateSlope1: '',
+ stableRateSlope2: '',
+ },
+ },
+ {
+ asset: 'DAI',
+ params: {
+ optimalUtilizationRate: '',
+ baseVariableBorrowRate: '4',
+ variableRateSlope1: '10',
+ variableRateSlope2: '',
+ stableRateSlope1: '',
+ stableRateSlope2: '',
+ },
+ },
+ {
+ asset: 'USDC',
+ params: {
+ optimalUtilizationRate: '',
+ baseVariableBorrowRate: '4',
+ variableRateSlope1: '10',
+ variableRateSlope2: '',
+ stableRateSlope1: '',
+ stableRateSlope2: '',
+ },
+ },
+ {
+ asset: 'USDT',
+ params: {
+ optimalUtilizationRate: '',
+ baseVariableBorrowRate: '6',
+ variableRateSlope1: '10',
+ variableRateSlope2: '',
+ stableRateSlope1: '',
+ stableRateSlope2: '',
+ },
+ },
+ {
+ asset: 'WBTC',
+ params: {
+ optimalUtilizationRate: '',
+ baseVariableBorrowRate: '5',
+ variableRateSlope1: '',
+ variableRateSlope2: '',
+ stableRateSlope1: '',
+ stableRateSlope2: '',
+ },
+ },
+ ],
+ OTHERS: {},
+ },
+ cache: {blockNumber: 19164401},
+ },
+ },
+};
diff --git a/yarn.lock b/yarn.lock
index 0b1d0ba7a..6dc7913ba 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -75,225 +75,225 @@
resolved "https://registry.npmjs.org/@commander-js/extra-typings/-/extra-typings-11.1.0.tgz"
integrity sha512-GuvZ38d23H+7Tz2C9DhzCepivsOsky03s5NI+KCy7ke1FNUvsJ2oO47scQ9YaGGhgjgNW5OYYNSADmbjcSoIhw==
-"@esbuild/aix-ppc64@0.19.12":
- version "0.19.12"
- resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f"
- integrity sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==
+"@esbuild/aix-ppc64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz#2acd20be6d4f0458bc8c784103495ff24f13b1d3"
+ integrity sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==
-"@esbuild/android-arm64@0.19.12":
- version "0.19.12"
- resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4"
- integrity sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==
+"@esbuild/android-arm64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz#b45d000017385c9051a4f03e17078abb935be220"
+ integrity sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==
"@esbuild/android-arm64@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.9.tgz#683794bdc3d27222d3eced7b74cad15979548031"
integrity sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==
-"@esbuild/android-arm@0.19.12":
- version "0.19.12"
- resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824"
- integrity sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==
+"@esbuild/android-arm@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.11.tgz#f46f55414e1c3614ac682b29977792131238164c"
+ integrity sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==
"@esbuild/android-arm@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.9.tgz#21a4de41f07b2af47401c601d64dfdefd056c595"
integrity sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==
-"@esbuild/android-x64@0.19.12":
- version "0.19.12"
- resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d"
- integrity sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==
+"@esbuild/android-x64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.11.tgz#bfc01e91740b82011ef503c48f548950824922b2"
+ integrity sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==
"@esbuild/android-x64@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.9.tgz#e2d7674bc025ddc8699f0cc76cb97823bb63c252"
integrity sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==
-"@esbuild/darwin-arm64@0.19.12":
- version "0.19.12"
- resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e"
- integrity sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==
+"@esbuild/darwin-arm64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz#533fb7f5a08c37121d82c66198263dcc1bed29bf"
+ integrity sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==
"@esbuild/darwin-arm64@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.9.tgz#ae7a582289cc5c0bac15d4b9020a90cb7288f1e9"
integrity sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==
-"@esbuild/darwin-x64@0.19.12":
- version "0.19.12"
- resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd"
- integrity sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==
+"@esbuild/darwin-x64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz#62f3819eff7e4ddc656b7c6815a31cf9a1e7d98e"
+ integrity sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==
"@esbuild/darwin-x64@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.9.tgz#8a216c66dcf51addeeb843d8cfaeff712821d12b"
integrity sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==
-"@esbuild/freebsd-arm64@0.19.12":
- version "0.19.12"
- resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487"
- integrity sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==
+"@esbuild/freebsd-arm64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz#d478b4195aa3ca44160272dab85ef8baf4175b4a"
+ integrity sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==
"@esbuild/freebsd-arm64@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.9.tgz#63d4f603e421252c3cd836b18d01545be7c6c440"
integrity sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==
-"@esbuild/freebsd-x64@0.19.12":
- version "0.19.12"
- resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c"
- integrity sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==
+"@esbuild/freebsd-x64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz#7bdcc1917409178257ca6a1a27fe06e797ec18a2"
+ integrity sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==
"@esbuild/freebsd-x64@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.9.tgz#a3db52595be65360eae4de1d1fa3c1afd942e1e4"
integrity sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==
-"@esbuild/linux-arm64@0.19.12":
- version "0.19.12"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b"
- integrity sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==
+"@esbuild/linux-arm64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz#58ad4ff11685fcc735d7ff4ca759ab18fcfe4545"
+ integrity sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==
"@esbuild/linux-arm64@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.9.tgz#4ae5811ce9f8d7df5eb9edd9765ea9401a534f13"
integrity sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==
-"@esbuild/linux-arm@0.19.12":
- version "0.19.12"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef"
- integrity sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==
+"@esbuild/linux-arm@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz#ce82246d873b5534d34de1e5c1b33026f35e60e3"
+ integrity sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==
"@esbuild/linux-arm@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.9.tgz#9807e92cfd335f46326394805ad488e646e506f2"
integrity sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==
-"@esbuild/linux-ia32@0.19.12":
- version "0.19.12"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601"
- integrity sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==
+"@esbuild/linux-ia32@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz#cbae1f313209affc74b80f4390c4c35c6ab83fa4"
+ integrity sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==
"@esbuild/linux-ia32@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.9.tgz#18892c10f3106652b16f9da88a0362dc95ed46c7"
integrity sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==
-"@esbuild/linux-loong64@0.19.12":
- version "0.19.12"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299"
- integrity sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==
+"@esbuild/linux-loong64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz#5f32aead1c3ec8f4cccdb7ed08b166224d4e9121"
+ integrity sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==
"@esbuild/linux-loong64@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.9.tgz#dc2ebf9a125db0a1bba18c2bbfd4fbdcbcaf61c2"
integrity sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==
-"@esbuild/linux-mips64el@0.19.12":
- version "0.19.12"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec"
- integrity sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==
+"@esbuild/linux-mips64el@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz#38eecf1cbb8c36a616261de858b3c10d03419af9"
+ integrity sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==
"@esbuild/linux-mips64el@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.9.tgz#4c2f7c5d901015e3faf1563c4a89a50776cb07fd"
integrity sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==
-"@esbuild/linux-ppc64@0.19.12":
- version "0.19.12"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8"
- integrity sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==
+"@esbuild/linux-ppc64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz#9c5725a94e6ec15b93195e5a6afb821628afd912"
+ integrity sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==
"@esbuild/linux-ppc64@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.9.tgz#8385332713b4e7812869622163784a5633f76fc4"
integrity sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==
-"@esbuild/linux-riscv64@0.19.12":
- version "0.19.12"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf"
- integrity sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==
+"@esbuild/linux-riscv64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz#2dc4486d474a2a62bbe5870522a9a600e2acb916"
+ integrity sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==
"@esbuild/linux-riscv64@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.9.tgz#23f1db24fa761be311874f32036c06249aa20cba"
integrity sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==
-"@esbuild/linux-s390x@0.19.12":
- version "0.19.12"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8"
- integrity sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==
+"@esbuild/linux-s390x@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz#4ad8567df48f7dd4c71ec5b1753b6f37561a65a8"
+ integrity sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==
"@esbuild/linux-s390x@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.9.tgz#2dffe497726b897c9f0109e774006e25b33b4fd0"
integrity sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==
-"@esbuild/linux-x64@0.19.12":
- version "0.19.12"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78"
- integrity sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==
+"@esbuild/linux-x64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz#b7390c4d5184f203ebe7ddaedf073df82a658766"
+ integrity sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==
"@esbuild/linux-x64@0.19.9":
version "0.19.9"
resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.9.tgz"
integrity sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==
-"@esbuild/netbsd-x64@0.19.12":
- version "0.19.12"
- resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b"
- integrity sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==
+"@esbuild/netbsd-x64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz#d633c09492a1721377f3bccedb2d821b911e813d"
+ integrity sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==
"@esbuild/netbsd-x64@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.9.tgz#0cbca65e9ef4d3fc41502d3e055e6f49479a8f18"
integrity sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==
-"@esbuild/openbsd-x64@0.19.12":
- version "0.19.12"
- resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0"
- integrity sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==
+"@esbuild/openbsd-x64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz#17388c76e2f01125bf831a68c03a7ffccb65d1a2"
+ integrity sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==
"@esbuild/openbsd-x64@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.9.tgz#1f57adfbee09c743292c6758a3642e875bcad1cf"
integrity sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==
-"@esbuild/sunos-x64@0.19.12":
- version "0.19.12"
- resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30"
- integrity sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==
+"@esbuild/sunos-x64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz#e320636f00bb9f4fdf3a80e548cb743370d41767"
+ integrity sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==
"@esbuild/sunos-x64@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.9.tgz#116be6adbd2c7479edeeb5f6ea0441002ab4cb9c"
integrity sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==
-"@esbuild/win32-arm64@0.19.12":
- version "0.19.12"
- resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae"
- integrity sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==
+"@esbuild/win32-arm64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz#c778b45a496e90b6fc373e2a2bb072f1441fe0ee"
+ integrity sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==
"@esbuild/win32-arm64@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.9.tgz#2be22131ab18af4693fd737b161d1ef34de8ca9d"
integrity sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==
-"@esbuild/win32-ia32@0.19.12":
- version "0.19.12"
- resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67"
- integrity sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==
+"@esbuild/win32-ia32@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz#481a65fee2e5cce74ec44823e6b09ecedcc5194c"
+ integrity sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==
"@esbuild/win32-ia32@0.19.9":
version "0.19.9"
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.9.tgz#e10ead5a55789b167b4225d2469324538768af7c"
integrity sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==
-"@esbuild/win32-x64@0.19.12":
- version "0.19.12"
- resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae"
- integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==
+"@esbuild/win32-x64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz#a5d300008960bb39677c46bf16f53ec70d8dee04"
+ integrity sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==
"@esbuild/win32-x64@0.19.9":
version "0.19.9"
@@ -732,9 +732,9 @@
antlr4ts "^0.5.0-alpha.4"
"@supercharge/promise-pool@^3.1.0":
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/@supercharge/promise-pool/-/promise-pool-3.1.0.tgz#308b9f4d4bf1d607695f916d9454a3556cd4c2b4"
- integrity sha512-gB3NukbIcYzRtPoE6dx9svQYPodxvnfQlaaQd8N/z87E6WaMfRE7o5HwB+LZ+KeM0nsNAq1n4TmBtfz1VCUR+Q==
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/@supercharge/promise-pool/-/promise-pool-3.1.1.tgz#237d4e151b8591e2ff4f0ae388f7d6b4741bacc0"
+ integrity sha512-TgCm6jVqMPv+OgD5uBNND/CkCwNDdXPQlcprtnXsWSBpTCy0q5CI6vRj+jsUiXE1xeRaKIX4UeaYJqzZBL92sg==
"@types/estree@^1.0.0":
version "1.0.5"
@@ -988,10 +988,10 @@ camelcase@^5.3.1:
resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz"
integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
-catapulta-verify@^0.1.12:
- version "0.1.12"
- resolved "https://registry.yarnpkg.com/catapulta-verify/-/catapulta-verify-0.1.12.tgz#a0fc7f7f6388f4f197f7fba9e6d80a975134a3cd"
- integrity sha512-lQfFHadbGGRSuCsG80NFQTX1SYE3CgUqTA7uzQdFb0iPzlD8AVtO6ml0qf1PlmRvOBjOiykvuFjXAjlmG3Mtkw==
+catapulta-verify@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/catapulta-verify/-/catapulta-verify-1.0.4.tgz#6d109772437ec1bb3ee943b3b2ca8ad15b16ea76"
+ integrity sha512-8bOR7eOuwc8mStLtyeOU+ofCdT7i0CkH2KsKXRekf7xXrJefqtY+sA9mGnJmln9MU0qNDv6EvNCOTadLyhtbAA==
chai@^4.3.10:
version "4.3.10"
@@ -1216,33 +1216,33 @@ esbuild@^0.19.3:
"@esbuild/win32-x64" "0.19.9"
esbuild@~0.19.10:
- version "0.19.12"
- resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04"
- integrity sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.11.tgz#4a02dca031e768b5556606e1b468fe72e3325d96"
+ integrity sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==
optionalDependencies:
- "@esbuild/aix-ppc64" "0.19.12"
- "@esbuild/android-arm" "0.19.12"
- "@esbuild/android-arm64" "0.19.12"
- "@esbuild/android-x64" "0.19.12"
- "@esbuild/darwin-arm64" "0.19.12"
- "@esbuild/darwin-x64" "0.19.12"
- "@esbuild/freebsd-arm64" "0.19.12"
- "@esbuild/freebsd-x64" "0.19.12"
- "@esbuild/linux-arm" "0.19.12"
- "@esbuild/linux-arm64" "0.19.12"
- "@esbuild/linux-ia32" "0.19.12"
- "@esbuild/linux-loong64" "0.19.12"
- "@esbuild/linux-mips64el" "0.19.12"
- "@esbuild/linux-ppc64" "0.19.12"
- "@esbuild/linux-riscv64" "0.19.12"
- "@esbuild/linux-s390x" "0.19.12"
- "@esbuild/linux-x64" "0.19.12"
- "@esbuild/netbsd-x64" "0.19.12"
- "@esbuild/openbsd-x64" "0.19.12"
- "@esbuild/sunos-x64" "0.19.12"
- "@esbuild/win32-arm64" "0.19.12"
- "@esbuild/win32-ia32" "0.19.12"
- "@esbuild/win32-x64" "0.19.12"
+ "@esbuild/aix-ppc64" "0.19.11"
+ "@esbuild/android-arm" "0.19.11"
+ "@esbuild/android-arm64" "0.19.11"
+ "@esbuild/android-x64" "0.19.11"
+ "@esbuild/darwin-arm64" "0.19.11"
+ "@esbuild/darwin-x64" "0.19.11"
+ "@esbuild/freebsd-arm64" "0.19.11"
+ "@esbuild/freebsd-x64" "0.19.11"
+ "@esbuild/linux-arm" "0.19.11"
+ "@esbuild/linux-arm64" "0.19.11"
+ "@esbuild/linux-ia32" "0.19.11"
+ "@esbuild/linux-loong64" "0.19.11"
+ "@esbuild/linux-mips64el" "0.19.11"
+ "@esbuild/linux-ppc64" "0.19.11"
+ "@esbuild/linux-riscv64" "0.19.11"
+ "@esbuild/linux-s390x" "0.19.11"
+ "@esbuild/linux-x64" "0.19.11"
+ "@esbuild/netbsd-x64" "0.19.11"
+ "@esbuild/openbsd-x64" "0.19.11"
+ "@esbuild/sunos-x64" "0.19.11"
+ "@esbuild/win32-arm64" "0.19.11"
+ "@esbuild/win32-ia32" "0.19.11"
+ "@esbuild/win32-x64" "0.19.11"
escape-string-regexp@^1.0.5:
version "1.0.5"