diff --git a/.assets/20b02c78bc8b99547929074a8d98940dc76ac4e3.svg b/.assets/20b02c78bc8b99547929074a8d98940dc76ac4e3.svg deleted file mode 100644 index bb652b1a0..000000000 --- a/.assets/20b02c78bc8b99547929074a8d98940dc76ac4e3.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 45%Optimal utilization 45% \ No newline at end of file diff --git a/.assets/237c21391c0b67eb1236e3875c882cd6115a3758.svg b/.assets/237c21391c0b67eb1236e3875c882cd6115a3758.svg deleted file mode 100644 index f1b68a17b..000000000 --- a/.assets/237c21391c0b67eb1236e3875c882cd6115a3758.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 92%Optimal utilization 92% \ No newline at end of file diff --git a/.assets/3b30aea0d7ed061d9d9b0eeecb2e4835c7844ba5.svg b/.assets/3b30aea0d7ed061d9d9b0eeecb2e4835c7844ba5.svg deleted file mode 100644 index 3c15ce1a6..000000000 --- a/.assets/3b30aea0d7ed061d9d9b0eeecb2e4835c7844ba5.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%100%200%300%Optimal utilization 45%Optimal utilization 45% \ No newline at end of file diff --git a/.assets/4f7a3ee47355f466dc627787f8cd371573621162.svg b/.assets/4f7a3ee47355f466dc627787f8cd371573621162.svg deleted file mode 100644 index 0bd7d00f7..000000000 --- a/.assets/4f7a3ee47355f466dc627787f8cd371573621162.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 92%Optimal utilization 92% \ No newline at end of file diff --git a/.assets/59f72276d32ba1eeba45953b23c84ea37048e299.svg b/.assets/59f72276d32ba1eeba45953b23c84ea37048e299.svg deleted file mode 100644 index f3e37f8aa..000000000 --- a/.assets/59f72276d32ba1eeba45953b23c84ea37048e299.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 92%Optimal utilization 92% \ No newline at end of file diff --git a/.assets/5e92a6663aeee25254a2740f3a545f211faeacbf.svg b/.assets/5e92a6663aeee25254a2740f3a545f211faeacbf.svg deleted file mode 100644 index 5e7903832..000000000 --- a/.assets/5e92a6663aeee25254a2740f3a545f211faeacbf.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 80%Optimal utilization 80% \ No newline at end of file diff --git a/.assets/75cdb567a41d55d63ab2bb1326ea702df0bfacf4.svg b/.assets/75cdb567a41d55d63ab2bb1326ea702df0bfacf4.svg deleted file mode 100644 index 0bd7d00f7..000000000 --- a/.assets/75cdb567a41d55d63ab2bb1326ea702df0bfacf4.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 92%Optimal utilization 92% \ No newline at end of file diff --git a/.assets/873d4c8affcd41504dffeb1e9750d8e5357e2775.svg b/.assets/873d4c8affcd41504dffeb1e9750d8e5357e2775.svg deleted file mode 100644 index fc56a2cce..000000000 --- a/.assets/873d4c8affcd41504dffeb1e9750d8e5357e2775.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%50%100%Optimal utilization 90%Optimal utilization 90% \ No newline at end of file diff --git a/.assets/92cd89f015c573a55ccf57593f88a74f7b8bc050.svg b/.assets/92cd89f015c573a55ccf57593f88a74f7b8bc050.svg deleted file mode 100644 index e673fbc39..000000000 --- a/.assets/92cd89f015c573a55ccf57593f88a74f7b8bc050.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stable0%25%50%75%100%0%20%40%60%80%Optimal utilization 92%Optimal utilization 92% \ No newline at end of file diff --git a/.env.example b/.env.example index b437ac105..f74cb4e5d 100644 --- a/.env.example +++ b/.env.example @@ -6,22 +6,25 @@ LEDGER_SENDER= PRIVATE_KEY= # Test rpc_endpoints -RPC_MAINNET=https://eth.llamarpc.com -RPC_AVALANCHE=https://api.avax.network/ext/bc/C/rpc -RPC_OPTIMISM=https://optimism.llamarpc.com -RPC_POLYGON=https://polygon.llamarpc.com -RPC_ARBITRUM=https://arbitrum.llamarpc.com -RPC_FANTOM=https://rpc.ftm.tools -RPC_HARMONY=https://api.harmony.one -RPC_METIS=https://andromeda.metis.io/?owner=1088 -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 -RPC_ZKSYNC=https://mainnet.era.zksync.io +# To generate RPCs based on you api keys, you can use +# export ALCHEMY_API_KEY=yourAlchemyKey && npx @bgd-labs/rpc-env +RPC_MAINNET= +RPC_AVALANCHE= +RPC_OPTIMISM= +RPC_POLYGON= +RPC_ARBITRUM= +RPC_FANTOM= +RPC_HARMONY= +RPC_METIS= +RPC_BASE= +RPC_ZKEVM= +RPC_GNOSIS= +RPC_BNB= +RPC_SCROLL= +RPC_ZKSYNC= # Etherscan api keys for verification & download utils +# Dedicated api keys for each chain are required when using foundry verification ETHERSCAN_API_KEY_MAINNET= ETHERSCAN_API_KEY_POLYGON= ETHERSCAN_API_KEY_AVALANCHE= @@ -35,6 +38,9 @@ ETHERSCAN_API_KEY_BNB= ETHERSCAN_API_KEY_SCROLL= ETHERESCAN_API_KEY_ZKSYNC= +# Catapulta verify uses etherscan v2 api, therefore adding a single api key is good enough +ETHERSCAN_API_KEY= + # Simulation/fork creation TENDERLY_ACCESS_TOKEN= TENDERLY_ACCOUNT= diff --git a/.github/workflows/comment.yml b/.github/workflows/comment.yml index 0a8a422fd..2117aea36 100644 --- a/.github/workflows/comment.yml +++ b/.github/workflows/comment.yml @@ -9,4 +9,5 @@ on: jobs: test: uses: bgd-labs/github-workflows/.github/workflows/comment.yml@main - secrets: inherit + secrets: + READ_ONLY_PAT: ${{ secrets.READ_ONLY_PAT }} diff --git a/.github/workflows/ipfs.yml b/.github/workflows/ipfs.yml index d3ec42b93..4c911941d 100644 --- a/.github/workflows/ipfs.yml +++ b/.github/workflows/ipfs.yml @@ -39,14 +39,7 @@ jobs: ref: ${{ inputs.myCommit }} persist-credentials: true - - uses: actions/setup-node@v3 - with: - node-version: 20 - registry-url: "https://registry.npmjs.org" - cache: "yarn" - - - name: Install dependencies - run: yarn install --frozen-lockfile + - uses: bgd-labs/github-workflows/.github/actions/setup-node@main - name: Get all changed *.md file(s) id: changed-files diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0f186f228..204fcb2b7 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,34 +14,54 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: actions/setup-node@v3 - with: - node-version: 20 - registry-url: "https://registry.npmjs.org" - cache: "yarn" - - - name: Install dependencies - run: yarn install --frozen-lockfile + - uses: bgd-labs/github-workflows/.github/actions/setup-node@main - name: Enforce linting - run: yarn lint --check + run: npm run lint --check test-sol: - uses: bgd-labs/github-workflows/.github/workflows/foundry-test.yml@main - secrets: inherit - with: - mode: "CHANGED" - - test-sol-zksync: - uses: bgd-labs/github-workflows/.github/workflows/foundry-test.yml@main - secrets: inherit - with: - mode: "CHANGED" - zksync: true - ROOT_DIR: "zksync" + name: Foundry build n test + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - uses: bgd-labs/action-rpc-env@main + with: + ALCHEMY_API_KEY: ${{ secrets.ALCHEMY_API_KEY }} + + # we simply use foundry zk for all jobs in this repo + - name: Run Foundry setup + uses: bgd-labs/github-workflows/.github/actions/foundry-setup@main + with: + ZKSYNC: "true" + + - name: Run Forge tests + id: test + uses: bgd-labs/github-workflows/.github/actions/foundry-test@main + with: + MODE: "CHANGED" + + - name: Run ZK tests + id: zktest + uses: bgd-labs/github-workflows/.github/actions/foundry-test@main + with: + MODE: "CHANGED" + ZKSYNC: true + ROOT_DIR: "zksync" + + - name: Run Forge tests + uses: bgd-labs/github-workflows/.github/actions/comment-artifact@main + + # we let failing tests pass so we can log them in the comment, still we want the ci to fail + - name: Post test + if: ${{ steps.test.outputs.testStatus != 0 || steps.zktest.outputs.testStatus != 0 }} + run: | + echo "tests failed" + exit 1 test-js: uses: bgd-labs/github-workflows/.github/workflows/test-node.yml@main - secrets: inherit diff --git a/.gitignore b/.gitignore index 9634c09db..4fdc38c50 100644 --- a/.gitignore +++ b/.gitignore @@ -13,9 +13,8 @@ zkout/ # editors .idea -# well, looks strange to ignore package-lock, but we have only pretter and it's temproray -package-lock.json node_modules +yarn.lock # ignore foundry deploy artifacts broadcast/ diff --git a/README.md b/README.md index d211784a0..0a7f58d80 100644 --- a/README.md +++ b/README.md @@ -22,19 +22,18 @@ The template ships with sensible default so you can use default `foundry` comman ```sh cp .env.example .env forge install -yarn +npm i ``` ### Create an aip This repository includes a generator to help you bootstrap the required files for an `AIP`. -To generate a proposal you need to run: `yarn generate` +To generate a proposal you need to run: `npm run generate` -To get a full list of available commands run `yarn generate --help` +To get a full list of available commands run `npm run generate -- --help` ```sh -yarn generate --help -yarn run v1.22.19 +npm run generate -- --help $ tsx generator/cli --help Usage: proposal-generator [options] @@ -108,7 +107,8 @@ If for whatever reason verification fails, there's a good chance the error is on To retry a specific verification you can follow the following steps: 1. copy verify.example.json to verify.json -2. replace the `chain` with the appropriate chainId -3. replace the `hash` with the transaction hash of the deployment transaction (make sure it's the deployment transaction, not the one registering the payload on the payloadscontroller) -4. run `FOUNDRY_PROFILE= forge build --force` -5. run `FOUNDRY_PROFILE= npx catapulta-verify -b verify.json` +2. enter an `ETHERSCAN_API_KEY` in your `.env` +3. replace the `chain` with the appropriate chainId +4. replace the `hash` with the transaction hash of the deployment transaction (make sure it's the deployment transaction, not the one registering the payload on the payloadscontroller) +5. run `FOUNDRY_PROFILE= forge build --force` +6. run `FOUNDRY_PROFILE= npx catapulta-verify -b verify.json` diff --git a/diffs/AaveV2Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV2Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md b/diffs/AaveV2Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV2Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md new file mode 100644 index 000000000..a5e7897bc --- /dev/null +++ b/diffs/AaveV2Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV2Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md @@ -0,0 +1,86 @@ +## Reserve changes + +### Reserve altered + +#### DAI ([0x6B175474E89094C44Da98b954EedeAC495271d0F](https://etherscan.io/address/0x6B175474E89094C44Da98b954EedeAC495271d0F)) + +| description | value before | value after | +| --- | --- | --- | +| interestRateStrategy | [0xA939B1f36E9a14B044B8149933184a18E0dFC17D](https://etherscan.io/address/0xA939B1f36E9a14B044B8149933184a18E0dFC17D) | [0x7011B47A142E2f462AB10F5bDBc8A478310EB0FD](https://etherscan.io/address/0x7011B47A142E2f462AB10F5bDBc8A478310EB0FD) | +| variableRateSlope1 | 5.5 % | 12.5 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=undefined) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=undefined) | + +#### USDC ([0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48](https://etherscan.io/address/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48)) + +| description | value before | value after | +| --- | --- | --- | +| interestRateStrategy | [0x6a8C8119b2BA9460162B8C999f5A8C84f28a033f](https://etherscan.io/address/0x6a8C8119b2BA9460162B8C999f5A8C84f28a033f) | [0x4e1494475048fa155F1D837B6bD51458bD170f48](https://etherscan.io/address/0x4e1494475048fa155F1D837B6bD51458bD170f48) | +| variableRateSlope1 | 5.5 % | 12.5 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=600000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=undefined) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=600000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=undefined) | + +#### USDT ([0xdAC17F958D2ee523a2206206994597C13D831ec7](https://etherscan.io/address/0xdAC17F958D2ee523a2206206994597C13D831ec7)) + +| description | value before | value after | +| --- | --- | --- | +| interestRateStrategy | [0xa8850b94E4A0B881c3b08aE065D189D87F34F175](https://etherscan.io/address/0xa8850b94E4A0B881c3b08aE065D189D87F34F175) | [0x869eF970878F96c130E14B46B024D2ca18b5b762](https://etherscan.io/address/0x869eF970878F96c130E14B46B024D2ca18b5b762) | +| variableRateSlope1 | 5.5 % | 12.5 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=1000000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=undefined) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=1000000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=undefined) | + +## Raw diff + +```json +{ + "reserves": { + "0x6B175474E89094C44Da98b954EedeAC495271d0F": { + "interestRateStrategy": { + "from": "0xA939B1f36E9a14B044B8149933184a18E0dFC17D", + "to": "0x7011B47A142E2f462AB10F5bDBc8A478310EB0FD" + } + }, + "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48": { + "interestRateStrategy": { + "from": "0x6a8C8119b2BA9460162B8C999f5A8C84f28a033f", + "to": "0x4e1494475048fa155F1D837B6bD51458bD170f48" + } + }, + "0xdAC17F958D2ee523a2206206994597C13D831ec7": { + "interestRateStrategy": { + "from": "0xa8850b94E4A0B881c3b08aE065D189D87F34F175", + "to": "0x869eF970878F96c130E14B46B024D2ca18b5b762" + } + } + }, + "strategies": { + "0x6B175474E89094C44Da98b954EedeAC495271d0F": { + "address": { + "from": "0xA939B1f36E9a14B044B8149933184a18E0dFC17D", + "to": "0x7011B47A142E2f462AB10F5bDBc8A478310EB0FD" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + } + }, + "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48": { + "address": { + "from": "0x6a8C8119b2BA9460162B8C999f5A8C84f28a033f", + "to": "0x4e1494475048fa155F1D837B6bD51458bD170f48" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + } + }, + "0xdAC17F958D2ee523a2206206994597C13D831ec7": { + "address": { + "from": "0xa8850b94E4A0B881c3b08aE065D189D87F34F175", + "to": "0x869eF970878F96c130E14B46B024D2ca18b5b762" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV2Polygon_ReserveFactorUpdatesMidOctober_20241004_before_AaveV2Polygon_ReserveFactorUpdatesMidOctober_20241004_after.md b/diffs/AaveV2Polygon_ReserveFactorUpdatesMidOctober_20241004_before_AaveV2Polygon_ReserveFactorUpdatesMidOctober_20241004_after.md index bc459294d..48e216798 100644 --- a/diffs/AaveV2Polygon_ReserveFactorUpdatesMidOctober_20241004_before_AaveV2Polygon_ReserveFactorUpdatesMidOctober_20241004_after.md +++ b/diffs/AaveV2Polygon_ReserveFactorUpdatesMidOctober_20241004_before_AaveV2Polygon_ReserveFactorUpdatesMidOctober_20241004_after.md @@ -8,7 +8,7 @@ | --- | --- | --- | | interestRateStrategy | [0x79715aB77F637C95a8c28804F56f98946B332851](https://polygonscan.com/address/0x79715aB77F637C95a8c28804F56f98946B332851) | [0xAF5917cFc2F376eCD6c4df91C9AC5965Beaf5AfA](https://polygonscan.com/address/0xAF5917cFc2F376eCD6c4df91C9AC5965Beaf5AfA) | | variableRateSlope1 | 11.25 % | 12 % | -| interestRate | ![before](/.assets/6915e7063266167ef15bdb78b210c78b61a3ee71.svg) | ![after](/.assets/677bb3d52a3dee35bd995572dcfcda026d303815.svg) | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=112500000000000000000000000&variableRateSlope2=1340000000000000000000000000&optimalUsageRatio=480000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=undefined) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=120000000000000000000000000&variableRateSlope2=1340000000000000000000000000&optimalUsageRatio=480000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=undefined) | #### WBTC ([0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6](https://polygonscan.com/address/0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6)) @@ -16,7 +16,7 @@ | --- | --- | --- | | interestRateStrategy | [0xbbEA829b9E104733Cf69b6e96E7Ff810cBcfae38](https://polygonscan.com/address/0xbbEA829b9E104733Cf69b6e96E7Ff810cBcfae38) | [0x3465528BE493a61629234C259b62b9539817d8e7](https://polygonscan.com/address/0x3465528BE493a61629234C259b62b9539817d8e7) | | variableRateSlope1 | 9.25 % | 10 % | -| interestRate | ![before](/.assets/6650d384c2b8469b66743178da45ac5b7d37de2c.svg) | ![after](/.assets/6efc2be6d186d0f9ec95cd884ac9775e328507e7.svg) | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=92500000000000000000000000&variableRateSlope2=1340000000000000000000000000&optimalUsageRatio=370000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=undefined) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=100000000000000000000000000&variableRateSlope2=1340000000000000000000000000&optimalUsageRatio=370000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=undefined) | #### USDC ([0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174](https://polygonscan.com/address/0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174)) @@ -24,7 +24,7 @@ | --- | --- | --- | | interestRateStrategy | [0xf98258ea0C095157c2c390E9f6d914847d7fbACf](https://polygonscan.com/address/0xf98258ea0C095157c2c390E9f6d914847d7fbACf) | [0x4309B0d719a0Dfb526EE9C0E58b77635B2971cC4](https://polygonscan.com/address/0x4309B0d719a0Dfb526EE9C0E58b77635B2971cC4) | | variableRateSlope1 | 14.25 % | 15 % | -| interestRate | ![before](/.assets/dfecd97a09cb209cb661ea90b029bd58db92a066.svg) | ![after](/.assets/b747c0090de2cc213d7d5ef6dc8d35034bd6fabe.svg) | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=142500000000000000000000000&variableRateSlope2=1340000000000000000000000000&optimalUsageRatio=770000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=undefined) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=150000000000000000000000000&variableRateSlope2=1340000000000000000000000000&optimalUsageRatio=770000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=undefined) | #### WETH ([0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619](https://polygonscan.com/address/0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619)) @@ -32,7 +32,7 @@ | --- | --- | --- | | interestRateStrategy | [0x9C9f4C39952848FBA513d44B356c7855F504B1cd](https://polygonscan.com/address/0x9C9f4C39952848FBA513d44B356c7855F504B1cd) | [0xd141820D89840C9A3b0AE46c041D70B98F15928F](https://polygonscan.com/address/0xd141820D89840C9A3b0AE46c041D70B98F15928F) | | variableRateSlope1 | 9.25 % | 10 % | -| interestRate | ![before](/.assets/6f7a87524bb74b6a49faabc68d32cf5bb1e16899.svg) | ![after](/.assets/6975d921b3c041277e54308467fc64285fc75196.svg) | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=92500000000000000000000000&variableRateSlope2=1340000000000000000000000000&optimalUsageRatio=400000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=undefined) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=100000000000000000000000000&variableRateSlope2=1340000000000000000000000000&optimalUsageRatio=400000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=undefined) | #### DAI ([0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063](https://polygonscan.com/address/0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063)) @@ -40,7 +40,7 @@ | --- | --- | --- | | interestRateStrategy | [0x5c9B09Bb260BCa51f4C5476013eE5949F2C4f397](https://polygonscan.com/address/0x5c9B09Bb260BCa51f4C5476013eE5949F2C4f397) | [0xDa6b70b725404A0c6bb116B1584fb88Eb7d7ED6d](https://polygonscan.com/address/0xDa6b70b725404A0c6bb116B1584fb88Eb7d7ED6d) | | variableRateSlope1 | 14.25 % | 15 % | -| interestRate | ![before](/.assets/1cc370116b8869617805acb375f6e4ea0388878c.svg) | ![after](/.assets/fe8490c89960dd4c0d4597cb152f4ce0485c673c.svg) | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=142500000000000000000000000&variableRateSlope2=1340000000000000000000000000&optimalUsageRatio=710000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=undefined) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=150000000000000000000000000&variableRateSlope2=1340000000000000000000000000&optimalUsageRatio=710000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=undefined) | #### USDT ([0xc2132D05D31c914a87C6611C10748AEb04B58e8F](https://polygonscan.com/address/0xc2132D05D31c914a87C6611C10748AEb04B58e8F)) @@ -48,7 +48,7 @@ | --- | --- | --- | | interestRateStrategy | [0xDC220F1d8EA6910BDBbb48c4AdFb7cE565500D08](https://polygonscan.com/address/0xDC220F1d8EA6910BDBbb48c4AdFb7cE565500D08) | [0xAb85FD7DCBFdD40e822321DAc4D5fD3cf08b2542](https://polygonscan.com/address/0xAb85FD7DCBFdD40e822321DAc4D5fD3cf08b2542) | | variableRateSlope1 | 14.25 % | 15 % | -| interestRate | ![before](/.assets/97e2d5a39dbc577e317098062838a03c4c79b1a5.svg) | ![after](/.assets/91fc38e72a46271f6e68f56fa46bf6c3060ae70a.svg) | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=142500000000000000000000000&variableRateSlope2=1340000000000000000000000000&optimalUsageRatio=520000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=undefined) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=150000000000000000000000000&variableRateSlope2=1340000000000000000000000000&optimalUsageRatio=520000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=undefined) | ## Raw diff diff --git a/diffs/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118_before_AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118_after.md b/diffs/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118_before_AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118_before_AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3Arbitrum_FluidAlignment_20241127_before_AaveV3Arbitrum_FluidAlignment_20241127_after.md b/diffs/AaveV3Arbitrum_FluidAlignment_20241127_before_AaveV3Arbitrum_FluidAlignment_20241127_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Arbitrum_FluidAlignment_20241127_before_AaveV3Arbitrum_FluidAlignment_20241127_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021_before_AaveV3Arbitrum_GHOCCIP150Upgrade_20241021_after.md b/diffs/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021_before_AaveV3Arbitrum_GHOCCIP150Upgrade_20241021_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021_before_AaveV3Arbitrum_GHOCCIP150Upgrade_20241021_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_before_AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_after.md b/diffs/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_before_AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_before_AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3Arbitrum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3Arbitrum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md b/diffs/AaveV3Arbitrum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3Arbitrum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md new file mode 100644 index 000000000..b3c332bf2 --- /dev/null +++ b/diffs/AaveV3Arbitrum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3Arbitrum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md @@ -0,0 +1,173 @@ +## Reserve changes + +### Reserve altered + +#### FRAX ([0x17FC002b466eEc40DaE837Fc4bE5c67993ddBd6F](https://arbiscan.io/address/0x17FC002b466eEc40DaE837Fc4bE5c67993ddBd6F)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 80.5 % | 52.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 75 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=805000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=525000000000000000000000000) | + +#### GHO ([0x7dfF72693f6A4149b17e7C6314655f6A9F7c8B33](https://arbiscan.io/address/0x7dfF72693f6A4149b17e7C6314655f6A9F7c8B33)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 77 % | 52.5 % | +| variableRateSlope1 | 12 % | 12.5 % | +| variableRateSlope2 | 65 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=120000000000000000000000000&variableRateSlope2=650000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=770000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=525000000000000000000000000) | + +#### LUSD ([0x93b346b6BC2548dA6A1E7d98E9a421B42541425b](https://arbiscan.io/address/0x93b346b6BC2548dA6A1E7d98E9a421B42541425b)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 92.5 % | 62.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 87 % | 50 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=870000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=925000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=500000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=625000000000000000000000000) | + +#### DAI ([0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1](https://arbiscan.io/address/0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 80.5 % | 52.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 75 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=805000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=525000000000000000000000000) | + +#### USDC ([0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8](https://arbiscan.io/address/0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 86.5 % | 53.5 % | +| variableRateSlope1 | 6.5 % | 13.5 % | +| variableRateSlope2 | 80 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=65000000000000000000000000&variableRateSlope2=800000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=865000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=135000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=535000000000000000000000000) | + +#### USDT ([0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9](https://arbiscan.io/address/0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 80.5 % | 52.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 75 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=805000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=525000000000000000000000000) | + +#### USDC ([0xaf88d065e77c8cC2239327C5EDb3A432268e5831](https://arbiscan.io/address/0xaf88d065e77c8cC2239327C5EDb3A432268e5831)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 65.5 % | 52.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 60 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=600000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=655000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=525000000000000000000000000) | + +## Raw diff + +```json +{ + "strategies": { + "0x17FC002b466eEc40DaE837Fc4bE5c67993ddBd6F": { + "maxVariableBorrowRate": { + "from": "805000000000000000000000000", + "to": "525000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "750000000000000000000000000", + "to": "400000000000000000000000000" + } + }, + "0x7dfF72693f6A4149b17e7C6314655f6A9F7c8B33": { + "maxVariableBorrowRate": { + "from": "770000000000000000000000000", + "to": "525000000000000000000000000" + }, + "variableRateSlope1": { + "from": "120000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "650000000000000000000000000", + "to": "400000000000000000000000000" + } + }, + "0x93b346b6BC2548dA6A1E7d98E9a421B42541425b": { + "maxVariableBorrowRate": { + "from": "925000000000000000000000000", + "to": "625000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "870000000000000000000000000", + "to": "500000000000000000000000000" + } + }, + "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1": { + "maxVariableBorrowRate": { + "from": "805000000000000000000000000", + "to": "525000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "750000000000000000000000000", + "to": "400000000000000000000000000" + } + }, + "0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8": { + "maxVariableBorrowRate": { + "from": "865000000000000000000000000", + "to": "535000000000000000000000000" + }, + "variableRateSlope1": { + "from": "65000000000000000000000000", + "to": "135000000000000000000000000" + }, + "variableRateSlope2": { + "from": "800000000000000000000000000", + "to": "400000000000000000000000000" + } + }, + "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9": { + "maxVariableBorrowRate": { + "from": "805000000000000000000000000", + "to": "525000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "750000000000000000000000000", + "to": "400000000000000000000000000" + } + }, + "0xaf88d065e77c8cC2239327C5EDb3A432268e5831": { + "maxVariableBorrowRate": { + "from": "655000000000000000000000000", + "to": "525000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "600000000000000000000000000", + "to": "400000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Arbitrum_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Arbitrum_ReserveFactorUpdatesMidOctober_20241004_after.md b/diffs/AaveV3Arbitrum_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Arbitrum_ReserveFactorUpdatesMidOctober_20241004_after.md index fc7691ef3..b2c9dd2af 100644 --- a/diffs/AaveV3Arbitrum_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Arbitrum_ReserveFactorUpdatesMidOctober_20241004_after.md +++ b/diffs/AaveV3Arbitrum_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Arbitrum_ReserveFactorUpdatesMidOctober_20241004_after.md @@ -9,8 +9,6 @@ | reserveFactor | 45 % [4500] | 50 % [5000] | -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113_before_AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113_after.md b/diffs/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113_before_AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113_after.md new file mode 100644 index 000000000..5bfdf16e1 --- /dev/null +++ b/diffs/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113_before_AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113_after.md @@ -0,0 +1,48 @@ +## Reserve changes + +### Reserve altered + +#### LUSD ([0x93b346b6BC2548dA6A1E7d98E9a421B42541425b](https://arbiscan.io/address/0x93b346b6BC2548dA6A1E7d98E9a421B42541425b)) + +| description | value before | value after | +| --- | --- | --- | +| aTokenUnderlyingBalance | 106,435.1469 LUSD [106435146991153500610108] | 92,219.4613 LUSD [92219461394279151682363] | +| virtualBalance | 106,434.9878 LUSD [106434987881929276913954] | 92,219.3022 LUSD [92219302285054927986209] | + + +#### USDC ([0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8](https://arbiscan.io/address/0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8)) + +| description | value before | value after | +| --- | --- | --- | +| aTokenUnderlyingBalance | 523,273.5575 USDC [523273557554] | 471,041.9823 USDC [471041982302] | +| virtualBalance | 523,161.0279 USDC [523161027996] | 470,929.4527 USDC [470929452744] | + + +## Raw diff + +```json +{ + "reserves": { + "0x93b346b6BC2548dA6A1E7d98E9a421B42541425b": { + "aTokenUnderlyingBalance": { + "from": "106435146991153500610108", + "to": "92219461394279151682363" + }, + "virtualBalance": { + "from": "106434987881929276913954", + "to": "92219302285054927986209" + } + }, + "0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8": { + "aTokenUnderlyingBalance": { + "from": "523273557554", + "to": "471041982302" + }, + "virtualBalance": { + "from": "523161027996", + "to": "470929452744" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Arbitrum_UpdateLegacyGuardian_20241016_before_AaveV3Arbitrum_UpdateLegacyGuardian_20241016_after.md b/diffs/AaveV3Arbitrum_UpdateLegacyGuardian_20241016_before_AaveV3Arbitrum_UpdateLegacyGuardian_20241016_after.md index dbd03dce4..c15d3e2bc 100644 --- a/diffs/AaveV3Arbitrum_UpdateLegacyGuardian_20241016_before_AaveV3Arbitrum_UpdateLegacyGuardian_20241016_after.md +++ b/diffs/AaveV3Arbitrum_UpdateLegacyGuardian_20241016_before_AaveV3Arbitrum_UpdateLegacyGuardian_20241016_after.md @@ -1,5 +1,3 @@ -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3Arbitrum_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3Arbitrum_UpdatePriceCapAdaptersCAPO_20241101_after.md b/diffs/AaveV3Arbitrum_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3Arbitrum_UpdatePriceCapAdaptersCAPO_20241101_after.md new file mode 100644 index 000000000..5918bcd87 --- /dev/null +++ b/diffs/AaveV3Arbitrum_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3Arbitrum_UpdatePriceCapAdaptersCAPO_20241101_after.md @@ -0,0 +1,103 @@ +## Reserve changes + +### Reserve altered + +#### FRAX ([0x17FC002b466eEc40DaE837Fc4bE5c67993ddBd6F](https://arbiscan.io/address/0x17FC002b466eEc40DaE837Fc4bE5c67993ddBd6F)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x06919EB75Bd6BA817D38CC70C1CA588ac7a01C10](https://arbiscan.io/address/0x06919EB75Bd6BA817D38CC70C1CA588ac7a01C10) | [0xC1d2Faa98935eA2f2eD34Bc84edb00B387061376](https://arbiscan.io/address/0xC1d2Faa98935eA2f2eD34Bc84edb00B387061376) | + + +#### MAI ([0x3F56e0c36d275367b8C502090EDF38289b3dEa0d](https://arbiscan.io/address/0x3F56e0c36d275367b8C502090EDF38289b3dEa0d)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x7a7cE08a1057723CCEDeA2462407427Ae33FFEb2](https://arbiscan.io/address/0x7a7cE08a1057723CCEDeA2462407427Ae33FFEb2) | [0xAF92b0A685a15F4E26B6d7DA86F1a9C8C01E2a09](https://arbiscan.io/address/0xAF92b0A685a15F4E26B6d7DA86F1a9C8C01E2a09) | + + +#### LUSD ([0x93b346b6BC2548dA6A1E7d98E9a421B42541425b](https://arbiscan.io/address/0x93b346b6BC2548dA6A1E7d98E9a421B42541425b)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x341B110bDF665A20F0D5f84A92FcAF5EbeEBC629](https://arbiscan.io/address/0x341B110bDF665A20F0D5f84A92FcAF5EbeEBC629) | [0xc8b3e2776260c7e7A9C158a2344776e65E10ceE8](https://arbiscan.io/address/0xc8b3e2776260c7e7A9C158a2344776e65E10ceE8) | + + +#### DAI ([0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1](https://arbiscan.io/address/0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x4a838a3Dac6633bB1fd932B6f356DecFCAf7803D](https://arbiscan.io/address/0x4a838a3Dac6633bB1fd932B6f356DecFCAf7803D) | [0x9F221bfD2d3F226b187d4419b49117aD7E698977](https://arbiscan.io/address/0x9F221bfD2d3F226b187d4419b49117aD7E698977) | + + +#### USDC ([0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8](https://arbiscan.io/address/0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0xDe25a88F87FEd9F8999fAbF6729dCB121893623C](https://arbiscan.io/address/0xDe25a88F87FEd9F8999fAbF6729dCB121893623C) | [0x6200A5122Af8D5D9e69f4d526311Cd85241ACeC9](https://arbiscan.io/address/0x6200A5122Af8D5D9e69f4d526311Cd85241ACeC9) | + + +#### USDT ([0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9](https://arbiscan.io/address/0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x84dC1C52D7C340AA54B4e8799FBB31C3D28E67aD](https://arbiscan.io/address/0x84dC1C52D7C340AA54B4e8799FBB31C3D28E67aD) | [0x476494a850eec47301F74C8c9c2652495c47C56c](https://arbiscan.io/address/0x476494a850eec47301F74C8c9c2652495c47C56c) | + + +#### USDC ([0xaf88d065e77c8cC2239327C5EDb3A432268e5831](https://arbiscan.io/address/0xaf88d065e77c8cC2239327C5EDb3A432268e5831)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0xDe25a88F87FEd9F8999fAbF6729dCB121893623C](https://arbiscan.io/address/0xDe25a88F87FEd9F8999fAbF6729dCB121893623C) | [0x6200A5122Af8D5D9e69f4d526311Cd85241ACeC9](https://arbiscan.io/address/0x6200A5122Af8D5D9e69f4d526311Cd85241ACeC9) | + + +## Raw diff + +```json +{ + "reserves": { + "0x17FC002b466eEc40DaE837Fc4bE5c67993ddBd6F": { + "oracle": { + "from": "0x06919EB75Bd6BA817D38CC70C1CA588ac7a01C10", + "to": "0xC1d2Faa98935eA2f2eD34Bc84edb00B387061376" + } + }, + "0x3F56e0c36d275367b8C502090EDF38289b3dEa0d": { + "oracle": { + "from": "0x7a7cE08a1057723CCEDeA2462407427Ae33FFEb2", + "to": "0xAF92b0A685a15F4E26B6d7DA86F1a9C8C01E2a09" + } + }, + "0x93b346b6BC2548dA6A1E7d98E9a421B42541425b": { + "oracle": { + "from": "0x341B110bDF665A20F0D5f84A92FcAF5EbeEBC629", + "to": "0xc8b3e2776260c7e7A9C158a2344776e65E10ceE8" + } + }, + "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1": { + "oracle": { + "from": "0x4a838a3Dac6633bB1fd932B6f356DecFCAf7803D", + "to": "0x9F221bfD2d3F226b187d4419b49117aD7E698977" + } + }, + "0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8": { + "oracle": { + "from": "0xDe25a88F87FEd9F8999fAbF6729dCB121893623C", + "to": "0x6200A5122Af8D5D9e69f4d526311Cd85241ACeC9" + } + }, + "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9": { + "oracle": { + "from": "0x84dC1C52D7C340AA54B4e8799FBB31C3D28E67aD", + "to": "0x476494a850eec47301F74C8c9c2652495c47C56c" + } + }, + "0xaf88d065e77c8cC2239327C5EDb3A432268e5831": { + "oracle": { + "from": "0xDe25a88F87FEd9F8999fAbF6729dCB121893623C", + "to": "0x6200A5122Af8D5D9e69f4d526311Cd85241ACeC9" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120_before_AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120_after.md b/diffs/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120_before_AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120_after.md new file mode 100644 index 000000000..9d00eda70 --- /dev/null +++ b/diffs/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120_before_AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120_after.md @@ -0,0 +1,44 @@ +## Reserve changes + +### Reserves altered + +#### WBTC ([0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f](https://arbiscan.io/address/0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f)) + +| description | value before | value after | +| --- | --- | --- | +| reserveFactor | 20 % [2000] | 50 % [5000] | +| optimalUsageRatio | 45 % | 80 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=40000000000000000000000000&variableRateSlope2=3000000000000000000000000000&optimalUsageRatio=450000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=3040000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=40000000000000000000000000&variableRateSlope2=3000000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=3040000000000000000000000000) | + +## Emodes changed + +### EMode: Stablecoins(id: 1) + + + +### EMode: ETH correlated(id: 2) + + + +## Raw diff + +```json +{ + "reserves": { + "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f": { + "reserveFactor": { + "from": 2000, + "to": 5000 + } + } + }, + "strategies": { + "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f": { + "optimalUsageRatio": { + "from": "450000000000000000000000000", + "to": "800000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Avalanche_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3Avalanche_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md b/diffs/AaveV3Avalanche_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3Avalanche_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md new file mode 100644 index 000000000..25cae27b5 --- /dev/null +++ b/diffs/AaveV3Avalanche_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3Avalanche_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md @@ -0,0 +1,104 @@ +## Reserve changes + +### Reserve altered + +#### USDt ([0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7](https://snowtrace.io/address/0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 80.5 % | 52.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 75 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=805000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=525000000000000000000000000) | + +#### USDC ([0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E](https://snowtrace.io/address/0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 65.5 % | 52.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 60 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=600000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=655000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=525000000000000000000000000) | + +#### FRAX ([0xD24C2Ad096400B6FBcd2ad8B24E7acBc21A1da64](https://snowtrace.io/address/0xD24C2Ad096400B6FBcd2ad8B24E7acBc21A1da64)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 80.5 % | 52.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 75 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=805000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=525000000000000000000000000) | + +#### DAI.e ([0xd586E7F844cEa2F87f50152665BCbc2C279D8d70](https://snowtrace.io/address/0xd586E7F844cEa2F87f50152665BCbc2C279D8d70)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 80.5 % | 52.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 75 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=805000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=525000000000000000000000000) | + +## Raw diff + +```json +{ + "strategies": { + "0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7": { + "maxVariableBorrowRate": { + "from": "805000000000000000000000000", + "to": "525000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "750000000000000000000000000", + "to": "400000000000000000000000000" + } + }, + "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E": { + "maxVariableBorrowRate": { + "from": "655000000000000000000000000", + "to": "525000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "600000000000000000000000000", + "to": "400000000000000000000000000" + } + }, + "0xD24C2Ad096400B6FBcd2ad8B24E7acBc21A1da64": { + "maxVariableBorrowRate": { + "from": "805000000000000000000000000", + "to": "525000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "750000000000000000000000000", + "to": "400000000000000000000000000" + } + }, + "0xd586E7F844cEa2F87f50152665BCbc2C279D8d70": { + "maxVariableBorrowRate": { + "from": "805000000000000000000000000", + "to": "525000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "750000000000000000000000000", + "to": "400000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Avalanche_OnboardAUSD_20241125_before_AaveV3Avalanche_OnboardAUSD_20241125_after.md b/diffs/AaveV3Avalanche_OnboardAUSD_20241125_before_AaveV3Avalanche_OnboardAUSD_20241125_after.md new file mode 100644 index 000000000..55f375ec8 --- /dev/null +++ b/diffs/AaveV3Avalanche_OnboardAUSD_20241125_before_AaveV3Avalanche_OnboardAUSD_20241125_after.md @@ -0,0 +1,112 @@ +## Reserve changes + +### Reserves added + +#### AUSD ([0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a](https://snowtrace.io/address/0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a)) + +| description | value | +| --- | --- | +| decimals | 6 | +| isActive | true | +| isFrozen | false | +| supplyCap | 19,000,000 AUSD | +| borrowCap | 17,400,000 AUSD | +| debtCeiling | 0 $ [0] | +| isSiloed | false | +| isFlashloanable | true | +| oracle | [0x83f32c0882B12Ef16214c417efF11FD9e764bf34](https://snowtrace.io/address/0x83f32c0882B12Ef16214c417efF11FD9e764bf34) | +| oracleDecimals | 8 | +| oracleDescription | Capped AUSD / USD | +| oracleLatestAnswer | 0.99925546 | +| usageAsCollateralEnabled | false | +| ltv | 0 % [0] | +| liquidationThreshold | 0 % [0] | +| liquidationBonus | 0 % | +| liquidationProtocolFee | 0 % [0] | +| reserveFactor | 10 % [1000] | +| aToken | [0x724dc807b04555b71ed48a6896b6F41593b8C637](https://snowtrace.io/address/0x724dc807b04555b71ed48a6896b6F41593b8C637) | +| aTokenImpl | [0x1E81af09001aD208BDa68FF022544dB2102A752d](https://snowtrace.io/address/0x1E81af09001aD208BDa68FF022544dB2102A752d) | +| variableDebtToken | [0xDC1fad70953Bb3918592b6fCc374fe05F5811B6a](https://snowtrace.io/address/0xDC1fad70953Bb3918592b6fCc374fe05F5811B6a) | +| variableDebtTokenImpl | [0xa0d9C1E9E48Ca30c8d8C3B5D69FF5dc1f6DFfC24](https://snowtrace.io/address/0xa0d9C1E9E48Ca30c8d8C3B5D69FF5dc1f6DFfC24) | +| borrowingEnabled | true | +| isBorrowableInIsolation | false | +| interestRateStrategy | [0xCe1C5509f2f4d755aA64B8D135B15ec6F12a93da](https://snowtrace.io/address/0xCe1C5509f2f4d755aA64B8D135B15ec6F12a93da) | +| aTokenName | Aave Avalanche AUSD | +| aTokenSymbol | aAvaAUSD | +| aTokenUnderlyingBalance | 100 AUSD [100000000] | +| id | 12 | +| isPaused | false | +| variableDebtTokenName | Aave Avalanche Variable Debt AUSD | +| variableDebtTokenSymbol | variableDebtAvaAUSD | +| virtualAccountingActive | true | +| virtualBalance | 100 AUSD [100000000] | +| optimalUsageRatio | 90 % | +| maxVariableBorrowRate | 80.5 % | +| baseVariableBorrowRate | 0 % | +| variableRateSlope1 | 5.5 % | +| variableRateSlope2 | 75 % | +| interestRate | ![ir](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=805000000000000000000000000) | + + +## Raw diff + +```json +{ + "reserves": { + "0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a": { + "from": null, + "to": { + "aToken": "0x724dc807b04555b71ed48a6896b6F41593b8C637", + "aTokenImpl": "0x1E81af09001aD208BDa68FF022544dB2102A752d", + "aTokenName": "Aave Avalanche AUSD", + "aTokenSymbol": "aAvaAUSD", + "aTokenUnderlyingBalance": "100000000", + "borrowCap": 17400000, + "borrowingEnabled": true, + "debtCeiling": 0, + "decimals": 6, + "id": 12, + "interestRateStrategy": "0xCe1C5509f2f4d755aA64B8D135B15ec6F12a93da", + "isActive": true, + "isBorrowableInIsolation": false, + "isFlashloanable": true, + "isFrozen": false, + "isPaused": false, + "isSiloed": false, + "liquidationBonus": 0, + "liquidationProtocolFee": 0, + "liquidationThreshold": 0, + "ltv": 0, + "oracle": "0x83f32c0882B12Ef16214c417efF11FD9e764bf34", + "oracleDecimals": 8, + "oracleDescription": "Capped AUSD / USD", + "oracleLatestAnswer": "99925546", + "reserveFactor": 1000, + "supplyCap": 19000000, + "symbol": "AUSD", + "underlying": "0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a", + "usageAsCollateralEnabled": false, + "variableDebtToken": "0xDC1fad70953Bb3918592b6fCc374fe05F5811B6a", + "variableDebtTokenImpl": "0xa0d9C1E9E48Ca30c8d8C3B5D69FF5dc1f6DFfC24", + "variableDebtTokenName": "Aave Avalanche Variable Debt AUSD", + "variableDebtTokenSymbol": "variableDebtAvaAUSD", + "virtualAccountingActive": true, + "virtualBalance": "100000000" + } + } + }, + "strategies": { + "0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a": { + "from": null, + "to": { + "address": "0xCe1C5509f2f4d755aA64B8D135B15ec6F12a93da", + "baseVariableBorrowRate": "0", + "maxVariableBorrowRate": "805000000000000000000000000", + "optimalUsageRatio": "900000000000000000000000000", + "variableRateSlope1": "55000000000000000000000000", + "variableRateSlope2": "750000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Avalanche_UpdateLegacyGuardian_20241016_before_AaveV3Avalanche_UpdateLegacyGuardian_20241016_after.md b/diffs/AaveV3Avalanche_UpdateLegacyGuardian_20241016_before_AaveV3Avalanche_UpdateLegacyGuardian_20241016_after.md index dbd03dce4..c15d3e2bc 100644 --- a/diffs/AaveV3Avalanche_UpdateLegacyGuardian_20241016_before_AaveV3Avalanche_UpdateLegacyGuardian_20241016_after.md +++ b/diffs/AaveV3Avalanche_UpdateLegacyGuardian_20241016_before_AaveV3Avalanche_UpdateLegacyGuardian_20241016_after.md @@ -1,5 +1,3 @@ -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3Avalanche_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3Avalanche_UpdatePriceCapAdaptersCAPO_20241101_after.md b/diffs/AaveV3Avalanche_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3Avalanche_UpdatePriceCapAdaptersCAPO_20241101_after.md new file mode 100644 index 000000000..9d689fe90 --- /dev/null +++ b/diffs/AaveV3Avalanche_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3Avalanche_UpdatePriceCapAdaptersCAPO_20241101_after.md @@ -0,0 +1,77 @@ +## Reserve changes + +### Reserve altered + +#### MAI ([0x5c49b268c9841AFF1Cc3B0a418ff5c3442eE3F3b](https://snowtrace.io/address/0x5c49b268c9841AFF1Cc3B0a418ff5c3442eE3F3b)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0xCcC55Db26B78a19Dba1beE0066F9c1665575439A](https://snowtrace.io/address/0xCcC55Db26B78a19Dba1beE0066F9c1665575439A) | [0x85142981C14D98a4B69B04225ca74b764648D443](https://snowtrace.io/address/0x85142981C14D98a4B69B04225ca74b764648D443) | + + +#### USDt ([0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7](https://snowtrace.io/address/0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x39185f2236A6022b682e8BB93C040d125DA093CF](https://snowtrace.io/address/0x39185f2236A6022b682e8BB93C040d125DA093CF) | [0x5b7810a910B4a878AaA4800a824E5E5796838009](https://snowtrace.io/address/0x5b7810a910B4a878AaA4800a824E5E5796838009) | + + +#### USDC ([0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E](https://snowtrace.io/address/0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0xD8277249e871BE9A402fa286C2C5ec16046dC512](https://snowtrace.io/address/0xD8277249e871BE9A402fa286C2C5ec16046dC512) | [0xb0D7A8bbDcdb1203850b742bB4d7f57a1F1C8483](https://snowtrace.io/address/0xb0D7A8bbDcdb1203850b742bB4d7f57a1F1C8483) | + + +#### FRAX ([0xD24C2Ad096400B6FBcd2ad8B24E7acBc21A1da64](https://snowtrace.io/address/0xD24C2Ad096400B6FBcd2ad8B24E7acBc21A1da64)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x6208576378D06ce69A27987b7A524A9B15d499a4](https://snowtrace.io/address/0x6208576378D06ce69A27987b7A524A9B15d499a4) | [0x0b7c356de5E68A8A257fcD23Ac1e8204D753A6fb](https://snowtrace.io/address/0x0b7c356de5E68A8A257fcD23Ac1e8204D753A6fb) | + + +#### DAI.e ([0xd586E7F844cEa2F87f50152665BCbc2C279D8d70](https://snowtrace.io/address/0xd586E7F844cEa2F87f50152665BCbc2C279D8d70)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0xf82da795727633aFA9BB0f1B08A87c0F6A38723f](https://snowtrace.io/address/0xf82da795727633aFA9BB0f1B08A87c0F6A38723f) | [0x0b47c51CCD4FaDe1D93C750bFCAB0a5ce8734ED0](https://snowtrace.io/address/0x0b47c51CCD4FaDe1D93C750bFCAB0a5ce8734ED0) | + + +## Raw diff + +```json +{ + "reserves": { + "0x5c49b268c9841AFF1Cc3B0a418ff5c3442eE3F3b": { + "oracle": { + "from": "0xCcC55Db26B78a19Dba1beE0066F9c1665575439A", + "to": "0x85142981C14D98a4B69B04225ca74b764648D443" + } + }, + "0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7": { + "oracle": { + "from": "0x39185f2236A6022b682e8BB93C040d125DA093CF", + "to": "0x5b7810a910B4a878AaA4800a824E5E5796838009" + } + }, + "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E": { + "oracle": { + "from": "0xD8277249e871BE9A402fa286C2C5ec16046dC512", + "to": "0xb0D7A8bbDcdb1203850b742bB4d7f57a1F1C8483" + } + }, + "0xD24C2Ad096400B6FBcd2ad8B24E7acBc21A1da64": { + "oracle": { + "from": "0x6208576378D06ce69A27987b7A524A9B15d499a4", + "to": "0x0b7c356de5E68A8A257fcD23Ac1e8204D753A6fb" + } + }, + "0xd586E7F844cEa2F87f50152665BCbc2C279D8d70": { + "oracle": { + "from": "0xf82da795727633aFA9BB0f1B08A87c0F6A38723f", + "to": "0x0b47c51CCD4FaDe1D93C750bFCAB0a5ce8734ED0" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3BNB_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3BNB_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md b/diffs/AaveV3BNB_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3BNB_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md new file mode 100644 index 000000000..f43cb2f99 --- /dev/null +++ b/diffs/AaveV3BNB_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3BNB_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md @@ -0,0 +1,81 @@ +## Reserve changes + +### Reserve altered + +#### USDT ([0x55d398326f99059fF775485246999027B3197955](https://bscscan.com/address/0x55d398326f99059fF775485246999027B3197955)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 80.5 % | 52.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 75 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=805000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=525000000000000000000000000) | + +#### USDC ([0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d](https://bscscan.com/address/0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 65.5 % | 52.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 60 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=600000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=655000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=525000000000000000000000000) | + +#### FDUSD ([0xc5f0f7b66764F6ec8C8Dff7BA683102295E16409](https://bscscan.com/address/0xc5f0f7b66764F6ec8C8Dff7BA683102295E16409)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 80.5 % | 52.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 75 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=805000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=525000000000000000000000000) | + +## Raw diff + +```json +{ + "strategies": { + "0x55d398326f99059fF775485246999027B3197955": { + "maxVariableBorrowRate": { + "from": "805000000000000000000000000", + "to": "525000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "750000000000000000000000000", + "to": "400000000000000000000000000" + } + }, + "0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "maxVariableBorrowRate": { + "from": "655000000000000000000000000", + "to": "525000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "600000000000000000000000000", + "to": "400000000000000000000000000" + } + }, + "0xc5f0f7b66764F6ec8C8Dff7BA683102295E16409": { + "maxVariableBorrowRate": { + "from": "805000000000000000000000000", + "to": "525000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "750000000000000000000000000", + "to": "400000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3BNB_OnboardWstETHToAaveV3OnBNBChain_20241030_before_AaveV3BNB_OnboardWstETHToAaveV3OnBNBChain_20241030_after.md b/diffs/AaveV3BNB_OnboardWstETHToAaveV3OnBNBChain_20241030_before_AaveV3BNB_OnboardWstETHToAaveV3OnBNBChain_20241030_after.md index 0e55ef15c..6c56cc6f8 100644 --- a/diffs/AaveV3BNB_OnboardWstETHToAaveV3OnBNBChain_20241030_before_AaveV3BNB_OnboardWstETHToAaveV3OnBNBChain_20241030_after.md +++ b/diffs/AaveV3BNB_OnboardWstETHToAaveV3OnBNBChain_20241030_before_AaveV3BNB_OnboardWstETHToAaveV3OnBNBChain_20241030_after.md @@ -70,8 +70,8 @@ "1": { "from": null, "to": { - "borrowableBitmap": 8, - "collateralBitmap": 128, + "borrowableBitmap": "8", + "collateralBitmap": "128", "eModeCategory": 1, "label": "ETH-Correlated", "liquidationBonus": 10100, @@ -108,7 +108,7 @@ "oracle": "0xc1377B4cdF9116bf7b3d7F72A4f8A7Be8506cE80", "oracleDecimals": 8, "oracleDescription": "Capped wstETH / stETH(ETH) / USD", - "oracleLatestAnswer": 317984965150, + "oracleLatestAnswer": "317984965150", "reserveFactor": 1500, "supplyCap": 1900, "symbol": "wstETH", @@ -128,7 +128,7 @@ "from": null, "to": { "address": "0x86AB1C62A8bf868E1b3E1ab87d587Aba6fbCbDC5", - "baseVariableBorrowRate": 0, + "baseVariableBorrowRate": "0", "maxVariableBorrowRate": "3070000000000000000000000000", "optimalUsageRatio": "450000000000000000000000000", "variableRateSlope1": "70000000000000000000000000", diff --git a/diffs/AaveV3BNB_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3BNB_UpdatePriceCapAdaptersCAPO_20241101_after.md b/diffs/AaveV3BNB_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3BNB_UpdatePriceCapAdaptersCAPO_20241101_after.md new file mode 100644 index 000000000..9783be13e --- /dev/null +++ b/diffs/AaveV3BNB_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3BNB_UpdatePriceCapAdaptersCAPO_20241101_after.md @@ -0,0 +1,51 @@ +## Reserve changes + +### Reserve altered + +#### USDT ([0x55d398326f99059fF775485246999027B3197955](https://bscscan.com/address/0x55d398326f99059fF775485246999027B3197955)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x0F682319Ed4A240b7a2599A48C965049515D9bC3](https://bscscan.com/address/0x0F682319Ed4A240b7a2599A48C965049515D9bC3) | [0xee845A7A40A090Da256420A293803C35B7F436b6](https://bscscan.com/address/0xee845A7A40A090Da256420A293803C35B7F436b6) | + + +#### USDC ([0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d](https://bscscan.com/address/0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0xaFcFF74AE956f4c23c27Db49659D4a7F350415C1](https://bscscan.com/address/0xaFcFF74AE956f4c23c27Db49659D4a7F350415C1) | [0x9102a9553B470dbD0dC74009a870A5886C92902C](https://bscscan.com/address/0x9102a9553B470dbD0dC74009a870A5886C92902C) | + + +#### FDUSD ([0xc5f0f7b66764F6ec8C8Dff7BA683102295E16409](https://bscscan.com/address/0xc5f0f7b66764F6ec8C8Dff7BA683102295E16409)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x60a117Fa5bAbee4d645884fB11E413Da4F893b6D](https://bscscan.com/address/0x60a117Fa5bAbee4d645884fB11E413Da4F893b6D) | [0x72Cb7a00D439296A6fC3c9face9Eca96bfdEf825](https://bscscan.com/address/0x72Cb7a00D439296A6fC3c9face9Eca96bfdEf825) | + + +## Raw diff + +```json +{ + "reserves": { + "0x55d398326f99059fF775485246999027B3197955": { + "oracle": { + "from": "0x0F682319Ed4A240b7a2599A48C965049515D9bC3", + "to": "0xee845A7A40A090Da256420A293803C35B7F436b6" + } + }, + "0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "oracle": { + "from": "0xaFcFF74AE956f4c23c27Db49659D4a7F350415C1", + "to": "0x9102a9553B470dbD0dC74009a870A5886C92902C" + } + }, + "0xc5f0f7b66764F6ec8C8Dff7BA683102295E16409": { + "oracle": { + "from": "0x60a117Fa5bAbee4d645884fB11E413Da4F893b6D", + "to": "0x72Cb7a00D439296A6fC3c9face9Eca96bfdEf825" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118_before_AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118_after.md b/diffs/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118_before_AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118_before_AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3Base_FluidAlignment_20241127_before_AaveV3Base_FluidAlignment_20241127_after.md b/diffs/AaveV3Base_FluidAlignment_20241127_before_AaveV3Base_FluidAlignment_20241127_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Base_FluidAlignment_20241127_before_AaveV3Base_FluidAlignment_20241127_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3Base_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3Base_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md b/diffs/AaveV3Base_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3Base_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md new file mode 100644 index 000000000..c31b306bc --- /dev/null +++ b/diffs/AaveV3Base_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3Base_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md @@ -0,0 +1,58 @@ +## Reserve changes + +### Reserve altered + +#### USDC ([0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913](https://basescan.org/address/0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 65.5 % | 52.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 60 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=600000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=655000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=525000000000000000000000000) | + +#### USDbC ([0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA](https://basescan.org/address/0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 90 % | 53.5 % | +| variableRateSlope1 | 10 % | 13.5 % | +| variableRateSlope2 | 80 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=100000000000000000000000000&variableRateSlope2=800000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=900000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=135000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=535000000000000000000000000) | + +## Raw diff + +```json +{ + "strategies": { + "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913": { + "maxVariableBorrowRate": { + "from": "655000000000000000000000000", + "to": "525000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "600000000000000000000000000", + "to": "400000000000000000000000000" + } + }, + "0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA": { + "maxVariableBorrowRate": { + "from": "900000000000000000000000000", + "to": "535000000000000000000000000" + }, + "variableRateSlope1": { + "from": "100000000000000000000000000", + "to": "135000000000000000000000000" + }, + "variableRateSlope2": { + "from": "800000000000000000000000000", + "to": "400000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Base_IncreaseCbBTCSupplyCaps_20241004_before_AaveV3Base_IncreaseCbBTCSupplyCaps_20241004_after.md b/diffs/AaveV3Base_IncreaseCbBTCSupplyCaps_20241004_before_AaveV3Base_IncreaseCbBTCSupplyCaps_20241004_after.md index 33437d01f..a1f2f6cc1 100644 --- a/diffs/AaveV3Base_IncreaseCbBTCSupplyCaps_20241004_before_AaveV3Base_IncreaseCbBTCSupplyCaps_20241004_after.md +++ b/diffs/AaveV3Base_IncreaseCbBTCSupplyCaps_20241004_before_AaveV3Base_IncreaseCbBTCSupplyCaps_20241004_after.md @@ -9,8 +9,6 @@ | supplyCap | 1,600 cbBTC | 5,000 cbBTC | -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3Base_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Base_ReserveFactorUpdatesMidOctober_20241004_after.md b/diffs/AaveV3Base_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Base_ReserveFactorUpdatesMidOctober_20241004_after.md index 7389a694c..999a5886b 100644 --- a/diffs/AaveV3Base_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Base_ReserveFactorUpdatesMidOctober_20241004_after.md +++ b/diffs/AaveV3Base_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Base_ReserveFactorUpdatesMidOctober_20241004_after.md @@ -9,8 +9,6 @@ | reserveFactor | 45 % [4500] | 50 % [5000] | -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3Base_UpdateLegacyGuardian_20241016_before_AaveV3Base_UpdateLegacyGuardian_20241016_after.md b/diffs/AaveV3Base_UpdateLegacyGuardian_20241016_before_AaveV3Base_UpdateLegacyGuardian_20241016_after.md index dbd03dce4..c15d3e2bc 100644 --- a/diffs/AaveV3Base_UpdateLegacyGuardian_20241016_before_AaveV3Base_UpdateLegacyGuardian_20241016_after.md +++ b/diffs/AaveV3Base_UpdateLegacyGuardian_20241016_before_AaveV3Base_UpdateLegacyGuardian_20241016_after.md @@ -1,5 +1,3 @@ -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3Base_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3Base_UpdatePriceCapAdaptersCAPO_20241101_after.md b/diffs/AaveV3Base_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3Base_UpdatePriceCapAdaptersCAPO_20241101_after.md new file mode 100644 index 000000000..981c0c3f7 --- /dev/null +++ b/diffs/AaveV3Base_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3Base_UpdatePriceCapAdaptersCAPO_20241101_after.md @@ -0,0 +1,38 @@ +## Reserve changes + +### Reserve altered + +#### USDC ([0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913](https://basescan.org/address/0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x978D8878b53Fbe40dab7D4AB47b97AB622FFeF9f](https://basescan.org/address/0x978D8878b53Fbe40dab7D4AB47b97AB622FFeF9f) | [0xfcF82bFa2485253263969167583Ea4de09e9993b](https://basescan.org/address/0xfcF82bFa2485253263969167583Ea4de09e9993b) | + + +#### USDbC ([0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA](https://basescan.org/address/0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x978D8878b53Fbe40dab7D4AB47b97AB622FFeF9f](https://basescan.org/address/0x978D8878b53Fbe40dab7D4AB47b97AB622FFeF9f) | [0xfcF82bFa2485253263969167583Ea4de09e9993b](https://basescan.org/address/0xfcF82bFa2485253263969167583Ea4de09e9993b) | + + +## Raw diff + +```json +{ + "reserves": { + "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913": { + "oracle": { + "from": "0x978D8878b53Fbe40dab7D4AB47b97AB622FFeF9f", + "to": "0xfcF82bFa2485253263969167583Ea4de09e9993b" + } + }, + "0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA": { + "oracle": { + "from": "0x978D8878b53Fbe40dab7D4AB47b97AB622FFeF9f", + "to": "0xfcF82bFa2485253263969167583Ea4de09e9993b" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3EthereumEtherFi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3EthereumEtherFi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md b/diffs/AaveV3EthereumEtherFi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3EthereumEtherFi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md new file mode 100644 index 000000000..a0fd306ae --- /dev/null +++ b/diffs/AaveV3EthereumEtherFi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3EthereumEtherFi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md @@ -0,0 +1,81 @@ +## Reserve changes + +### Reserve altered + +#### PYUSD ([0x6c3ea9036406852006290770BEdFcAbA0e23A0e8](https://etherscan.io/address/0x6c3ea9036406852006290770BEdFcAbA0e23A0e8)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 85.5 % | 52.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 80 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=800000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=855000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=525000000000000000000000000) | + +#### FRAX ([0x853d955aCEf822Db058eb8505911ED77F175b99e](https://etherscan.io/address/0x853d955aCEf822Db058eb8505911ED77F175b99e)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 85.5 % | 52.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 80 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=800000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=855000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=525000000000000000000000000) | + +#### USDC ([0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48](https://etherscan.io/address/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 66.5 % | 52.5 % | +| variableRateSlope1 | 6.5 % | 12.5 % | +| variableRateSlope2 | 60 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=65000000000000000000000000&variableRateSlope2=600000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=665000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=525000000000000000000000000) | + +## Raw diff + +```json +{ + "strategies": { + "0x6c3ea9036406852006290770BEdFcAbA0e23A0e8": { + "maxVariableBorrowRate": { + "from": "855000000000000000000000000", + "to": "525000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "800000000000000000000000000", + "to": "400000000000000000000000000" + } + }, + "0x853d955aCEf822Db058eb8505911ED77F175b99e": { + "maxVariableBorrowRate": { + "from": "855000000000000000000000000", + "to": "525000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "800000000000000000000000000", + "to": "400000000000000000000000000" + } + }, + "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48": { + "maxVariableBorrowRate": { + "from": "665000000000000000000000000", + "to": "525000000000000000000000000" + }, + "variableRateSlope1": { + "from": "65000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "600000000000000000000000000", + "to": "400000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3EthereumEtherFi_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3EthereumEtherFi_UpdatePriceCapAdaptersCAPO_20241101_after.md b/diffs/AaveV3EthereumEtherFi_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3EthereumEtherFi_UpdatePriceCapAdaptersCAPO_20241101_after.md new file mode 100644 index 000000000..2863e03da --- /dev/null +++ b/diffs/AaveV3EthereumEtherFi_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3EthereumEtherFi_UpdatePriceCapAdaptersCAPO_20241101_after.md @@ -0,0 +1,51 @@ +## Reserve changes + +### Reserve altered + +#### PYUSD ([0x6c3ea9036406852006290770BEdFcAbA0e23A0e8](https://etherscan.io/address/0x6c3ea9036406852006290770BEdFcAbA0e23A0e8)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x150bAe7Ce224555D39AfdBc6Cb4B8204E594E022](https://etherscan.io/address/0x150bAe7Ce224555D39AfdBc6Cb4B8204E594E022) | [0x36964C0579D02E0a5AaAb89E24Cf8d7CDF3549EE](https://etherscan.io/address/0x36964C0579D02E0a5AaAb89E24Cf8d7CDF3549EE) | + + +#### FRAX ([0x853d955aCEf822Db058eb8505911ED77F175b99e](https://etherscan.io/address/0x853d955aCEf822Db058eb8505911ED77F175b99e)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x45D270263BBee500CF8adcf2AbC0aC227097b036](https://etherscan.io/address/0x45D270263BBee500CF8adcf2AbC0aC227097b036) | [0xeF50f8DC65402c3019586bc8725fCD0b99B8AAd7](https://etherscan.io/address/0xeF50f8DC65402c3019586bc8725fCD0b99B8AAd7) | + + +#### USDC ([0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48](https://etherscan.io/address/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x736bF902680e68989886e9807CD7Db4B3E015d3C](https://etherscan.io/address/0x736bF902680e68989886e9807CD7Db4B3E015d3C) | [0xB6557F02F0a5dA7b9D3C2d979cc19e00e756F6dA](https://etherscan.io/address/0xB6557F02F0a5dA7b9D3C2d979cc19e00e756F6dA) | + + +## Raw diff + +```json +{ + "reserves": { + "0x6c3ea9036406852006290770BEdFcAbA0e23A0e8": { + "oracle": { + "from": "0x150bAe7Ce224555D39AfdBc6Cb4B8204E594E022", + "to": "0x36964C0579D02E0a5AaAb89E24Cf8d7CDF3549EE" + } + }, + "0x853d955aCEf822Db058eb8505911ED77F175b99e": { + "oracle": { + "from": "0x45D270263BBee500CF8adcf2AbC0aC227097b036", + "to": "0xeF50f8DC65402c3019586bc8725fCD0b99B8AAd7" + } + }, + "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48": { + "oracle": { + "from": "0x736bF902680e68989886e9807CD7Db4B3E015d3C", + "to": "0xB6557F02F0a5dA7b9D3C2d979cc19e00e756F6dA" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV_20241209_before_AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV_20241209_after.md b/diffs/AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV_20241209_before_AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV_20241209_after.md new file mode 100644 index 000000000..042d135bc --- /dev/null +++ b/diffs/AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV_20241209_before_AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV_20241209_after.md @@ -0,0 +1,30 @@ +## Reserve changes + +### Reserves altered + +#### GHO ([0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f](https://etherscan.io/address/0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f)) + +| description | value before | value after | +| --- | --- | --- | +| aTokenUnderlyingBalance | 3,000,000 GHO [3000000000000000000000000] | 5,500,000 GHO [5500000000000000000000000] | +| virtualBalance | 3,000,000 GHO [3000000000000000000000000] | 5,500,000 GHO [5500000000000000000000000] | + + +## Raw diff + +```json +{ + "reserves": { + "0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f": { + "aTokenUnderlyingBalance": { + "from": "3000000000000000000000000", + "to": "5500000000000000000000000" + }, + "virtualBalance": { + "from": "3000000000000000000000000", + "to": "5500000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3EthereumLido_AutomatedAGRSActivation_20241108_before_AaveV3EthereumLido_AutomatedAGRSActivation_20241108_after.md b/diffs/AaveV3EthereumLido_AutomatedAGRSActivation_20241108_before_AaveV3EthereumLido_AutomatedAGRSActivation_20241108_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3EthereumLido_AutomatedAGRSActivation_20241108_before_AaveV3EthereumLido_AutomatedAGRSActivation_20241108_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3EthereumLido_FluidAlignment_20241127_before_AaveV3EthereumLido_FluidAlignment_20241127_after.md b/diffs/AaveV3EthereumLido_FluidAlignment_20241127_before_AaveV3EthereumLido_FluidAlignment_20241127_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3EthereumLido_FluidAlignment_20241127_before_AaveV3EthereumLido_FluidAlignment_20241127_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3EthereumLido_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3EthereumLido_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md b/diffs/AaveV3EthereumLido_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3EthereumLido_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md new file mode 100644 index 000000000..594ba5cdc --- /dev/null +++ b/diffs/AaveV3EthereumLido_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3EthereumLido_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md @@ -0,0 +1,35 @@ +## Reserve changes + +### Reserves altered + +#### USDC ([0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48](https://etherscan.io/address/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 65.5 % | 47.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 60 % | 35 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=600000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=655000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=350000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=475000000000000000000000000) | + +## Raw diff + +```json +{ + "strategies": { + "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48": { + "maxVariableBorrowRate": { + "from": "655000000000000000000000000", + "to": "475000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "600000000000000000000000000", + "to": "350000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_before_AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_after.md b/diffs/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_before_AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_after.md new file mode 100644 index 000000000..8e0549235 --- /dev/null +++ b/diffs/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_before_AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_after.md @@ -0,0 +1,152 @@ +## Reserve changes + +### Reserves added + +#### sUSDe ([0x9D39A5DE30e57443BfF2A8307A4256c8797A3497](https://etherscan.io/address/0x9D39A5DE30e57443BfF2A8307A4256c8797A3497)) + +| description | value | +| --- | --- | +| decimals | 18 | +| isActive | true | +| isFrozen | false | +| supplyCap | 20,000,000 sUSDe | +| borrowCap | 1,000 sUSDe | +| debtCeiling | 0 $ [0] | +| isSiloed | false | +| isFlashloanable | true | +| oracle | [0xb37aE8aBa6C0C1Bf2c509fc06E11aa4AF29B665A](https://etherscan.io/address/0xb37aE8aBa6C0C1Bf2c509fc06E11aa4AF29B665A) | +| oracleDecimals | 8 | +| oracleDescription | Capped sUSDe / USDe / USD | +| oracleLatestAnswer | 1.11869905 | +| usageAsCollateralEnabled | true | +| ltv | 0.05 % [5] | +| liquidationThreshold | 0.1 % [10] | +| liquidationBonus | 7.5 % | +| liquidationProtocolFee | 10 % [1000] | +| reserveFactor | 10 % [1000] | +| aToken | [0xc2015641564a5914A17CB9A92eC8d8feCfa8f2D0](https://etherscan.io/address/0xc2015641564a5914A17CB9A92eC8d8feCfa8f2D0) | +| aTokenImpl | [0x7F8Fc14D462bdF93c681c1f2Fd615389bF969Fb2](https://etherscan.io/address/0x7F8Fc14D462bdF93c681c1f2Fd615389bF969Fb2) | +| variableDebtToken | [0x2ABbAab3EF4e4A899d39e7EC996b5715E76b399a](https://etherscan.io/address/0x2ABbAab3EF4e4A899d39e7EC996b5715E76b399a) | +| variableDebtTokenImpl | [0x3E59212c34588a63350142EFad594a20C88C2CEd](https://etherscan.io/address/0x3E59212c34588a63350142EFad594a20C88C2CEd) | +| borrowingEnabled | false | +| isBorrowableInIsolation | false | +| interestRateStrategy | [0x8958b1C39269167527821f8c276Ef7504883f2fa](https://etherscan.io/address/0x8958b1C39269167527821f8c276Ef7504883f2fa) | +| aTokenName | Aave Ethereum Lido sUSDe | +| aTokenSymbol | aEthLidosUSDe | +| aTokenUnderlyingBalance | 100 sUSDe [100000000000000000000] | +| id | 5 | +| isPaused | false | +| variableDebtTokenName | Aave Ethereum Lido Variable Debt sUSDe | +| variableDebtTokenSymbol | variableDebtEthLidosUSDe | +| virtualAccountingActive | true | +| virtualBalance | 100 sUSDe [100000000000000000000] | +| optimalUsageRatio | 1 % | +| maxVariableBorrowRate | 3.15 % | +| baseVariableBorrowRate | 0.05 % | +| variableRateSlope1 | 0.1 % | +| variableRateSlope2 | 3 % | +| interestRate | ![ir](https://dash.onaave.com/api/static?variableRateSlope1=1000000000000000000000000&variableRateSlope2=30000000000000000000000000&optimalUsageRatio=10000000000000000000000000&baseVariableBorrowRate=500000000000000000000000&maxVariableBorrowRate=31500000000000000000000000) | + + +## Emodes changed + +### EMode: ETH correlated(id: 1) + + + +### EMode: LRT Stablecoins main(id: 2) + + + +### EMode: LRT wstETH main(id: 3) + + + +### EMode: sUSDe Stablecoins(id: 4) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label | - | sUSDe Stablecoins | +| eMode.ltv | - | 90 % | +| eMode.liquidationThreshold | - | 92 % | +| eMode.liquidationBonus | - | 3 % | +| eMode.borrowableBitmap | - | USDS, USDC | +| eMode.collateralBitmap | - | sUSDe | + + +## Raw diff + +```json +{ + "eModes": { + "4": { + "from": null, + "to": { + "borrowableBitmap": "12", + "collateralBitmap": "32", + "eModeCategory": 4, + "label": "sUSDe Stablecoins", + "liquidationBonus": 10300, + "liquidationThreshold": 9200, + "ltv": 9000 + } + } + }, + "reserves": { + "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497": { + "from": null, + "to": { + "aToken": "0xc2015641564a5914A17CB9A92eC8d8feCfa8f2D0", + "aTokenImpl": "0x7F8Fc14D462bdF93c681c1f2Fd615389bF969Fb2", + "aTokenName": "Aave Ethereum Lido sUSDe", + "aTokenSymbol": "aEthLidosUSDe", + "aTokenUnderlyingBalance": "100000000000000000000", + "borrowCap": 1000, + "borrowingEnabled": false, + "debtCeiling": 0, + "decimals": 18, + "id": 5, + "interestRateStrategy": "0x8958b1C39269167527821f8c276Ef7504883f2fa", + "isActive": true, + "isBorrowableInIsolation": false, + "isFlashloanable": true, + "isFrozen": false, + "isPaused": false, + "isSiloed": false, + "liquidationBonus": 10750, + "liquidationProtocolFee": 1000, + "liquidationThreshold": 10, + "ltv": 5, + "oracle": "0xb37aE8aBa6C0C1Bf2c509fc06E11aa4AF29B665A", + "oracleDecimals": 8, + "oracleDescription": "Capped sUSDe / USDe / USD", + "oracleLatestAnswer": "111869905", + "reserveFactor": 1000, + "supplyCap": 20000000, + "symbol": "sUSDe", + "underlying": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "usageAsCollateralEnabled": true, + "variableDebtToken": "0x2ABbAab3EF4e4A899d39e7EC996b5715E76b399a", + "variableDebtTokenImpl": "0x3E59212c34588a63350142EFad594a20C88C2CEd", + "variableDebtTokenName": "Aave Ethereum Lido Variable Debt sUSDe", + "variableDebtTokenSymbol": "variableDebtEthLidosUSDe", + "virtualAccountingActive": true, + "virtualBalance": "100000000000000000000" + } + } + }, + "strategies": { + "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497": { + "from": null, + "to": { + "address": "0x8958b1C39269167527821f8c276Ef7504883f2fa", + "baseVariableBorrowRate": "500000000000000000000000", + "maxVariableBorrowRate": "31500000000000000000000000", + "optimalUsageRatio": "10000000000000000000000000", + "variableRateSlope1": "1000000000000000000000000", + "variableRateSlope2": "30000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3EthereumLido_OnboardEzETHToLidoInstance_20241021_before_AaveV3EthereumLido_OnboardEzETHToLidoInstance_20241021_after.md b/diffs/AaveV3EthereumLido_OnboardEzETHToLidoInstance_20241021_before_AaveV3EthereumLido_OnboardEzETHToLidoInstance_20241021_after.md index 01f3b66ad..b715bb394 100644 --- a/diffs/AaveV3EthereumLido_OnboardEzETHToLidoInstance_20241021_before_AaveV3EthereumLido_OnboardEzETHToLidoInstance_20241021_after.md +++ b/diffs/AaveV3EthereumLido_OnboardEzETHToLidoInstance_20241021_before_AaveV3EthereumLido_OnboardEzETHToLidoInstance_20241021_after.md @@ -45,7 +45,7 @@ | baseVariableBorrowRate | 0 % | | variableRateSlope1 | 7 % | | variableRateSlope2 | 300 % | -| interestRate | ![ir](/.assets/3b30aea0d7ed061d9d9b0eeecb2e4835c7844ba5.svg) | +| interestRate | ![ir](https://dash.onaave.com/api/static?variableRateSlope1=70000000000000000000000000&variableRateSlope2=3000000000000000000000000000&optimalUsageRatio=450000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=3070000000000000000000000000) | ### Reserves altered diff --git a/diffs/AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance_20241104_before_AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance_20241104_after.md b/diffs/AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance_20241104_before_AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance_20241104_after.md new file mode 100644 index 000000000..ce94f0aba --- /dev/null +++ b/diffs/AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance_20241104_before_AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance_20241104_after.md @@ -0,0 +1,158 @@ +## Reserve changes + +### Reserves added + +#### GHO ([0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f](https://etherscan.io/address/0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f)) + +| description | value | +| --- | --- | +| decimals | 18 | +| isActive | true | +| isFrozen | false | +| supplyCap | 20,000,000 GHO | +| borrowCap | 2,500,000 GHO | +| debtCeiling | 0 $ [0] | +| isSiloed | false | +| isFlashloanable | true | +| oracle | [0xD110cac5d8682A3b045D5524a9903E031d70FCCd](https://etherscan.io/address/0xD110cac5d8682A3b045D5524a9903E031d70FCCd) | +| oracleDecimals | 8 | +| oracleLatestAnswer | 1 | +| usageAsCollateralEnabled | false | +| ltv | 0 % [0] | +| liquidationThreshold | 0 % [0] | +| liquidationBonus | 0 % | +| liquidationProtocolFee | 0 % [0] | +| reserveFactor | 10 % [1000] | +| aToken | [0x18eFE565A5373f430e2F809b97De30335B3ad96A](https://etherscan.io/address/0x18eFE565A5373f430e2F809b97De30335B3ad96A) | +| aTokenImpl | [0x7F8Fc14D462bdF93c681c1f2Fd615389bF969Fb2](https://etherscan.io/address/0x7F8Fc14D462bdF93c681c1f2Fd615389bF969Fb2) | +| variableDebtToken | [0x18577F0f4A0B2Ee6F4048dB51c7acd8699F97DB8](https://etherscan.io/address/0x18577F0f4A0B2Ee6F4048dB51c7acd8699F97DB8) | +| variableDebtTokenImpl | [0x3E59212c34588a63350142EFad594a20C88C2CEd](https://etherscan.io/address/0x3E59212c34588a63350142EFad594a20C88C2CEd) | +| borrowingEnabled | true | +| isBorrowableInIsolation | false | +| interestRateStrategy | [0x8958b1C39269167527821f8c276Ef7504883f2fa](https://etherscan.io/address/0x8958b1C39269167527821f8c276Ef7504883f2fa) | +| aTokenName | Aave Ethereum Lido GHO | +| aTokenSymbol | aEthLidoGHO | +| aTokenUnderlyingBalance | 3,000,000 GHO [3000000000000000000000000] | +| id | 6 | +| isPaused | false | +| variableDebtTokenName | Aave Ethereum Lido Variable Debt GHO | +| variableDebtTokenSymbol | variableDebtEthLidoGHO | +| virtualAccountingActive | true | +| virtualBalance | 3,000,000 GHO [3000000000000000000000000] | +| optimalUsageRatio | 92 % | +| maxVariableBorrowRate | 63.5 % | +| baseVariableBorrowRate | 10.5 % | +| variableRateSlope1 | 3 % | +| variableRateSlope2 | 50 % | +| interestRate | ![ir](https://dash.onaave.com/api/static?variableRateSlope1=30000000000000000000000000&variableRateSlope2=500000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=105000000000000000000000000&maxVariableBorrowRate=635000000000000000000000000) | + + +## Emodes changed + +### EMode: ETH correlated(id: 1) + + + +### EMode: LRT Stablecoins main(id: 2) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label (unchanged) | LRT Stablecoins main | LRT Stablecoins main | +| eMode.ltv (unchanged) | 75 % | 75 % | +| eMode.liquidationThreshold (unchanged) | 78 % | 78 % | +| eMode.liquidationBonus (unchanged) | 7.5 % | 7.5 % | +| eMode.borrowableBitmap | USDS | USDS, USDC, GHO | +| eMode.collateralBitmap (unchanged) | ezETH | ezETH | + + +### EMode: LRT wstETH main(id: 3) + + + +### EMode: sUSDe Stablecoins(id: 4) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label (unchanged) | sUSDe Stablecoins | sUSDe Stablecoins | +| eMode.ltv (unchanged) | 90 % | 90 % | +| eMode.liquidationThreshold (unchanged) | 92 % | 92 % | +| eMode.liquidationBonus (unchanged) | 3 % | 3 % | +| eMode.borrowableBitmap | USDS, USDC | USDS, USDC, GHO | +| eMode.collateralBitmap (unchanged) | sUSDe | sUSDe | + + +## Raw diff + +```json +{ + "eModes": { + "2": { + "borrowableBitmap": { + "from": "4", + "to": "76" + } + }, + "4": { + "borrowableBitmap": { + "from": "12", + "to": "76" + } + } + }, + "reserves": { + "0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f": { + "from": null, + "to": { + "aToken": "0x18eFE565A5373f430e2F809b97De30335B3ad96A", + "aTokenImpl": "0x7F8Fc14D462bdF93c681c1f2Fd615389bF969Fb2", + "aTokenName": "Aave Ethereum Lido GHO", + "aTokenSymbol": "aEthLidoGHO", + "aTokenUnderlyingBalance": "3000000000000000000000000", + "borrowCap": 2500000, + "borrowingEnabled": true, + "debtCeiling": 0, + "decimals": 18, + "id": 6, + "interestRateStrategy": "0x8958b1C39269167527821f8c276Ef7504883f2fa", + "isActive": true, + "isBorrowableInIsolation": false, + "isFlashloanable": true, + "isFrozen": false, + "isPaused": false, + "isSiloed": false, + "liquidationBonus": 0, + "liquidationProtocolFee": 0, + "liquidationThreshold": 0, + "ltv": 0, + "oracle": "0xD110cac5d8682A3b045D5524a9903E031d70FCCd", + "oracleDecimals": 8, + "oracleLatestAnswer": "100000000", + "reserveFactor": 1000, + "supplyCap": 20000000, + "symbol": "GHO", + "underlying": "0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f", + "usageAsCollateralEnabled": false, + "variableDebtToken": "0x18577F0f4A0B2Ee6F4048dB51c7acd8699F97DB8", + "variableDebtTokenImpl": "0x3E59212c34588a63350142EFad594a20C88C2CEd", + "variableDebtTokenName": "Aave Ethereum Lido Variable Debt GHO", + "variableDebtTokenSymbol": "variableDebtEthLidoGHO", + "virtualAccountingActive": true, + "virtualBalance": "3000000000000000000000000" + } + } + }, + "strategies": { + "0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f": { + "from": null, + "to": { + "address": "0x8958b1C39269167527821f8c276Ef7504883f2fa", + "baseVariableBorrowRate": "105000000000000000000000000", + "maxVariableBorrowRate": "635000000000000000000000000", + "optimalUsageRatio": "920000000000000000000000000", + "variableRateSlope1": "30000000000000000000000000", + "variableRateSlope2": "500000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3EthereumLido_OnboardRsETHToLidoInstance_20241205_before_AaveV3EthereumLido_OnboardRsETHToLidoInstance_20241205_after.md b/diffs/AaveV3EthereumLido_OnboardRsETHToLidoInstance_20241205_before_AaveV3EthereumLido_OnboardRsETHToLidoInstance_20241205_after.md new file mode 100644 index 000000000..b0f1a99ba --- /dev/null +++ b/diffs/AaveV3EthereumLido_OnboardRsETHToLidoInstance_20241205_before_AaveV3EthereumLido_OnboardRsETHToLidoInstance_20241205_after.md @@ -0,0 +1,156 @@ +## Reserve changes + +### Reserves added + +#### rsETH ([0xA1290d69c65A6Fe4DF752f95823fae25cB99e5A7](https://etherscan.io/address/0xA1290d69c65A6Fe4DF752f95823fae25cB99e5A7)) + +| description | value | +| --- | --- | +| decimals | 18 | +| isActive | true | +| isFrozen | false | +| supplyCap | 10,000 rsETH | +| borrowCap | 1 rsETH | +| debtCeiling | 0 $ [0] | +| isSiloed | false | +| isFlashloanable | true | +| oracle | [0x47F52B2e43D0386cF161e001835b03Ad49889e3b](https://etherscan.io/address/0x47F52B2e43D0386cF161e001835b03Ad49889e3b) | +| oracleDecimals | 8 | +| oracleDescription | Capped rsETH / ETH / USD | +| oracleLatestAnswer | 4023.47907549 | +| usageAsCollateralEnabled | true | +| ltv | 0.05 % [5] | +| liquidationThreshold | 0.1 % [10] | +| liquidationBonus | 7.5 % | +| liquidationProtocolFee | 10 % [1000] | +| reserveFactor | 0.15 % [15] | +| aToken | [0x18eFE565A5373f430e2F809b97De30335B3ad96A](https://etherscan.io/address/0x18eFE565A5373f430e2F809b97De30335B3ad96A) | +| aTokenImpl | [0x7F8Fc14D462bdF93c681c1f2Fd615389bF969Fb2](https://etherscan.io/address/0x7F8Fc14D462bdF93c681c1f2Fd615389bF969Fb2) | +| variableDebtToken | [0x18577F0f4A0B2Ee6F4048dB51c7acd8699F97DB8](https://etherscan.io/address/0x18577F0f4A0B2Ee6F4048dB51c7acd8699F97DB8) | +| variableDebtTokenImpl | [0x3E59212c34588a63350142EFad594a20C88C2CEd](https://etherscan.io/address/0x3E59212c34588a63350142EFad594a20C88C2CEd) | +| borrowingEnabled | false | +| isBorrowableInIsolation | false | +| interestRateStrategy | [0x8958b1C39269167527821f8c276Ef7504883f2fa](https://etherscan.io/address/0x8958b1C39269167527821f8c276Ef7504883f2fa) | +| aTokenName | Aave Ethereum Lido rsETH | +| aTokenSymbol | aEthLidorsETH | +| aTokenUnderlyingBalance | 0.03 rsETH [30000000000000000] | +| id | 6 | +| isPaused | false | +| variableDebtTokenName | Aave Ethereum Lido Variable Debt rsETH | +| variableDebtTokenSymbol | variableDebtEthLidorsETH | +| virtualAccountingActive | true | +| virtualBalance | 0.03 rsETH [30000000000000000] | +| optimalUsageRatio | 1 % | +| maxVariableBorrowRate | 110 % | +| baseVariableBorrowRate | 0 % | +| variableRateSlope1 | 10 % | +| variableRateSlope2 | 100 % | +| interestRate | ![ir](https://dash.onaave.com/api/static?variableRateSlope1=100000000000000000000000000&variableRateSlope2=1000000000000000000000000000&optimalUsageRatio=10000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=1100000000000000000000000000) | + + +## Emodes changed + +### EMode: ETH correlated(id: 1) + + + +### EMode: LRT Stablecoins main(id: 2) + + + +### EMode: LRT wstETH main(id: 3) + + + +### EMode: sUSDe Stablecoins(id: 4) + + + +### EMode: rsETH LST main(id: 5) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label | - | rsETH LST main | +| eMode.ltv | - | 92.5 % | +| eMode.liquidationThreshold | - | 94.5 % | +| eMode.liquidationBonus | - | 1 % | +| eMode.borrowableBitmap | - | wstETH | +| eMode.collateralBitmap | - | rsETH | + + +## Raw diff + +```json +{ + "eModes": { + "5": { + "from": null, + "to": { + "borrowableBitmap": "1", + "collateralBitmap": "64", + "eModeCategory": 5, + "label": "rsETH LST main", + "liquidationBonus": 10100, + "liquidationThreshold": 9450, + "ltv": 9250 + } + } + }, + "reserves": { + "0xA1290d69c65A6Fe4DF752f95823fae25cB99e5A7": { + "from": null, + "to": { + "aToken": "0x18eFE565A5373f430e2F809b97De30335B3ad96A", + "aTokenImpl": "0x7F8Fc14D462bdF93c681c1f2Fd615389bF969Fb2", + "aTokenName": "Aave Ethereum Lido rsETH", + "aTokenSymbol": "aEthLidorsETH", + "aTokenUnderlyingBalance": "30000000000000000", + "borrowCap": 1, + "borrowingEnabled": false, + "debtCeiling": 0, + "decimals": 18, + "id": 6, + "interestRateStrategy": "0x8958b1C39269167527821f8c276Ef7504883f2fa", + "isActive": true, + "isBorrowableInIsolation": false, + "isFlashloanable": true, + "isFrozen": false, + "isPaused": false, + "isSiloed": false, + "liquidationBonus": 10750, + "liquidationProtocolFee": 1000, + "liquidationThreshold": 10, + "ltv": 5, + "oracle": "0x47F52B2e43D0386cF161e001835b03Ad49889e3b", + "oracleDecimals": 8, + "oracleDescription": "Capped rsETH / ETH / USD", + "oracleLatestAnswer": "402347907549", + "reserveFactor": 15, + "supplyCap": 10000, + "symbol": "rsETH", + "underlying": "0xA1290d69c65A6Fe4DF752f95823fae25cB99e5A7", + "usageAsCollateralEnabled": true, + "variableDebtToken": "0x18577F0f4A0B2Ee6F4048dB51c7acd8699F97DB8", + "variableDebtTokenImpl": "0x3E59212c34588a63350142EFad594a20C88C2CEd", + "variableDebtTokenName": "Aave Ethereum Lido Variable Debt rsETH", + "variableDebtTokenSymbol": "variableDebtEthLidorsETH", + "virtualAccountingActive": true, + "virtualBalance": "30000000000000000" + } + } + }, + "strategies": { + "0xA1290d69c65A6Fe4DF752f95823fae25cB99e5A7": { + "from": null, + "to": { + "address": "0x8958b1C39269167527821f8c276Ef7504883f2fa", + "baseVariableBorrowRate": "0", + "maxVariableBorrowRate": "1100000000000000000000000000", + "optimalUsageRatio": "10000000000000000000000000", + "variableRateSlope1": "100000000000000000000000000", + "variableRateSlope2": "1000000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_before_AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_after.md b/diffs/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_before_AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_after.md new file mode 100644 index 000000000..cf884f873 --- /dev/null +++ b/diffs/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_before_AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_after.md @@ -0,0 +1,30 @@ +## Reserve changes + +### Reserves altered + +#### USDS ([0xdC035D45d973E3EC169d2276DDab16f1e407384F](https://etherscan.io/address/0xdC035D45d973E3EC169d2276DDab16f1e407384F)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 82 % | 85 % | +| variableRateSlope1 | 6.25 % | 9.25 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=62500000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=7500000000000000000000000&maxVariableBorrowRate=820000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=92500000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=7500000000000000000000000&maxVariableBorrowRate=850000000000000000000000000) | + +## Raw diff + +```json +{ + "strategies": { + "0xdC035D45d973E3EC169d2276DDab16f1e407384F": { + "maxVariableBorrowRate": { + "from": "820000000000000000000000000", + "to": "850000000000000000000000000" + }, + "variableRateSlope1": { + "from": "62500000000000000000000000", + "to": "92500000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3EthereumLido_USDSInterestRateCurveUpdate_20241223_before_AaveV3EthereumLido_USDSInterestRateCurveUpdate_20241223_after.md b/diffs/AaveV3EthereumLido_USDSInterestRateCurveUpdate_20241223_before_AaveV3EthereumLido_USDSInterestRateCurveUpdate_20241223_after.md new file mode 100644 index 000000000..dd07f6184 --- /dev/null +++ b/diffs/AaveV3EthereumLido_USDSInterestRateCurveUpdate_20241223_before_AaveV3EthereumLido_USDSInterestRateCurveUpdate_20241223_after.md @@ -0,0 +1,35 @@ +## Reserve changes + +### Reserves altered + +#### USDS ([0xdC035D45d973E3EC169d2276DDab16f1e407384F](https://etherscan.io/address/0xdC035D45d973E3EC169d2276DDab16f1e407384F)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 85 % | 47.5 % | +| variableRateSlope1 | 9.25 % | 11.75 % | +| variableRateSlope2 | 75 % | 35 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=92500000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=7500000000000000000000000&maxVariableBorrowRate=850000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=117500000000000000000000000&variableRateSlope2=350000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=7500000000000000000000000&maxVariableBorrowRate=475000000000000000000000000) | + +## Raw diff + +```json +{ + "strategies": { + "0xdC035D45d973E3EC169d2276DDab16f1e407384F": { + "maxVariableBorrowRate": { + "from": "850000000000000000000000000", + "to": "475000000000000000000000000" + }, + "variableRateSlope1": { + "from": "92500000000000000000000000", + "to": "117500000000000000000000000" + }, + "variableRateSlope2": { + "from": "750000000000000000000000000", + "to": "350000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3EthereumLido_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3EthereumLido_UpdatePriceCapAdaptersCAPO_20241101_after.md b/diffs/AaveV3EthereumLido_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3EthereumLido_UpdatePriceCapAdaptersCAPO_20241101_after.md new file mode 100644 index 000000000..9abdc8d7d --- /dev/null +++ b/diffs/AaveV3EthereumLido_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3EthereumLido_UpdatePriceCapAdaptersCAPO_20241101_after.md @@ -0,0 +1,48 @@ +## Reserve changes + +### Reserve altered + +#### USDC ([0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48](https://etherscan.io/address/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x736bF902680e68989886e9807CD7Db4B3E015d3C](https://etherscan.io/address/0x736bF902680e68989886e9807CD7Db4B3E015d3C) | [0xB6557F02F0a5dA7b9D3C2d979cc19e00e756F6dA](https://etherscan.io/address/0xB6557F02F0a5dA7b9D3C2d979cc19e00e756F6dA) | + + +#### USDS ([0xdC035D45d973E3EC169d2276DDab16f1e407384F](https://etherscan.io/address/0xdC035D45d973E3EC169d2276DDab16f1e407384F)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x4F01b76391A05d32B20FA2d05dD5963eE8db20E6](https://etherscan.io/address/0x4F01b76391A05d32B20FA2d05dD5963eE8db20E6) | [0x94C7FD62fd0506e71d8142E9D36687fC72A86B02](https://etherscan.io/address/0x94C7FD62fd0506e71d8142E9D36687fC72A86B02) | +| oracleDescription | Capped USDS <-> DAI / USD | Capped USDS/USD | +| oracleLatestAnswer | 1.00002917 | 0.99804349 | + + +## Raw diff + +```json +{ + "reserves": { + "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48": { + "oracle": { + "from": "0x736bF902680e68989886e9807CD7Db4B3E015d3C", + "to": "0xB6557F02F0a5dA7b9D3C2d979cc19e00e756F6dA" + } + }, + "0xdC035D45d973E3EC169d2276DDab16f1e407384F": { + "oracle": { + "from": "0x4F01b76391A05d32B20FA2d05dD5963eE8db20E6", + "to": "0x94C7FD62fd0506e71d8142E9D36687fC72A86B02" + }, + "oracleDescription": { + "from": "Capped USDS <-> DAI / USD", + "to": "Capped USDS/USD" + }, + "oracleLatestAnswer": { + "from": "100002917", + "to": "99804349" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3EthereumLido_WstETHReserveUpdate_20241203_before_AaveV3EthereumLido_WstETHReserveUpdate_20241203_after.md b/diffs/AaveV3EthereumLido_WstETHReserveUpdate_20241203_before_AaveV3EthereumLido_WstETHReserveUpdate_20241203_after.md new file mode 100644 index 000000000..b63bada9d --- /dev/null +++ b/diffs/AaveV3EthereumLido_WstETHReserveUpdate_20241203_before_AaveV3EthereumLido_WstETHReserveUpdate_20241203_after.md @@ -0,0 +1,35 @@ +## Reserve changes + +### Reserves altered + +#### wstETH ([0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0](https://etherscan.io/address/0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0)) + +| description | value before | value after | +| --- | --- | --- | +| optimalUsageRatio | 80 % | 90 % | +| maxVariableBorrowRate | 87.25 % | 86.75 % | +| variableRateSlope1 | 2.25 % | 1.75 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=22500000000000000000000000&variableRateSlope2=850000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=872500000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=17500000000000000000000000&variableRateSlope2=850000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=867500000000000000000000000) | + +## Raw diff + +```json +{ + "strategies": { + "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0": { + "maxVariableBorrowRate": { + "from": "872500000000000000000000000", + "to": "867500000000000000000000000" + }, + "optimalUsageRatio": { + "from": "800000000000000000000000000", + "to": "900000000000000000000000000" + }, + "variableRateSlope1": { + "from": "22500000000000000000000000", + "to": "17500000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3EthereumLido_WstETHSlope1UoptimalUpdate_20241001_before_AaveV3EthereumLido_WstETHSlope1UoptimalUpdate_20241001_after.md b/diffs/AaveV3EthereumLido_WstETHSlope1UoptimalUpdate_20241001_before_AaveV3EthereumLido_WstETHSlope1UoptimalUpdate_20241001_after.md index c6c884901..e3fd63400 100644 --- a/diffs/AaveV3EthereumLido_WstETHSlope1UoptimalUpdate_20241001_before_AaveV3EthereumLido_WstETHSlope1UoptimalUpdate_20241001_after.md +++ b/diffs/AaveV3EthereumLido_WstETHSlope1UoptimalUpdate_20241001_before_AaveV3EthereumLido_WstETHSlope1UoptimalUpdate_20241001_after.md @@ -9,9 +9,7 @@ | optimalUsageRatio | 45 % | 80 % | | maxVariableBorrowRate | 88.5 % | 87.25 % | | variableRateSlope1 | 3.5 % | 2.25 % | -| interestRate | ![before](/.assets/20b02c78bc8b99547929074a8d98940dc76ac4e3.svg) | ![after](/.assets/76125e3a0b338875aa6ae2af0ba3fb1ee003880c.svg) | - -## Emodes changes +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=35000000000000000000000000&variableRateSlope2=850000000000000000000000000&optimalUsageRatio=450000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=885000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=22500000000000000000000000&variableRateSlope2=850000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=872500000000000000000000000) | ## Raw diff diff --git a/diffs/AaveV3Ethereum_AaveBGDPhase4_20241025_before_AaveV3Ethereum_AaveBGDPhase4_20241025_after.md b/diffs/AaveV3Ethereum_AaveBGDPhase4_20241025_before_AaveV3Ethereum_AaveBGDPhase4_20241025_after.md index e03f15bf7..c15d3e2bc 100644 --- a/diffs/AaveV3Ethereum_AaveBGDPhase4_20241025_before_AaveV3Ethereum_AaveBGDPhase4_20241025_after.md +++ b/diffs/AaveV3Ethereum_AaveBGDPhase4_20241025_before_AaveV3Ethereum_AaveBGDPhase4_20241025_after.md @@ -1,17 +1,3 @@ -## Emodes changed - -### EMode: ETH correlated(id: 1) - -| description | value before | value after | -| --- | --- | --- | -| eMode.label (unchanged) | ETH correlated | ETH correlated | -| eMode.ltv (unchanged) | 93 % | 93 % | -| eMode.liquidationThreshold (unchanged) | 95 % | 95 % | -| eMode.liquidationBonus (unchanged) | 1 % | 1 % | -| eMode.borrowableBitmap (unchanged) | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | -| eMode.collateralBitmap (unchanged) | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | WETH, wstETH, cbETH, rETH, weETH, osETH, ETHx | - - ## Raw diff ```json diff --git a/diffs/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125_before_AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125_after.md b/diffs/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125_before_AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125_after.md new file mode 100644 index 000000000..7599f4449 --- /dev/null +++ b/diffs/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125_before_AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125_after.md @@ -0,0 +1,36 @@ +## Emodes changed + +### EMode: ETH correlated(id: 1) + + + +### EMode: sUSDe Stablecoins(id: 2) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label (unchanged) | sUSDe Stablecoins | sUSDe Stablecoins | +| eMode.ltv (unchanged) | 90 % | 90 % | +| eMode.liquidationThreshold (unchanged) | 92 % | 92 % | +| eMode.liquidationBonus (unchanged) | 3 % | 3 % | +| eMode.borrowableBitmap | USDC, USDS | USDC, USDT, USDS | +| eMode.collateralBitmap (unchanged) | sUSDe | sUSDe | + + +### EMode: rsETH LST main(id: 3) + + + +## Raw diff + +```json +{ + "eModes": { + "2": { + "borrowableBitmap": { + "from": "34359738376", + "to": "34359738632" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Ethereum_FixUSDSBorrowRateToMatchSkySavingsRate_20241022_before_AaveV3Ethereum_FixUSDSBorrowRateToMatchSkySavingsRate_20241022_after.md b/diffs/AaveV3Ethereum_FixUSDSBorrowRateToMatchSkySavingsRate_20241022_before_AaveV3Ethereum_FixUSDSBorrowRateToMatchSkySavingsRate_20241022_after.md index 4cab64c25..0e62b2dfe 100644 --- a/diffs/AaveV3Ethereum_FixUSDSBorrowRateToMatchSkySavingsRate_20241022_before_AaveV3Ethereum_FixUSDSBorrowRateToMatchSkySavingsRate_20241022_after.md +++ b/diffs/AaveV3Ethereum_FixUSDSBorrowRateToMatchSkySavingsRate_20241022_before_AaveV3Ethereum_FixUSDSBorrowRateToMatchSkySavingsRate_20241022_after.md @@ -8,9 +8,7 @@ | --- | --- | --- | | maxVariableBorrowRate | 87.5 % | 82 % | | variableRateSlope1 | 6.25 % | 0.75 % | -| interestRate | ![before](/.assets/59f72276d32ba1eeba45953b23c84ea37048e299.svg) | ![after](/.assets/237c21391c0b67eb1236e3875c882cd6115a3758.svg) | - -## Emodes changes +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=62500000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=62500000000000000000000000&maxVariableBorrowRate=875000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=7500000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=62500000000000000000000000&maxVariableBorrowRate=820000000000000000000000000) | ## Raw diff diff --git a/diffs/AaveV3Ethereum_FluidAlignment_20241127_before_AaveV3Ethereum_FluidAlignment_20241127_after.md b/diffs/AaveV3Ethereum_FluidAlignment_20241127_before_AaveV3Ethereum_FluidAlignment_20241127_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Ethereum_FluidAlignment_20241127_before_AaveV3Ethereum_FluidAlignment_20241127_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127_before_AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127_after.md b/diffs/AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127_before_AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127_before_AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3Ethereum_GHOCCIP150Upgrade_20241021_before_AaveV3Ethereum_GHOCCIP150Upgrade_20241021_after.md b/diffs/AaveV3Ethereum_GHOCCIP150Upgrade_20241021_before_AaveV3Ethereum_GHOCCIP150Upgrade_20241021_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Ethereum_GHOCCIP150Upgrade_20241021_before_AaveV3Ethereum_GHOCCIP150Upgrade_20241021_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3Ethereum_GHOStewardV2Upgrade_20241007_before_AaveV3Ethereum_GHOStewardV2Upgrade_20241007_after.md b/diffs/AaveV3Ethereum_GHOStewardV2Upgrade_20241007_before_AaveV3Ethereum_GHOStewardV2Upgrade_20241007_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Ethereum_GHOStewardV2Upgrade_20241007_before_AaveV3Ethereum_GHOStewardV2Upgrade_20241007_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md b/diffs/AaveV3Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md new file mode 100644 index 000000000..93cd5769a --- /dev/null +++ b/diffs/AaveV3Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md @@ -0,0 +1,196 @@ +## Reserve changes + +### Reserve altered + +#### USDe ([0x4c9EDD5852cd905f086C759E8383e09bff1E68B3](https://etherscan.io/address/0x4c9EDD5852cd905f086C759E8383e09bff1E68B3)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 84 % | 62.5 % | +| variableRateSlope1 | 9 % | 12.5 % | +| variableRateSlope2 | 75 % | 50 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=90000000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=840000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=500000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=625000000000000000000000000) | + +#### LUSD ([0x5f98805A4E8be255a32880FDeC7F6728C6568bA0](https://etherscan.io/address/0x5f98805A4E8be255a32880FDeC7F6728C6568bA0)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 92.5 % | 62.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 87 % | 50 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=870000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=925000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=500000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=625000000000000000000000000) | + +#### DAI ([0x6B175474E89094C44Da98b954EedeAC495271d0F](https://etherscan.io/address/0x6B175474E89094C44Da98b954EedeAC495271d0F)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 80.5 % | 47.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 75 % | 35 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=805000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=350000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=475000000000000000000000000) | + +#### PYUSD ([0x6c3ea9036406852006290770BEdFcAbA0e23A0e8](https://etherscan.io/address/0x6c3ea9036406852006290770BEdFcAbA0e23A0e8)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 85.5 % | 62.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 80 % | 50 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=800000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=855000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=500000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=625000000000000000000000000) | + +#### FRAX ([0x853d955aCEf822Db058eb8505911ED77F175b99e](https://etherscan.io/address/0x853d955aCEf822Db058eb8505911ED77F175b99e)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 80.5 % | 52.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 75 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=805000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=525000000000000000000000000) | + +#### USDC ([0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48](https://etherscan.io/address/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 65.5 % | 47.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 60 % | 35 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=600000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=655000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=350000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=475000000000000000000000000) | + +#### USDT ([0xdAC17F958D2ee523a2206206994597C13D831ec7](https://etherscan.io/address/0xdAC17F958D2ee523a2206206994597C13D831ec7)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 80.5 % | 47.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 75 % | 35 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=805000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=350000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=475000000000000000000000000) | + +#### crvUSD ([0xf939E0A03FB07F59A73314E73794Be0E57ac1b4E](https://etherscan.io/address/0xf939E0A03FB07F59A73314E73794Be0E57ac1b4E)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 85.5 % | 62.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 80 % | 50 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=800000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=855000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=500000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=625000000000000000000000000) | + +## Raw diff + +```json +{ + "strategies": { + "0x4c9EDD5852cd905f086C759E8383e09bff1E68B3": { + "maxVariableBorrowRate": { + "from": "840000000000000000000000000", + "to": "625000000000000000000000000" + }, + "variableRateSlope1": { + "from": "90000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "750000000000000000000000000", + "to": "500000000000000000000000000" + } + }, + "0x5f98805A4E8be255a32880FDeC7F6728C6568bA0": { + "maxVariableBorrowRate": { + "from": "925000000000000000000000000", + "to": "625000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "870000000000000000000000000", + "to": "500000000000000000000000000" + } + }, + "0x6B175474E89094C44Da98b954EedeAC495271d0F": { + "maxVariableBorrowRate": { + "from": "805000000000000000000000000", + "to": "475000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "750000000000000000000000000", + "to": "350000000000000000000000000" + } + }, + "0x6c3ea9036406852006290770BEdFcAbA0e23A0e8": { + "maxVariableBorrowRate": { + "from": "855000000000000000000000000", + "to": "625000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "800000000000000000000000000", + "to": "500000000000000000000000000" + } + }, + "0x853d955aCEf822Db058eb8505911ED77F175b99e": { + "maxVariableBorrowRate": { + "from": "805000000000000000000000000", + "to": "525000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "750000000000000000000000000", + "to": "400000000000000000000000000" + } + }, + "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48": { + "maxVariableBorrowRate": { + "from": "655000000000000000000000000", + "to": "475000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "600000000000000000000000000", + "to": "350000000000000000000000000" + } + }, + "0xdAC17F958D2ee523a2206206994597C13D831ec7": { + "maxVariableBorrowRate": { + "from": "805000000000000000000000000", + "to": "475000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "750000000000000000000000000", + "to": "350000000000000000000000000" + } + }, + "0xf939E0A03FB07F59A73314E73794Be0E57ac1b4E": { + "maxVariableBorrowRate": { + "from": "855000000000000000000000000", + "to": "625000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "800000000000000000000000000", + "to": "500000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Ethereum_IncreaseCbBTCSupplyCaps_20241004_before_AaveV3Ethereum_IncreaseCbBTCSupplyCaps_20241004_after.md b/diffs/AaveV3Ethereum_IncreaseCbBTCSupplyCaps_20241004_before_AaveV3Ethereum_IncreaseCbBTCSupplyCaps_20241004_after.md index c55e14fa2..8643d8700 100644 --- a/diffs/AaveV3Ethereum_IncreaseCbBTCSupplyCaps_20241004_before_AaveV3Ethereum_IncreaseCbBTCSupplyCaps_20241004_after.md +++ b/diffs/AaveV3Ethereum_IncreaseCbBTCSupplyCaps_20241004_before_AaveV3Ethereum_IncreaseCbBTCSupplyCaps_20241004_after.md @@ -9,8 +9,6 @@ | supplyCap | 2,400 cbBTC | 10,000 cbBTC | -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3Ethereum_IncreaseUSDSBorrowRateToMatchSkySavingsRate_20241016_before_AaveV3Ethereum_IncreaseUSDSBorrowRateToMatchSkySavingsRate_20241016_after.md b/diffs/AaveV3Ethereum_IncreaseUSDSBorrowRateToMatchSkySavingsRate_20241016_before_AaveV3Ethereum_IncreaseUSDSBorrowRateToMatchSkySavingsRate_20241016_after.md index 7c5412604..cc8aa0613 100644 --- a/diffs/AaveV3Ethereum_IncreaseUSDSBorrowRateToMatchSkySavingsRate_20241016_before_AaveV3Ethereum_IncreaseUSDSBorrowRateToMatchSkySavingsRate_20241016_after.md +++ b/diffs/AaveV3Ethereum_IncreaseUSDSBorrowRateToMatchSkySavingsRate_20241016_before_AaveV3Ethereum_IncreaseUSDSBorrowRateToMatchSkySavingsRate_20241016_after.md @@ -8,9 +8,7 @@ | --- | --- | --- | | maxVariableBorrowRate | 82 % | 87.5 % | | baseVariableBorrowRate | 0.75 % | 6.25 % | -| interestRate | ![before](/.assets/75cdb567a41d55d63ab2bb1326ea702df0bfacf4.svg) | ![after](/.assets/59f72276d32ba1eeba45953b23c84ea37048e299.svg) | - -## Emodes changes +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=62500000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=7500000000000000000000000&maxVariableBorrowRate=820000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=62500000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=62500000000000000000000000&maxVariableBorrowRate=875000000000000000000000000) | ## Raw diff diff --git a/diffs/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_before_AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_after.md b/diffs/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_before_AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_after.md new file mode 100644 index 000000000..daf380ea9 --- /dev/null +++ b/diffs/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_before_AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_after.md @@ -0,0 +1,57 @@ +## Reserve changes + +### Reserves altered + +#### sUSDe ([0x9D39A5DE30e57443BfF2A8307A4256c8797A3497](https://etherscan.io/address/0x9D39A5DE30e57443BfF2A8307A4256c8797A3497)) + +| description | value before | value after | +| --- | --- | --- | +| debtCeiling | 40,000,000 $ [4000000000] | 0 $ [0] | + + +## Emodes changed + +### EMode: ETH correlated(id: 1) + + + +### EMode: sUSDe Stablecoins(id: 2) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label | - | sUSDe Stablecoins | +| eMode.ltv | - | 90 % | +| eMode.liquidationThreshold | - | 92 % | +| eMode.liquidationBonus | - | 3 % | +| eMode.borrowableBitmap | - | USDC, USDS | +| eMode.collateralBitmap | - | sUSDe | + + +## Raw diff + +```json +{ + "eModes": { + "2": { + "from": null, + "to": { + "borrowableBitmap": "34359738376", + "collateralBitmap": "4294967296", + "eModeCategory": 2, + "label": "sUSDe Stablecoins", + "liquidationBonus": 10300, + "liquidationThreshold": 9200, + "ltv": 9000 + } + } + }, + "reserves": { + "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497": { + "debtCeiling": { + "from": 4000000000, + "to": 0 + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104_before_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104_after.md b/diffs/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104_before_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104_after.md new file mode 100644 index 000000000..3ac08f174 --- /dev/null +++ b/diffs/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104_before_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104_after.md @@ -0,0 +1,172 @@ +## Reserve changes + +### Reserves added + +#### rsETH ([0xA1290d69c65A6Fe4DF752f95823fae25cB99e5A7](https://etherscan.io/address/0xA1290d69c65A6Fe4DF752f95823fae25cB99e5A7)) + +| description | value | +| --- | --- | +| decimals | 18 | +| isActive | true | +| isFrozen | false | +| supplyCap | 19,000 rsETH | +| borrowCap | 1,900 rsETH | +| debtCeiling | 0 $ [0] | +| isSiloed | false | +| isFlashloanable | true | +| oracle | [0x47F52B2e43D0386cF161e001835b03Ad49889e3b](https://etherscan.io/address/0x47F52B2e43D0386cF161e001835b03Ad49889e3b) | +| oracleDecimals | 8 | +| oracleDescription | Capped rsETH / ETH / USD | +| oracleLatestAnswer | 2892.03476952 | +| usageAsCollateralEnabled | true | +| ltv | 72 % [7200] | +| liquidationThreshold | 75 % [7500] | +| liquidationBonus | 7.5 % | +| liquidationProtocolFee | 10 % [1000] | +| reserveFactor | 15 % [1500] | +| aToken | [0x2D62109243b87C4bA3EE7bA1D91B0dD0A074d7b1](https://etherscan.io/address/0x2D62109243b87C4bA3EE7bA1D91B0dD0A074d7b1) | +| aTokenImpl | [0x7EfFD7b47Bfd17e52fB7559d3f924201b9DbfF3d](https://etherscan.io/address/0x7EfFD7b47Bfd17e52fB7559d3f924201b9DbfF3d) | +| variableDebtToken | [0x6De3E52A1B7294A34e271a508082b1Ff4a37E30e](https://etherscan.io/address/0x6De3E52A1B7294A34e271a508082b1Ff4a37E30e) | +| variableDebtTokenImpl | [0xaC725CB59D16C81061BDeA61041a8A5e73DA9EC6](https://etherscan.io/address/0xaC725CB59D16C81061BDeA61041a8A5e73DA9EC6) | +| borrowingEnabled | true | +| isBorrowableInIsolation | false | +| interestRateStrategy | [0x9ec6F08190DeA04A54f8Afc53Db96134e5E3FdFB](https://etherscan.io/address/0x9ec6F08190DeA04A54f8Afc53Db96134e5E3FdFB) | +| aTokenName | Aave Ethereum rsETH | +| aTokenSymbol | aEthrsETH | +| aTokenUnderlyingBalance | 0.04 rsETH [40000000000000000] | +| id | 36 | +| isPaused | false | +| variableDebtTokenName | Aave Ethereum Variable Debt rsETH | +| variableDebtTokenSymbol | variableDebtEthrsETH | +| virtualAccountingActive | true | +| virtualBalance | 0.04 rsETH [40000000000000000] | +| optimalUsageRatio | 45 % | +| maxVariableBorrowRate | 307 % | +| baseVariableBorrowRate | 0 % | +| variableRateSlope1 | 7 % | +| variableRateSlope2 | 300 % | +| interestRate | ![ir](https://dash.onaave.com/api/static?variableRateSlope1=70000000000000000000000000&variableRateSlope2=3000000000000000000000000000&optimalUsageRatio=450000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=3070000000000000000000000000) | + + +### Reserve altered + +#### wstETH ([0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0](https://etherscan.io/address/0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0)) + +| description | value before | value after | +| --- | --- | --- | +| borrowCap | 48,000 wstETH | 60,000 wstETH | + + +#### ETHx ([0xA35b1B31Ce002FBF2058D22F30f95D405200A15b](https://etherscan.io/address/0xA35b1B31Ce002FBF2058D22F30f95D405200A15b)) + +| description | value before | value after | +| --- | --- | --- | +| borrowCap | 320 ETHx | 5,000 ETHx | + + +## Emodes changed + +### EMode: ETH correlated(id: 1) + + + +### EMode: rsETH LST main(id: 3) + +| description | value before | value after | +| --- | --- | --- | +| eMode.label | - | rsETH LST main | +| eMode.ltv | - | 92.5 % | +| eMode.liquidationThreshold | - | 94.5 % | +| eMode.liquidationBonus | - | 1 % | +| eMode.borrowableBitmap | - | wstETH, ETHx | +| eMode.collateralBitmap | - | rsETH | + + +## Raw diff + +```json +{ + "eModes": { + "3": { + "from": null, + "to": { + "borrowableBitmap": "2147483650", + "collateralBitmap": "68719476736", + "eModeCategory": 3, + "label": "rsETH LST main", + "liquidationBonus": 10100, + "liquidationThreshold": 9450, + "ltv": 9250 + } + } + }, + "reserves": { + "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0": { + "borrowCap": { + "from": 48000, + "to": 60000 + } + }, + "0xA35b1B31Ce002FBF2058D22F30f95D405200A15b": { + "borrowCap": { + "from": 320, + "to": 5000 + } + }, + "0xA1290d69c65A6Fe4DF752f95823fae25cB99e5A7": { + "from": null, + "to": { + "aToken": "0x2D62109243b87C4bA3EE7bA1D91B0dD0A074d7b1", + "aTokenImpl": "0x7EfFD7b47Bfd17e52fB7559d3f924201b9DbfF3d", + "aTokenName": "Aave Ethereum rsETH", + "aTokenSymbol": "aEthrsETH", + "aTokenUnderlyingBalance": "40000000000000000", + "borrowCap": 1900, + "borrowingEnabled": true, + "debtCeiling": 0, + "decimals": 18, + "id": 36, + "interestRateStrategy": "0x9ec6F08190DeA04A54f8Afc53Db96134e5E3FdFB", + "isActive": true, + "isBorrowableInIsolation": false, + "isFlashloanable": true, + "isFrozen": false, + "isPaused": false, + "isSiloed": false, + "liquidationBonus": 10750, + "liquidationProtocolFee": 1000, + "liquidationThreshold": 7500, + "ltv": 7200, + "oracle": "0x47F52B2e43D0386cF161e001835b03Ad49889e3b", + "oracleDecimals": 8, + "oracleDescription": "Capped rsETH / ETH / USD", + "oracleLatestAnswer": "289203476952", + "reserveFactor": 1500, + "supplyCap": 19000, + "symbol": "rsETH", + "underlying": "0xA1290d69c65A6Fe4DF752f95823fae25cB99e5A7", + "usageAsCollateralEnabled": true, + "variableDebtToken": "0x6De3E52A1B7294A34e271a508082b1Ff4a37E30e", + "variableDebtTokenImpl": "0xaC725CB59D16C81061BDeA61041a8A5e73DA9EC6", + "variableDebtTokenName": "Aave Ethereum Variable Debt rsETH", + "variableDebtTokenSymbol": "variableDebtEthrsETH", + "virtualAccountingActive": true, + "virtualBalance": "40000000000000000" + } + } + }, + "strategies": { + "0xA1290d69c65A6Fe4DF752f95823fae25cB99e5A7": { + "from": null, + "to": { + "address": "0x9ec6F08190DeA04A54f8Afc53Db96134e5E3FdFB", + "baseVariableBorrowRate": "0", + "maxVariableBorrowRate": "3070000000000000000000000000", + "optimalUsageRatio": "450000000000000000000000000", + "variableRateSlope1": "70000000000000000000000000", + "variableRateSlope2": "3000000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031_before_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031_after.md b/diffs/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031_before_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031_after.md new file mode 100644 index 000000000..e648600fb --- /dev/null +++ b/diffs/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031_before_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031_after.md @@ -0,0 +1,50 @@ +## Reserve changes + +### Reserves altered + +#### PYUSD ([0x6c3ea9036406852006290770BEdFcAbA0e23A0e8](https://etherscan.io/address/0x6c3ea9036406852006290770BEdFcAbA0e23A0e8)) + +| description | value before | value after | +| --- | --- | --- | +| borrowCap | 48,000,000 PYUSD | 15,000,000 PYUSD | +| usageAsCollateralEnabled | false | true | +| ltv | 0 % [0] | 75 % [7500] | +| liquidationThreshold | 0 % [0] | 78 % [7800] | +| liquidationBonus | 0 % | 7.5 % | +| liquidationProtocolFee | 0 % [0] | 10 % [1000] | + + +## Raw diff + +```json +{ + "reserves": { + "0x6c3ea9036406852006290770BEdFcAbA0e23A0e8": { + "borrowCap": { + "from": 48000000, + "to": 15000000 + }, + "liquidationBonus": { + "from": 0, + "to": 10750 + }, + "liquidationProtocolFee": { + "from": 0, + "to": 1000 + }, + "liquidationThreshold": { + "from": 0, + "to": 7800 + }, + "ltv": { + "from": 0, + "to": 7500 + }, + "usageAsCollateralEnabled": { + "from": false, + "to": true + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105_before_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105_after.md b/diffs/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105_before_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105_after.md new file mode 100644 index 000000000..dda218d41 --- /dev/null +++ b/diffs/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105_before_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105_after.md @@ -0,0 +1,25 @@ +## Reserve changes + +### Reserves altered + +#### FRAX ([0x853d955aCEf822Db058eb8505911ED77F175b99e](https://etherscan.io/address/0x853d955aCEf822Db058eb8505911ED77F175b99e)) + +| description | value before | value after | +| --- | --- | --- | +| debtCeiling | 10,000,000 $ [1000000000] | 0 $ [0] | + + +## Raw diff + +```json +{ + "reserves": { + "0x853d955aCEf822Db058eb8505911ED77F175b99e": { + "debtCeiling": { + "from": 1000000000, + "to": 0 + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113_before_AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113_after.md b/diffs/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113_before_AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113_after.md new file mode 100644 index 000000000..bc4a04d60 --- /dev/null +++ b/diffs/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113_before_AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113_after.md @@ -0,0 +1,66 @@ +## Reserve changes + +### Reserve altered + +#### DAI ([0x6B175474E89094C44Da98b954EedeAC495271d0F](https://etherscan.io/address/0x6B175474E89094C44Da98b954EedeAC495271d0F)) + +| description | value before | value after | +| --- | --- | --- | +| aTokenUnderlyingBalance | 15,924,528.6233 DAI [15924528623359921994863938] | 15,424,528.6233 DAI [15424528623359921994863938] | +| virtualBalance | 15,924,487.4050 DAI [15924487405080584531407384] | 15,424,487.4050 DAI [15424487405080584531407384] | + + +#### USDC ([0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48](https://etherscan.io/address/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48)) + +| description | value before | value after | +| --- | --- | --- | +| aTokenUnderlyingBalance | 137,192,431.4930 USDC [137192431493016] | 135,942,431.4930 USDC [135942431493016] | +| virtualBalance | 137,186,093.5677 USDC [137186093567742] | 135,936,093.5677 USDC [135936093567742] | + + +#### USDT ([0xdAC17F958D2ee523a2206206994597C13D831ec7](https://etherscan.io/address/0xdAC17F958D2ee523a2206206994597C13D831ec7)) + +| description | value before | value after | +| --- | --- | --- | +| aTokenUnderlyingBalance | 199,667,226.1302 USDT [199667226130261] | 198,417,226.1302 USDT [198417226130261] | +| virtualBalance | 199,666,071.9160 USDT [199666071916049] | 198,416,071.9160 USDT [198416071916049] | + + +## Raw diff + +```json +{ + "reserves": { + "0x6B175474E89094C44Da98b954EedeAC495271d0F": { + "aTokenUnderlyingBalance": { + "from": "15924528623359921994863938", + "to": "15424528623359921994863938" + }, + "virtualBalance": { + "from": "15924487405080584531407384", + "to": "15424487405080584531407384" + } + }, + "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48": { + "aTokenUnderlyingBalance": { + "from": "137192431493016", + "to": "135942431493016" + }, + "virtualBalance": { + "from": "137186093567742", + "to": "135936093567742" + } + }, + "0xdAC17F958D2ee523a2206206994597C13D831ec7": { + "aTokenUnderlyingBalance": { + "from": "199667226130261", + "to": "198417226130261" + }, + "virtualBalance": { + "from": "199666071916049", + "to": "198416071916049" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Ethereum_TokenLogicFinancialServiceProvider_20241213_before_AaveV3Ethereum_TokenLogicFinancialServiceProvider_20241213_after.md b/diffs/AaveV3Ethereum_TokenLogicFinancialServiceProvider_20241213_before_AaveV3Ethereum_TokenLogicFinancialServiceProvider_20241213_after.md new file mode 100644 index 000000000..4faea457d --- /dev/null +++ b/diffs/AaveV3Ethereum_TokenLogicFinancialServiceProvider_20241213_before_AaveV3Ethereum_TokenLogicFinancialServiceProvider_20241213_after.md @@ -0,0 +1,30 @@ +## Reserve changes + +### Reserves altered + +#### USDC ([0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48](https://etherscan.io/address/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48)) + +| description | value before | value after | +| --- | --- | --- | +| aTokenUnderlyingBalance | 155,110,390.4563 USDC [155110390456382] | 154,360,390.4563 USDC [154360390456382] | +| virtualBalance | 155,104,052.5311 USDC [155104052531108] | 154,354,052.5311 USDC [154354052531108] | + + +## Raw diff + +```json +{ + "reserves": { + "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48": { + "aTokenUnderlyingBalance": { + "from": "155110390456382", + "to": "154360390456382" + }, + "virtualBalance": { + "from": "155104052531108", + "to": "154354052531108" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_before_AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_after.md b/diffs/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_before_AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_after.md new file mode 100644 index 000000000..7a2fc85c1 --- /dev/null +++ b/diffs/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_before_AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_after.md @@ -0,0 +1,30 @@ +## Reserve changes + +### Reserves altered + +#### USDS ([0xdC035D45d973E3EC169d2276DDab16f1e407384F](https://etherscan.io/address/0xdC035D45d973E3EC169d2276DDab16f1e407384F)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 82 % | 85 % | +| baseVariableBorrowRate | 6.25 % | 9.25 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=7500000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=62500000000000000000000000&maxVariableBorrowRate=820000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=7500000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=92500000000000000000000000&maxVariableBorrowRate=850000000000000000000000000) | + +## Raw diff + +```json +{ + "strategies": { + "0xdC035D45d973E3EC169d2276DDab16f1e407384F": { + "baseVariableBorrowRate": { + "from": "62500000000000000000000000", + "to": "92500000000000000000000000" + }, + "maxVariableBorrowRate": { + "from": "820000000000000000000000000", + "to": "850000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Ethereum_USDSInterestRateCurveUpdate_20241223_before_AaveV3Ethereum_USDSInterestRateCurveUpdate_20241223_after.md b/diffs/AaveV3Ethereum_USDSInterestRateCurveUpdate_20241223_before_AaveV3Ethereum_USDSInterestRateCurveUpdate_20241223_after.md new file mode 100644 index 000000000..be345ab80 --- /dev/null +++ b/diffs/AaveV3Ethereum_USDSInterestRateCurveUpdate_20241223_before_AaveV3Ethereum_USDSInterestRateCurveUpdate_20241223_after.md @@ -0,0 +1,35 @@ +## Reserve changes + +### Reserves altered + +#### USDS ([0xdC035D45d973E3EC169d2276DDab16f1e407384F](https://etherscan.io/address/0xdC035D45d973E3EC169d2276DDab16f1e407384F)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 85 % | 47.5 % | +| baseVariableBorrowRate | 9.25 % | 11.75 % | +| variableRateSlope2 | 75 % | 35 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=7500000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=92500000000000000000000000&maxVariableBorrowRate=850000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=7500000000000000000000000&variableRateSlope2=350000000000000000000000000&optimalUsageRatio=920000000000000000000000000&baseVariableBorrowRate=117500000000000000000000000&maxVariableBorrowRate=475000000000000000000000000) | + +## Raw diff + +```json +{ + "strategies": { + "0xdC035D45d973E3EC169d2276DDab16f1e407384F": { + "baseVariableBorrowRate": { + "from": "92500000000000000000000000", + "to": "117500000000000000000000000" + }, + "maxVariableBorrowRate": { + "from": "850000000000000000000000000", + "to": "475000000000000000000000000" + }, + "variableRateSlope2": { + "from": "750000000000000000000000000", + "to": "350000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Ethereum_UpdateLegacyGuardian_20241016_before_AaveV3Ethereum_UpdateLegacyGuardian_20241016_after.md b/diffs/AaveV3Ethereum_UpdateLegacyGuardian_20241016_before_AaveV3Ethereum_UpdateLegacyGuardian_20241016_after.md index dbd03dce4..c15d3e2bc 100644 --- a/diffs/AaveV3Ethereum_UpdateLegacyGuardian_20241016_before_AaveV3Ethereum_UpdateLegacyGuardian_20241016_after.md +++ b/diffs/AaveV3Ethereum_UpdateLegacyGuardian_20241016_before_AaveV3Ethereum_UpdateLegacyGuardian_20241016_after.md @@ -1,5 +1,3 @@ -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3Ethereum_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3Ethereum_UpdatePriceCapAdaptersCAPO_20241101_after.md b/diffs/AaveV3Ethereum_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3Ethereum_UpdatePriceCapAdaptersCAPO_20241101_after.md new file mode 100644 index 000000000..d9218d427 --- /dev/null +++ b/diffs/AaveV3Ethereum_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3Ethereum_UpdatePriceCapAdaptersCAPO_20241101_after.md @@ -0,0 +1,144 @@ +## Reserve changes + +### Reserve altered + +#### LUSD ([0x5f98805A4E8be255a32880FDeC7F6728C6568bA0](https://etherscan.io/address/0x5f98805A4E8be255a32880FDeC7F6728C6568bA0)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x9eCdfaCca946614cc32aF63F3DBe50959244F3af](https://etherscan.io/address/0x9eCdfaCca946614cc32aF63F3DBe50959244F3af) | [0xEbb721daf3DA9f1b3dcEc590cDf648137172d7CB](https://etherscan.io/address/0xEbb721daf3DA9f1b3dcEc590cDf648137172d7CB) | + + +#### DAI ([0x6B175474E89094C44Da98b954EedeAC495271d0F](https://etherscan.io/address/0x6B175474E89094C44Da98b954EedeAC495271d0F)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0xaEb897E1Dc6BbdceD3B9D551C71a8cf172F27AC4](https://etherscan.io/address/0xaEb897E1Dc6BbdceD3B9D551C71a8cf172F27AC4) | [0x5c66322CA59bB61e867B28195576DbD8dA4b08dE](https://etherscan.io/address/0x5c66322CA59bB61e867B28195576DbD8dA4b08dE) | + + +#### PYUSD ([0x6c3ea9036406852006290770BEdFcAbA0e23A0e8](https://etherscan.io/address/0x6c3ea9036406852006290770BEdFcAbA0e23A0e8)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x150bAe7Ce224555D39AfdBc6Cb4B8204E594E022](https://etherscan.io/address/0x150bAe7Ce224555D39AfdBc6Cb4B8204E594E022) | [0x36964C0579D02E0a5AaAb89E24Cf8d7CDF3549EE](https://etherscan.io/address/0x36964C0579D02E0a5AaAb89E24Cf8d7CDF3549EE) | + + +#### sDAI ([0x83F20F44975D03b1b09e64809B757c47f942BEeA](https://etherscan.io/address/0x83F20F44975D03b1b09e64809B757c47f942BEeA)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x29081f7aB5a644716EfcDC10D5c926c5fEe9F72B](https://etherscan.io/address/0x29081f7aB5a644716EfcDC10D5c926c5fEe9F72B) | [0xf14f501863F5db3A6D5b7e37af24e2Ca25d7Aea8](https://etherscan.io/address/0xf14f501863F5db3A6D5b7e37af24e2Ca25d7Aea8) | +| oracleDescription | sDAI/DAI/USD | Capped sDAI / DAI / USD | + + +#### FRAX ([0x853d955aCEf822Db058eb8505911ED77F175b99e](https://etherscan.io/address/0x853d955aCEf822Db058eb8505911ED77F175b99e)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x45D270263BBee500CF8adcf2AbC0aC227097b036](https://etherscan.io/address/0x45D270263BBee500CF8adcf2AbC0aC227097b036) | [0xeF50f8DC65402c3019586bc8725fCD0b99B8AAd7](https://etherscan.io/address/0xeF50f8DC65402c3019586bc8725fCD0b99B8AAd7) | + + +#### USDC ([0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48](https://etherscan.io/address/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x736bF902680e68989886e9807CD7Db4B3E015d3C](https://etherscan.io/address/0x736bF902680e68989886e9807CD7Db4B3E015d3C) | [0xB6557F02F0a5dA7b9D3C2d979cc19e00e756F6dA](https://etherscan.io/address/0xB6557F02F0a5dA7b9D3C2d979cc19e00e756F6dA) | + + +#### USDT ([0xdAC17F958D2ee523a2206206994597C13D831ec7](https://etherscan.io/address/0xdAC17F958D2ee523a2206206994597C13D831ec7)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0xC26D4a1c46d884cfF6dE9800B6aE7A8Cf48B4Ff8](https://etherscan.io/address/0xC26D4a1c46d884cfF6dE9800B6aE7A8Cf48B4Ff8) | [0x260326c220E469358846b187eE53328303Efe19C](https://etherscan.io/address/0x260326c220E469358846b187eE53328303Efe19C) | + + +#### USDS ([0xdC035D45d973E3EC169d2276DDab16f1e407384F](https://etherscan.io/address/0xdC035D45d973E3EC169d2276DDab16f1e407384F)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x4F01b76391A05d32B20FA2d05dD5963eE8db20E6](https://etherscan.io/address/0x4F01b76391A05d32B20FA2d05dD5963eE8db20E6) | [0x94C7FD62fd0506e71d8142E9D36687fC72A86B02](https://etherscan.io/address/0x94C7FD62fd0506e71d8142E9D36687fC72A86B02) | +| oracleDescription | Capped USDS <-> DAI / USD | Capped USDS/USD | +| oracleLatestAnswer | 1.00002917 | 0.99804349 | + + +#### crvUSD ([0xf939E0A03FB07F59A73314E73794Be0E57ac1b4E](https://etherscan.io/address/0xf939E0A03FB07F59A73314E73794Be0E57ac1b4E)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x02AeE5b225366302339748951E1a924617b8814F](https://etherscan.io/address/0x02AeE5b225366302339748951E1a924617b8814F) | [0x9Dc30dc58c72f5B669aEa01d02A2e4da194eE893](https://etherscan.io/address/0x9Dc30dc58c72f5B669aEa01d02A2e4da194eE893) | + + +## Raw diff + +```json +{ + "reserves": { + "0x5f98805A4E8be255a32880FDeC7F6728C6568bA0": { + "oracle": { + "from": "0x9eCdfaCca946614cc32aF63F3DBe50959244F3af", + "to": "0xEbb721daf3DA9f1b3dcEc590cDf648137172d7CB" + } + }, + "0x6B175474E89094C44Da98b954EedeAC495271d0F": { + "oracle": { + "from": "0xaEb897E1Dc6BbdceD3B9D551C71a8cf172F27AC4", + "to": "0x5c66322CA59bB61e867B28195576DbD8dA4b08dE" + } + }, + "0x6c3ea9036406852006290770BEdFcAbA0e23A0e8": { + "oracle": { + "from": "0x150bAe7Ce224555D39AfdBc6Cb4B8204E594E022", + "to": "0x36964C0579D02E0a5AaAb89E24Cf8d7CDF3549EE" + } + }, + "0x83F20F44975D03b1b09e64809B757c47f942BEeA": { + "oracle": { + "from": "0x29081f7aB5a644716EfcDC10D5c926c5fEe9F72B", + "to": "0xf14f501863F5db3A6D5b7e37af24e2Ca25d7Aea8" + }, + "oracleDescription": { + "from": "sDAI/DAI/USD", + "to": "Capped sDAI / DAI / USD" + } + }, + "0x853d955aCEf822Db058eb8505911ED77F175b99e": { + "oracle": { + "from": "0x45D270263BBee500CF8adcf2AbC0aC227097b036", + "to": "0xeF50f8DC65402c3019586bc8725fCD0b99B8AAd7" + } + }, + "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48": { + "oracle": { + "from": "0x736bF902680e68989886e9807CD7Db4B3E015d3C", + "to": "0xB6557F02F0a5dA7b9D3C2d979cc19e00e756F6dA" + } + }, + "0xdAC17F958D2ee523a2206206994597C13D831ec7": { + "oracle": { + "from": "0xC26D4a1c46d884cfF6dE9800B6aE7A8Cf48B4Ff8", + "to": "0x260326c220E469358846b187eE53328303Efe19C" + } + }, + "0xdC035D45d973E3EC169d2276DDab16f1e407384F": { + "oracle": { + "from": "0x4F01b76391A05d32B20FA2d05dD5963eE8db20E6", + "to": "0x94C7FD62fd0506e71d8142E9D36687fC72A86B02" + }, + "oracleDescription": { + "from": "Capped USDS <-> DAI / USD", + "to": "Capped USDS/USD" + }, + "oracleLatestAnswer": { + "from": "100002917", + "to": "99804349" + } + }, + "0xf939E0A03FB07F59A73314E73794Be0E57ac1b4E": { + "oracle": { + "from": "0x02AeE5b225366302339748951E1a924617b8814F", + "to": "0x9Dc30dc58c72f5B669aEa01d02A2e4da194eE893" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120_before_AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120_after.md b/diffs/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120_before_AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120_after.md new file mode 100644 index 000000000..495604a7a --- /dev/null +++ b/diffs/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120_before_AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120_after.md @@ -0,0 +1,44 @@ +## Reserve changes + +### Reserves altered + +#### WBTC ([0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599](https://etherscan.io/address/0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599)) + +| description | value before | value after | +| --- | --- | --- | +| reserveFactor | 20 % [2000] | 50 % [5000] | +| optimalUsageRatio | 45 % | 80 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=40000000000000000000000000&variableRateSlope2=3000000000000000000000000000&optimalUsageRatio=450000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=3040000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=40000000000000000000000000&variableRateSlope2=3000000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=3040000000000000000000000000) | + +## Emodes changed + +### EMode: ETH correlated(id: 1) + + + +### EMode: sUSDe Stablecoins(id: 2) + + + +## Raw diff + +```json +{ + "reserves": { + "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599": { + "reserveFactor": { + "from": 2000, + "to": 5000 + } + } + }, + "strategies": { + "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599": { + "optimalUsageRatio": { + "from": "450000000000000000000000000", + "to": "800000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Ethereum_WeETHRiskParameterAdjustment_20241223_before_AaveV3Ethereum_WeETHRiskParameterAdjustment_20241223_after.md b/diffs/AaveV3Ethereum_WeETHRiskParameterAdjustment_20241223_before_AaveV3Ethereum_WeETHRiskParameterAdjustment_20241223_after.md new file mode 100644 index 000000000..5e137cc60 --- /dev/null +++ b/diffs/AaveV3Ethereum_WeETHRiskParameterAdjustment_20241223_before_AaveV3Ethereum_WeETHRiskParameterAdjustment_20241223_after.md @@ -0,0 +1,35 @@ +## Reserve changes + +### Reserves altered + +#### weETH ([0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee](https://etherscan.io/address/0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee)) + +| description | value before | value after | +| --- | --- | --- | +| ltv | 72.5 % [7250] | 77.5 % [7750] | +| liquidationThreshold | 75 % [7500] | 80 % [8000] | +| liquidationBonus | 7.5 % | 7 % | + + +## Raw diff + +```json +{ + "reserves": { + "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee": { + "liquidationBonus": { + "from": 10750, + "to": 10700 + }, + "liquidationThreshold": { + "from": 7500, + "to": 8000 + }, + "ltv": { + "from": 7250, + "to": 7750 + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024_before_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024_after.md b/diffs/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024_before_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024_after.md new file mode 100644 index 000000000..168d90d77 --- /dev/null +++ b/diffs/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024_before_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024_after.md @@ -0,0 +1,35 @@ +## Reserve changes + +### Reserves altered + +#### wstETH ([0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0](https://etherscan.io/address/0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 84.75 % | 82 % | +| baseVariableBorrowRate | 0.25 % | 0 % | +| variableRateSlope1 | 4.5 % | 2 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=45000000000000000000000000&variableRateSlope2=800000000000000000000000000&optimalUsageRatio=450000000000000000000000000&baseVariableBorrowRate=2500000000000000000000000&maxVariableBorrowRate=847500000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=20000000000000000000000000&variableRateSlope2=800000000000000000000000000&optimalUsageRatio=450000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=820000000000000000000000000) | + +## Raw diff + +```json +{ + "strategies": { + "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0": { + "baseVariableBorrowRate": { + "from": "2500000000000000000000000", + "to": "0" + }, + "maxVariableBorrowRate": { + "from": "847500000000000000000000000", + "to": "820000000000000000000000000" + }, + "variableRateSlope1": { + "from": "45000000000000000000000000", + "to": "20000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Ethereum_WstETHReserveUpdate_20241203_before_AaveV3Ethereum_WstETHReserveUpdate_20241203_after.md b/diffs/AaveV3Ethereum_WstETHReserveUpdate_20241203_before_AaveV3Ethereum_WstETHReserveUpdate_20241203_after.md new file mode 100644 index 000000000..6b11c208f --- /dev/null +++ b/diffs/AaveV3Ethereum_WstETHReserveUpdate_20241203_before_AaveV3Ethereum_WstETHReserveUpdate_20241203_after.md @@ -0,0 +1,40 @@ +## Reserve changes + +### Reserves altered + +#### wstETH ([0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0](https://etherscan.io/address/0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0)) + +| description | value before | value after | +| --- | --- | --- | +| optimalUsageRatio | 45 % | 80 % | +| maxVariableBorrowRate | 82 % | 86.75 % | +| variableRateSlope1 | 2 % | 1.75 % | +| variableRateSlope2 | 80 % | 85 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=20000000000000000000000000&variableRateSlope2=800000000000000000000000000&optimalUsageRatio=450000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=820000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=17500000000000000000000000&variableRateSlope2=850000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=867500000000000000000000000) | + +## Raw diff + +```json +{ + "strategies": { + "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0": { + "maxVariableBorrowRate": { + "from": "820000000000000000000000000", + "to": "867500000000000000000000000" + }, + "optimalUsageRatio": { + "from": "450000000000000000000000000", + "to": "800000000000000000000000000" + }, + "variableRateSlope1": { + "from": "20000000000000000000000000", + "to": "17500000000000000000000000" + }, + "variableRateSlope2": { + "from": "800000000000000000000000000", + "to": "850000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Gnosis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3Gnosis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md b/diffs/AaveV3Gnosis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3Gnosis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md new file mode 100644 index 000000000..1b5761122 --- /dev/null +++ b/diffs/AaveV3Gnosis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3Gnosis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md @@ -0,0 +1,104 @@ +## Reserve changes + +### Reserve altered + +#### USDC.e ([0x2a22f9c3b484c3629090FeED35F17Ff8F88f76F0](https://gnosisscan.io/address/0x2a22f9c3b484c3629090FeED35F17Ff8F88f76F0)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 84 % | 53.5 % | +| variableRateSlope1 | 9 % | 13.5 % | +| variableRateSlope2 | 75 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=90000000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=840000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=135000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=535000000000000000000000000) | + +#### USDC ([0xDDAfbb505ad214D7b80b1f830fcCc89B60fb7A83](https://gnosisscan.io/address/0xDDAfbb505ad214D7b80b1f830fcCc89B60fb7A83)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 80.5 % | 52.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 75 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=805000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=525000000000000000000000000) | + +#### EURe ([0xcB444e90D8198415266c6a2724b7900fb12FC56E](https://gnosisscan.io/address/0xcB444e90D8198415266c6a2724b7900fb12FC56E)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 80.5 % | 62.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 75 % | 50 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=805000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=500000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=625000000000000000000000000) | + +#### WXDAI ([0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d](https://gnosisscan.io/address/0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 80.5 % | 52.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 75 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=805000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=525000000000000000000000000) | + +## Raw diff + +```json +{ + "strategies": { + "0x2a22f9c3b484c3629090FeED35F17Ff8F88f76F0": { + "maxVariableBorrowRate": { + "from": "840000000000000000000000000", + "to": "535000000000000000000000000" + }, + "variableRateSlope1": { + "from": "90000000000000000000000000", + "to": "135000000000000000000000000" + }, + "variableRateSlope2": { + "from": "750000000000000000000000000", + "to": "400000000000000000000000000" + } + }, + "0xDDAfbb505ad214D7b80b1f830fcCc89B60fb7A83": { + "maxVariableBorrowRate": { + "from": "805000000000000000000000000", + "to": "525000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "750000000000000000000000000", + "to": "400000000000000000000000000" + } + }, + "0xcB444e90D8198415266c6a2724b7900fb12FC56E": { + "maxVariableBorrowRate": { + "from": "805000000000000000000000000", + "to": "625000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "750000000000000000000000000", + "to": "500000000000000000000000000" + } + }, + "0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d": { + "maxVariableBorrowRate": { + "from": "805000000000000000000000000", + "to": "525000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "750000000000000000000000000", + "to": "400000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Gnosis_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Gnosis_ReserveFactorUpdatesMidOctober_20241004_after.md b/diffs/AaveV3Gnosis_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Gnosis_ReserveFactorUpdatesMidOctober_20241004_after.md index e394c69e5..9801e3828 100644 --- a/diffs/AaveV3Gnosis_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Gnosis_ReserveFactorUpdatesMidOctober_20241004_after.md +++ b/diffs/AaveV3Gnosis_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Gnosis_ReserveFactorUpdatesMidOctober_20241004_after.md @@ -9,8 +9,6 @@ | reserveFactor | 20 % [2000] | 25 % [2500] | -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3Gnosis_UpdateLegacyGuardian_20241016_before_AaveV3Gnosis_UpdateLegacyGuardian_20241016_after.md b/diffs/AaveV3Gnosis_UpdateLegacyGuardian_20241016_before_AaveV3Gnosis_UpdateLegacyGuardian_20241016_after.md index dbd03dce4..c15d3e2bc 100644 --- a/diffs/AaveV3Gnosis_UpdateLegacyGuardian_20241016_before_AaveV3Gnosis_UpdateLegacyGuardian_20241016_after.md +++ b/diffs/AaveV3Gnosis_UpdateLegacyGuardian_20241016_before_AaveV3Gnosis_UpdateLegacyGuardian_20241016_after.md @@ -1,5 +1,3 @@ -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3Gnosis_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3Gnosis_UpdatePriceCapAdaptersCAPO_20241101_after.md b/diffs/AaveV3Gnosis_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3Gnosis_UpdatePriceCapAdaptersCAPO_20241101_after.md new file mode 100644 index 000000000..467f7b645 --- /dev/null +++ b/diffs/AaveV3Gnosis_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3Gnosis_UpdatePriceCapAdaptersCAPO_20241101_after.md @@ -0,0 +1,69 @@ +## Reserve changes + +### Reserve altered + +#### USDC.e ([0x2a22f9c3b484c3629090FeED35F17Ff8F88f76F0](https://gnosisscan.io/address/0x2a22f9c3b484c3629090FeED35F17Ff8F88f76F0)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x0a2d05bc646C65A029e602c257DfA14adF8BfAd2](https://gnosisscan.io/address/0x0a2d05bc646C65A029e602c257DfA14adF8BfAd2) | [0x1450C4BE9dd66889CddAB77e5947B6166ACbfAE2](https://gnosisscan.io/address/0x1450C4BE9dd66889CddAB77e5947B6166ACbfAE2) | + + +#### USDC ([0xDDAfbb505ad214D7b80b1f830fcCc89B60fb7A83](https://gnosisscan.io/address/0xDDAfbb505ad214D7b80b1f830fcCc89B60fb7A83)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x0a2d05bc646C65A029e602c257DfA14adF8BfAd2](https://gnosisscan.io/address/0x0a2d05bc646C65A029e602c257DfA14adF8BfAd2) | [0x1450C4BE9dd66889CddAB77e5947B6166ACbfAE2](https://gnosisscan.io/address/0x1450C4BE9dd66889CddAB77e5947B6166ACbfAE2) | + + +#### sDAI ([0xaf204776c7245bF4147c2612BF6e5972Ee483701](https://gnosisscan.io/address/0xaf204776c7245bF4147c2612BF6e5972Ee483701)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x1D0f881Ce1a646E2f27Dec3c57Fa056cB838BCC2](https://gnosisscan.io/address/0x1D0f881Ce1a646E2f27Dec3c57Fa056cB838BCC2) | [0x38fe17BA2dfF456C6c980dD2227B0abA89FCB105](https://gnosisscan.io/address/0x38fe17BA2dfF456C6c980dD2227B0abA89FCB105) | +| oracleDescription | sDAI/DAI/USD | Capped sDAI / DAI / USD | + + +#### WXDAI ([0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d](https://gnosisscan.io/address/0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0xE5269eF0CE04E509E8134624c7BF043b21e10897](https://gnosisscan.io/address/0xE5269eF0CE04E509E8134624c7BF043b21e10897) | [0x7443afE82986d7475Cea0c5b04C6F1581fdAce87](https://gnosisscan.io/address/0x7443afE82986d7475Cea0c5b04C6F1581fdAce87) | + + +## Raw diff + +```json +{ + "reserves": { + "0x2a22f9c3b484c3629090FeED35F17Ff8F88f76F0": { + "oracle": { + "from": "0x0a2d05bc646C65A029e602c257DfA14adF8BfAd2", + "to": "0x1450C4BE9dd66889CddAB77e5947B6166ACbfAE2" + } + }, + "0xDDAfbb505ad214D7b80b1f830fcCc89B60fb7A83": { + "oracle": { + "from": "0x0a2d05bc646C65A029e602c257DfA14adF8BfAd2", + "to": "0x1450C4BE9dd66889CddAB77e5947B6166ACbfAE2" + } + }, + "0xaf204776c7245bF4147c2612BF6e5972Ee483701": { + "oracle": { + "from": "0x1D0f881Ce1a646E2f27Dec3c57Fa056cB838BCC2", + "to": "0x38fe17BA2dfF456C6c980dD2227B0abA89FCB105" + }, + "oracleDescription": { + "from": "sDAI/DAI/USD", + "to": "Capped sDAI / DAI / USD" + } + }, + "0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d": { + "oracle": { + "from": "0xE5269eF0CE04E509E8134624c7BF043b21e10897", + "to": "0x7443afE82986d7475Cea0c5b04C6F1581fdAce87" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Metis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3Metis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md b/diffs/AaveV3Metis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3Metis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md new file mode 100644 index 000000000..bf1459031 --- /dev/null +++ b/diffs/AaveV3Metis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3Metis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md @@ -0,0 +1,81 @@ +## Reserve changes + +### Reserve altered + +#### m.DAI ([0x4c078361FC9BbB78DF910800A991C7c3DD2F6ce0](https://explorer.metis.io/address/0x4c078361FC9BbB78DF910800A991C7c3DD2F6ce0)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 82 % | 62.5 % | +| variableRateSlope1 | 7 % | 12.5 % | +| variableRateSlope2 | 75 % | 50 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=70000000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=820000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=500000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=625000000000000000000000000) | + +#### m.USDC ([0xEA32A96608495e54156Ae48931A7c20f0dcc1a21](https://explorer.metis.io/address/0xEA32A96608495e54156Ae48931A7c20f0dcc1a21)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 66 % | 52.5 % | +| variableRateSlope1 | 6 % | 12.5 % | +| variableRateSlope2 | 60 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=60000000000000000000000000&variableRateSlope2=600000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=660000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=525000000000000000000000000) | + +#### m.USDT ([0xbB06DCA3AE6887fAbF931640f67cab3e3a16F4dC](https://explorer.metis.io/address/0xbB06DCA3AE6887fAbF931640f67cab3e3a16F4dC)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 81 % | 52.5 % | +| variableRateSlope1 | 6 % | 12.5 % | +| variableRateSlope2 | 75 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=60000000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=810000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=525000000000000000000000000) | + +## Raw diff + +```json +{ + "strategies": { + "0x4c078361FC9BbB78DF910800A991C7c3DD2F6ce0": { + "maxVariableBorrowRate": { + "from": "820000000000000000000000000", + "to": "625000000000000000000000000" + }, + "variableRateSlope1": { + "from": "70000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "750000000000000000000000000", + "to": "500000000000000000000000000" + } + }, + "0xEA32A96608495e54156Ae48931A7c20f0dcc1a21": { + "maxVariableBorrowRate": { + "from": "660000000000000000000000000", + "to": "525000000000000000000000000" + }, + "variableRateSlope1": { + "from": "60000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "600000000000000000000000000", + "to": "400000000000000000000000000" + } + }, + "0xbB06DCA3AE6887fAbF931640f67cab3e3a16F4dC": { + "maxVariableBorrowRate": { + "from": "810000000000000000000000000", + "to": "525000000000000000000000000" + }, + "variableRateSlope1": { + "from": "60000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "750000000000000000000000000", + "to": "400000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Metis_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3Metis_UpdatePriceCapAdaptersCAPO_20241101_after.md b/diffs/AaveV3Metis_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3Metis_UpdatePriceCapAdaptersCAPO_20241101_after.md new file mode 100644 index 000000000..7abb197a3 --- /dev/null +++ b/diffs/AaveV3Metis_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3Metis_UpdatePriceCapAdaptersCAPO_20241101_after.md @@ -0,0 +1,51 @@ +## Reserve changes + +### Reserve altered + +#### m.DAI ([0x4c078361FC9BbB78DF910800A991C7c3DD2F6ce0](https://explorer.metis.io/address/0x4c078361FC9BbB78DF910800A991C7c3DD2F6ce0)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0xB3721282cd62Ba8F7bB02Cb843F3a34f9e109ef8](https://explorer.metis.io/address/0xB3721282cd62Ba8F7bB02Cb843F3a34f9e109ef8) | [0xf577E512687C83706ccfeD31C1939C75E8ea966F](https://explorer.metis.io/address/0xf577E512687C83706ccfeD31C1939C75E8ea966F) | + + +#### m.USDC ([0xEA32A96608495e54156Ae48931A7c20f0dcc1a21](https://explorer.metis.io/address/0xEA32A96608495e54156Ae48931A7c20f0dcc1a21)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0xF2acD6aE4fcf662161eA354dA844f224bf91FF8c](https://explorer.metis.io/address/0xF2acD6aE4fcf662161eA354dA844f224bf91FF8c) | [0x0b9cA640284cf2636577703f785D5aEEc466BC56](https://explorer.metis.io/address/0x0b9cA640284cf2636577703f785D5aEEc466BC56) | + + +#### m.USDT ([0xbB06DCA3AE6887fAbF931640f67cab3e3a16F4dC](https://explorer.metis.io/address/0xbB06DCA3AE6887fAbF931640f67cab3e3a16F4dC)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0xD1D7DCBDE72916646A7F8AcE6Ad8C5179D8ddFbB](https://explorer.metis.io/address/0xD1D7DCBDE72916646A7F8AcE6Ad8C5179D8ddFbB) | [0x433636CB0136Cfd75145ccca608Bb548E6C037dE](https://explorer.metis.io/address/0x433636CB0136Cfd75145ccca608Bb548E6C037dE) | + + +## Raw diff + +```json +{ + "reserves": { + "0x4c078361FC9BbB78DF910800A991C7c3DD2F6ce0": { + "oracle": { + "from": "0xB3721282cd62Ba8F7bB02Cb843F3a34f9e109ef8", + "to": "0xf577E512687C83706ccfeD31C1939C75E8ea966F" + } + }, + "0xEA32A96608495e54156Ae48931A7c20f0dcc1a21": { + "oracle": { + "from": "0xF2acD6aE4fcf662161eA354dA844f224bf91FF8c", + "to": "0x0b9cA640284cf2636577703f785D5aEEc466BC56" + } + }, + "0xbB06DCA3AE6887fAbF931640f67cab3e3a16F4dC": { + "oracle": { + "from": "0xD1D7DCBDE72916646A7F8AcE6Ad8C5179D8ddFbB", + "to": "0x433636CB0136Cfd75145ccca608Bb548E6C037dE" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118_before_AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118_after.md b/diffs/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118_before_AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118_before_AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3Optimism_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3Optimism_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md b/diffs/AaveV3Optimism_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3Optimism_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md new file mode 100644 index 000000000..814c5d0dc --- /dev/null +++ b/diffs/AaveV3Optimism_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3Optimism_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md @@ -0,0 +1,150 @@ +## Reserve changes + +### Reserve altered + +#### USDC ([0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85](https://optimistic.etherscan.io/address/0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 65.5 % | 52.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 60 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=600000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=655000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=525000000000000000000000000) | + +#### USDC ([0x7F5c764cBc14f9669B88837ca1490cCa17c31607](https://optimistic.etherscan.io/address/0x7F5c764cBc14f9669B88837ca1490cCa17c31607)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 86.5 % | 53.5 % | +| variableRateSlope1 | 6.5 % | 13.5 % | +| variableRateSlope2 | 80 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=65000000000000000000000000&variableRateSlope2=800000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=865000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=135000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=535000000000000000000000000) | + +#### sUSD ([0x8c6f28f2F1A3C87F0f938b96d27520d9751ec8d9](https://optimistic.etherscan.io/address/0x8c6f28f2F1A3C87F0f938b96d27520d9751ec8d9)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 80.5 % | 62.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 75 % | 50 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=805000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=500000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=625000000000000000000000000) | + +#### USDT ([0x94b008aA00579c1307B0EF2c499aD98a8ce58e58](https://optimistic.etherscan.io/address/0x94b008aA00579c1307B0EF2c499aD98a8ce58e58)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 80.5 % | 52.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 75 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=805000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=525000000000000000000000000) | + +#### DAI ([0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1](https://optimistic.etherscan.io/address/0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 80.5 % | 52.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 75 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=805000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=525000000000000000000000000) | + +#### LUSD ([0xc40F949F8a4e094D1b49a23ea9241D289B7b2819](https://optimistic.etherscan.io/address/0xc40F949F8a4e094D1b49a23ea9241D289B7b2819)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 92.5 % | 62.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 87 % | 50 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=870000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=925000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=500000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=625000000000000000000000000) | + +## Raw diff + +```json +{ + "strategies": { + "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85": { + "maxVariableBorrowRate": { + "from": "655000000000000000000000000", + "to": "525000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "600000000000000000000000000", + "to": "400000000000000000000000000" + } + }, + "0x7F5c764cBc14f9669B88837ca1490cCa17c31607": { + "maxVariableBorrowRate": { + "from": "865000000000000000000000000", + "to": "535000000000000000000000000" + }, + "variableRateSlope1": { + "from": "65000000000000000000000000", + "to": "135000000000000000000000000" + }, + "variableRateSlope2": { + "from": "800000000000000000000000000", + "to": "400000000000000000000000000" + } + }, + "0x8c6f28f2F1A3C87F0f938b96d27520d9751ec8d9": { + "maxVariableBorrowRate": { + "from": "805000000000000000000000000", + "to": "625000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "750000000000000000000000000", + "to": "500000000000000000000000000" + } + }, + "0x94b008aA00579c1307B0EF2c499aD98a8ce58e58": { + "maxVariableBorrowRate": { + "from": "805000000000000000000000000", + "to": "525000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "750000000000000000000000000", + "to": "400000000000000000000000000" + } + }, + "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1": { + "maxVariableBorrowRate": { + "from": "805000000000000000000000000", + "to": "525000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "750000000000000000000000000", + "to": "400000000000000000000000000" + } + }, + "0xc40F949F8a4e094D1b49a23ea9241D289B7b2819": { + "maxVariableBorrowRate": { + "from": "925000000000000000000000000", + "to": "625000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "870000000000000000000000000", + "to": "500000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Optimism_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Optimism_ReserveFactorUpdatesMidOctober_20241004_after.md b/diffs/AaveV3Optimism_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Optimism_ReserveFactorUpdatesMidOctober_20241004_after.md index 980195bc0..06fb9593b 100644 --- a/diffs/AaveV3Optimism_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Optimism_ReserveFactorUpdatesMidOctober_20241004_after.md +++ b/diffs/AaveV3Optimism_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Optimism_ReserveFactorUpdatesMidOctober_20241004_after.md @@ -9,8 +9,6 @@ | reserveFactor | 45 % [4500] | 50 % [5000] | -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113_before_AaveV3Optimism_SeptemberFundingUpdatePartA_20241113_after.md b/diffs/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113_before_AaveV3Optimism_SeptemberFundingUpdatePartA_20241113_after.md new file mode 100644 index 000000000..bdcf791a9 --- /dev/null +++ b/diffs/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113_before_AaveV3Optimism_SeptemberFundingUpdatePartA_20241113_after.md @@ -0,0 +1,48 @@ +## Reserve changes + +### Reserve altered + +#### USDC ([0x7F5c764cBc14f9669B88837ca1490cCa17c31607](https://optimistic.etherscan.io/address/0x7F5c764cBc14f9669B88837ca1490cCa17c31607)) + +| description | value before | value after | +| --- | --- | --- | +| aTokenUnderlyingBalance | 546,549.4039 USDC [546549403932] | 495,281.6742 USDC [495281674219] | +| virtualBalance | 546,472.3570 USDC [546472357070] | 495,204.6273 USDC [495204627357] | + + +#### LUSD ([0xc40F949F8a4e094D1b49a23ea9241D289B7b2819](https://optimistic.etherscan.io/address/0xc40F949F8a4e094D1b49a23ea9241D289B7b2819)) + +| description | value before | value after | +| --- | --- | --- | +| aTokenUnderlyingBalance | 50,745.9305 LUSD [50745930580778611947683] | 47,352.8754 LUSD [47352875460535625271531] | +| virtualBalance | 50,745.9305 LUSD [50745930580778611947683] | 47,352.8754 LUSD [47352875460535625271531] | + + +## Raw diff + +```json +{ + "reserves": { + "0x7F5c764cBc14f9669B88837ca1490cCa17c31607": { + "aTokenUnderlyingBalance": { + "from": "546549403932", + "to": "495281674219" + }, + "virtualBalance": { + "from": "546472357070", + "to": "495204627357" + } + }, + "0xc40F949F8a4e094D1b49a23ea9241D289B7b2819": { + "aTokenUnderlyingBalance": { + "from": "50745930580778611947683", + "to": "47352875460535625271531" + }, + "virtualBalance": { + "from": "50745930580778611947683", + "to": "47352875460535625271531" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Optimism_UpdateLegacyGuardian_20241016_before_AaveV3Optimism_UpdateLegacyGuardian_20241016_after.md b/diffs/AaveV3Optimism_UpdateLegacyGuardian_20241016_before_AaveV3Optimism_UpdateLegacyGuardian_20241016_after.md index dbd03dce4..c15d3e2bc 100644 --- a/diffs/AaveV3Optimism_UpdateLegacyGuardian_20241016_before_AaveV3Optimism_UpdateLegacyGuardian_20241016_after.md +++ b/diffs/AaveV3Optimism_UpdateLegacyGuardian_20241016_before_AaveV3Optimism_UpdateLegacyGuardian_20241016_after.md @@ -1,5 +1,3 @@ -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3Optimism_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3Optimism_UpdatePriceCapAdaptersCAPO_20241101_after.md b/diffs/AaveV3Optimism_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3Optimism_UpdatePriceCapAdaptersCAPO_20241101_after.md new file mode 100644 index 000000000..26d46f4b6 --- /dev/null +++ b/diffs/AaveV3Optimism_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3Optimism_UpdatePriceCapAdaptersCAPO_20241101_after.md @@ -0,0 +1,103 @@ +## Reserve changes + +### Reserve altered + +#### USDC ([0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85](https://optimistic.etherscan.io/address/0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x2daA7078f78485A708003989cBc9a643e3b4B61f](https://optimistic.etherscan.io/address/0x2daA7078f78485A708003989cBc9a643e3b4B61f) | [0x6379A975Ef93EC2bE87f56A02CCF8535dFAde201](https://optimistic.etherscan.io/address/0x6379A975Ef93EC2bE87f56A02CCF8535dFAde201) | + + +#### USDC ([0x7F5c764cBc14f9669B88837ca1490cCa17c31607](https://optimistic.etherscan.io/address/0x7F5c764cBc14f9669B88837ca1490cCa17c31607)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x2daA7078f78485A708003989cBc9a643e3b4B61f](https://optimistic.etherscan.io/address/0x2daA7078f78485A708003989cBc9a643e3b4B61f) | [0x6379A975Ef93EC2bE87f56A02CCF8535dFAde201](https://optimistic.etherscan.io/address/0x6379A975Ef93EC2bE87f56A02CCF8535dFAde201) | + + +#### sUSD ([0x8c6f28f2F1A3C87F0f938b96d27520d9751ec8d9](https://optimistic.etherscan.io/address/0x8c6f28f2F1A3C87F0f938b96d27520d9751ec8d9)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0xC77E9CF9603F5ef5503213229ABB1Fec3001f312](https://optimistic.etherscan.io/address/0xC77E9CF9603F5ef5503213229ABB1Fec3001f312) | [0x8ea108096AdEA6Ac059cbEaE6862ce9BB52B4E87](https://optimistic.etherscan.io/address/0x8ea108096AdEA6Ac059cbEaE6862ce9BB52B4E87) | + + +#### USDT ([0x94b008aA00579c1307B0EF2c499aD98a8ce58e58](https://optimistic.etherscan.io/address/0x94b008aA00579c1307B0EF2c499aD98a8ce58e58)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x70E6DBBFFc9c3c6fB4a9c349E3101B7dCEE67f4D](https://optimistic.etherscan.io/address/0x70E6DBBFFc9c3c6fB4a9c349E3101B7dCEE67f4D) | [0xDb4E371F8dc7D834D3F1359295c669352ECe7D9c](https://optimistic.etherscan.io/address/0xDb4E371F8dc7D834D3F1359295c669352ECe7D9c) | + + +#### DAI ([0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1](https://optimistic.etherscan.io/address/0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x1a96fe91278bcF6F19665F642FE7a88cD5c360bb](https://optimistic.etherscan.io/address/0x1a96fe91278bcF6F19665F642FE7a88cD5c360bb) | [0xf116891adaBb21Df94663c8Aa62f87fC1bc19d53](https://optimistic.etherscan.io/address/0xf116891adaBb21Df94663c8Aa62f87fC1bc19d53) | + + +#### LUSD ([0xc40F949F8a4e094D1b49a23ea9241D289B7b2819](https://optimistic.etherscan.io/address/0xc40F949F8a4e094D1b49a23ea9241D289B7b2819)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x8f4dAFb6Feb190e7846eb7665fD49FFb1177Ff8e](https://optimistic.etherscan.io/address/0x8f4dAFb6Feb190e7846eb7665fD49FFb1177Ff8e) | [0x5a602E33B935415477550c709a79cDF23E1355d5](https://optimistic.etherscan.io/address/0x5a602E33B935415477550c709a79cDF23E1355d5) | + + +#### MAI ([0xdFA46478F9e5EA86d57387849598dbFB2e964b02](https://optimistic.etherscan.io/address/0xdFA46478F9e5EA86d57387849598dbFB2e964b02)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0xc6ac65E8f4F50a6655Efd78A92b6c503B5B625C8](https://optimistic.etherscan.io/address/0xc6ac65E8f4F50a6655Efd78A92b6c503B5B625C8) | [0x1D85F6eB05f618154ac520D2fDa74C40D21BD93e](https://optimistic.etherscan.io/address/0x1D85F6eB05f618154ac520D2fDa74C40D21BD93e) | + + +## Raw diff + +```json +{ + "reserves": { + "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85": { + "oracle": { + "from": "0x2daA7078f78485A708003989cBc9a643e3b4B61f", + "to": "0x6379A975Ef93EC2bE87f56A02CCF8535dFAde201" + } + }, + "0x7F5c764cBc14f9669B88837ca1490cCa17c31607": { + "oracle": { + "from": "0x2daA7078f78485A708003989cBc9a643e3b4B61f", + "to": "0x6379A975Ef93EC2bE87f56A02CCF8535dFAde201" + } + }, + "0x8c6f28f2F1A3C87F0f938b96d27520d9751ec8d9": { + "oracle": { + "from": "0xC77E9CF9603F5ef5503213229ABB1Fec3001f312", + "to": "0x8ea108096AdEA6Ac059cbEaE6862ce9BB52B4E87" + } + }, + "0x94b008aA00579c1307B0EF2c499aD98a8ce58e58": { + "oracle": { + "from": "0x70E6DBBFFc9c3c6fB4a9c349E3101B7dCEE67f4D", + "to": "0xDb4E371F8dc7D834D3F1359295c669352ECe7D9c" + } + }, + "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1": { + "oracle": { + "from": "0x1a96fe91278bcF6F19665F642FE7a88cD5c360bb", + "to": "0xf116891adaBb21Df94663c8Aa62f87fC1bc19d53" + } + }, + "0xc40F949F8a4e094D1b49a23ea9241D289B7b2819": { + "oracle": { + "from": "0x8f4dAFb6Feb190e7846eb7665fD49FFb1177Ff8e", + "to": "0x5a602E33B935415477550c709a79cDF23E1355d5" + } + }, + "0xdFA46478F9e5EA86d57387849598dbFB2e964b02": { + "oracle": { + "from": "0xc6ac65E8f4F50a6655Efd78A92b6c503B5B625C8", + "to": "0x1D85F6eB05f618154ac520D2fDa74C40D21BD93e" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120_before_AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120_after.md b/diffs/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120_before_AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120_after.md new file mode 100644 index 000000000..31c026ce8 --- /dev/null +++ b/diffs/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120_before_AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120_after.md @@ -0,0 +1,44 @@ +## Reserve changes + +### Reserves altered + +#### WBTC ([0x68f180fcCe6836688e9084f035309E29Bf0A2095](https://optimistic.etherscan.io/address/0x68f180fcCe6836688e9084f035309E29Bf0A2095)) + +| description | value before | value after | +| --- | --- | --- | +| reserveFactor | 20 % [2000] | 50 % [5000] | +| optimalUsageRatio | 45 % | 80 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=40000000000000000000000000&variableRateSlope2=3000000000000000000000000000&optimalUsageRatio=450000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=3040000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=40000000000000000000000000&variableRateSlope2=3000000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=3040000000000000000000000000) | + +## Emodes changed + +### EMode: Stablecoins(id: 1) + + + +### EMode: ETH correlated(id: 2) + + + +## Raw diff + +```json +{ + "reserves": { + "0x68f180fcCe6836688e9084f035309E29Bf0A2095": { + "reserveFactor": { + "from": 2000, + "to": 5000 + } + } + }, + "strategies": { + "0x68f180fcCe6836688e9084f035309E29Bf0A2095": { + "optimalUsageRatio": { + "from": "450000000000000000000000000", + "to": "800000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118_before_AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118_after.md b/diffs/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118_before_AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118_after.md new file mode 100644 index 000000000..c15d3e2bc --- /dev/null +++ b/diffs/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118_before_AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118_after.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/AaveV3Polygon_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3Polygon_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md b/diffs/AaveV3Polygon_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3Polygon_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md new file mode 100644 index 000000000..ea2ff95a0 --- /dev/null +++ b/diffs/AaveV3Polygon_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3Polygon_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md @@ -0,0 +1,127 @@ +## Reserve changes + +### Reserve altered + +#### USDC ([0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174](https://polygonscan.com/address/0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 90 % | 53.5 % | +| variableRateSlope1 | 10 % | 13.5 % | +| variableRateSlope2 | 80 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=100000000000000000000000000&variableRateSlope2=800000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=900000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=135000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=535000000000000000000000000) | + +#### USDC ([0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359](https://polygonscan.com/address/0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 65.5 % | 52.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 60 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=600000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=655000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=525000000000000000000000000) | + +#### DAI ([0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063](https://polygonscan.com/address/0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 80.5 % | 52.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 75 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=805000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=525000000000000000000000000) | + +#### EURS ([0xE111178A87A3BFf0c8d18DECBa5798827539Ae99](https://polygonscan.com/address/0xE111178A87A3BFf0c8d18DECBa5798827539Ae99)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 80.5 % | 62.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 75 % | 50 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=805000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=500000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=625000000000000000000000000) | + +#### USDT ([0xc2132D05D31c914a87C6611C10748AEb04B58e8F](https://polygonscan.com/address/0xc2132D05D31c914a87C6611C10748AEb04B58e8F)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 80.5 % | 52.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 75 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=750000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=805000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=525000000000000000000000000) | + +## Raw diff + +```json +{ + "strategies": { + "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174": { + "maxVariableBorrowRate": { + "from": "900000000000000000000000000", + "to": "535000000000000000000000000" + }, + "variableRateSlope1": { + "from": "100000000000000000000000000", + "to": "135000000000000000000000000" + }, + "variableRateSlope2": { + "from": "800000000000000000000000000", + "to": "400000000000000000000000000" + } + }, + "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359": { + "maxVariableBorrowRate": { + "from": "655000000000000000000000000", + "to": "525000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "600000000000000000000000000", + "to": "400000000000000000000000000" + } + }, + "0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063": { + "maxVariableBorrowRate": { + "from": "805000000000000000000000000", + "to": "525000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "750000000000000000000000000", + "to": "400000000000000000000000000" + } + }, + "0xE111178A87A3BFf0c8d18DECBa5798827539Ae99": { + "maxVariableBorrowRate": { + "from": "805000000000000000000000000", + "to": "625000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "750000000000000000000000000", + "to": "500000000000000000000000000" + } + }, + "0xc2132D05D31c914a87C6611C10748AEb04B58e8F": { + "maxVariableBorrowRate": { + "from": "805000000000000000000000000", + "to": "525000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "750000000000000000000000000", + "to": "400000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Polygon_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Polygon_ReserveFactorUpdatesMidOctober_20241004_after.md b/diffs/AaveV3Polygon_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Polygon_ReserveFactorUpdatesMidOctober_20241004_after.md index 3090391ec..dedef70e1 100644 --- a/diffs/AaveV3Polygon_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Polygon_ReserveFactorUpdatesMidOctober_20241004_after.md +++ b/diffs/AaveV3Polygon_ReserveFactorUpdatesMidOctober_20241004_before_AaveV3Polygon_ReserveFactorUpdatesMidOctober_20241004_after.md @@ -9,8 +9,6 @@ | reserveFactor | 45 % [4500] | 50 % [5000] | -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113_before_AaveV3Polygon_SeptemberFundingUpdatePartA_20241113_after.md b/diffs/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113_before_AaveV3Polygon_SeptemberFundingUpdatePartA_20241113_after.md new file mode 100644 index 000000000..ebf37a9b7 --- /dev/null +++ b/diffs/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113_before_AaveV3Polygon_SeptemberFundingUpdatePartA_20241113_after.md @@ -0,0 +1,120 @@ +## Reserve changes + +### Reserve altered + +#### WPOL ([0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270](https://polygonscan.com/address/0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270)) + +| description | value before | value after | +| --- | --- | --- | +| aTokenUnderlyingBalance | 52,650,750.6758 WPOL [52650750675856200640974187] | 52,667,562.2081 WPOL [52667562208106867321829248] | +| virtualBalance | 52,650,750.6758 WPOL [52650750675856200640974187] | 52,667,562.2081 WPOL [52667562208106867321829248] | + + +#### USDC ([0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174](https://polygonscan.com/address/0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174)) + +| description | value before | value after | +| --- | --- | --- | +| aTokenUnderlyingBalance | 1,707,045.0579 USDC [1707045057954] | 1,609,614.1753 USDC [1609614175343] | +| virtualBalance | 1,706,866.8345 USDC [1706866834534] | 1,609,435.9519 USDC [1609435951923] | + + +#### LINK ([0x53E0bca35eC356BD5ddDFebbD1Fc0fD03FaBad39](https://polygonscan.com/address/0x53E0bca35eC356BD5ddDFebbD1Fc0fD03FaBad39)) + +| description | value before | value after | +| --- | --- | --- | +| aTokenUnderlyingBalance | 760,821.4170 LINK [760821417069511886594222] | 760,872.1296 LINK [760872129635541295966141] | +| virtualBalance | 760,821.4105 LINK [760821410547668237659103] | 760,872.1231 LINK [760872123113697647031022] | + + +#### WETH ([0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619](https://polygonscan.com/address/0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619)) + +| description | value before | value after | +| --- | --- | --- | +| aTokenUnderlyingBalance | 15,758.8942 WETH [15758894219160674399387] | 15,767.0373 WETH [15767037334375620833165] | +| virtualBalance | 15,758.8942 WETH [15758894219160674399387] | 15,767.0373 WETH [15767037334375620833165] | + + +#### DAI ([0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063](https://polygonscan.com/address/0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063)) + +| description | value before | value after | +| --- | --- | --- | +| aTokenUnderlyingBalance | 796,729.9585 DAI [796729958523072652649220] | 1,065,764.4509 DAI [1065764450949738388580093] | +| virtualBalance | 796,569.0625 DAI [796569062545281907932762] | 1,065,603.5549 DAI [1065603554971947643863635] | + + +#### USDT ([0xc2132D05D31c914a87C6611C10748AEb04B58e8F](https://polygonscan.com/address/0xc2132D05D31c914a87C6611C10748AEb04B58e8F)) + +| description | value before | value after | +| --- | --- | --- | +| aTokenUnderlyingBalance | 3,912,929.3134 USDT [3912929313459] | 4,296,001.3224 USDT [4296001322402] | +| virtualBalance | 3,912,857.1847 USDT [3912857184739] | 4,295,929.1936 USDT [4295929193682] | + + +## Raw diff + +```json +{ + "reserves": { + "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270": { + "aTokenUnderlyingBalance": { + "from": "52650750675856200640974187", + "to": "52667562208106867321829248" + }, + "virtualBalance": { + "from": "52650750675856200640974187", + "to": "52667562208106867321829248" + } + }, + "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174": { + "aTokenUnderlyingBalance": { + "from": "1707045057954", + "to": "1609614175343" + }, + "virtualBalance": { + "from": "1706866834534", + "to": "1609435951923" + } + }, + "0x53E0bca35eC356BD5ddDFebbD1Fc0fD03FaBad39": { + "aTokenUnderlyingBalance": { + "from": "760821417069511886594222", + "to": "760872129635541295966141" + }, + "virtualBalance": { + "from": "760821410547668237659103", + "to": "760872123113697647031022" + } + }, + "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619": { + "aTokenUnderlyingBalance": { + "from": "15758894219160674399387", + "to": "15767037334375620833165" + }, + "virtualBalance": { + "from": "15758894219160674399387", + "to": "15767037334375620833165" + } + }, + "0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063": { + "aTokenUnderlyingBalance": { + "from": "796729958523072652649220", + "to": "1065764450949738388580093" + }, + "virtualBalance": { + "from": "796569062545281907932762", + "to": "1065603554971947643863635" + } + }, + "0xc2132D05D31c914a87C6611C10748AEb04B58e8F": { + "aTokenUnderlyingBalance": { + "from": "3912929313459", + "to": "4296001322402" + }, + "virtualBalance": { + "from": "3912857184739", + "to": "4295929193682" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Polygon_UpdateLegacyGuardian_20241016_before_AaveV3Polygon_UpdateLegacyGuardian_20241016_after.md b/diffs/AaveV3Polygon_UpdateLegacyGuardian_20241016_before_AaveV3Polygon_UpdateLegacyGuardian_20241016_after.md index dbd03dce4..c15d3e2bc 100644 --- a/diffs/AaveV3Polygon_UpdateLegacyGuardian_20241016_before_AaveV3Polygon_UpdateLegacyGuardian_20241016_after.md +++ b/diffs/AaveV3Polygon_UpdateLegacyGuardian_20241016_before_AaveV3Polygon_UpdateLegacyGuardian_20241016_after.md @@ -1,5 +1,3 @@ -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3Polygon_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3Polygon_UpdatePriceCapAdaptersCAPO_20241101_after.md b/diffs/AaveV3Polygon_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3Polygon_UpdatePriceCapAdaptersCAPO_20241101_after.md new file mode 100644 index 000000000..c83a7e76f --- /dev/null +++ b/diffs/AaveV3Polygon_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3Polygon_UpdatePriceCapAdaptersCAPO_20241101_after.md @@ -0,0 +1,77 @@ +## Reserve changes + +### Reserve altered + +#### USDC ([0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174](https://polygonscan.com/address/0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x17E33D122FC34c7ad8FBd4a1995Dff9c8aE675eb](https://polygonscan.com/address/0x17E33D122FC34c7ad8FBd4a1995Dff9c8aE675eb) | [0x31Ebeb03223AaC82C8EB24C77624Ea40F4D849Fb](https://polygonscan.com/address/0x31Ebeb03223AaC82C8EB24C77624Ea40F4D849Fb) | + + +#### USDC ([0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359](https://polygonscan.com/address/0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x17E33D122FC34c7ad8FBd4a1995Dff9c8aE675eb](https://polygonscan.com/address/0x17E33D122FC34c7ad8FBd4a1995Dff9c8aE675eb) | [0x31Ebeb03223AaC82C8EB24C77624Ea40F4D849Fb](https://polygonscan.com/address/0x31Ebeb03223AaC82C8EB24C77624Ea40F4D849Fb) | + + +#### DAI ([0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063](https://polygonscan.com/address/0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0xF86577E7d27Ed35b85A7645c58bAaA64453fe32B](https://polygonscan.com/address/0xF86577E7d27Ed35b85A7645c58bAaA64453fe32B) | [0xa1913Df228db08F02F3F3Dc0f397Af3A2d2f96A1](https://polygonscan.com/address/0xa1913Df228db08F02F3F3Dc0f397Af3A2d2f96A1) | + + +#### miMATIC ([0xa3Fa99A148fA48D14Ed51d610c367C61876997F1](https://polygonscan.com/address/0xa3Fa99A148fA48D14Ed51d610c367C61876997F1)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x4ae2Ab1af7e3b0092dbF3A4B20ec3de8fC834873](https://polygonscan.com/address/0x4ae2Ab1af7e3b0092dbF3A4B20ec3de8fC834873) | [0x1e2Ba4725c6847dC8304466c4eA25A872A7D43a8](https://polygonscan.com/address/0x1e2Ba4725c6847dC8304466c4eA25A872A7D43a8) | + + +#### USDT ([0xc2132D05D31c914a87C6611C10748AEb04B58e8F](https://polygonscan.com/address/0xc2132D05D31c914a87C6611C10748AEb04B58e8F)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0xaA574f4f6E124E77a7a1B5Ed91c8b407000A7730](https://polygonscan.com/address/0xaA574f4f6E124E77a7a1B5Ed91c8b407000A7730) | [0x01Aba1Fe7D72a3490bEef7CD0C09e1Ba2dD88D83](https://polygonscan.com/address/0x01Aba1Fe7D72a3490bEef7CD0C09e1Ba2dD88D83) | + + +## Raw diff + +```json +{ + "reserves": { + "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174": { + "oracle": { + "from": "0x17E33D122FC34c7ad8FBd4a1995Dff9c8aE675eb", + "to": "0x31Ebeb03223AaC82C8EB24C77624Ea40F4D849Fb" + } + }, + "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359": { + "oracle": { + "from": "0x17E33D122FC34c7ad8FBd4a1995Dff9c8aE675eb", + "to": "0x31Ebeb03223AaC82C8EB24C77624Ea40F4D849Fb" + } + }, + "0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063": { + "oracle": { + "from": "0xF86577E7d27Ed35b85A7645c58bAaA64453fe32B", + "to": "0xa1913Df228db08F02F3F3Dc0f397Af3A2d2f96A1" + } + }, + "0xa3Fa99A148fA48D14Ed51d610c367C61876997F1": { + "oracle": { + "from": "0x4ae2Ab1af7e3b0092dbF3A4B20ec3de8fC834873", + "to": "0x1e2Ba4725c6847dC8304466c4eA25A872A7D43a8" + } + }, + "0xc2132D05D31c914a87C6611C10748AEb04B58e8F": { + "oracle": { + "from": "0xaA574f4f6E124E77a7a1B5Ed91c8b407000A7730", + "to": "0x01Aba1Fe7D72a3490bEef7CD0C09e1Ba2dD88D83" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120_before_AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120_after.md b/diffs/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120_before_AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120_after.md new file mode 100644 index 000000000..d8df55857 --- /dev/null +++ b/diffs/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120_before_AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120_after.md @@ -0,0 +1,48 @@ +## Reserve changes + +### Reserves altered + +#### WBTC ([0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6](https://polygonscan.com/address/0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6)) + +| description | value before | value after | +| --- | --- | --- | +| reserveFactor | 20 % [2000] | 50 % [5000] | +| optimalUsageRatio | 45 % | 80 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=40000000000000000000000000&variableRateSlope2=3000000000000000000000000000&optimalUsageRatio=450000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=3040000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=40000000000000000000000000&variableRateSlope2=3000000000000000000000000000&optimalUsageRatio=800000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=3040000000000000000000000000) | + +## Emodes changed + +### EMode: Stablecoins(id: 1) + + + +### EMode: MATIC correlated(id: 2) + + + +### EMode: ETH correlated(id: 3) + + + +## Raw diff + +```json +{ + "reserves": { + "0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6": { + "reserveFactor": { + "from": 2000, + "to": 5000 + } + } + }, + "strategies": { + "0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6": { + "optimalUsageRatio": { + "from": "450000000000000000000000000", + "to": "800000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Scroll_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3Scroll_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md b/diffs/AaveV3Scroll_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3Scroll_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md new file mode 100644 index 000000000..b79b7d146 --- /dev/null +++ b/diffs/AaveV3Scroll_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_before_AaveV3Scroll_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_after.md @@ -0,0 +1,35 @@ +## Reserve changes + +### Reserves altered + +#### USDC ([0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4](https://scrollscan.com/address/0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4)) + +| description | value before | value after | +| --- | --- | --- | +| maxVariableBorrowRate | 65.5 % | 52.5 % | +| variableRateSlope1 | 5.5 % | 12.5 % | +| variableRateSlope2 | 60 % | 40 % | +| interestRate | ![before](https://dash.onaave.com/api/static?variableRateSlope1=55000000000000000000000000&variableRateSlope2=600000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=655000000000000000000000000) | ![after](https://dash.onaave.com/api/static?variableRateSlope1=125000000000000000000000000&variableRateSlope2=400000000000000000000000000&optimalUsageRatio=900000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=525000000000000000000000000) | + +## Raw diff + +```json +{ + "strategies": { + "0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4": { + "maxVariableBorrowRate": { + "from": "655000000000000000000000000", + "to": "525000000000000000000000000" + }, + "variableRateSlope1": { + "from": "55000000000000000000000000", + "to": "125000000000000000000000000" + }, + "variableRateSlope2": { + "from": "600000000000000000000000000", + "to": "400000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Scroll_OnboardSCRToAaveV3Scroll_20241203_before_AaveV3Scroll_OnboardSCRToAaveV3Scroll_20241203_after.md b/diffs/AaveV3Scroll_OnboardSCRToAaveV3Scroll_20241203_before_AaveV3Scroll_OnboardSCRToAaveV3Scroll_20241203_after.md new file mode 100644 index 000000000..caabe35de --- /dev/null +++ b/diffs/AaveV3Scroll_OnboardSCRToAaveV3Scroll_20241203_before_AaveV3Scroll_OnboardSCRToAaveV3Scroll_20241203_after.md @@ -0,0 +1,112 @@ +## Reserve changes + +### Reserves added + +#### SCR ([0xd29687c813D741E2F938F4aC377128810E217b1b](https://scrollscan.com/address/0xd29687c813D741E2F938F4aC377128810E217b1b)) + +| description | value | +| --- | --- | +| decimals | 18 | +| isActive | true | +| isFrozen | false | +| supplyCap | 360,000 SCR | +| borrowCap | 180,000 SCR | +| debtCeiling | 0 $ [0] | +| isSiloed | false | +| isFlashloanable | true | +| oracle | [0x26f6F7C468EE309115d19Aa2055db5A74F8cE7A5](https://scrollscan.com/address/0x26f6F7C468EE309115d19Aa2055db5A74F8cE7A5) | +| oracleDecimals | 8 | +| oracleDescription | SCR / USD | +| oracleLatestAnswer | 0.929571 | +| usageAsCollateralEnabled | false | +| ltv | 0 % [0] | +| liquidationThreshold | 0 % [0] | +| liquidationBonus | 0 % | +| liquidationProtocolFee | 0 % [0] | +| reserveFactor | 20 % [2000] | +| aToken | [0x25718130C2a8eb94e2e1FAFB5f1cDd4b459aCf64](https://scrollscan.com/address/0x25718130C2a8eb94e2e1FAFB5f1cDd4b459aCf64) | +| aTokenImpl | [0x92EDe4ABd9df4Bfb49b4d723e4c932e35c47C54C](https://scrollscan.com/address/0x92EDe4ABd9df4Bfb49b4d723e4c932e35c47C54C) | +| variableDebtToken | [0xFFbA405BBF25B2e6C454d18165F2fd8786858c6B](https://scrollscan.com/address/0xFFbA405BBF25B2e6C454d18165F2fd8786858c6B) | +| variableDebtTokenImpl | [0x49bA16C08130FF8cFADE263B49387A8555bc057B](https://scrollscan.com/address/0x49bA16C08130FF8cFADE263B49387A8555bc057B) | +| borrowingEnabled | true | +| isBorrowableInIsolation | false | +| interestRateStrategy | [0xC37353E5766164D8654D3CB395acfDcA4c2E7Ddc](https://scrollscan.com/address/0xC37353E5766164D8654D3CB395acfDcA4c2E7Ddc) | +| aTokenName | Aave Scroll SCR | +| aTokenSymbol | aScrSCR | +| aTokenUnderlyingBalance | 100 SCR [100000000000000000000] | +| id | 4 | +| isPaused | false | +| variableDebtTokenName | Aave Scroll Variable Debt SCR | +| variableDebtTokenSymbol | variableDebtScrSCR | +| virtualAccountingActive | true | +| virtualBalance | 100 SCR [100000000000000000000] | +| optimalUsageRatio | 45 % | +| maxVariableBorrowRate | 307 % | +| baseVariableBorrowRate | 0 % | +| variableRateSlope1 | 7 % | +| variableRateSlope2 | 300 % | +| interestRate | ![ir](https://dash.onaave.com/api/static?variableRateSlope1=70000000000000000000000000&variableRateSlope2=3000000000000000000000000000&optimalUsageRatio=450000000000000000000000000&baseVariableBorrowRate=0&maxVariableBorrowRate=3070000000000000000000000000) | + + +## Raw diff + +```json +{ + "reserves": { + "0xd29687c813D741E2F938F4aC377128810E217b1b": { + "from": null, + "to": { + "aToken": "0x25718130C2a8eb94e2e1FAFB5f1cDd4b459aCf64", + "aTokenImpl": "0x92EDe4ABd9df4Bfb49b4d723e4c932e35c47C54C", + "aTokenName": "Aave Scroll SCR", + "aTokenSymbol": "aScrSCR", + "aTokenUnderlyingBalance": "100000000000000000000", + "borrowCap": 180000, + "borrowingEnabled": true, + "debtCeiling": 0, + "decimals": 18, + "id": 4, + "interestRateStrategy": "0xC37353E5766164D8654D3CB395acfDcA4c2E7Ddc", + "isActive": true, + "isBorrowableInIsolation": false, + "isFlashloanable": true, + "isFrozen": false, + "isPaused": false, + "isSiloed": false, + "liquidationBonus": 0, + "liquidationProtocolFee": 0, + "liquidationThreshold": 0, + "ltv": 0, + "oracle": "0x26f6F7C468EE309115d19Aa2055db5A74F8cE7A5", + "oracleDecimals": 8, + "oracleDescription": "SCR / USD", + "oracleLatestAnswer": "92957100", + "reserveFactor": 2000, + "supplyCap": 360000, + "symbol": "SCR", + "underlying": "0xd29687c813D741E2F938F4aC377128810E217b1b", + "usageAsCollateralEnabled": false, + "variableDebtToken": "0xFFbA405BBF25B2e6C454d18165F2fd8786858c6B", + "variableDebtTokenImpl": "0x49bA16C08130FF8cFADE263B49387A8555bc057B", + "variableDebtTokenName": "Aave Scroll Variable Debt SCR", + "variableDebtTokenSymbol": "variableDebtScrSCR", + "virtualAccountingActive": true, + "virtualBalance": "100000000000000000000" + } + } + }, + "strategies": { + "0xd29687c813D741E2F938F4aC377128810E217b1b": { + "from": null, + "to": { + "address": "0xC37353E5766164D8654D3CB395acfDcA4c2E7Ddc", + "baseVariableBorrowRate": "0", + "maxVariableBorrowRate": "3070000000000000000000000000", + "optimalUsageRatio": "450000000000000000000000000", + "variableRateSlope1": "70000000000000000000000000", + "variableRateSlope2": "3000000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/AaveV3Scroll_UpdateLegacyGuardian_20241016_before_AaveV3Scroll_UpdateLegacyGuardian_20241016_after.md b/diffs/AaveV3Scroll_UpdateLegacyGuardian_20241016_before_AaveV3Scroll_UpdateLegacyGuardian_20241016_after.md index dbd03dce4..c15d3e2bc 100644 --- a/diffs/AaveV3Scroll_UpdateLegacyGuardian_20241016_before_AaveV3Scroll_UpdateLegacyGuardian_20241016_after.md +++ b/diffs/AaveV3Scroll_UpdateLegacyGuardian_20241016_before_AaveV3Scroll_UpdateLegacyGuardian_20241016_after.md @@ -1,5 +1,3 @@ -## Emodes changes - ## Raw diff ```json diff --git a/diffs/AaveV3Scroll_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3Scroll_UpdatePriceCapAdaptersCAPO_20241101_after.md b/diffs/AaveV3Scroll_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3Scroll_UpdatePriceCapAdaptersCAPO_20241101_after.md new file mode 100644 index 000000000..65177c52a --- /dev/null +++ b/diffs/AaveV3Scroll_UpdatePriceCapAdaptersCAPO_20241101_before_AaveV3Scroll_UpdatePriceCapAdaptersCAPO_20241101_after.md @@ -0,0 +1,25 @@ +## Reserve changes + +### Reserves altered + +#### USDC ([0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4](https://scrollscan.com/address/0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4)) + +| description | value before | value after | +| --- | --- | --- | +| oracle | [0x427Fd98dbD1DbC2D4e792350caBe7c9665F35bee](https://scrollscan.com/address/0x427Fd98dbD1DbC2D4e792350caBe7c9665F35bee) | [0x1685D81212580DD4cDA287616C2f6F4794927e18](https://scrollscan.com/address/0x1685D81212580DD4cDA287616C2f6F4794927e18) | + + +## Raw diff + +```json +{ + "reserves": { + "0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4": { + "oracle": { + "from": "0x427Fd98dbD1DbC2D4e792350caBe7c9665F35bee", + "to": "0x1685D81212580DD4cDA287616C2f6F4794927e18" + } + } + } +} +``` \ No newline at end of file diff --git a/generator/cli.ts b/generator/cli.ts index 321fa5474..76830c1eb 100644 --- a/generator/cli.ts +++ b/generator/cli.ts @@ -48,6 +48,7 @@ program ).choices(Object.values(VOTING_NETWORK)), ) .addOption(new Option('-c, --configFile ', 'path to config file')) + .addOption(new Option('-u, --update', 'when used with -c update block height')) .allowExcessArguments(false) .parse(process.argv); @@ -138,6 +139,9 @@ if (options.configFile) { const module = v2 ? FEATURE_MODULES_V2.find((m) => m.value === feature)! : FEATURE_MODULES_V3.find((m) => m.value === feature)!; + if (options.update) { + poolConfigs[pool]!.cache = await generateDeterministicPoolCache(pool); + } poolConfigs[pool]!.artifacts.push( module.build({ options, diff --git a/generator/templates/aip.template.ts b/generator/templates/aip.template.ts index 41b90fcf6..d1b907e68 100644 --- a/generator/templates/aip.template.ts +++ b/generator/templates/aip.template.ts @@ -3,10 +3,14 @@ import {Options, PoolConfigs, PoolIdentifier} from '../types'; export function generateAIP(options: Options, configs: PoolConfigs) { return `--- -title: ${`"${options.title}"` || 'TODO'} -author: ${`"${options.author}"` || 'TODO'} -discussions: ${`"${options.discussion}"` || 'TODO'}${ - options.snapshot ? `\nsnapshot: "${options.snapshot}"\n` : '' +title: ${options.title ? `"${options.title}"` : 'TODO'} +author: ${options.author ? `"${options.author}"` : 'TODO'} +discussions: ${options.discussion ? `"${options.discussion}"` : 'TODO'}${ + options.snapshot + ? options.snapshot.toLowerCase() != 'direct-to-aip' + ? `\nsnapshot: "${options.snapshot}"\n` + : '' + : '\nsnapshot: TODO' } --- @@ -42,8 +46,13 @@ ${Object.keys(configs) options, )}/${generateContractName(options, pool)}.t.sol)`, ) - .join(', ')} -- [Snapshot](${options.snapshot || 'TODO'}) + .join(', ')}${ + options.snapshot + ? options.snapshot.toLowerCase() != 'direct-to-aip' + ? `\n- [Snapshot](${options.snapshot})` + : '\n- Snapshot: Direct-to-AIP' + : '\n[Snapshot](TODO)' + } - [Discussion](${options.discussion || 'TODO'}) ## Copyright diff --git a/lib/aave-helpers b/lib/aave-helpers index 19d8ece8a..1821d62cc 160000 --- a/lib/aave-helpers +++ b/lib/aave-helpers @@ -1 +1 @@ -Subproject commit 19d8ece8a12d3d789ccb96fd184fef0a646b201c +Subproject commit 1821d62ccddb4d9d66ad35405cbaaeec795bd1b2 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..049874659 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4144 @@ +{ + "name": "aave-proposals-v3", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "aave-proposals-v3", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@bgd-labs/aave-address-book": "4.6.0", + "@bgd-labs/aave-cli": "^1.1.12", + "@bgd-labs/js-utils": "^1.4.6", + "@inquirer/prompts": "^7.1.0", + "@inquirer/testing": "^2.1.37", + "catapulta-verify": "^1.2.1", + "commander": "^12.1.0", + "husky": "^8.0.3", + "lint-staged": "^15.2.10", + "tsx": "^4.19.2", + "viem": "^2.18.6" + }, + "devDependencies": { + "@types/node": "^22.9.0", + "prettier": "3.2.5", + "prettier-plugin-solidity": "1.3.1", + "vitest": "^2.1.5" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@assemblyscript/loader": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.9.4.tgz", + "integrity": "sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==", + "license": "Apache-2.0" + }, + "node_modules/@bgd-labs/aave-address-book": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@bgd-labs/aave-address-book/-/aave-address-book-4.6.0.tgz", + "integrity": "sha512-1YgjwdgxOpvABDtYzSS1J4PU/ntI7pOzKUzoOcbxD91sUVm/VA+3AJFOY8aM3M/Q8VFQY/XKaseGTBfUtALHKQ==" + }, + "node_modules/@bgd-labs/aave-cli": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@bgd-labs/aave-cli/-/aave-cli-1.1.12.tgz", + "integrity": "sha512-PuxWcdmNmNjVHP9hzZpJ6LYyM6MViJCQQ7U4yEPjiAGQ0mQ9aJIfAq5EpNds6r4OmmxufZ+Ely6f8QkIrDXDdA==", + "dependencies": { + "@bgd-labs/aave-address-book": "^4.5.1", + "@bgd-labs/aave-v3-governance-cache": "^1.0.8", + "@bgd-labs/js-utils": "^1.4.6", + "@bgd-labs/rpc-env": "^2.1.1", + "@commander-js/extra-typings": "^12.1.0", + "@inquirer/prompts": "^7.1.0", + "blockstore-core": "^5.0.2", + "chalk": "^4.1.2", + "commander": "^12.1.0", + "deepmerge": "^4.3.1", + "dotenv": "^16.4.1", + "find-object-paths": "^1.1.0", + "gray-matter": "^4.0.3", + "ipfs-unixfs-importer": "^15.3.1", + "json-bigint": "^1.0.0", + "viem": "^2.21.48", + "zod": "^3.23.8" + }, + "bin": { + "aave-cli": "dist/cli.js" + } + }, + "node_modules/@bgd-labs/aave-cli/node_modules/@bgd-labs/aave-v3-governance-cache": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@bgd-labs/aave-v3-governance-cache/-/aave-v3-governance-cache-1.0.8.tgz", + "integrity": "sha512-niaJafgxLQcuzZ13Wo1rO5tJ8f5pE5AdWs+5/PoHMrk5Z+bm5kE59oHbIO2xpg1pCQ7IZmsxXEIIlC2c0+v/Jg==", + "peerDependencies": { + "@bgd-labs/aave-address-book": "^4.0.1-02c70ec5f8a433b38372b81d27ed44b79aa52f65.0", + "viem": "^2.9.20" + } + }, + "node_modules/@bgd-labs/js-utils": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@bgd-labs/js-utils/-/js-utils-1.4.6.tgz", + "integrity": "sha512-0IA3fbHo/PJvtBPZ0q0zepsmsbZRAujchdd7GVsKJcJQ2xQulWYUZ9IeV+TTroR9wukKBgf6teYxEjCx0FVfuA==", + "dependencies": { + "@supercharge/promise-pool": "^3.1.1", + "bs58": "^5.0.0", + "gray-matter": "^4.0.3", + "tsx": "^4.7.1" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "viem": "^2.0.3" + } + }, + "node_modules/@bgd-labs/rpc-env": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@bgd-labs/rpc-env/-/rpc-env-2.1.2.tgz", + "integrity": "sha512-xY6cjC55ZUhsAGt4LynzG7DT8MWSeDZJ3opCK2AIkPn2dQrqvMPTkeodbyaUyV59AK3Qy8aiFmNCeHqF+aPnvQ==", + "bin": { + "rpc-env": "dist/cli.js" + } + }, + "node_modules/@chainsafe/is-ip": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@chainsafe/is-ip/-/is-ip-2.0.2.tgz", + "integrity": "sha512-ndGqEMG1W5WkGagaqOZHpPU172AGdxr+LD15sv3WIUvT5oCFUrG1Y0CW/v2Egwj4JXEvSibaIIIqImsm98y1nA==", + "license": "MIT" + }, + "node_modules/@chainsafe/netmask": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@chainsafe/netmask/-/netmask-2.0.0.tgz", + "integrity": "sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg==", + "license": "MIT", + "dependencies": { + "@chainsafe/is-ip": "^2.0.1" + } + }, + "node_modules/@commander-js/extra-typings": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@commander-js/extra-typings/-/extra-typings-12.1.0.tgz", + "integrity": "sha512-wf/lwQvWAA0goIghcb91dQYpkLBcyhOhQNqG/VgWhnKzgt+UOMvra7EX/2fv70arm5RW+PUHoQHHDa6/p77Eqg==", + "peerDependencies": { + "commander": "~12.1.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.2.tgz", + "integrity": "sha512-+gznPl8ip8P8HYHYecDtUtdsh1t2jvb+sWCD72GAiZ9m45RqwrLmReDaqdC0umQfamtFXVRoMVJ2/qINKGm9Tg==", + "dependencies": { + "@inquirer/core": "^10.1.0", + "@inquirer/figures": "^1.0.8", + "@inquirer/type": "^3.0.1", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.0.2.tgz", + "integrity": "sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==", + "dependencies": { + "@inquirer/core": "^10.1.0", + "@inquirer/type": "^3.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/core": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.0.tgz", + "integrity": "sha512-I+ETk2AL+yAVbvuKx5AJpQmoaWhpiTFOg/UJb7ZkMAK4blmtG8ATh5ct+T/8xNld0CZG/2UhtkdMwpgvld92XQ==", + "dependencies": { + "@inquirer/figures": "^1.0.8", + "@inquirer/type": "^3.0.1", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/editor": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.1.0.tgz", + "integrity": "sha512-K1gGWsxEqO23tVdp5MT3H799OZ4ER1za7Dlc8F4um0W7lwSv0KGR/YyrUEyimj0g7dXZd8XknM/5QA2/Uy+TbA==", + "dependencies": { + "@inquirer/core": "^10.1.0", + "@inquirer/type": "^3.0.1", + "external-editor": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.2.tgz", + "integrity": "sha512-WdgCX1cUtinz+syKyZdJomovULYlKUWZbVYZzhf+ZeeYf4htAQ3jLymoNs3koIAKfZZl3HUBb819ClCBfyznaw==", + "dependencies": { + "@inquirer/core": "^10.1.0", + "@inquirer/type": "^3.0.1", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.8.tgz", + "integrity": "sha512-tKd+jsmhq21AP1LhexC0pPwsCxEhGgAkg28byjJAd+xhmIs8LUX8JbUc3vBf3PhLxWiB5EvyBE5X7JSPAqMAqg==", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.0.2.tgz", + "integrity": "sha512-yCLCraigU085EcdpIVEDgyfGv4vBiE4I+k1qRkc9C5dMjWF42ADMGy1RFU94+eZlz4YlkmFsiyHZy0W1wdhaNg==", + "dependencies": { + "@inquirer/core": "^10.1.0", + "@inquirer/type": "^3.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.2.tgz", + "integrity": "sha512-MKQhYofdUNk7eqJtz52KvM1dH6R93OMrqHduXCvuefKrsiMjHiMwjc3NZw5Imm2nqY7gWd9xdhYrtcHMJQZUxA==", + "dependencies": { + "@inquirer/core": "^10.1.0", + "@inquirer/type": "^3.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.2.tgz", + "integrity": "sha512-tQXGSu7IO07gsYlGy3VgXRVsbOWqFBMbqAUrJSc1PDTQQ5Qdm+QVwkP0OC0jnUZ62D19iPgXOMO+tnWG+HhjNQ==", + "dependencies": { + "@inquirer/core": "^10.1.0", + "@inquirer/type": "^3.0.1", + "ansi-escapes": "^4.3.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.1.0.tgz", + "integrity": "sha512-5U/XiVRH2pp1X6gpNAjWOglMf38/Ys522ncEHIKT1voRUvSj/DQnR22OVxHnwu5S+rCFaUiPQ57JOtMFQayqYA==", + "dependencies": { + "@inquirer/checkbox": "^4.0.2", + "@inquirer/confirm": "^5.0.2", + "@inquirer/editor": "^4.1.0", + "@inquirer/expand": "^4.0.2", + "@inquirer/input": "^4.0.2", + "@inquirer/number": "^3.0.2", + "@inquirer/password": "^4.0.2", + "@inquirer/rawlist": "^4.0.2", + "@inquirer/search": "^3.0.2", + "@inquirer/select": "^4.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.2.tgz", + "integrity": "sha512-3XGcskMoVF8H0Dl1S5TSZ3rMPPBWXRcM0VeNVsS4ByWeWjSeb0lPqfnBg6N7T0608I1B2bSVnbi2cwCrmOD1Yw==", + "dependencies": { + "@inquirer/core": "^10.1.0", + "@inquirer/type": "^3.0.1", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/search": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.2.tgz", + "integrity": "sha512-Zv4FC7w4dJ13BOJfKRQCICQfShinGjb1bCEIHxTSnjj2telu3+3RHwHubPG9HyD4aix5s+lyAMEK/wSFD75HLA==", + "dependencies": { + "@inquirer/core": "^10.1.0", + "@inquirer/figures": "^1.0.8", + "@inquirer/type": "^3.0.1", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/select": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.2.tgz", + "integrity": "sha512-uSWUzaSYAEj0hlzxa1mUB6VqrKaYx0QxGBLZzU4xWFxaSyGaXxsSE4OSOwdU24j0xl8OajgayqFXW0l2bkl2kg==", + "dependencies": { + "@inquirer/core": "^10.1.0", + "@inquirer/figures": "^1.0.8", + "@inquirer/type": "^3.0.1", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/testing": { + "version": "2.1.37", + "resolved": "https://registry.npmjs.org/@inquirer/testing/-/testing-2.1.37.tgz", + "integrity": "sha512-6QU4Xt8jM9kWEky6/JwjNJ/HvM2VfNB+G6GU8J8UJtRD+sQDGmNR4geX3iu3lYhFAaHH8XtSvBc1aG//58eUKg==", + "dependencies": { + "@inquirer/type": "^3.0.1", + "ansi-escapes": "^4.3.2", + "mute-stream": "^2.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.1.tgz", + "integrity": "sha512-+ksJMIy92sOAiAccGpcKZUc3bYO07cADnscIxHBknEm3uNts3movSmBofc1908BNy5edKscxYeAdaX1NXkHS6A==", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@ipld/dag-pb": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@ipld/dag-pb/-/dag-pb-4.1.3.tgz", + "integrity": "sha512-ueULCaaSCcD+dQga6nKiRr+RSeVgdiYiEPKVUu5iQMNYDN+9osd0KpR3UDd9uQQ+6RWuv9L34SchfEwj7YIbOA==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.1.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" + }, + "node_modules/@libp2p/interface": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@libp2p/interface/-/interface-2.2.0.tgz", + "integrity": "sha512-Pn3P5ixDggBjDyuULT0GvwdgD3JA426OqZ0e521mI7ysS+/M9Z9fp4Qcy8JrkJ45bLmIi9cgrNrefuU/Zu+bAQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@multiformats/multiaddr": "^12.2.3", + "it-pushable": "^3.2.3", + "it-stream-types": "^2.0.1", + "multiformats": "^13.1.0", + "progress-events": "^1.0.0", + "uint8arraylist": "^2.4.8" + } + }, + "node_modules/@libp2p/logger": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@libp2p/logger/-/logger-5.1.3.tgz", + "integrity": "sha512-NUVWEWGbXlBDgDE5ntdm51+ZICmaKYI8mor6KrlPeB1WXDyIFxRWIBw6uzt+HgprQJWzLTojeUEGv6OPsj95Dg==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@libp2p/interface": "^2.2.0", + "@multiformats/multiaddr": "^12.2.3", + "interface-datastore": "^8.3.0", + "multiformats": "^13.1.0", + "weald": "^1.0.2" + } + }, + "node_modules/@multiformats/dns": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@multiformats/dns/-/dns-1.0.6.tgz", + "integrity": "sha512-nt/5UqjMPtyvkG9BQYdJ4GfLK3nMqGpFZOzf4hAmIa0sJh2LlS9YKXZ4FgwBDsaHvzZqR/rUFIywIc7pkHNNuw==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@types/dns-packet": "^5.6.5", + "buffer": "^6.0.3", + "dns-packet": "^5.6.1", + "hashlru": "^2.3.0", + "p-queue": "^8.0.1", + "progress-events": "^1.0.0", + "uint8arrays": "^5.0.2" + } + }, + "node_modules/@multiformats/multiaddr": { + "version": "12.3.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.3.1.tgz", + "integrity": "sha512-yoGODQY4nIj41ENJClucS8FtBoe8w682bzbKldEQr9lSlfdHqAsRC+vpJAOBpiMwPps1tHua4kxrDmvprdhoDQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@chainsafe/is-ip": "^2.0.1", + "@chainsafe/netmask": "^2.0.0", + "@multiformats/dns": "^1.0.3", + "multiformats": "^13.0.0", + "uint8-varint": "^2.0.1", + "uint8arrays": "^5.0.0" + } + }, + "node_modules/@multiformats/murmur3": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@multiformats/murmur3/-/murmur3-2.1.8.tgz", + "integrity": "sha512-6vId1C46ra3R1sbJUOFCZnsUIveR9oF20yhPmAFxPm0JfrX3/ZRCgP3YDrBzlGoEppOXnA9czHeYc0T9mB6hbA==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.0.0", + "murmurhash3js-revisited": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@noble/curves": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.6.0.tgz", + "integrity": "sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==", + "dependencies": { + "@noble/hashes": "1.5.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", + "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.3.tgz", + "integrity": "sha512-EzxVSkIvCFxUd4Mgm4xR9YXrcp976qVaHnqom/Tgm+vU79k4vV4eYTjmRvGfeoW8m9LVcsAy/lGjcgVegKEhLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.3.tgz", + "integrity": "sha512-LJc5pDf1wjlt9o/Giaw9Ofl+k/vLUaYsE2zeQGH85giX2F+wn/Cg8b3c5CDP3qmVmeO5NzwVUzQQxwZvC2eQKw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.3.tgz", + "integrity": "sha512-OuRysZ1Mt7wpWJ+aYKblVbJWtVn3Cy52h8nLuNSzTqSesYw1EuN6wKp5NW/4eSre3mp12gqFRXOKTcN3AI3LqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.3.tgz", + "integrity": "sha512-xW//zjJMlJs2sOrCmXdB4d0uiilZsOdlGQIC/jjmMWT47lkLLoB1nsNhPUcnoqyi5YR6I4h+FjBpILxbEy8JRg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.3.tgz", + "integrity": "sha512-58E0tIcwZ+12nK1WiLzHOD8I0d0kdrY/+o7yFVPRHuVGY3twBwzwDdTIBGRxLmyjciMYl1B/U515GJy+yn46qw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.3.tgz", + "integrity": "sha512-78fohrpcVwTLxg1ZzBMlwEimoAJmY6B+5TsyAZ3Vok7YabRBUvjYTsRXPTjGEvv/mfgVBepbW28OlMEz4w8wGA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.3.tgz", + "integrity": "sha512-h2Ay79YFXyQi+QZKo3ISZDyKaVD7uUvukEHTOft7kh00WF9mxAaxZsNs3o/eukbeKuH35jBvQqrT61fzKfAB/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.3.tgz", + "integrity": "sha512-Sv2GWmrJfRY57urktVLQ0VKZjNZGogVtASAgosDZ1aUB+ykPxSi3X1nWORL5Jk0sTIIwQiPH7iE3BMi9zGWfkg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.3.tgz", + "integrity": "sha512-FPoJBLsPW2bDNWjSrwNuTPUt30VnfM8GPGRoLCYKZpPx0xiIEdFip3dH6CqgoT0RnoGXptaNziM0WlKgBc+OWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.3.tgz", + "integrity": "sha512-TKxiOvBorYq4sUpA0JT+Fkh+l+G9DScnG5Dqx7wiiqVMiRSkzTclP35pE6eQQYjP4Gc8yEkJGea6rz4qyWhp3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.3.tgz", + "integrity": "sha512-v2M/mPvVUKVOKITa0oCFksnQQ/TqGrT+yD0184/cWHIu0LoIuYHwox0Pm3ccXEz8cEQDLk6FPKd1CCm+PlsISw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.3.tgz", + "integrity": "sha512-LdrI4Yocb1a/tFVkzmOE5WyYRgEBOyEhWYJe4gsDWDiwnjYKjNs7PS6SGlTDB7maOHF4kxevsuNBl2iOcj3b4A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.3.tgz", + "integrity": "sha512-d4wVu6SXij/jyiwPvI6C4KxdGzuZOvJ6y9VfrcleHTwo68fl8vZC5ZYHsCVPUi4tndCfMlFniWgwonQ5CUpQcA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.3.tgz", + "integrity": "sha512-/6bn6pp1fsCGEY5n3yajmzZQAh+mW4QPItbiWxs69zskBzJuheb3tNynEjL+mKOsUSFK11X4LYF2BwwXnzWleA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.3.tgz", + "integrity": "sha512-nBXOfJds8OzUT1qUreT/en3eyOXd2EH5b0wr2bVB5999qHdGKkzGzIyKYaKj02lXk6wpN71ltLIaQpu58YFBoQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.3.tgz", + "integrity": "sha512-ogfbEVQgIZOz5WPWXF2HVb6En+kWzScuxJo/WdQTqEgeyGkaa2ui5sQav9Zkr7bnNCLK48uxmmK0TySm22eiuw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.3.tgz", + "integrity": "sha512-ecE36ZBMLINqiTtSNQ1vzWc5pXLQHlf/oqGp/bSbi7iedcjcNb6QbCBNG73Euyy2C+l/fn8qKWEwxr+0SSfs3w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.3.tgz", + "integrity": "sha512-vliZLrDmYKyaUoMzEbMTg2JkerfBjn03KmAw9CykO0Zzkzoyd7o3iZNam/TpyWNjNT+Cz2iO3P9Smv2wgrR+Eg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@scure/bip32": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.5.0.tgz", + "integrity": "sha512-8EnFYkqEQdnkuGBVpCzKxyIwDCBLDVj3oiX0EKUFre/tOjL/Hqba1D6n/8RcmaQy4f95qQFrO2A8Sr6ybh4NRw==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.6.0", + "@noble/hashes": "~1.5.0", + "@scure/base": "~1.1.7" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.4.0.tgz", + "integrity": "sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.5.0", + "@scure/base": "~1.1.8" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@solidity-parser/parser": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.17.0.tgz", + "integrity": "sha512-Nko8R0/kUo391jsEHHxrGM07QFdnPGvlmox4rmH0kNiNAashItAilhy4Mv4pK5gQmW5f4sXAF58fwJbmlkGcVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@supercharge/promise-pool": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@supercharge/promise-pool/-/promise-pool-3.1.1.tgz", + "integrity": "sha512-TgCm6jVqMPv+OgD5uBNND/CkCwNDdXPQlcprtnXsWSBpTCy0q5CI6vRj+jsUiXE1xeRaKIX4UeaYJqzZBL92sg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@types/dns-packet": { + "version": "5.6.5", + "resolved": "https://registry.npmjs.org/@types/dns-packet/-/dns-packet-5.6.5.tgz", + "integrity": "sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "22.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz", + "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==", + "dependencies": { + "undici-types": "~6.19.8" + } + }, + "node_modules/@vitest/expect": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.5.tgz", + "integrity": "sha512-nZSBTW1XIdpZvEJyoP/Sy8fUg0b8od7ZpGDkTUcfJ7wz/VoZAFzFfLyxVxGFhUjJzhYqSbIpfMtl/+k/dpWa3Q==", + "dev": true, + "dependencies": { + "@vitest/spy": "2.1.5", + "@vitest/utils": "2.1.5", + "chai": "^5.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.5.tgz", + "integrity": "sha512-XYW6l3UuBmitWqSUXTNXcVBUCRytDogBsWuNXQijc00dtnU/9OqpXWp4OJroVrad/gLIomAq9aW8yWDBtMthhQ==", + "dev": true, + "dependencies": { + "@vitest/spy": "2.1.5", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.5.tgz", + "integrity": "sha512-4ZOwtk2bqG5Y6xRGHcveZVr+6txkH7M2e+nPFd6guSoN638v/1XQ0K06eOpi0ptVU/2tW/pIU4IoPotY/GZ9fw==", + "dev": true, + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.5.tgz", + "integrity": "sha512-pKHKy3uaUdh7X6p1pxOkgkVAFW7r2I818vHDthYLvUyjRfkKOU6P45PztOch4DZarWQne+VOaIMwA/erSSpB9g==", + "dev": true, + "dependencies": { + "@vitest/utils": "2.1.5", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.5.tgz", + "integrity": "sha512-zmYw47mhfdfnYbuhkQvkkzYroXUumrwWDGlMjpdUr4jBd3HZiV2w7CQHj+z7AAS4VOtWxI4Zt4bWt4/sKcoIjg==", + "dev": true, + "dependencies": { + "@vitest/pretty-format": "2.1.5", + "magic-string": "^0.30.12", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.5.tgz", + "integrity": "sha512-aWZF3P0r3w6DiYTVskOYuhBc7EMc3jvn1TkBg8ttylFFRqNN2XGD7V5a4aQdk6QiUzZQ4klNBSpCLJgWNdIiNw==", + "dev": true, + "dependencies": { + "tinyspy": "^3.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.5.tgz", + "integrity": "sha512-yfj6Yrp0Vesw2cwJbP+cl04OC+IHFsuQsrsJBL9pyGeQXE56v1UAOQco+SR55Vf1nQzfV0QJg1Qum7AaWUwwYg==", + "dev": true, + "dependencies": { + "@vitest/pretty-format": "2.1.5", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/abitype": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.6.tgz", + "integrity": "sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3 >=3.22.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/base-x": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", + "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/blockstore-core": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/blockstore-core/-/blockstore-core-5.0.2.tgz", + "integrity": "sha512-y7/BHdYLO3YCpJMg6Ue7b4Oz4FT1HWSZoHHdlsaJTsvoE8XieXb6kUCB9UkkUBDw2x4neRDwlgYBpyK77+Ro2Q==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@libp2p/logger": "^5.0.1", + "interface-blockstore": "^5.0.0", + "interface-store": "^6.0.0", + "it-drain": "^3.0.7", + "it-filter": "^3.1.1", + "it-merge": "^3.0.5", + "it-pushable": "^3.2.3", + "multiformats": "^13.2.3" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bs58": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", + "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", + "license": "MIT", + "dependencies": { + "base-x": "^4.0.0" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/catapulta-verify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/catapulta-verify/-/catapulta-verify-1.2.1.tgz", + "integrity": "sha512-yXJ0/WV/3w6WLrVUoe2maEqPlGDyCwQ9oIk2vUiw+kfEG7zMlFzSQB8xf7sAo8kUKk/fwaMEn9AQrb84Ubae4Q==", + "dependencies": { + "@bgd-labs/rpc-env": "^2.0.1" + }, + "bin": { + "catapulta-verify": "out/index.mjs" + } + }, + "node_modules/chai": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", + "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", + "dev": true, + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "engines": { + "node": ">= 16" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dotenv": { + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.1.tgz", + "integrity": "sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "license": "MIT" + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/expect-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", + "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", + "dev": true, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-object-paths": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-object-paths/-/find-object-paths-1.1.0.tgz", + "integrity": "sha512-UJvfPQibLUOrXl76PJ49cYbXJPsU1lYX6Pw7mHVW+ahaGx6kVHiozNIQriDc/EOlSvkDa6L9GyTFXPYQsa6sGA==", + "license": "GPL-3.0-or-later" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz", + "integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==", + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/hamt-sharding": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/hamt-sharding/-/hamt-sharding-3.0.6.tgz", + "integrity": "sha512-nZeamxfymIWLpVcAN0CRrb7uVq3hCOGj9IcL6NMA6VVCVWqj+h9Jo/SmaWuS92AEDf1thmHsM5D5c70hM3j2Tg==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "sparse-array": "^1.3.1", + "uint8arrays": "^5.0.1" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/hashlru": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hashlru/-/hashlru-2.3.0.tgz", + "integrity": "sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A==", + "license": "MIT" + }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/husky": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", + "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", + "license": "MIT", + "bin": { + "husky": "lib/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/interface-blockstore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/interface-blockstore/-/interface-blockstore-5.3.1.tgz", + "integrity": "sha512-nhgrQnz6yUQEqxTFLhlOBurQOy5lWlwCpgFmZ3GTObTVTQS9RZjK/JTozY6ty9uz2lZs7VFJSqwjWAltorJ4Vw==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "interface-store": "^6.0.0", + "multiformats": "^13.2.3" + } + }, + "node_modules/interface-datastore": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/interface-datastore/-/interface-datastore-8.3.1.tgz", + "integrity": "sha512-3r0ETmHIi6HmvM5sc09QQiCD3gUfwtEM/AAChOyAd/UAKT69uk8LXfTSUBufbUIO/dU65Vj8nb9O6QjwW8vDSQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "interface-store": "^6.0.0", + "uint8arrays": "^5.1.0" + } + }, + "node_modules/interface-store": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/interface-store/-/interface-store-6.0.2.tgz", + "integrity": "sha512-KSFCXtBlNoG0hzwNa0RmhHtrdhzexp+S+UY2s0rWTBJyfdEIgn6i6Zl9otVqrcFYbYrneBT7hbmHQ8gE0C3umA==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/ipfs-unixfs": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/ipfs-unixfs/-/ipfs-unixfs-11.2.0.tgz", + "integrity": "sha512-J8FN1qM5nfrDo8sQKQwfj0+brTg1uBfZK2vY9hxci33lcl3BFrsELS9+1+4q/8tO1ASKfxZO8W3Pi2O4sVX2Lg==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "protons-runtime": "^5.5.0", + "uint8arraylist": "^2.4.8" + } + }, + "node_modules/ipfs-unixfs-importer": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/ipfs-unixfs-importer/-/ipfs-unixfs-importer-15.3.1.tgz", + "integrity": "sha512-wHCTBqNsZXLJZ9/GSr7Msb3FDXD5yXF20Y9sKyUbbqNjbvaXs3n3h1+NM/5+WrgESHfwRcJIlJtaOKafL8Ymdg==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@ipld/dag-pb": "^4.1.2", + "@multiformats/murmur3": "^2.1.8", + "hamt-sharding": "^3.0.6", + "interface-blockstore": "^5.3.0", + "interface-store": "^6.0.0", + "ipfs-unixfs": "^11.0.0", + "it-all": "^3.0.6", + "it-batch": "^3.0.6", + "it-first": "^3.0.6", + "it-parallel-batch": "^3.0.6", + "multiformats": "^13.2.3", + "progress-events": "^1.0.1", + "rabin-wasm": "^0.1.5", + "uint8arraylist": "^2.4.8", + "uint8arrays": "^5.1.0" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/isows": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", + "integrity": "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/it-all": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/it-all/-/it-all-3.0.6.tgz", + "integrity": "sha512-HXZWbxCgQZJfrv5rXvaVeaayXED8nTKx9tj9fpBhmcUJcedVZshMMMqTj0RG2+scGypb9Ut1zd1ifbf3lA8L+Q==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/it-batch": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/it-batch/-/it-batch-3.0.6.tgz", + "integrity": "sha512-pQAAlSvJ4aV6xM/6LRvkPdKSKXxS4my2fGzNUxJyAQ8ccFdxPmK1bUuF5OoeUDkcdrbs8jtsmc4DypCMrGY6sg==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/it-drain": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/it-drain/-/it-drain-3.0.7.tgz", + "integrity": "sha512-vy6S1JKjjHSIFHgBpLpD1zhkCRl3z1zYWUxE14+kAYf+BL9ssWSFImJfhl361IIcwr0ofw8etzg11VqqB+ntUA==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/it-filter": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/it-filter/-/it-filter-3.1.1.tgz", + "integrity": "sha512-TOXmVuaSkxlLp2hXKoMTra0WMZMKVFxE3vSsbIA+PbADNCBAHhjJ/lM31vBOUTddHMO34Ku++vU8T9PLlBxQtg==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "it-peekable": "^3.0.0" + } + }, + "node_modules/it-first": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/it-first/-/it-first-3.0.6.tgz", + "integrity": "sha512-ExIewyK9kXKNAplg2GMeWfgjUcfC1FnUXz/RPfAvIXby+w7U4b3//5Lic0NV03gXT8O/isj5Nmp6KiY0d45pIQ==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/it-merge": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/it-merge/-/it-merge-3.0.5.tgz", + "integrity": "sha512-2l7+mPf85pyRF5pqi0dKcA54E5Jm/2FyY5GsOaN51Ta0ipC7YZ3szuAsH8wOoB6eKY4XsU4k2X+mzPmFBMayEA==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "it-pushable": "^3.2.3" + } + }, + "node_modules/it-parallel-batch": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/it-parallel-batch/-/it-parallel-batch-3.0.6.tgz", + "integrity": "sha512-3wgiQGvMMHy65OXScrtrtmY+bJSF7P6St1AP+BU+SK83fEr8NNk/MrmJKrtB1+MahYX2a8I+pOGKDj8qVtuV0Q==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "it-batch": "^3.0.0" + } + }, + "node_modules/it-peekable": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/it-peekable/-/it-peekable-3.0.5.tgz", + "integrity": "sha512-JWQOGMt6rKiPcY30zUVMR4g6YxkpueTwHVE7CMs/aGqCf4OydM6w+7ZM3PvmO1e0TocjuR4aL8xyZWR46cTqCQ==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/it-pushable": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.2.3.tgz", + "integrity": "sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "p-defer": "^4.0.0" + } + }, + "node_modules/it-stream-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.2.tgz", + "integrity": "sha512-Rz/DEZ6Byn/r9+/SBCuJhpPATDF9D+dz5pbgSUyBsCDtza6wtNATrz/jz1gDyNanC3XdLboriHnOC925bZRBww==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lint-staged": { + "version": "15.2.10", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.10.tgz", + "integrity": "sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==", + "dependencies": { + "chalk": "~5.3.0", + "commander": "~12.1.0", + "debug": "~4.3.6", + "execa": "~8.0.1", + "lilconfig": "~3.1.2", + "listr2": "~8.2.4", + "micromatch": "~4.0.8", + "pidtree": "~0.6.0", + "string-argv": "~0.3.2", + "yaml": "~2.5.0" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/listr2": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.4.tgz", + "integrity": "sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==", + "license": "MIT", + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/loupe": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", + "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.30.13", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.13.tgz", + "integrity": "sha512-8rYBO+MsWkgjDSOvLomYnzhdwEG51olQ4zL5KXnNJWV5MNmrb4rTZdrtkhxjnD/QyZUqR/Z/XDsUs/4ej2nx0g==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/multiformats": { + "version": "13.3.1", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.3.1.tgz", + "integrity": "sha512-QxowxTNwJ3r5RMctoGA5p13w5RbRT2QDkoM+yFlqfLiioBp78nhDjnRLvmSBI9+KAqN4VdgOVWM9c0CHd86m3g==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/murmurhash3js-revisited": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz", + "integrity": "sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ox": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.1.2.tgz", + "integrity": "sha512-ak/8K0Rtphg9vnRJlbOdaX9R7cmxD2MiSthjWGaQdMk3D7hrAlDoM+6Lxn7hN52Za3vrXfZ7enfke/5WjolDww==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "^1.10.1", + "@noble/curves": "^1.6.0", + "@noble/hashes": "^1.5.0", + "@scure/bip32": "^1.5.0", + "@scure/bip39": "^1.4.0", + "abitype": "^1.0.6", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/ox/node_modules/@adraffy/ens-normalize": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz", + "integrity": "sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==", + "license": "MIT" + }, + "node_modules/p-defer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-4.0.1.tgz", + "integrity": "sha512-Mr5KC5efvAK5VUptYEIopP1bakB85k2IWXaRC0rsh1uwn1L6M0LVml8OIQ4Gudg4oyZakf7FmeRLkMMtZW1i5A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.0.1.tgz", + "integrity": "sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^6.1.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.3.tgz", + "integrity": "sha512-UJUyfKbwvr/uZSV6btANfb+0t/mOhKV/KXcCUTp8FcQI+v/0d+wXqH4htrW0E4rR6WiEO/EPvUFiV9D5OI4vlw==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-solidity": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.3.1.tgz", + "integrity": "sha512-MN4OP5I2gHAzHZG1wcuJl0FsLS3c4Cc5494bbg+6oQWBPuEamjwDvmGfFMZ6NFzsh3Efd9UUxeT7ImgjNH4ozA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@solidity-parser/parser": "^0.17.0", + "semver": "^7.5.4", + "solidity-comments-extractor": "^0.0.8" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "prettier": ">=2.3.0" + } + }, + "node_modules/progress-events": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/progress-events/-/progress-events-1.0.1.tgz", + "integrity": "sha512-MOzLIwhpt64KIVN64h1MwdKWiyKFNc/S6BoYKPIVUHFg0/eIEyBulhWCgn678v/4c0ri3FdGuzXymNCv02MUIw==", + "license": "Apache-2.0 OR MIT" + }, + "node_modules/protons-runtime": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-5.5.0.tgz", + "integrity": "sha512-EsALjF9QsrEk6gbCx3lmfHxVN0ah7nG3cY7GySD4xf4g8cr7g543zB88Foh897Sr1RQJ9yDCUsoT1i1H/cVUFA==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "uint8-varint": "^2.0.2", + "uint8arraylist": "^2.4.3", + "uint8arrays": "^5.0.1" + } + }, + "node_modules/rabin-wasm": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/rabin-wasm/-/rabin-wasm-0.1.5.tgz", + "integrity": "sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA==", + "license": "MIT", + "dependencies": { + "@assemblyscript/loader": "^0.9.4", + "bl": "^5.0.0", + "debug": "^4.3.1", + "minimist": "^1.2.5", + "node-fetch": "^2.6.1", + "readable-stream": "^3.6.0" + }, + "bin": { + "rabin-wasm": "cli/bin.js" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.27.3.tgz", + "integrity": "sha512-SLsCOnlmGt9VoZ9Ek8yBK8tAdmPHeppkw+Xa7yDlCEhDTvwYei03JlWo1fdc7YTfLZ4tD8riJCUyAgTbszk1fQ==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.27.3", + "@rollup/rollup-android-arm64": "4.27.3", + "@rollup/rollup-darwin-arm64": "4.27.3", + "@rollup/rollup-darwin-x64": "4.27.3", + "@rollup/rollup-freebsd-arm64": "4.27.3", + "@rollup/rollup-freebsd-x64": "4.27.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.27.3", + "@rollup/rollup-linux-arm-musleabihf": "4.27.3", + "@rollup/rollup-linux-arm64-gnu": "4.27.3", + "@rollup/rollup-linux-arm64-musl": "4.27.3", + "@rollup/rollup-linux-powerpc64le-gnu": "4.27.3", + "@rollup/rollup-linux-riscv64-gnu": "4.27.3", + "@rollup/rollup-linux-s390x-gnu": "4.27.3", + "@rollup/rollup-linux-x64-gnu": "4.27.3", + "@rollup/rollup-linux-x64-musl": "4.27.3", + "@rollup/rollup-win32-arm64-msvc": "4.27.3", + "@rollup/rollup-win32-ia32-msvc": "4.27.3", + "@rollup/rollup-win32-x64-msvc": "4.27.3", + "fsevents": "~2.3.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/solidity-comments-extractor": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.8.tgz", + "integrity": "sha512-htM7Vn6LhHreR+EglVMd2s+sZhcXAirB1Zlyrv5zBuTxieCvjfnRpd7iZk75m/u6NOlEyQ94C6TWbBn2cY7w8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sparse-array": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/sparse-array/-/sparse-array-1.3.2.tgz", + "integrity": "sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg==", + "license": "ISC" + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", + "dev": true + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.0.0.tgz", + "integrity": "sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true + }, + "node_modules/tinyexec": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz", + "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==", + "dev": true + }, + "node_modules/tinypool": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", + "dev": true, + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/tsx": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", + "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==", + "dependencies": { + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "optional": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uint8-varint": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "uint8arraylist": "^2.0.0", + "uint8arrays": "^5.0.0" + } + }, + "node_modules/uint8arraylist": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.4.8.tgz", + "integrity": "sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "uint8arrays": "^5.0.1" + } + }, + "node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "multiformats": "^13.0.0" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/viem": { + "version": "2.21.48", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.21.48.tgz", + "integrity": "sha512-/hBHyG1gdIIuiQv0z9YmzXl5eWJa0UCZGwkeuQzH2Bmg6FIEwZeEcxgiytXZydip+p2wMBFa1jdr7o5O1+mrIg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "dependencies": { + "@noble/curves": "1.6.0", + "@noble/hashes": "1.5.0", + "@scure/bip32": "1.5.0", + "@scure/bip39": "1.4.0", + "abitype": "1.0.6", + "isows": "1.0.6", + "ox": "0.1.2", + "webauthn-p256": "0.0.10", + "ws": "8.18.0" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vite": { + "version": "5.4.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", + "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.5.tgz", + "integrity": "sha512-rd0QIgx74q4S1Rd56XIiL2cYEdyWn13cunYBIuqh9mpmQr7gGS0IxXoP8R6OaZtNQQLyXSWbd4rXKYUbhFpK5w==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.7", + "es-module-lexer": "^1.5.4", + "pathe": "^1.1.2", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/vitest": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.5.tgz", + "integrity": "sha512-P4ljsdpuzRTPI/kbND2sDZ4VmieerR2c9szEZpjc+98Z9ebvnXmM5+0tHEKqYZumXqlvnmfWsjeFOjXVriDG7A==", + "dev": true, + "dependencies": { + "@vitest/expect": "2.1.5", + "@vitest/mocker": "2.1.5", + "@vitest/pretty-format": "^2.1.5", + "@vitest/runner": "2.1.5", + "@vitest/snapshot": "2.1.5", + "@vitest/spy": "2.1.5", + "@vitest/utils": "2.1.5", + "chai": "^5.1.2", + "debug": "^4.3.7", + "expect-type": "^1.1.0", + "magic-string": "^0.30.12", + "pathe": "^1.1.2", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.1", + "tinypool": "^1.0.1", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.1.5", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.1.5", + "@vitest/ui": "2.1.5", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/weald": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/weald/-/weald-1.0.4.tgz", + "integrity": "sha512-+kYTuHonJBwmFhP1Z4YQK/dGi3jAnJGCYhyODFpHK73rbxnp9lnZQj7a2m+WVgn8fXr5bJaxUpF6l8qZpPeNWQ==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "ms": "^3.0.0-canary.1", + "supports-color": "^9.4.0" + } + }, + "node_modules/weald/node_modules/ms": { + "version": "3.0.0-canary.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-3.0.0-canary.1.tgz", + "integrity": "sha512-kh8ARjh8rMN7Du2igDRO9QJnqCb2xYTJxyQYK7vJJS4TvLLmsbyhiKpSW+t+y26gyOyMd0riphX0GeWKU3ky5g==", + "license": "MIT", + "engines": { + "node": ">=12.13" + } + }, + "node_modules/weald/node_modules/supports-color": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", + "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/webauthn-p256": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/webauthn-p256/-/webauthn-p256-0.0.10.tgz", + "integrity": "sha512-EeYD+gmIT80YkSIDb2iWq0lq2zbHo1CxHlQTeJ+KkCILWpVy3zASH3ByD4bopzfk0uCwXxLqKGLqp2W4O28VFA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "dependencies": { + "@noble/curves": "^1.4.0", + "@noble/hashes": "^1.4.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", + "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/package.json b/package.json index cd967f431..c4be0353f 100644 --- a/package.json +++ b/package.json @@ -25,22 +25,22 @@ }, "homepage": "https://github.com/bgd-labs/aave-proposals-v3#readme", "devDependencies": { - "@types/node": "^20.11.10", + "@types/node": "^22.9.0", "prettier": "3.2.5", "prettier-plugin-solidity": "1.3.1", - "vitest": "^2.0.4" + "vitest": "^2.1.5" }, "dependencies": { - "@bgd-labs/aave-address-book": "4.0.0", - "@bgd-labs/aave-cli": "0.16.4", - "@bgd-labs/js-utils": "^1.4.2", - "@inquirer/prompts": "^3.3.0", - "@inquirer/testing": "^2.1.13", - "catapulta-verify": "^1.1.1", + "@bgd-labs/aave-address-book": "4.6.0", + "@bgd-labs/aave-cli": "^1.1.12", + "@bgd-labs/js-utils": "^1.4.6", + "@inquirer/prompts": "^7.1.0", + "@inquirer/testing": "^2.1.37", + "catapulta-verify": "^1.2.1", "commander": "^12.1.0", "husky": "^8.0.3", - "lint-staged": "^15.2.7", - "tsx": "^4.16.3", + "lint-staged": "^15.2.10", + "tsx": "^4.19.2", "viem": "^2.18.6" }, "lint-staged": { diff --git a/src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2.md b/src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2.md index 822770a5f..b55a13143 100644 --- a/src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2.md +++ b/src/20240805_Multi_RiskStewardPhase2/RiskStewardPhase2.md @@ -1,22 +1,26 @@ --- -title: "Risk Steward Phase 2" +title: "Aave Generalized Risk Stewards (AGRS) activation" author: "BGD Labs (@bgdlabs)" -discussions: "https://governance.aave.com/t/arfc-bgd-risk-steward-phase-2-risksteward/16204" +discussions: "https://governance.aave.com/t/arfc-aave-generalized-risk-stewards-agrs-activation/19178" snapshot: "https://snapshot.org/#/aave.eth/proposal/0x4809f179e517e5745ec13eba8f40d98dab73ca65f8a141bd2f18cc16dcd0cc16" --- ## Simple Summary -Expanding from the scope of [CapsPlusRiskSteward](https://governance.aave.com/t/bgd-risk-steward-phase-1-capsplusrisksteward/12602), we now introduce the new generalized RiskSteward, allowing hardly constrained risk parameter updates by risk service providers and reducing governance overhead. +Expanding from the scope of [CapsPlusRiskSteward](https://governance.aave.com/t/bgd-risk-steward-phase-1-capsplusrisksteward/12602), we now introduce the new Aave Generalized Risk Stewards (AGRS), allowing hardly constrained risk parameter updates by risk service providers and reducing governance overhead. + +Aave Generalized Risk Stewards (AGRS) include two instances: Manual AGRS and Automated AGRS. Manual AGRS is a continuation of the previous design, with the parameters recommendation risk provider, with constrained capacity to modify all types of risk parameters on Aave. Automated AGRS is a pilot version to automate interest rate updates of assets (starting with WETH on Aave v3 Lido Ethereum), based on the newly released risk infrastructure technology Edge, by Chaos Labs. + +This AIP activates the Manual AGRS and the Automated AGRS will be activated at a later stage. ## Motivation Aave's decentralized governance system, while robust, creates significant operational overhead and cost due to its comprehensive proposal process. This process includes pre-AIP procedures, payload creation, multiple reviews, voting, and on-chain verification. While recent improvements have optimized some steps, further efficiency gains are possible, particularly in risk-related proposals. -Rationale for reducing risk-related proposals: +The rationale for reducing risk-related proposals: -- Two expert, independent risk teams (ChaosLabs, LlamaRisk) are engaged with the DAO. +- Two experts, and independent risk teams (ChaosLabs, LlamaRisk) are engaged with the DAO. - Historical voting unanimity on non-controversial, incremental risk proposals. - Technical feasibility of constraining updates using Aave v3 roles and specific validations. @@ -24,19 +28,19 @@ The success of the CapsPlusRiskStewards experiment demonstrates the viability of ## Specification -The new RiskSteward we propose follows the same design as the CapsPlusRiskSteward, an smart contract to which the Aave Governance gives `RISK_ADMIN` role over all v3 instances, controlled by a 2-of-2 multisig, and heavily constrained on what can do and how by its own logic. +The new Manual AGRS we propose follows the same design as the CapsPlusRiskSteward, a smart contract to which the Aave Governance gives `RISK_ADMIN` role over all v3 instances, controlled by a 2-of-2 multisig, and heavily constrained on what can do and how by its own logic. -The 2-of-2 multisig controlling the RiskSteward will have Chaos and BGD Labs as signers, with the inclusion of BGD Labs as a matter of extra security procedure. +The 2-of-2 multisig controlling the Manual AGRS will have Chaos and BGD Labs as signers, temporarily including BGD Labs as a matter of extra security procedure. -`ACL_MANAGER.addRiskAdmin()` is called to add a the new risk steward. +`ACL_MANAGER.addRiskAdmin()` is called to add the new Manual AGRS. -Additionally, params for GHO on Arbitrum and Ethereum cannot be changed by this RiskStewards, as the params will be updated by the GhoStewards instead, this is done by setting the GHO asset as restricted via the following method: `RISK_STEWARD.setAddressRestricted();` +Additionally, params for GHO on Arbitrum and Ethereum cannot be changed by this Manual AGRS, as the params will be updated by the GhoStewards instead, this is done by setting the GHO asset as restricted via the following method: `RISK_STEWARD.setAddressRestricted();` To give some extra buffer and protection, we will remove the `RISK_ADMIN` role from the old `CapsPlusRiskSteward` once risk providers have adapted to use the new Risk Stewards. -Deployed Risk Steward Contracts: +Deployed AGRS Contracts: -| Network Instance | Risk Steward Contract | +| Network Instance | Manual AGRS Contract | | ---------------- | -------------------------------------------------------------------------------------------------------------------------------- | | Ethereum | [0x7C7143f4bE189928A6a98D8686c5e84c893c59c7](https://etherscan.io/address/0x7C7143f4bE189928A6a98D8686c5e84c893c59c7) | | Ethereum Lido | [0x30adC2f98ff78fDde12F191Acb82699f640694FB](https://etherscan.io/address/0x30adC2f98ff78fDde12F191Acb82699f640694FB) | @@ -70,9 +74,9 @@ The new risk stewards have been configured with the following risk params on all ## References -- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Ethereum_RiskStewardPhase2_20240805.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumLido_RiskStewardPhase2_20240805.sol), [AaveV3EthereumEtherFi](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Polygon_RiskStewardPhase2_20240805.sol), [AaveV3Avalanche](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Avalanche_RiskStewardPhase2_20240805.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Optimism_RiskStewardPhase2_20240805.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Arbitrum_RiskStewardPhase2_20240805.sol), [AaveV3Metis](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Metis_RiskStewardPhase2_20240805.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Base_RiskStewardPhase2_20240805.sol), [AaveV3Gnosis](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Gnosis_RiskStewardPhase2_20240805.sol), [AaveV3Scroll](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Scroll_RiskStewardPhase2_20240805.sol), [AaveV3BNB](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3BNB_RiskStewardPhase2_20240805.sol), [AaveV3ZkSync](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/zksync/src/20240805_Multi_RiskStewardPhase2/AaveV3ZkSync_RiskStewardPhase2_20240805.sol) -- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Ethereum_RiskStewardPhase2_20240805.t.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumLido_RiskStewardPhase2_20240805.t.sol), [AaveV3EthereumEtherFi](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805.t.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Polygon_RiskStewardPhase2_20240805.t.sol), [AaveV3Avalanche](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Avalanche_RiskStewardPhase2_20240805.t.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Optimism_RiskStewardPhase2_20240805.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Arbitrum_RiskStewardPhase2_20240805.t.sol), [AaveV3Metis](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Metis_RiskStewardPhase2_20240805.t.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Base_RiskStewardPhase2_20240805.t.sol), [AaveV3Gnosis](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Gnosis_RiskStewardPhase2_20240805.t.sol), [AaveV3Scroll](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3Scroll_RiskStewardPhase2_20240805.t.sol), [AaveV3BNB](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/src/20240805_Multi_RiskStewardPhase2/AaveV3BNB_RiskStewardPhase2_20240805.t.sol), [AaveV3ZkSync](https://github.com/bgd-labs/aave-proposals-v3/blob/6133c63c69341c4462fc0fc00874096752a01fcb/zksync/src/20240805_Multi_RiskStewardPhase2/AaveV3ZkSync_RiskStewardPhase2_20240805.t.sol) -- [Discussion](https://governance.aave.com/t/arfc-bgd-risk-steward-phase-2-risksteward/16204) +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Ethereum_RiskStewardPhase2_20240805.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumLido_RiskStewardPhase2_20240805.sol), [AaveV3EthereumEtherFi](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Polygon_RiskStewardPhase2_20240805.sol), [AaveV3Avalanche](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Avalanche_RiskStewardPhase2_20240805.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Optimism_RiskStewardPhase2_20240805.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Arbitrum_RiskStewardPhase2_20240805.sol), [AaveV3Metis](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Metis_RiskStewardPhase2_20240805.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Base_RiskStewardPhase2_20240805.sol), [AaveV3Gnosis](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Gnosis_RiskStewardPhase2_20240805.sol), [AaveV3Scroll](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Scroll_RiskStewardPhase2_20240805.sol), [AaveV3BNB](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3BNB_RiskStewardPhase2_20240805.sol), [AaveV3ZkSync](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/zksync/src/20240805_Multi_RiskStewardPhase2/AaveV3ZkSync_RiskStewardPhase2_20240805.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Ethereum_RiskStewardPhase2_20240805.t.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumLido_RiskStewardPhase2_20240805.t.sol), [AaveV3EthereumEtherFi](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3EthereumEtherFi_RiskStewardPhase2_20240805.t.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Polygon_RiskStewardPhase2_20240805.t.sol), [AaveV3Avalanche](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Avalanche_RiskStewardPhase2_20240805.t.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Optimism_RiskStewardPhase2_20240805.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Arbitrum_RiskStewardPhase2_20240805.t.sol), [AaveV3Metis](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Metis_RiskStewardPhase2_20240805.t.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Base_RiskStewardPhase2_20240805.t.sol), [AaveV3Gnosis](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Gnosis_RiskStewardPhase2_20240805.t.sol), [AaveV3Scroll](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3Scroll_RiskStewardPhase2_20240805.t.sol), [AaveV3BNB](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/src/20240805_Multi_RiskStewardPhase2/AaveV3BNB_RiskStewardPhase2_20240805.t.sol), [AaveV3ZkSync](https://github.com/bgd-labs/aave-proposals-v3/blob/9c7233fde23e9061245c09b6cc58365a32a7b19b/zksync/src/20240805_Multi_RiskStewardPhase2/AaveV3ZkSync_RiskStewardPhase2_20240805.t.sol) +- [Discussion](https://governance.aave.com/t/arfc-aave-generalized-risk-stewards-agrs-activation/19178) - [Snapshot](https://snapshot.org/#/aave.eth/proposal/0x4809f179e517e5745ec13eba8f40d98dab73ca65f8a141bd2f18cc16dcd0cc16) - Github Repo: [Aave V3 Risk Stewards](https://github.com/aave-dao/aave-v3-risk-stewards) diff --git a/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007.sol b/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007.sol index f9bd1e496..2129300bc 100644 --- a/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007.sol +++ b/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007.sol @@ -4,14 +4,15 @@ pragma solidity ^0.8.0; import {AaveV3Arbitrum, AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol'; import {IACLManager} from 'aave-address-book/AaveV3.sol'; import {MiscArbitrum} from 'aave-address-book/MiscArbitrum.sol'; -import {ProxyAdmin} from 'solidity-utils/contracts/transparent-proxy/ProxyAdmin.sol'; -import {TransparentUpgradeableProxy} from 'solidity-utils/contracts/transparent-proxy/TransparentUpgradeableProxy.sol'; +import {GhoArbitrum} from 'aave-address-book/GhoArbitrum.sol'; import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; import {IAccessControl} from '@openzeppelin/contracts/access/IAccessControl.sol'; +import {ITransparentUpgradeableProxy} from 'solidity-utils/contracts/transparent-proxy/TransparentUpgradeableProxy.sol'; -import {IGhoBucketSteward} from 'src/interfaces/IGhoBucketSteward.sol'; -import {IGhoToken} from 'src/interfaces/IGhoToken.sol'; -import {IUpgradeableLockReleaseTokenPool} from 'src/interfaces/ccip/IUpgradeableLockReleaseTokenPool.sol'; +import {IGhoBucketSteward} from '../interfaces/IGhoBucketSteward.sol'; +import {IGhoToken} from '../interfaces/IGhoToken.sol'; +import {IUpgradeableLockReleaseTokenPool} from '../interfaces/ccip/IUpgradeableLockReleaseTokenPool.sol'; +import {ILegacyProxyAdmin} from '../interfaces/ILegacyProxyAdmin.sol'; /** * @title GHO Steward v2 Upgrade @@ -34,8 +35,8 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007 is IProposalGenericExecutor function execute() external { // New CCIP Token Pool - ProxyAdmin(MiscArbitrum.PROXY_ADMIN).upgrade( - TransparentUpgradeableProxy(payable(MiscArbitrum.GHO_CCIP_TOKEN_POOL)), + ILegacyProxyAdmin(MiscArbitrum.PROXY_ADMIN).upgrade( + ITransparentUpgradeableProxy(payable(GhoArbitrum.GHO_CCIP_TOKEN_POOL)), NEW_CCIP_POOL_IMPL ); @@ -46,7 +47,7 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007 is IProposalGenericExecutor ); address[] memory controlledFacilitators = new address[](1); - controlledFacilitators[0] = MiscArbitrum.GHO_CCIP_TOKEN_POOL; + controlledFacilitators[0] = GhoArbitrum.GHO_CCIP_TOKEN_POOL; IGhoBucketSteward(GHO_BUCKET_STEWARD).setControlledFacilitator(controlledFacilitators, true); // Gho Aave Steward @@ -56,7 +57,7 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007 is IProposalGenericExecutor ); // Gho CCIP Steward - IUpgradeableLockReleaseTokenPool(MiscArbitrum.GHO_CCIP_TOKEN_POOL).setRateLimitAdmin( + IUpgradeableLockReleaseTokenPool(GhoArbitrum.GHO_CCIP_TOKEN_POOL).setRateLimitAdmin( GHO_CCIP_STEWARD ); } diff --git a/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007.t.sol b/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007.t.sol index a323ba406..a52892e64 100644 --- a/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007.t.sol +++ b/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Arbitrum_GHOStewardV2Upgrade_20241007.t.sol @@ -1,12 +1,14 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; +import {ProxyHelpers} from 'aave-v3-origin-tests/utils/ProxyHelpers.sol'; import {AaveV3Arbitrum, AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol'; import {MiscArbitrum} from 'aave-address-book/MiscArbitrum.sol'; +import {GhoArbitrum} from 'aave-address-book/GhoArbitrum.sol'; import {GovernanceV3Arbitrum} from 'aave-address-book/GovernanceV3Arbitrum.sol'; import {IACLManager, IDefaultInterestRateStrategyV2} from 'aave-address-book/AaveV3.sol'; import {IAccessControl} from '@openzeppelin/contracts/access/IAccessControl.sol'; -import {TransparentUpgradeableProxy} from 'solidity-utils/contracts/transparent-proxy/TransparentUpgradeableProxy.sol'; +import {ITransparentUpgradeableProxy} from 'solidity-utils/contracts/transparent-proxy/TransparentUpgradeableProxy.sol'; import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; import {AaveV3Arbitrum_GHOStewardV2Upgrade_20241007} from './AaveV3Arbitrum_GHOStewardV2Upgrade_20241007.sol'; @@ -52,13 +54,15 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase // Gho CCIP Steward vm.expectRevert(); // getRateLimitAdmin doesn't exist yet - IUpgradeableLockReleaseTokenPool(MiscArbitrum.GHO_CCIP_TOKEN_POOL).getRateLimitAdmin(); + IUpgradeableLockReleaseTokenPool(GhoArbitrum.GHO_CCIP_TOKEN_POOL).getRateLimitAdmin(); executePayload(vm, address(proposal)); vm.prank(MiscArbitrum.PROXY_ADMIN); - address impl = TransparentUpgradeableProxy(payable(MiscArbitrum.GHO_CCIP_TOKEN_POOL)) - .implementation(); + address impl = ProxyHelpers.getInitializableAdminUpgradeabilityProxyImplementation( + vm, + GhoArbitrum.GHO_CCIP_TOKEN_POOL + ); IUpgradeableLockReleaseTokenPool poolTokenImpl = IUpgradeableLockReleaseTokenPool( proposal.NEW_CCIP_POOL_IMPL() @@ -77,7 +81,7 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase // Proxy cannot be re-initialized vm.expectRevert(); - IUpgradeableLockReleaseTokenPool(MiscArbitrum.GHO_CCIP_TOKEN_POOL).initialize( + IUpgradeableLockReleaseTokenPool(GhoArbitrum.GHO_CCIP_TOKEN_POOL).initialize( owner, list, router @@ -94,7 +98,7 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase assertTrue( IGhoBucketSteward(proposal.GHO_BUCKET_STEWARD()).isControlledFacilitator( - MiscArbitrum.GHO_CCIP_TOKEN_POOL + GhoArbitrum.GHO_CCIP_TOKEN_POOL ) ); @@ -108,7 +112,7 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase ); assertEq( - IUpgradeableLockReleaseTokenPool(MiscArbitrum.GHO_CCIP_TOKEN_POOL).getRateLimitAdmin(), + IUpgradeableLockReleaseTokenPool(GhoArbitrum.GHO_CCIP_TOKEN_POOL).getRateLimitAdmin(), proposal.GHO_CCIP_STEWARD() ); } @@ -117,7 +121,7 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase executePayload(vm, address(proposal)); IUpgradeableLockReleaseTokenPool poolToken = IUpgradeableLockReleaseTokenPool( - MiscArbitrum.GHO_CCIP_TOKEN_POOL + GhoArbitrum.GHO_CCIP_TOKEN_POOL ); assertEq(proposal.GHO_CCIP_STEWARD(), poolToken.getRateLimitAdmin()); @@ -181,15 +185,15 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase executePayload(vm, address(proposal)); (uint256 currentBucketCapacity, ) = IGhoToken(AaveV3ArbitrumAssets.GHO_UNDERLYING) - .getFacilitatorBucket(MiscArbitrum.GHO_CCIP_TOKEN_POOL); + .getFacilitatorBucket(GhoArbitrum.GHO_CCIP_TOKEN_POOL); vm.startPrank(RISK_COUNCIL); uint128 newBucketCapacity = uint128(currentBucketCapacity) + 1; IGhoBucketSteward(proposal.GHO_BUCKET_STEWARD()).updateFacilitatorBucketCapacity( - MiscArbitrum.GHO_CCIP_TOKEN_POOL, + GhoArbitrum.GHO_CCIP_TOKEN_POOL, newBucketCapacity ); (uint256 bucketCapacity, ) = IGhoToken(AaveV3ArbitrumAssets.GHO_UNDERLYING) - .getFacilitatorBucket(MiscArbitrum.GHO_CCIP_TOKEN_POOL); + .getFacilitatorBucket(GhoArbitrum.GHO_CCIP_TOKEN_POOL); assertEq(bucketCapacity, newBucketCapacity); } @@ -216,10 +220,10 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase executePayload(vm, address(proposal)); RateLimiter.TokenBucket memory outboundConfig = IUpgradeableLockReleaseTokenPool( - MiscArbitrum.GHO_CCIP_TOKEN_POOL + GhoArbitrum.GHO_CCIP_TOKEN_POOL ).getCurrentOutboundRateLimiterState(remoteChainSelector); RateLimiter.TokenBucket memory inboundConfig = IUpgradeableLockReleaseTokenPool( - MiscArbitrum.GHO_CCIP_TOKEN_POOL + GhoArbitrum.GHO_CCIP_TOKEN_POOL ).getCurrentInboundRateLimiterState(remoteChainSelector); RateLimiter.Config memory newOutboundConfig = RateLimiter.Config({ @@ -260,9 +264,9 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase }); // Mocking response due to rate limit currently being 0 vm.mockCall( - MiscArbitrum.GHO_CCIP_TOKEN_POOL, + GhoArbitrum.GHO_CCIP_TOKEN_POOL, abi.encodeWithSelector( - IUpgradeableLockReleaseTokenPool(MiscArbitrum.GHO_CCIP_TOKEN_POOL) + IUpgradeableLockReleaseTokenPool(GhoArbitrum.GHO_CCIP_TOKEN_POOL) .getCurrentOutboundRateLimiterState .selector, remoteChainSelector @@ -271,10 +275,10 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase ); RateLimiter.TokenBucket memory outboundConfig = IUpgradeableLockReleaseTokenPool( - MiscArbitrum.GHO_CCIP_TOKEN_POOL + GhoArbitrum.GHO_CCIP_TOKEN_POOL ).getCurrentOutboundRateLimiterState(remoteChainSelector); RateLimiter.TokenBucket memory inboundConfig = IUpgradeableLockReleaseTokenPool( - MiscArbitrum.GHO_CCIP_TOKEN_POOL + GhoArbitrum.GHO_CCIP_TOKEN_POOL ).getCurrentInboundRateLimiterState(remoteChainSelector); RateLimiter.Config memory newOutboundConfig = RateLimiter.Config({ @@ -317,9 +321,9 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase // Mocking response due to rate limit currently being 0 vm.mockCall( - MiscArbitrum.GHO_CCIP_TOKEN_POOL, + GhoArbitrum.GHO_CCIP_TOKEN_POOL, abi.encodeWithSelector( - IUpgradeableLockReleaseTokenPool(MiscArbitrum.GHO_CCIP_TOKEN_POOL) + IUpgradeableLockReleaseTokenPool(GhoArbitrum.GHO_CCIP_TOKEN_POOL) .getCurrentOutboundRateLimiterState .selector, remoteChainSelector @@ -327,9 +331,9 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase abi.encode(mockConfig) ); vm.mockCall( - MiscArbitrum.GHO_CCIP_TOKEN_POOL, + GhoArbitrum.GHO_CCIP_TOKEN_POOL, abi.encodeWithSelector( - IUpgradeableLockReleaseTokenPool(MiscArbitrum.GHO_CCIP_TOKEN_POOL) + IUpgradeableLockReleaseTokenPool(GhoArbitrum.GHO_CCIP_TOKEN_POOL) .getCurrentInboundRateLimiterState .selector, remoteChainSelector @@ -338,10 +342,10 @@ contract AaveV3Arbitrum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase ); RateLimiter.TokenBucket memory outboundConfig = IUpgradeableLockReleaseTokenPool( - MiscArbitrum.GHO_CCIP_TOKEN_POOL + GhoArbitrum.GHO_CCIP_TOKEN_POOL ).getCurrentOutboundRateLimiterState(remoteChainSelector); RateLimiter.TokenBucket memory inboundConfig = IUpgradeableLockReleaseTokenPool( - MiscArbitrum.GHO_CCIP_TOKEN_POOL + GhoArbitrum.GHO_CCIP_TOKEN_POOL ).getCurrentInboundRateLimiterState(remoteChainSelector); RateLimiter.Config memory newOutboundConfig = RateLimiter.Config({ diff --git a/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Ethereum_GHOStewardV2Upgrade_20241007.sol b/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Ethereum_GHOStewardV2Upgrade_20241007.sol index df9f71d71..2c66a0607 100644 --- a/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Ethereum_GHOStewardV2Upgrade_20241007.sol +++ b/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Ethereum_GHOStewardV2Upgrade_20241007.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.0; import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {GhoEthereum} from 'aave-address-book/GhoEthereum.sol'; import {IACLManager} from 'aave-address-book/AaveV3.sol'; import {IAccessControl} from '@openzeppelin/contracts/access/IAccessControl.sol'; import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; @@ -43,13 +44,13 @@ contract AaveV3Ethereum_GHOStewardV2Upgrade_20241007 is IProposalGenericExecutor OLD_STEWARD ); - IGsm(MiscEthereum.GSM_USDC).revokeRole( - IGsm(MiscEthereum.GSM_USDC).CONFIGURATOR_ROLE(), + IGsm(GhoEthereum.GSM_USDC).revokeRole( + IGsm(GhoEthereum.GSM_USDC).CONFIGURATOR_ROLE(), OLD_STEWARD ); - IGsm(MiscEthereum.GSM_USDT).revokeRole( - IGsm(MiscEthereum.GSM_USDT).CONFIGURATOR_ROLE(), + IGsm(GhoEthereum.GSM_USDT).revokeRole( + IGsm(GhoEthereum.GSM_USDT).CONFIGURATOR_ROLE(), OLD_STEWARD ); @@ -61,8 +62,8 @@ contract AaveV3Ethereum_GHOStewardV2Upgrade_20241007 is IProposalGenericExecutor address[] memory controlledFacilitators = new address[](3); controlledFacilitators[0] = AaveV3EthereumAssets.GHO_A_TOKEN; - controlledFacilitators[1] = MiscEthereum.GSM_USDC; - controlledFacilitators[2] = MiscEthereum.GSM_USDT; + controlledFacilitators[1] = GhoEthereum.GSM_USDC; + controlledFacilitators[2] = GhoEthereum.GSM_USDT; IGhoBucketSteward(GHO_BUCKET_STEWARD).setControlledFacilitator(controlledFacilitators, true); // Gho Aave Steward @@ -72,20 +73,20 @@ contract AaveV3Ethereum_GHOStewardV2Upgrade_20241007 is IProposalGenericExecutor ); // Gho CCIP Steward - IUpgradeableLockReleaseTokenPool(MiscEthereum.GHO_CCIP_TOKEN_POOL).setRateLimitAdmin( + IUpgradeableLockReleaseTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL).setRateLimitAdmin( GHO_CCIP_STEWARD ); - IUpgradeableLockReleaseTokenPool(MiscEthereum.GHO_CCIP_TOKEN_POOL).setBridgeLimitAdmin( + IUpgradeableLockReleaseTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL).setBridgeLimitAdmin( GHO_CCIP_STEWARD ); // GHO GSM Steward - IGsm(MiscEthereum.GSM_USDC).grantRole( - IGsm(MiscEthereum.GSM_USDC).CONFIGURATOR_ROLE(), + IGsm(GhoEthereum.GSM_USDC).grantRole( + IGsm(GhoEthereum.GSM_USDC).CONFIGURATOR_ROLE(), GHO_GSM_STEWARD ); - IGsm(MiscEthereum.GSM_USDT).grantRole( - IGsm(MiscEthereum.GSM_USDT).CONFIGURATOR_ROLE(), + IGsm(GhoEthereum.GSM_USDT).grantRole( + IGsm(GhoEthereum.GSM_USDT).CONFIGURATOR_ROLE(), GHO_GSM_STEWARD ); } diff --git a/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Ethereum_GHOStewardV2Upgrade_20241007.t.sol b/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Ethereum_GHOStewardV2Upgrade_20241007.t.sol index caa0f16b8..ae5d0fc69 100644 --- a/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Ethereum_GHOStewardV2Upgrade_20241007.t.sol +++ b/src/20241007_Multi_GHOStewardV2Upgrade/AaveV3Ethereum_GHOStewardV2Upgrade_20241007.t.sol @@ -4,6 +4,7 @@ pragma solidity ^0.8.0; import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {GhoEthereum} from 'aave-address-book/GhoEthereum.sol'; import {IACLManager, IDefaultInterestRateStrategyV2} from 'aave-address-book/AaveV3.sol'; import {IAccessControl} from '@openzeppelin/contracts/access/IAccessControl.sol'; import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; @@ -50,8 +51,8 @@ contract AaveV3Ethereum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase ); assertEq( - IGsm(MiscEthereum.GSM_USDC).hasRole( - IGsm(MiscEthereum.GSM_USDC).CONFIGURATOR_ROLE(), + IGsm(GhoEthereum.GSM_USDC).hasRole( + IGsm(GhoEthereum.GSM_USDC).CONFIGURATOR_ROLE(), proposal.OLD_STEWARD() ), true, @@ -59,8 +60,8 @@ contract AaveV3Ethereum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase ); assertEq( - IGsm(MiscEthereum.GSM_USDT).hasRole( - IGsm(MiscEthereum.GSM_USDT).CONFIGURATOR_ROLE(), + IGsm(GhoEthereum.GSM_USDT).hasRole( + IGsm(GhoEthereum.GSM_USDT).CONFIGURATOR_ROLE(), proposal.OLD_STEWARD() ), true, @@ -87,25 +88,25 @@ contract AaveV3Ethereum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase // Gho CCIP Steward assertEq( - IUpgradeableLockReleaseTokenPool(MiscEthereum.GHO_CCIP_TOKEN_POOL).getBridgeLimitAdmin(), + IUpgradeableLockReleaseTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL).getBridgeLimitAdmin(), address(0) ); assertEq( - IUpgradeableLockReleaseTokenPool(MiscEthereum.GHO_CCIP_TOKEN_POOL).getRateLimitAdmin(), + IUpgradeableLockReleaseTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL).getRateLimitAdmin(), address(0) ); // GHO GSM Steward assertEq( - IGsm(MiscEthereum.GSM_USDC).hasRole( - IGsm(MiscEthereum.GSM_USDC).CONFIGURATOR_ROLE(), + IGsm(GhoEthereum.GSM_USDC).hasRole( + IGsm(GhoEthereum.GSM_USDC).CONFIGURATOR_ROLE(), proposal.GHO_GSM_STEWARD() ), false ); assertEq( - IGsm(MiscEthereum.GSM_USDT).hasRole( - IGsm(MiscEthereum.GSM_USDT).CONFIGURATOR_ROLE(), + IGsm(GhoEthereum.GSM_USDT).hasRole( + IGsm(GhoEthereum.GSM_USDT).CONFIGURATOR_ROLE(), proposal.GHO_GSM_STEWARD() ), false @@ -124,16 +125,16 @@ contract AaveV3Ethereum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase ); assertEq( - IGsm(MiscEthereum.GSM_USDC).hasRole( - IGsm(MiscEthereum.GSM_USDC).CONFIGURATOR_ROLE(), + IGsm(GhoEthereum.GSM_USDC).hasRole( + IGsm(GhoEthereum.GSM_USDC).CONFIGURATOR_ROLE(), proposal.OLD_STEWARD() ), false ); assertEq( - IGsm(MiscEthereum.GSM_USDT).hasRole( - IGsm(MiscEthereum.GSM_USDT).CONFIGURATOR_ROLE(), + IGsm(GhoEthereum.GSM_USDT).hasRole( + IGsm(GhoEthereum.GSM_USDT).CONFIGURATOR_ROLE(), proposal.OLD_STEWARD() ), false @@ -154,14 +155,10 @@ contract AaveV3Ethereum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase ) ); assertTrue( - IGhoBucketSteward(proposal.GHO_BUCKET_STEWARD()).isControlledFacilitator( - MiscEthereum.GSM_USDC - ) + IGhoBucketSteward(proposal.GHO_BUCKET_STEWARD()).isControlledFacilitator(GhoEthereum.GSM_USDC) ); assertTrue( - IGhoBucketSteward(proposal.GHO_BUCKET_STEWARD()).isControlledFacilitator( - MiscEthereum.GSM_USDT - ) + IGhoBucketSteward(proposal.GHO_BUCKET_STEWARD()).isControlledFacilitator(GhoEthereum.GSM_USDT) ); // Gho Aave Steward @@ -174,25 +171,25 @@ contract AaveV3Ethereum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase ); assertEq( - IUpgradeableLockReleaseTokenPool(MiscEthereum.GHO_CCIP_TOKEN_POOL).getBridgeLimitAdmin(), + IUpgradeableLockReleaseTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL).getBridgeLimitAdmin(), proposal.GHO_CCIP_STEWARD() ); assertEq( - IUpgradeableLockReleaseTokenPool(MiscEthereum.GHO_CCIP_TOKEN_POOL).getRateLimitAdmin(), + IUpgradeableLockReleaseTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL).getRateLimitAdmin(), proposal.GHO_CCIP_STEWARD() ); // GHO GSM Steward assertEq( - IGsm(MiscEthereum.GSM_USDC).hasRole( - IGsm(MiscEthereum.GSM_USDC).CONFIGURATOR_ROLE(), + IGsm(GhoEthereum.GSM_USDC).hasRole( + IGsm(GhoEthereum.GSM_USDC).CONFIGURATOR_ROLE(), proposal.GHO_GSM_STEWARD() ), true ); assertEq( - IGsm(MiscEthereum.GSM_USDT).hasRole( - IGsm(MiscEthereum.GSM_USDT).CONFIGURATOR_ROLE(), + IGsm(GhoEthereum.GSM_USDT).hasRole( + IGsm(GhoEthereum.GSM_USDT).CONFIGURATOR_ROLE(), proposal.GHO_GSM_STEWARD() ), true @@ -289,33 +286,29 @@ contract AaveV3Ethereum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase executePayload(vm, address(proposal)); address[] memory newGsmList = new address[](1); - newGsmList[0] = MiscEthereum.GSM_USDC; + newGsmList[0] = GhoEthereum.GSM_USDC; vm.startPrank(GovernanceV3Ethereum.EXECUTOR_LVL_1); IGhoBucketSteward(proposal.GHO_BUCKET_STEWARD()).setControlledFacilitator(newGsmList, true); assertTrue( - IGhoBucketSteward(proposal.GHO_BUCKET_STEWARD()).isControlledFacilitator( - MiscEthereum.GSM_USDC - ) + IGhoBucketSteward(proposal.GHO_BUCKET_STEWARD()).isControlledFacilitator(GhoEthereum.GSM_USDC) ); IGhoBucketSteward(proposal.GHO_BUCKET_STEWARD()).setControlledFacilitator(newGsmList, false); assertFalse( - IGhoBucketSteward(proposal.GHO_BUCKET_STEWARD()).isControlledFacilitator( - MiscEthereum.GSM_USDC - ) + IGhoBucketSteward(proposal.GHO_BUCKET_STEWARD()).isControlledFacilitator(GhoEthereum.GSM_USDC) ); } function test_ghoCcipSteward_updateBridgeLimit() public { executePayload(vm, address(proposal)); - uint256 oldBridgeLimit = IUpgradeableLockReleaseTokenPool(MiscEthereum.GHO_CCIP_TOKEN_POOL) + uint256 oldBridgeLimit = IUpgradeableLockReleaseTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL) .getBridgeLimit(); uint256 newBridgeLimit = oldBridgeLimit + 1; vm.startPrank(RISK_COUNCIL); IGhoCcipSteward(proposal.GHO_CCIP_STEWARD()).updateBridgeLimit(newBridgeLimit); - uint256 currentBridgeLimit = IUpgradeableLockReleaseTokenPool(MiscEthereum.GHO_CCIP_TOKEN_POOL) + uint256 currentBridgeLimit = IUpgradeableLockReleaseTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL) .getBridgeLimit(); assertEq(currentBridgeLimit, newBridgeLimit); } @@ -324,10 +317,10 @@ contract AaveV3Ethereum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase executePayload(vm, address(proposal)); RateLimiter.TokenBucket memory outboundConfig = IUpgradeableLockReleaseTokenPool( - MiscEthereum.GHO_CCIP_TOKEN_POOL + GhoEthereum.GHO_CCIP_TOKEN_POOL ).getCurrentOutboundRateLimiterState(remoteChainSelector); RateLimiter.TokenBucket memory inboundConfig = IUpgradeableLockReleaseTokenPool( - MiscEthereum.GHO_CCIP_TOKEN_POOL + GhoEthereum.GHO_CCIP_TOKEN_POOL ).getCurrentInboundRateLimiterState(remoteChainSelector); RateLimiter.Config memory newOutboundConfig = RateLimiter.Config({ @@ -361,32 +354,32 @@ contract AaveV3Ethereum_GHOStewardV2Upgrade_20241007_Test is ProtocolV3TestBase function test_ghoGsmSteward_pdateExposureCap() public { executePayload(vm, address(proposal)); - uint128 oldExposureCap = IGsm(MiscEthereum.GSM_USDC).getExposureCap(); + uint128 oldExposureCap = IGsm(GhoEthereum.GSM_USDC).getExposureCap(); uint128 newExposureCap = oldExposureCap + 1; vm.startPrank(RISK_COUNCIL); IGsmSteward(proposal.GHO_GSM_STEWARD()).updateGsmExposureCap( - MiscEthereum.GSM_USDC, + GhoEthereum.GSM_USDC, newExposureCap ); - uint128 currentExposureCap = IGsm(MiscEthereum.GSM_USDC).getExposureCap(); + uint128 currentExposureCap = IGsm(GhoEthereum.GSM_USDC).getExposureCap(); assertEq(currentExposureCap, newExposureCap); } function test_ghoGsmSteward_updateGsmBuySellFees() public { executePayload(vm, address(proposal)); - address feeStrategy = IGsm(MiscEthereum.GSM_USDC).getFeeStrategy(); + address feeStrategy = IGsm(GhoEthereum.GSM_USDC).getFeeStrategy(); uint256 buyFee = IGsmFeeStrategy(feeStrategy).getBuyFee(1e4); uint256 sellFee = IGsmFeeStrategy(feeStrategy).getSellFee(1e4); vm.startPrank(RISK_COUNCIL); IGsmSteward(proposal.GHO_GSM_STEWARD()).updateGsmBuySellFees( - MiscEthereum.GSM_USDC, + GhoEthereum.GSM_USDC, buyFee + 1, sellFee ); - address newStrategy = IGsm(MiscEthereum.GSM_USDC).getFeeStrategy(); + address newStrategy = IGsm(GhoEthereum.GSM_USDC).getFeeStrategy(); uint256 newBuyFee = IGsmFeeStrategy(newStrategy).getBuyFee(1e4); assertEq(newBuyFee, buyFee + 1); } diff --git a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.sol b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.sol new file mode 100644 index 000000000..728ba707a --- /dev/null +++ b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {ITransparentUpgradeableProxy} from 'solidity-utils/contracts/transparent-proxy/TransparentUpgradeableProxy.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {MiscArbitrum} from 'aave-address-book/MiscArbitrum.sol'; +import {GhoArbitrum} from 'aave-address-book/GhoArbitrum.sol'; +import {IUpgradeableBurnMintTokenPool} from 'src/interfaces/ccip/IUpgradeableBurnMintTokenPool.sol'; +import {IRateLimiter} from 'src/interfaces/ccip/IRateLimiter.sol'; +import {ILegacyProxyAdmin} from '../interfaces/ILegacyProxyAdmin.sol'; + +/** + * @title GHO CCIP 1.50 Upgrade + * @author Aave Labs + * - Discussion: https://governance.aave.com/t/bgd-technical-maintenance-proposals/15274/51 + */ +contract AaveV3Arbitrum_GHOCCIP150Upgrade_20241021 is IProposalGenericExecutor { + uint64 public constant ETH_CHAIN_SELECTOR = 5009297550715157269; + + // https://arbiscan.io/address/0xfc421aD3C883Bf9E7C4f42dE845C4e4405799e73 + address public constant TOKEN_POOL_IMPL = 0xfc421aD3C883Bf9E7C4f42dE845C4e4405799e73; + // https://arbiscan.io/address/0x26329558f08cbb40d6a4CCA0E0C67b29D64A8c50 + address public constant GHO_CCIP_PROXY_POOL = 0x26329558f08cbb40d6a4CCA0E0C67b29D64A8c50; + + /// @dev Token Rate Limit Capacity: 300_000 GHO + uint128 public constant CCIP_RATE_LIMIT_CAPACITY = 300_000e18; + + /// @dev Token Rate Limit Refill Rate: 60 GHO per second (=> 216_000 GHO per hour) + uint128 public constant CCIP_RATE_LIMIT_REFILL_RATE = 60e18; + + function execute() external { + IUpgradeableBurnMintTokenPool tokenPoolProxy = IUpgradeableBurnMintTokenPool( + GhoArbitrum.GHO_CCIP_TOKEN_POOL + ); + + ILegacyProxyAdmin(MiscArbitrum.PROXY_ADMIN).upgrade( + ITransparentUpgradeableProxy(payable(address(tokenPoolProxy))), + TOKEN_POOL_IMPL + ); + + // Update proxyPool address + tokenPoolProxy.setProxyPool(GHO_CCIP_PROXY_POOL); + + // Set rate limit + IRateLimiter.Config memory rateLimitConfig = IRateLimiter.Config({ + isEnabled: true, + capacity: CCIP_RATE_LIMIT_CAPACITY, + rate: CCIP_RATE_LIMIT_REFILL_RATE + }); + tokenPoolProxy.setChainRateLimiterConfig(ETH_CHAIN_SELECTOR, rateLimitConfig, rateLimitConfig); + } +} diff --git a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.t.sol b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.t.sol new file mode 100644 index 000000000..73430ce9f --- /dev/null +++ b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.t.sol @@ -0,0 +1,495 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import 'forge-std/Test.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {AaveV3Arbitrum, AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol'; +import {MiscArbitrum} from 'aave-address-book/MiscArbitrum.sol'; +import {GhoArbitrum} from 'aave-address-book/GhoArbitrum.sol'; +import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {GhoEthereum} from 'aave-address-book/GhoEthereum.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {IClient} from 'src/interfaces/ccip/IClient.sol'; +import {IInternal} from 'src/interfaces/ccip/IInternal.sol'; +import {IRouter} from 'src/interfaces/ccip/IRouter.sol'; +import {ITypeAndVersion} from 'src/interfaces/ccip/ITypeAndVersion.sol'; +import {IProxyPool} from 'src/interfaces/ccip/IProxyPool.sol'; +import {IRateLimiter} from 'src/interfaces/ccip/IRateLimiter.sol'; +import {ITokenAdminRegistry} from 'src/interfaces/ccip/ITokenAdminRegistry.sol'; +import {IGhoToken} from 'src/interfaces/IGhoToken.sol'; +import {IGhoCcipSteward} from 'src/interfaces/IGhoCcipSteward.sol'; +import {IUpgradeableBurnMintTokenPool} from 'src/interfaces/ccip/IUpgradeableBurnMintTokenPool.sol'; +import {CCIPUtils} from './utils/CCIPUtils.sol'; + +import {AaveV3Arbitrum_GHOCCIP150Upgrade_20241021} from './AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.sol'; + +/** + * @dev Test for AaveV3Arbitrum_GHOCCIP150Upgrade_20241021 + * command: FOUNDRY_PROFILE=arbitrum forge test --match-path=src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.t.sol -vv + */ +contract AaveV3Arbitrum_GHOCCIP150Upgrade_20241021_Test is ProtocolV3TestBase { + struct CCIPSendParams { + IRouter router; + uint256 amount; + bool migrated; + } + + AaveV3Arbitrum_GHOCCIP150Upgrade_20241021 internal proposal; + IUpgradeableBurnMintTokenPool internal ghoTokenPool; + IProxyPool internal proxyPool; + + address internal alice = makeAddr('alice'); + + uint64 internal constant ETH_CHAIN_SELECTOR = 5009297550715157269; + uint64 internal constant ARB_CHAIN_SELECTOR = 4949039107694359620; + address internal constant ARB_GHO_TOKEN = AaveV3ArbitrumAssets.GHO_UNDERLYING; + address internal constant ETH_PROXY_POOL = 0x9Ec9F9804733df96D1641666818eFb5198eC50f0; + ITokenAdminRegistry internal constant TOKEN_ADMIN_REGISTRY = + ITokenAdminRegistry(0x39AE1032cF4B334a1Ed41cdD0833bdD7c7E7751E); + + address internal constant ON_RAMP_1_2 = 0xCe11020D56e5FDbfE46D9FC3021641FfbBB5AdEE; + address internal constant ON_RAMP_1_5 = 0x67761742ac8A21Ec4D76CA18cbd701e5A6F3Bef3; + address internal constant OFF_RAMP_1_2 = 0x542ba1902044069330e8c5b36A84EC503863722f; + address internal constant OFF_RAMP_1_5 = 0x91e46cc5590A4B9182e47f40006140A7077Dec31; + + IGhoCcipSteward internal constant GHO_CCIP_STEWARD = + IGhoCcipSteward(0xb329CEFF2c362F315900d245eC88afd24C4949D5); + + event Burned(address indexed sender, uint256 amount); + event Minted(address indexed sender, address indexed recipient, uint256 amount); + event CCIPSendRequested(IInternal.EVM2EVMMessage message); + + error CallerIsNotARampOnRouter(address caller); + error NotACompatiblePool(address pool); + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('arbitrum'), 271788784); + proposal = new AaveV3Arbitrum_GHOCCIP150Upgrade_20241021(); + ghoTokenPool = IUpgradeableBurnMintTokenPool(GhoArbitrum.GHO_CCIP_TOKEN_POOL); + proxyPool = IProxyPool(proposal.GHO_CCIP_PROXY_POOL()); + + _validateConstants(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + assertEq( + ghoTokenPool.getCurrentInboundRateLimiterState(ETH_CHAIN_SELECTOR), + _getDisabledConfig() + ); + assertEq( + ghoTokenPool.getCurrentOutboundRateLimiterState(ETH_CHAIN_SELECTOR), + _getDisabledConfig() + ); + + bytes memory dynamicParamsBefore = _getDynamicParams(); + bytes memory staticParamsBefore = _getStaticParams(); + + defaultTest( + 'AaveV3Arbitrum_GHOCCIP150Upgrade_20241021', + AaveV3Arbitrum.POOL, + address(proposal) + ); + + assertEq(keccak256(_getDynamicParams()), keccak256(dynamicParamsBefore)); + assertEq(keccak256(_getStaticParams()), keccak256(staticParamsBefore)); + + assertEq( + ghoTokenPool.getCurrentInboundRateLimiterState(ETH_CHAIN_SELECTOR), + _getRateLimiterConfig() + ); + assertEq( + ghoTokenPool.getCurrentOutboundRateLimiterState(ETH_CHAIN_SELECTOR), + _getRateLimiterConfig() + ); + } + + function test_getProxyPool() public { + // proxyPool getter does not exist before the upgrade + vm.expectRevert(); + ghoTokenPool.getProxyPool(); + + executePayload(vm, address(proposal)); + + assertEq(ghoTokenPool.getProxyPool(), address(proxyPool)); + } + + function test_tokenPoolCannotBeInitializedAgain() public { + vm.expectRevert('Initializable: contract is already initialized'); + ghoTokenPool.initialize(makeAddr('owner'), new address[](0), makeAddr('router')); + /// proxy implementation is initialized + assertEq(_readInitialized(address(ghoTokenPool)), 1); + assertEq(_readInitialized(_getImplementation(address(ghoTokenPool))), 255); + + executePayload(vm, address(proposal)); + + vm.expectRevert('Initializable: contract is already initialized'); + ghoTokenPool.initialize(makeAddr('owner'), new address[](0), makeAddr('router')); + assertEq(_readInitialized(address(ghoTokenPool)), 1); + /// proxy implementation is initialized + assertEq(_readInitialized(_getImplementation(address(ghoTokenPool))), 255); + } + + function test_sendMessagePreCCIPMigration(uint256 amount) public { + executePayload(vm, address(proposal)); + + IRouter router = IRouter(ghoTokenPool.getRouter()); + amount = bound(amount, 1, _getRateLimiterConfig().capacity); + uint256 facilitatorLevelBefore = _getFacilitatorLevel(address(ghoTokenPool)); + + // wait for the rate limiter to refill + skip(_getOutboundRefillTime(amount)); + + vm.prank(alice); + IERC20(ARB_GHO_TOKEN).approve(address(router), amount); + deal(ARB_GHO_TOKEN, alice, amount); + + ( + IClient.EVM2AnyMessage memory message, + IInternal.EVM2EVMMessage memory eventArg + ) = _getTokenMessage(CCIPSendParams({router: router, amount: amount, migrated: false})); + + vm.expectEmit(address(ghoTokenPool)); + emit Burned(ON_RAMP_1_2, amount); + vm.expectEmit(ON_RAMP_1_2); + emit CCIPSendRequested(eventArg); + vm.prank(alice); + router.ccipSend{value: eventArg.feeTokenAmount}(ETH_CHAIN_SELECTOR, message); + + assertEq(IERC20(ARB_GHO_TOKEN).balanceOf(alice), 0); + assertEq(_getFacilitatorLevel(address(ghoTokenPool)), facilitatorLevelBefore - amount); + } + + function test_sendMessagePostCCIPMigration(uint256 amount) public { + executePayload(vm, address(proposal)); + + _mockCCIPMigration(); + + IRouter router = IRouter(ghoTokenPool.getRouter()); + amount = bound(amount, 1, _getRateLimiterConfig().capacity); + uint256 facilitatorLevelBefore = _getFacilitatorLevel(address(ghoTokenPool)); + + // wait for the rate limiter to refill + skip(_getOutboundRefillTime(amount)); + + vm.prank(alice); + IERC20(ARB_GHO_TOKEN).approve(address(router), amount); + deal(ARB_GHO_TOKEN, alice, amount); + + ( + IClient.EVM2AnyMessage memory message, + IInternal.EVM2EVMMessage memory eventArg + ) = _getTokenMessage(CCIPSendParams({router: router, amount: amount, migrated: true})); + + vm.expectEmit(address(ghoTokenPool)); + emit Burned(address(proxyPool), amount); + vm.expectEmit(address(proxyPool)); + emit Burned(ON_RAMP_1_5, amount); + vm.expectEmit(ON_RAMP_1_5); + emit CCIPSendRequested(eventArg); + vm.prank(alice); + router.ccipSend{value: eventArg.feeTokenAmount}(ETH_CHAIN_SELECTOR, message); + + assertEq(IERC20(ARB_GHO_TOKEN).balanceOf(alice), 0); + assertEq(_getFacilitatorLevel(address(ghoTokenPool)), facilitatorLevelBefore - amount); + } + + function test_executeMessagePreCCIPMigration(uint256 amount) public { + executePayload(vm, address(proposal)); + + amount = bound(amount, 1, _getRateLimiterConfig().capacity); + uint256 facilitatorLevelBefore = _getFacilitatorLevel(address(ghoTokenPool)); + + // wait for the rate limiter to refill + skip(_getInboundRefillTime(amount)); + + vm.expectEmit(address(ghoTokenPool)); + emit Minted(OFF_RAMP_1_2, alice, amount); + vm.prank(OFF_RAMP_1_2); + ghoTokenPool.releaseOrMint(abi.encode(alice), alice, amount, ETH_CHAIN_SELECTOR, ''); + + assertEq(IERC20(ARB_GHO_TOKEN).balanceOf(alice), amount); + assertEq(_getFacilitatorLevel(address(ghoTokenPool)), facilitatorLevelBefore + amount); + } + + function test_executeMessagePostCCIPMigration(uint256 amount) public { + executePayload(vm, address(proposal)); + + _mockCCIPMigration(); + + amount = bound(amount, 1, _getRateLimiterConfig().capacity); + uint256 facilitatorLevelBefore = _getFacilitatorLevel(address(ghoTokenPool)); + + // wait for the rate limiter to refill + skip(_getInboundRefillTime(amount)); + + vm.expectEmit(address(ghoTokenPool)); + emit Minted(OFF_RAMP_1_5, alice, amount); + vm.prank(OFF_RAMP_1_5); + ghoTokenPool.releaseOrMint(abi.encode(alice), alice, amount, ETH_CHAIN_SELECTOR, ''); + + assertEq(IERC20(ARB_GHO_TOKEN).balanceOf(alice), amount); + assertEq(_getFacilitatorLevel(address(ghoTokenPool)), facilitatorLevelBefore + amount); + } + + function test_executeMessagePostCCIPMigrationViaLegacyOffRamp(uint256 amount) public { + executePayload(vm, address(proposal)); + + _mockCCIPMigration(); + + amount = bound(amount, 1, _getRateLimiterConfig().capacity); + uint256 facilitatorLevelBefore = _getFacilitatorLevel(address(ghoTokenPool)); + + // wait for the rate limiter to refill + skip(_getInboundRefillTime(amount)); + + vm.expectEmit(address(ghoTokenPool)); + emit Minted(OFF_RAMP_1_2, alice, amount); + vm.prank(OFF_RAMP_1_2); + ghoTokenPool.releaseOrMint(abi.encode(alice), alice, amount, ETH_CHAIN_SELECTOR, ''); + + assertEq(IERC20(ARB_GHO_TOKEN).balanceOf(alice), amount); + assertEq(_getFacilitatorLevel(address(ghoTokenPool)), facilitatorLevelBefore + amount); + } + + function test_proxyPoolCanOnRamp(uint256 amount) public { + amount = bound(amount, 1, _getRateLimiterConfig().capacity); + + vm.expectRevert(abi.encodeWithSelector(CallerIsNotARampOnRouter.selector, proxyPool)); + vm.prank(address(proxyPool)); + ghoTokenPool.lockOrBurn(alice, abi.encode(alice), amount, ETH_CHAIN_SELECTOR, new bytes(0)); + + executePayload(vm, address(proposal)); + // router is responsible for transferring liquidity, so we mock router.token.transferFrom(user, tokenPool) + deal(ARB_GHO_TOKEN, address(ghoTokenPool), amount); + uint256 facilitatorLevelBefore = _getFacilitatorLevel(address(ghoTokenPool)); + + // wait for the rate limiter to refill + skip(_getOutboundRefillTime(amount)); + + vm.expectEmit(address(ghoTokenPool)); + emit Burned(address(proxyPool), amount); + vm.prank(address(proxyPool)); + ghoTokenPool.lockOrBurn(alice, abi.encode(alice), amount, ETH_CHAIN_SELECTOR, new bytes(0)); + + assertEq(IERC20(ARB_GHO_TOKEN).balanceOf(alice), 0); + assertEq(_getFacilitatorLevel(address(ghoTokenPool)), facilitatorLevelBefore - amount); + } + + function test_proxyPoolCanOffRamp(uint256 amount) public { + amount = bound(amount, 1, _getRateLimiterConfig().capacity); + + vm.expectRevert(abi.encodeWithSelector(CallerIsNotARampOnRouter.selector, proxyPool)); + vm.prank(address(proxyPool)); + ghoTokenPool.releaseOrMint(abi.encode(alice), alice, amount, ETH_CHAIN_SELECTOR, new bytes(0)); + + executePayload(vm, address(proposal)); + uint256 facilitatorLevelBefore = _getFacilitatorLevel(address(ghoTokenPool)); + + // wait for the rate limiter to refill + skip(_getInboundRefillTime(amount)); + + vm.expectEmit(address(ghoTokenPool)); + emit Minted(address(proxyPool), alice, amount); + vm.prank(address(proxyPool)); + ghoTokenPool.releaseOrMint(abi.encode(alice), alice, amount, ETH_CHAIN_SELECTOR, new bytes(0)); + + assertEq(IERC20(ARB_GHO_TOKEN).balanceOf(alice), amount); + assertEq(_getFacilitatorLevel(address(ghoTokenPool)), facilitatorLevelBefore + amount); + } + + function test_stewardCanDisableRateLimit() public { + executePayload(vm, address(proposal)); + + assertEq(ghoTokenPool.getRateLimitAdmin(), address(GHO_CCIP_STEWARD)); + + vm.prank(GHO_CCIP_STEWARD.RISK_COUNCIL()); + GHO_CCIP_STEWARD.updateRateLimit(ETH_CHAIN_SELECTOR, false, 0, 0, false, 0, 0); + + assertEq( + abi.encode( + _tokenBucketToConfig(ghoTokenPool.getCurrentInboundRateLimiterState(ETH_CHAIN_SELECTOR)) + ), + abi.encode(_getDisabledConfig()) + ); + assertEq( + abi.encode( + _tokenBucketToConfig(ghoTokenPool.getCurrentOutboundRateLimiterState(ETH_CHAIN_SELECTOR)) + ), + abi.encode(_getDisabledConfig()) + ); + } + + function test_ownershipTransferOfGhoProxyPool() public { + executePayload(vm, address(proposal)); + _mockCCIPMigration(); + + assertEq(ghoTokenPool.owner(), AaveV3Arbitrum.ACL_ADMIN); + + // CLL team transfers ownership of proxyPool and GHO token in TokenAdminRegistry + vm.prank(proxyPool.owner()); + proxyPool.transferOwnership(AaveV3Arbitrum.ACL_ADMIN); + vm.prank(TOKEN_ADMIN_REGISTRY.owner()); + TOKEN_ADMIN_REGISTRY.transferAdminRole(ARB_GHO_TOKEN, AaveV3Arbitrum.ACL_ADMIN); + + // new AIP to accept ownership + vm.startPrank(AaveV3Arbitrum.ACL_ADMIN); + proxyPool.acceptOwnership(); + TOKEN_ADMIN_REGISTRY.acceptAdminRole(ARB_GHO_TOKEN); + vm.stopPrank(); + + assertEq(proxyPool.owner(), AaveV3Arbitrum.ACL_ADMIN); + assertTrue(TOKEN_ADMIN_REGISTRY.isAdministrator(ARB_GHO_TOKEN, AaveV3Arbitrum.ACL_ADMIN)); + } + + function _mockCCIPMigration() private { + IRouter router = IRouter(ghoTokenPool.getRouter()); + + assertEq(TOKEN_ADMIN_REGISTRY.getPool(ARB_GHO_TOKEN), address(proxyPool)); + + assertEq(proxyPool.getRouter(), address(router)); + + assertTrue(proxyPool.isSupportedChain(ETH_CHAIN_SELECTOR)); + assertEq(proxyPool.getCurrentInboundRateLimiterState(ETH_CHAIN_SELECTOR), _getDisabledConfig()); + assertEq( + proxyPool.getCurrentOutboundRateLimiterState(ETH_CHAIN_SELECTOR), + _getDisabledConfig() + ); + assertEq(proxyPool.getRemotePool(ETH_CHAIN_SELECTOR), abi.encode(ETH_PROXY_POOL)); + assertEq(proxyPool.getRemoteToken(ETH_CHAIN_SELECTOR), abi.encode(GhoEthereum.GHO_TOKEN)); + + IRouter.OnRamp[] memory onRampUpdates = new IRouter.OnRamp[](1); + onRampUpdates[0] = IRouter.OnRamp({ + destChainSelector: ETH_CHAIN_SELECTOR, + onRamp: ON_RAMP_1_5 // new onRamp + }); + IRouter.OffRamp[] memory offRampUpdates = new IRouter.OffRamp[](1); + offRampUpdates[0] = IRouter.OffRamp({ + sourceChainSelector: ARB_CHAIN_SELECTOR, + offRamp: OFF_RAMP_1_5 // new offRamp + }); + + vm.prank(router.owner()); + router.applyRampUpdates(onRampUpdates, new IRouter.OffRamp[](0), offRampUpdates); + } + + function _getTokenMessage( + CCIPSendParams memory params + ) internal returns (IClient.EVM2AnyMessage memory, IInternal.EVM2EVMMessage memory) { + IClient.EVM2AnyMessage memory message = CCIPUtils.generateMessage(alice, 1); + message.tokenAmounts[0] = IClient.EVMTokenAmount({token: ARB_GHO_TOKEN, amount: params.amount}); + + uint256 feeAmount = params.router.getFee(ETH_CHAIN_SELECTOR, message); + deal(alice, feeAmount); + + IInternal.EVM2EVMMessage memory eventArg = CCIPUtils.messageToEvent( + CCIPUtils.MessageToEventParams({ + message: message, + router: params.router, + sourceChainSelector: ARB_CHAIN_SELECTOR, + feeTokenAmount: feeAmount, + originalSender: alice, + destinationToken: GhoEthereum.GHO_TOKEN, + migrated: params.migrated + }) + ); + + return (message, eventArg); + } + + function _getImplementation(address proxy) private view returns (address) { + bytes32 slot = bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1); + return address(uint160(uint256(vm.load(proxy, slot)))); + } + + function _readInitialized(address proxy) private view returns (uint8) { + /// slot 0 + // <1 byte ^ 1 byte ^ ---------- 20 bytes ----------> + // initialized initializing owner + return uint8(uint256(vm.load(proxy, bytes32(0)))); + } + + function _getFacilitatorLevel(address f) internal view returns (uint256) { + (, uint256 level) = IGhoToken(ARB_GHO_TOKEN).getFacilitatorBucket(f); + return level; + } + + function _getStaticParams() private view returns (bytes memory) { + return + abi.encode( + address(ghoTokenPool.getToken()), + ghoTokenPool.getAllowList(), + ghoTokenPool.getArmProxy(), + ghoTokenPool.getRouter() + ); + } + + function _getDynamicParams() private view returns (bytes memory) { + return + abi.encode( + ghoTokenPool.owner(), + ghoTokenPool.getSupportedChains(), + ghoTokenPool.getAllowListEnabled(), + ghoTokenPool.getRateLimitAdmin() + ); + } + + function _validateConstants() private view { + assertEq(TOKEN_ADMIN_REGISTRY.typeAndVersion(), 'TokenAdminRegistry 1.5.0'); + assertEq(proxyPool.typeAndVersion(), 'BurnMintTokenPoolAndProxy 1.5.0'); + assertEq(ITypeAndVersion(ON_RAMP_1_2).typeAndVersion(), 'EVM2EVMOnRamp 1.2.0'); + assertEq(ITypeAndVersion(ON_RAMP_1_5).typeAndVersion(), 'EVM2EVMOnRamp 1.5.0'); + assertEq(ITypeAndVersion(OFF_RAMP_1_2).typeAndVersion(), 'EVM2EVMOffRamp 1.2.0'); + assertEq(ITypeAndVersion(OFF_RAMP_1_5).typeAndVersion(), 'EVM2EVMOffRamp 1.5.0'); + + assertEq(GHO_CCIP_STEWARD.GHO_TOKEN(), ARB_GHO_TOKEN); + assertEq(GHO_CCIP_STEWARD.GHO_TOKEN_POOL(), address(ghoTokenPool)); + + assertEq(proxyPool.getPreviousPool(), address(ghoTokenPool)); + } + + function _getOutboundRefillTime(uint256 amount) private view returns (uint256) { + uint128 rate = _getRateLimiterConfig().rate; + assertNotEq(rate, 0); + return amount / uint256(rate) + 1; // account for rounding + } + + function _getInboundRefillTime(uint256 amount) private view returns (uint256) { + uint128 rate = _getRateLimiterConfig().rate; + assertNotEq(rate, 0); + return amount / uint256(rate) + 1; // account for rounding + } + + function _tokenBucketToConfig( + IRateLimiter.TokenBucket memory bucket + ) private pure returns (IRateLimiter.Config memory) { + return + IRateLimiter.Config({ + isEnabled: bucket.isEnabled, + capacity: bucket.capacity, + rate: bucket.rate + }); + } + + function _getDisabledConfig() private pure returns (IRateLimiter.Config memory) { + return IRateLimiter.Config({isEnabled: false, capacity: 0, rate: 0}); + } + + function assertEq( + IRateLimiter.TokenBucket memory bucket, + IRateLimiter.Config memory config + ) internal pure { + assertEq(abi.encode(_tokenBucketToConfig(bucket)), abi.encode(config)); + } + + function _getRateLimiterConfig() internal view returns (IRateLimiter.Config memory) { + return + IRateLimiter.Config({ + isEnabled: true, + capacity: proposal.CCIP_RATE_LIMIT_CAPACITY(), + rate: proposal.CCIP_RATE_LIMIT_REFILL_RATE() + }); + } +} diff --git a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3E2E_GHOCCIP150Upgrade_20241021.t.sol b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3E2E_GHOCCIP150Upgrade_20241021.t.sol new file mode 100644 index 000000000..59c873c3e --- /dev/null +++ b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3E2E_GHOCCIP150Upgrade_20241021.t.sol @@ -0,0 +1,875 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import 'forge-std/Test.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {GhoEthereum} from 'aave-address-book/GhoEthereum.sol'; +import {MiscArbitrum} from 'aave-address-book/MiscArbitrum.sol'; +import {GhoArbitrum} from 'aave-address-book/GhoArbitrum.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {IClient} from 'src/interfaces/ccip/IClient.sol'; +import {IInternal} from 'src/interfaces/ccip/IInternal.sol'; +import {IRouter} from 'src/interfaces/ccip/IRouter.sol'; +import {IEVM2EVMOnRamp} from 'src/interfaces/ccip/IEVM2EVMOnRamp.sol'; +import {ITypeAndVersion} from 'src/interfaces/ccip/ITypeAndVersion.sol'; +import {IProxyPool} from 'src/interfaces/ccip/IProxyPool.sol'; +import {IRateLimiter} from 'src/interfaces/ccip/IRateLimiter.sol'; +import {IEVM2EVMOffRamp_1_2, IEVM2EVMOffRamp_1_5} from 'src/interfaces/ccip/IEVM2EVMOffRamp.sol'; +import {ITokenAdminRegistry} from 'src/interfaces/ccip/ITokenAdminRegistry.sol'; +import {IUpgradeableBurnMintTokenPool} from 'src/interfaces/ccip/IUpgradeableBurnMintTokenPool.sol'; +import {IUpgradeableLockReleaseTokenPool} from 'src/interfaces/ccip/IUpgradeableLockReleaseTokenPool.sol'; +import {CCIPUtils} from './utils/CCIPUtils.sol'; +import {AaveV3Ethereum_GHOCCIP150Upgrade_20241021} from './AaveV3Ethereum_GHOCCIP150Upgrade_20241021.sol'; +import {AaveV3Arbitrum_GHOCCIP150Upgrade_20241021} from './AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.sol'; + +/** + * @dev Test for AaveV3E2E_GHOCCIP150Upgrade_20241021 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241021_Multi_GHOCCIP150Upgrade/AaveV3E2E_GHOCCIP150Upgrade_20241021.t.sol -vv + */ +contract AaveV3E2E_GHOCCIP150Upgrade_20241021_Base is ProtocolV3TestBase { + struct CCIPSendParams { + IRouter router; + IERC20 token; + uint256 amount; + uint64 sourceChainSelector; + uint64 destinationChainSelector; + address sender; + bool migrated; + } + + struct Common { + IRouter router; + IERC20 token; + IEVM2EVMOnRamp EVM2EVMOnRamp1_2; + IEVM2EVMOnRamp EVM2EVMOnRamp1_5; + IEVM2EVMOffRamp_1_2 EVM2EVMOffRamp1_2; + IEVM2EVMOffRamp_1_5 EVM2EVMOffRamp1_5; + ITokenAdminRegistry tokenAdminRegistry; + IProxyPool proxyPool; + uint64 chainSelector; + uint256 forkId; + } + + struct L1 { + AaveV3Ethereum_GHOCCIP150Upgrade_20241021 proposal; + IUpgradeableLockReleaseTokenPool tokenPool; + IRateLimiter.Config rateLimitConfig; + Common c; + } + + struct L2 { + AaveV3Arbitrum_GHOCCIP150Upgrade_20241021 proposal; + IUpgradeableBurnMintTokenPool tokenPool; + IRateLimiter.Config rateLimitConfig; + Common c; + } + + L1 internal l1; + L2 internal l2; + address internal alice = makeAddr('alice'); + + event CCIPSendRequested(IInternal.EVM2EVMMessage message); + event Locked(address indexed sender, uint256 amount); + event Burned(address indexed sender, uint256 amount); + event Released(address indexed sender, address indexed recipient, uint256 amount); + event Minted(address indexed sender, address indexed recipient, uint256 amount); + + error CallerIsNotARampOnRouter(address caller); + error NotACompatiblePool(address pool); + + function setUp() public virtual { + l1.c.forkId = vm.createFork(vm.rpcUrl('mainnet'), 21131872); + l2.c.forkId = vm.createFork(vm.rpcUrl('arbitrum'), 271788784); + + vm.selectFork(l1.c.forkId); + l1.proposal = new AaveV3Ethereum_GHOCCIP150Upgrade_20241021(); + l1.c.proxyPool = IProxyPool(l1.proposal.GHO_CCIP_PROXY_POOL()); + l1.tokenPool = IUpgradeableLockReleaseTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL); + l1.rateLimitConfig = IRateLimiter.Config({ + isEnabled: true, + capacity: l1.proposal.CCIP_RATE_LIMIT_CAPACITY(), + rate: l1.proposal.CCIP_RATE_LIMIT_REFILL_RATE() + }); + l1.c.router = IRouter(l1.tokenPool.getRouter()); + l2.c.chainSelector = l1.tokenPool.getSupportedChains()[0]; + l1.c.token = IERC20(address(l1.tokenPool.getToken())); + l1.c.EVM2EVMOnRamp1_2 = IEVM2EVMOnRamp(l1.c.router.getOnRamp(l2.c.chainSelector)); + l1.c.EVM2EVMOnRamp1_5 = IEVM2EVMOnRamp(0x69eCC4E2D8ea56E2d0a05bF57f4Fd6aEE7f2c284); // new onramp + l1.c.EVM2EVMOffRamp1_2 = IEVM2EVMOffRamp_1_2(0xeFC4a18af59398FF23bfe7325F2401aD44286F4d); + l1.c.EVM2EVMOffRamp1_5 = IEVM2EVMOffRamp_1_5(0xdf615eF8D4C64d0ED8Fd7824BBEd2f6a10245aC9); // new offramp + l1.c.tokenAdminRegistry = ITokenAdminRegistry(0xb22764f98dD05c789929716D677382Df22C05Cb6); + + vm.selectFork(l2.c.forkId); + l2.proposal = new AaveV3Arbitrum_GHOCCIP150Upgrade_20241021(); + l2.c.proxyPool = IProxyPool(l2.proposal.GHO_CCIP_PROXY_POOL()); + l2.tokenPool = IUpgradeableBurnMintTokenPool(GhoArbitrum.GHO_CCIP_TOKEN_POOL); + l2.rateLimitConfig = IRateLimiter.Config({ + isEnabled: true, + capacity: l2.proposal.CCIP_RATE_LIMIT_CAPACITY(), + rate: l2.proposal.CCIP_RATE_LIMIT_REFILL_RATE() + }); + l2.c.router = IRouter(l2.tokenPool.getRouter()); + l1.c.chainSelector = l2.tokenPool.getSupportedChains()[0]; + l2.c.token = IERC20(address(l2.tokenPool.getToken())); + l2.c.EVM2EVMOnRamp1_2 = IEVM2EVMOnRamp(l2.c.router.getOnRamp(l1.c.chainSelector)); + l2.c.EVM2EVMOnRamp1_5 = IEVM2EVMOnRamp(0x67761742ac8A21Ec4D76CA18cbd701e5A6F3Bef3); // new onramp + l2.c.EVM2EVMOffRamp1_2 = IEVM2EVMOffRamp_1_2(0x542ba1902044069330e8c5b36A84EC503863722f); + l2.c.EVM2EVMOffRamp1_5 = IEVM2EVMOffRamp_1_5(0x91e46cc5590A4B9182e47f40006140A7077Dec31); // new offramp + l2.c.tokenAdminRegistry = ITokenAdminRegistry(0x39AE1032cF4B334a1Ed41cdD0833bdD7c7E7751E); + + _validateConfig({migrated: false}); + } + + function _getTokenMessage( + CCIPSendParams memory params + ) internal returns (IClient.EVM2AnyMessage memory, IInternal.EVM2EVMMessage memory) { + IClient.EVM2AnyMessage memory message = CCIPUtils.generateMessage(params.sender, 1); + message.tokenAmounts[0] = IClient.EVMTokenAmount({ + token: address(params.token), + amount: params.amount + }); + + uint256 feeAmount = params.router.getFee(params.destinationChainSelector, message); + deal(params.sender, feeAmount); + + IInternal.EVM2EVMMessage memory eventArg = CCIPUtils.messageToEvent( + CCIPUtils.MessageToEventParams({ + message: message, + router: params.router, + sourceChainSelector: params.sourceChainSelector, + feeTokenAmount: feeAmount, + originalSender: params.sender, + destinationToken: address(params.token == l1.c.token ? l2.c.token : l1.c.token), + migrated: params.migrated + }) + ); + + return (message, eventArg); + } + + function _validateConfig(bool migrated) internal { + vm.selectFork(l1.c.forkId); + assertEq(l1.c.chainSelector, 5009297550715157269); + assertEq(address(l1.c.token), GhoEthereum.GHO_TOKEN); + assertEq(ITypeAndVersion(address(l1.c.router)).typeAndVersion(), 'Router 1.2.0'); + assertEq( + ITypeAndVersion(address(l1.c.EVM2EVMOnRamp1_2)).typeAndVersion(), + 'EVM2EVMOnRamp 1.2.0' + ); + assertEq( + ITypeAndVersion(address(l1.c.EVM2EVMOnRamp1_5)).typeAndVersion(), + 'EVM2EVMOnRamp 1.5.0' + ); + assertEq( + ITypeAndVersion(address(l1.c.EVM2EVMOffRamp1_2)).typeAndVersion(), + 'EVM2EVMOffRamp 1.2.0' + ); + assertEq( + ITypeAndVersion(address(l1.c.EVM2EVMOffRamp1_5)).typeAndVersion(), + 'EVM2EVMOffRamp 1.5.0' + ); + assertEq(l1.c.proxyPool.typeAndVersion(), 'LockReleaseTokenPoolAndProxy 1.5.0'); + assertEq(l1.tokenPool.typeAndVersion(), 'LockReleaseTokenPool 1.4.0'); + assertEq(l1.c.tokenAdminRegistry.typeAndVersion(), 'TokenAdminRegistry 1.5.0'); + assertTrue(l1.c.router.isOffRamp(l2.c.chainSelector, address(l1.c.EVM2EVMOffRamp1_2))); + assertTrue(l1.c.router.isOffRamp(l2.c.chainSelector, address(l1.c.EVM2EVMOffRamp1_5))); + + // ensure only 1.2 & 1.5 offRamps are configured + IRouter.OffRamp[] memory offRamps = l1.c.router.getOffRamps(); + for (uint256 i; i < offRamps.length; ++i) { + if (offRamps[i].sourceChainSelector == l2.c.chainSelector) { + assertTrue( + offRamps[i].offRamp == address(l1.c.EVM2EVMOffRamp1_2) || + offRamps[i].offRamp == address(l1.c.EVM2EVMOffRamp1_5) + ); + } + } + + if (migrated) { + assertEq(l1.c.router.getOnRamp(l2.c.chainSelector), address(l1.c.EVM2EVMOnRamp1_5)); + } else { + assertEq(l1.c.router.getOnRamp(l2.c.chainSelector), address(l1.c.EVM2EVMOnRamp1_2)); + } + + vm.selectFork(l2.c.forkId); + assertEq(l2.c.chainSelector, 4949039107694359620); + assertEq(address(l2.c.token), 0x7dfF72693f6A4149b17e7C6314655f6A9F7c8B33); + assertEq(ITypeAndVersion(address(l2.c.router)).typeAndVersion(), 'Router 1.2.0'); + assertEq( + ITypeAndVersion(address(l2.c.EVM2EVMOnRamp1_2)).typeAndVersion(), + 'EVM2EVMOnRamp 1.2.0' + ); + assertEq( + ITypeAndVersion(address(l2.c.EVM2EVMOnRamp1_5)).typeAndVersion(), + 'EVM2EVMOnRamp 1.5.0' + ); + assertEq( + ITypeAndVersion(address(l2.c.EVM2EVMOffRamp1_2)).typeAndVersion(), + 'EVM2EVMOffRamp 1.2.0' + ); + assertEq( + ITypeAndVersion(address(l2.c.EVM2EVMOffRamp1_5)).typeAndVersion(), + 'EVM2EVMOffRamp 1.5.0' + ); + assertEq(l2.c.proxyPool.typeAndVersion(), 'BurnMintTokenPoolAndProxy 1.5.0'); + assertEq(l2.tokenPool.typeAndVersion(), 'BurnMintTokenPool 1.4.0'); + assertEq(l2.c.tokenAdminRegistry.typeAndVersion(), 'TokenAdminRegistry 1.5.0'); + assertTrue(l2.c.router.isOffRamp(l1.c.chainSelector, address(l2.c.EVM2EVMOffRamp1_2))); + assertTrue(l2.c.router.isOffRamp(l1.c.chainSelector, address(l2.c.EVM2EVMOffRamp1_5))); + + // ensure only 1.2 & 1.5 offRamps are configured + offRamps = l2.c.router.getOffRamps(); + for (uint256 i; i < offRamps.length; ++i) { + if (offRamps[i].sourceChainSelector == l1.c.chainSelector) { + assertTrue( + offRamps[i].offRamp == address(l2.c.EVM2EVMOffRamp1_2) || + offRamps[i].offRamp == address(l2.c.EVM2EVMOffRamp1_5) + ); + } + } + + if (migrated) { + assertEq(l2.c.router.getOnRamp(l1.c.chainSelector), address(l2.c.EVM2EVMOnRamp1_5)); + } else { + assertEq(l2.c.router.getOnRamp(l1.c.chainSelector), address(l2.c.EVM2EVMOnRamp1_2)); + } + } + + function _mockCCIPMigration(Common memory src, Common memory dest) internal { + vm.selectFork(src.forkId); + assertEq(src.tokenAdminRegistry.getPool(address(src.token)), address(src.proxyPool)); + assertEq(src.proxyPool.getRouter(), address(src.router)); + assertTrue(src.proxyPool.isSupportedChain(dest.chainSelector)); + assertEq( + src.proxyPool.getCurrentInboundRateLimiterState(dest.chainSelector), + _getDisabledConfig() + ); + assertEq( + src.proxyPool.getCurrentOutboundRateLimiterState(dest.chainSelector), + _getDisabledConfig() + ); + assertEq(src.proxyPool.getRemotePool(dest.chainSelector), abi.encode(dest.proxyPool)); + assertEq(src.proxyPool.getRemoteToken(dest.chainSelector), abi.encode(dest.token)); + + IRouter.OnRamp[] memory onRampUpdates = new IRouter.OnRamp[](1); + onRampUpdates[0] = IRouter.OnRamp({ + destChainSelector: dest.chainSelector, + onRamp: address(src.EVM2EVMOnRamp1_5) // new onRamp + }); + IRouter.OffRamp[] memory offRampUpdates = new IRouter.OffRamp[](1); + offRampUpdates[0] = IRouter.OffRamp({ + sourceChainSelector: dest.chainSelector, + offRamp: address(src.EVM2EVMOffRamp1_5) // new offRamp + }); + + vm.prank(src.router.owner()); + src.router.applyRampUpdates(onRampUpdates, new IRouter.OffRamp[](0), offRampUpdates); + } + + function _getDisabledConfig() private pure returns (IRateLimiter.Config memory) { + return IRateLimiter.Config({isEnabled: false, capacity: 0, rate: 0}); + } + + function _tokenBucketToConfig( + IRateLimiter.TokenBucket memory bucket + ) private pure returns (IRateLimiter.Config memory) { + return + IRateLimiter.Config({ + isEnabled: bucket.isEnabled, + capacity: bucket.capacity, + rate: bucket.rate + }); + } + + function assertEq( + IRateLimiter.TokenBucket memory bucket, + IRateLimiter.Config memory config + ) internal pure { + assertEq(abi.encode(_tokenBucketToConfig(bucket)), abi.encode(config)); + } +} + +contract AaveV3E2E_GHOCCIP150Upgrade_20241021_PreCCIPMigration is + AaveV3E2E_GHOCCIP150Upgrade_20241021_Base +{ + function setUp() public override { + super.setUp(); + + vm.selectFork(l1.c.forkId); + executePayload(vm, address(l1.proposal)); + vm.selectFork(l2.c.forkId); + executePayload(vm, address(l2.proposal)); + + _validateConfig({migrated: false}); + } + + function test_E2E() public { + uint256 amount = l1.rateLimitConfig.capacity; + // ETH (=> ARB) sendMessage + { + vm.selectFork(l1.c.forkId); + deal(address(l1.c.token), alice, amount, true); + vm.prank(alice); + l1.c.token.approve(address(l1.c.router), amount); + + uint128 outBoundRate = l1.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(outBoundRate) + 1); // rate is non zero + + uint256 tokenPoolBalance = l1.c.token.balanceOf(address(l1.tokenPool)); + uint256 bridgedAmount = l1.tokenPool.getCurrentBridgedAmount(); + + ( + IClient.EVM2AnyMessage memory message, + IInternal.EVM2EVMMessage memory eventArg + ) = _getTokenMessage( + CCIPSendParams({ + router: l1.c.router, + token: l1.c.token, + amount: amount, + sourceChainSelector: l1.c.chainSelector, + destinationChainSelector: l2.c.chainSelector, + sender: alice, + migrated: false + }) + ); + + vm.expectEmit(address(l1.tokenPool)); + emit Locked(address(l1.c.EVM2EVMOnRamp1_2), amount); + vm.expectEmit(address(l1.c.EVM2EVMOnRamp1_2)); + emit CCIPSendRequested(eventArg); + vm.prank(alice); + l1.c.router.ccipSend{value: eventArg.feeTokenAmount}(l2.c.chainSelector, message); + + assertEq(l1.c.token.balanceOf(address(l1.tokenPool)), tokenPoolBalance + amount); + assertEq(l1.tokenPool.getCurrentBridgedAmount(), bridgedAmount + amount); + + // ARB executeMessage + vm.selectFork(l2.c.forkId); + + uint256 aliceBalanceBefore = l2.c.token.balanceOf(alice); + + uint128 inBoundRate = l2.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(inBoundRate) + 1); // rate is non zero + + vm.expectEmit(address(l2.tokenPool)); + emit Minted(address(l2.c.EVM2EVMOffRamp1_2), alice, amount); + vm.prank(address(l2.c.EVM2EVMOffRamp1_2)); + l2.c.EVM2EVMOffRamp1_2.executeSingleMessage( + eventArg, + new bytes[](message.tokenAmounts.length) + ); + + assertEq(l2.c.token.balanceOf(alice), aliceBalanceBefore + amount); + } + + // ARB (=> ETH) sendMessage + { + vm.selectFork(l2.c.forkId); + + vm.prank(alice); + l2.c.token.approve(address(l2.c.router), amount); + uint128 outBoundRate = l2.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(outBoundRate) + 1); // rate is non zero + + ( + IClient.EVM2AnyMessage memory message, + IInternal.EVM2EVMMessage memory eventArg + ) = _getTokenMessage( + CCIPSendParams({ + router: l2.c.router, + token: l2.c.token, + amount: amount, + sourceChainSelector: l2.c.chainSelector, + destinationChainSelector: l1.c.chainSelector, + sender: alice, + migrated: false + }) + ); + + vm.expectEmit(address(l2.tokenPool)); + emit Burned(address(l2.c.EVM2EVMOnRamp1_2), amount); + vm.expectEmit(address(l2.c.EVM2EVMOnRamp1_2)); + emit CCIPSendRequested(eventArg); + vm.prank(alice); + l2.c.router.ccipSend{value: eventArg.feeTokenAmount}(l1.c.chainSelector, message); + + assertEq(l2.c.token.balanceOf(alice), 0); + + // ETH executeMessage + vm.selectFork(l1.c.forkId); + + uint256 tokenPoolBalanceBefore = l1.c.token.balanceOf(address(l1.tokenPool)); + + uint128 inBoundRate = l1.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(inBoundRate) + 1); // rate is non zero + + vm.expectEmit(address(l1.tokenPool)); + emit Released(address(l1.c.EVM2EVMOffRamp1_2), alice, amount); + vm.prank(address(l1.c.EVM2EVMOffRamp1_2)); + l1.c.EVM2EVMOffRamp1_2.executeSingleMessage( + eventArg, + new bytes[](message.tokenAmounts.length) + ); + + assertEq(l1.c.token.balanceOf(address(l1.tokenPool)), tokenPoolBalanceBefore - amount); + assertEq(l1.c.token.balanceOf(alice), amount); + } + } +} + +contract AaveV3E2E_GHOCCIP150Upgrade_20241021_PostCCIPMigration is + AaveV3E2E_GHOCCIP150Upgrade_20241021_Base +{ + function setUp() public override { + super.setUp(); + + // execute proposal + vm.selectFork(l1.c.forkId); + executePayload(vm, address(l1.proposal)); + vm.selectFork(l2.c.forkId); + executePayload(vm, address(l2.proposal)); + + _mockCCIPMigration(l1.c, l2.c); + _mockCCIPMigration(l2.c, l1.c); + + _validateConfig({migrated: true}); + } + + function test_E2E() public { + uint256 amount = l1.rateLimitConfig.capacity; + // ETH (=> ARB) sendMessage + { + vm.selectFork(l1.c.forkId); + deal(address(l1.c.token), alice, amount, true); + vm.prank(alice); + l1.c.token.approve(address(l1.c.router), amount); + + uint128 outBoundRate = l1.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(outBoundRate) + 1); // rate is non zero + + uint256 tokenPoolBalance = l1.c.token.balanceOf(address(l1.tokenPool)); + uint256 bridgedAmount = l1.tokenPool.getCurrentBridgedAmount(); + + ( + IClient.EVM2AnyMessage memory message, + IInternal.EVM2EVMMessage memory eventArg + ) = _getTokenMessage( + CCIPSendParams({ + router: l1.c.router, + token: l1.c.token, + amount: amount, + sourceChainSelector: l1.c.chainSelector, + destinationChainSelector: l2.c.chainSelector, + sender: alice, + migrated: true + }) + ); + + /// expected flow: router => onRamp => proxyPool => tokenPool + vm.expectEmit(address(l1.tokenPool)); + emit Locked(address(l1.c.proxyPool), amount); + + vm.expectEmit(address(l1.c.proxyPool)); + emit Locked(address(l1.c.EVM2EVMOnRamp1_5), amount); + + vm.expectEmit(address(l1.c.EVM2EVMOnRamp1_5)); // @dev caller is now 1.5 onRamp + emit CCIPSendRequested(eventArg); + vm.prank(alice); + l1.c.router.ccipSend{value: eventArg.feeTokenAmount}(l2.c.chainSelector, message); + + assertEq(l1.c.token.balanceOf(address(l1.tokenPool)), tokenPoolBalance + amount); + assertEq(l1.tokenPool.getCurrentBridgedAmount(), bridgedAmount + amount); + + // ARB executeMessage + vm.selectFork(l2.c.forkId); + + uint128 inBoundRate = l2.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(inBoundRate) + 1); // rate is non zero + + vm.expectEmit(address(l2.tokenPool)); + emit Minted(address(l2.c.EVM2EVMOffRamp1_2), alice, amount); + vm.prank(address(l2.c.EVM2EVMOffRamp1_2)); + l2.c.EVM2EVMOffRamp1_2.executeSingleMessage( + eventArg, + new bytes[](message.tokenAmounts.length) + ); + + // wait for the rate limiter to refill + skip(amount / uint256(inBoundRate) + 1); // rate is non zero + + vm.expectEmit(address(l2.c.proxyPool)); // emitter is proxyPool for 1.5 on ramp + emit Minted(address(l2.c.EVM2EVMOffRamp1_5), alice, amount); + vm.prank(address(l2.c.EVM2EVMOffRamp1_5)); + l2.c.EVM2EVMOffRamp1_5.executeSingleMessage( + eventArg, + new bytes[](message.tokenAmounts.length), + new uint32[](1) // tokenGasOverrides + ); + } + + // ARB (=> ETH) sendMessage + { + vm.selectFork(l2.c.forkId); + + vm.prank(alice); + l2.c.token.approve(address(l2.c.router), amount); + uint128 outBoundRate = l2.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(outBoundRate) + 1); // rate is non zero + + ( + IClient.EVM2AnyMessage memory message, + IInternal.EVM2EVMMessage memory eventArg + ) = _getTokenMessage( + CCIPSendParams({ + router: l2.c.router, + token: l2.c.token, + amount: amount, + sourceChainSelector: l2.c.chainSelector, + destinationChainSelector: l1.c.chainSelector, + sender: alice, + migrated: true + }) + ); + + /// expected flow: router => onRamp => proxyPool => tokenPool + vm.expectEmit(address(l2.tokenPool)); + emit Burned(address(l2.c.proxyPool), amount); // @dev caller is now 1.5 onRamp + + vm.expectEmit(address(l2.c.proxyPool)); + emit Burned(address(l2.c.EVM2EVMOnRamp1_5), amount); // @dev caller is now 1.5 onRamp + + vm.expectEmit(address(l2.c.EVM2EVMOnRamp1_5)); + emit CCIPSendRequested(eventArg); + vm.prank(alice); + l2.c.router.ccipSend{value: eventArg.feeTokenAmount}(l1.c.chainSelector, message); + + // ETH executeMessage + vm.selectFork(l1.c.forkId); + + uint256 tokenPoolBalanceBefore = l1.c.token.balanceOf(address(l1.tokenPool)); + + uint128 inBoundRate = l1.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(inBoundRate) + 1); // rate is non zero + + vm.expectEmit(address(l1.c.proxyPool)); // emitter is proxyPool for 1.5 off ramp + emit Released(address(l1.c.EVM2EVMOffRamp1_5), alice, amount); + vm.prank(address(l1.c.EVM2EVMOffRamp1_5)); + l1.c.EVM2EVMOffRamp1_5.executeSingleMessage( + eventArg, + new bytes[](message.tokenAmounts.length), + new uint32[](1) // tokenGasOverrides + ); + + assertEq(l1.c.token.balanceOf(address(l1.tokenPool)), tokenPoolBalanceBefore - amount); + assertEq(l1.c.token.balanceOf(alice), amount); + } + } + + function test_SendRevertsWithoutUpgrade() public { + { + vm.selectFork(l1.c.forkId); + uint256 amount = l1.rateLimitConfig.capacity; + deal(address(l1.c.token), alice, amount, true); + vm.prank(alice); + l1.c.token.approve(address(l1.c.router), amount); + uint128 rate = l1.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(rate) + 1); // rate is non zero + + ( + IClient.EVM2AnyMessage memory message, + IInternal.EVM2EVMMessage memory eventArg + ) = _getTokenMessage( + CCIPSendParams({ + router: l1.c.router, + token: l1.c.token, + amount: amount, + sourceChainSelector: l1.c.chainSelector, + destinationChainSelector: l2.c.chainSelector, + sender: alice, + migrated: true + }) + ); + + // mock undo upgrade by setting proxy pool to random address + vm.prank(l1.tokenPool.owner()); + l1.tokenPool.setProxyPool(address(1337)); + + vm.expectRevert(abi.encodeWithSelector(CallerIsNotARampOnRouter.selector, l1.c.proxyPool)); + vm.prank(alice); + l1.c.router.ccipSend{value: eventArg.feeTokenAmount}(l2.c.chainSelector, message); + } + + { + vm.selectFork(l2.c.forkId); + uint256 amount = l1.rateLimitConfig.capacity; + deal(address(l2.c.token), alice, amount, true); + vm.prank(alice); + l2.c.token.approve(address(l2.c.router), amount); + uint128 rate = l2.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(rate) + 1); // rate is non zero + + ( + IClient.EVM2AnyMessage memory message, + IInternal.EVM2EVMMessage memory eventArg + ) = _getTokenMessage( + CCIPSendParams({ + router: l2.c.router, + token: l2.c.token, + amount: amount, + sourceChainSelector: l2.c.chainSelector, + destinationChainSelector: l1.c.chainSelector, + sender: alice, + migrated: true + }) + ); + + // mock undo upgrade by setting proxy pool to random address + vm.prank(l2.tokenPool.owner()); + l2.tokenPool.setProxyPool(address(1337)); + + vm.expectRevert(abi.encodeWithSelector(CallerIsNotARampOnRouter.selector, l2.c.proxyPool)); + vm.prank(alice); + l2.c.router.ccipSend{value: eventArg.feeTokenAmount}(l1.c.chainSelector, message); + } + } + + function test_ExecuteRevertsWithoutUpgrade() public { + { + vm.selectFork(l1.c.forkId); + uint256 amount = l1.rateLimitConfig.capacity; + deal(address(l1.c.token), alice, amount, true); + vm.prank(alice); + l1.c.token.approve(address(l1.c.router), amount); + + uint128 inBoundRate = l1.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(inBoundRate) + 1); // rate is non zero + + ( + IClient.EVM2AnyMessage memory message, + IInternal.EVM2EVMMessage memory eventArg + ) = _getTokenMessage( + CCIPSendParams({ + router: l1.c.router, + token: l1.c.token, + amount: amount, + sourceChainSelector: l1.c.chainSelector, + destinationChainSelector: l2.c.chainSelector, + sender: alice, + migrated: true + }) + ); + + // mock undo upgrade by setting proxy pool to random address + vm.prank(l1.tokenPool.owner()); + l1.tokenPool.setProxyPool(address(1337)); + + vm.expectRevert(abi.encodeWithSelector(NotACompatiblePool.selector, address(0))); + vm.prank(address(l1.c.EVM2EVMOffRamp1_5)); + l1.c.EVM2EVMOffRamp1_5.executeSingleMessage( + eventArg, + new bytes[](message.tokenAmounts.length), + new uint32[](1) // tokenGasOverrides + ); + } + + { + vm.selectFork(l2.c.forkId); + uint256 amount = l1.rateLimitConfig.capacity; + deal(address(l2.c.token), alice, amount, true); + vm.prank(alice); + l2.c.token.approve(address(l2.c.router), amount); + + uint128 inBoundRate = l2.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(inBoundRate) + 1); // rate is non zero + + ( + IClient.EVM2AnyMessage memory message, + IInternal.EVM2EVMMessage memory eventArg + ) = _getTokenMessage( + CCIPSendParams({ + router: l2.c.router, + token: l2.c.token, + amount: amount, + sourceChainSelector: l2.c.chainSelector, + destinationChainSelector: l1.c.chainSelector, + sender: alice, + migrated: true + }) + ); + + // mock undo upgrade by setting proxy pool to random address + vm.prank(l2.tokenPool.owner()); + l2.tokenPool.setProxyPool(address(1337)); + + vm.expectRevert(abi.encodeWithSelector(NotACompatiblePool.selector, address(0))); + vm.prank(address(l2.c.EVM2EVMOffRamp1_5)); + l2.c.EVM2EVMOffRamp1_5.executeSingleMessage( + eventArg, + new bytes[](message.tokenAmounts.length), + new uint32[](1) // tokenGasOverrides + ); + } + } +} + +// sendMsg => CCIP Migration => executeMsg +contract AaveV3E2E_GHOCCIP150Upgrade_20241021_InFlightCCIPMigration is + AaveV3E2E_GHOCCIP150Upgrade_20241021_Base +{ + function setUp() public override { + super.setUp(); + + // execute proposal + vm.selectFork(l1.c.forkId); + executePayload(vm, address(l1.proposal)); + vm.selectFork(l2.c.forkId); + executePayload(vm, address(l2.proposal)); + + _validateConfig({migrated: false}); + } + + function test_SendFlowInFlightCCIPMigrationFromEth() public { + // ETH => ARB, ccipSend 1.4; CCIP migration, Destination executeMessage + { + vm.selectFork(l1.c.forkId); + uint256 amount = l1.rateLimitConfig.capacity; + deal(address(l1.c.token), alice, amount, true); + vm.prank(alice); + l1.c.token.approve(address(l1.c.router), amount); + uint128 rate = l1.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(rate) + 1); // rate is non zero + + ( + IClient.EVM2AnyMessage memory message, + IInternal.EVM2EVMMessage memory eventArg + ) = _getTokenMessage( + CCIPSendParams({ + router: l1.c.router, + token: l1.c.token, + amount: amount, + sourceChainSelector: l1.c.chainSelector, + destinationChainSelector: l2.c.chainSelector, + sender: alice, + migrated: false + }) + ); + + vm.expectEmit(address(l1.tokenPool)); + emit Locked(address(l1.c.EVM2EVMOnRamp1_2), amount); + vm.expectEmit(address(l1.c.EVM2EVMOnRamp1_2)); + emit CCIPSendRequested(eventArg); + vm.prank(alice); + l1.c.router.ccipSend{value: eventArg.feeTokenAmount}(l2.c.chainSelector, message); + + assertEq(l1.c.token.balanceOf(alice), 0); + + // CCIP Migration + _mockCCIPMigration(l1.c, l2.c); + _mockCCIPMigration(l2.c, l1.c); + + vm.selectFork(l2.c.forkId); + + uint128 inBoundRate = l2.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(inBoundRate) + 1); // rate is non zero + + // reverts with 1.5 off ramp because eventArg is in CCIP 1.4 message format + vm.expectRevert(); + vm.prank(address(l2.c.EVM2EVMOffRamp1_5)); + l2.c.EVM2EVMOffRamp1_5.executeSingleMessage( + eventArg, + new bytes[](message.tokenAmounts.length), + new uint32[](0) // tokenGasOverrides + ); + + // system can use legacy 1.2 off ramp after migration + vm.expectEmit(address(l2.tokenPool)); + emit Minted(address(l2.c.EVM2EVMOffRamp1_2), alice, amount); + vm.prank(address(l2.c.EVM2EVMOffRamp1_2)); + l2.c.EVM2EVMOffRamp1_2.executeSingleMessage( + eventArg, + new bytes[](message.tokenAmounts.length) + ); + } + } + + function test_SendFlowInFlightCCIPMigrationFromArb() public { + // ARB => ETH, ccipSend 1.4; CCIP migration, Destination executeMessage + { + vm.selectFork(l2.c.forkId); + uint256 amount = l1.rateLimitConfig.capacity; + deal(address(l2.c.token), alice, amount, true); + vm.prank(alice); + l2.c.token.approve(address(l2.c.router), amount); + uint128 outBoundRate = l2.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(outBoundRate) + 1); // rate is non zero + + ( + IClient.EVM2AnyMessage memory message, + IInternal.EVM2EVMMessage memory eventArg + ) = _getTokenMessage( + CCIPSendParams({ + router: l2.c.router, + token: l2.c.token, + amount: amount, + sourceChainSelector: l2.c.chainSelector, + destinationChainSelector: l1.c.chainSelector, + sender: alice, + migrated: false + }) + ); + + vm.expectEmit(address(l2.tokenPool)); + emit Burned(address(l2.c.EVM2EVMOnRamp1_2), amount); + vm.expectEmit(address(l2.c.EVM2EVMOnRamp1_2)); + emit CCIPSendRequested(eventArg); + vm.prank(alice); + l2.c.router.ccipSend{value: eventArg.feeTokenAmount}(l1.c.chainSelector, message); + + assertEq(l2.c.token.balanceOf(alice), 0); + + // CCIP Migration + _mockCCIPMigration(l1.c, l2.c); + _mockCCIPMigration(l2.c, l1.c); + + vm.selectFork(l1.c.forkId); + + uint128 inBoundRate = l1.rateLimitConfig.rate; + // wait for the rate limiter to refill + skip(amount / uint256(inBoundRate) + 1); // rate is non zero + + // reverts with 1.5 off ramp + vm.expectRevert(); + vm.prank(address(l1.c.EVM2EVMOffRamp1_5)); + l1.c.EVM2EVMOffRamp1_5.executeSingleMessage( + eventArg, + new bytes[](message.tokenAmounts.length), + new uint32[](0) // tokenGasOverrides + ); + + // system can use legacy 1.2 off ramp after migration + vm.expectEmit(address(l1.tokenPool)); + emit Released(address(l1.c.EVM2EVMOffRamp1_2), alice, amount); + vm.prank(address(l1.c.EVM2EVMOffRamp1_2)); + l1.c.EVM2EVMOffRamp1_2.executeSingleMessage( + eventArg, + new bytes[](message.tokenAmounts.length) + ); + } + } +} diff --git a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.sol b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.sol new file mode 100644 index 000000000..ec06e5402 --- /dev/null +++ b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {ITransparentUpgradeableProxy} from 'solidity-utils/contracts/transparent-proxy/TransparentUpgradeableProxy.sol'; +import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {GhoEthereum} from 'aave-address-book/GhoEthereum.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {IUpgradeableLockReleaseTokenPool} from 'src/interfaces/ccip/IUpgradeableLockReleaseTokenPool.sol'; +import {IRateLimiter} from 'src/interfaces/ccip/IRateLimiter.sol'; +import {ILegacyProxyAdmin} from '../interfaces/ILegacyProxyAdmin.sol'; + +/** + * @title GHO CCIP 1.50 Upgrade + * @author Aave Labs + * - Discussion: https://governance.aave.com/t/bgd-technical-maintenance-proposals/15274/51 + */ +contract AaveV3Ethereum_GHOCCIP150Upgrade_20241021 is IProposalGenericExecutor { + uint64 public constant ARB_CHAIN_SELECTOR = 4949039107694359620; + + // https://etherscan.io/address/0xb77E872A68C62CfC0dFb02C067Ecc3DA23B4bbf3 + address public constant TOKEN_POOL_IMPL = 0xb77E872A68C62CfC0dFb02C067Ecc3DA23B4bbf3; + // https://etherscan.io/address/0x9Ec9F9804733df96D1641666818eFb5198eC50f0 + address public constant GHO_CCIP_PROXY_POOL = 0x9Ec9F9804733df96D1641666818eFb5198eC50f0; + + /// @dev Token Rate Limit Capacity: 300_000 GHO + uint128 public constant CCIP_RATE_LIMIT_CAPACITY = 300_000e18; + + /// @dev Token Rate Limit Refill Rate: 60 GHO per second (=> 216_000 GHO per hour) + uint128 public constant CCIP_RATE_LIMIT_REFILL_RATE = 60e18; + + function execute() external { + IUpgradeableLockReleaseTokenPool tokenPoolProxy = IUpgradeableLockReleaseTokenPool( + GhoEthereum.GHO_CCIP_TOKEN_POOL + ); + + ILegacyProxyAdmin(MiscEthereum.PROXY_ADMIN).upgrade( + ITransparentUpgradeableProxy(address(tokenPoolProxy)), + TOKEN_POOL_IMPL + ); + + // Update proxyPool address + tokenPoolProxy.setProxyPool(GHO_CCIP_PROXY_POOL); + + // Set rate limit + IRateLimiter.Config memory rateLimitConfig = IRateLimiter.Config({ + isEnabled: true, + capacity: CCIP_RATE_LIMIT_CAPACITY, + rate: CCIP_RATE_LIMIT_REFILL_RATE + }); + tokenPoolProxy.setChainRateLimiterConfig(ARB_CHAIN_SELECTOR, rateLimitConfig, rateLimitConfig); + } +} diff --git a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.t.sol b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.t.sol new file mode 100644 index 000000000..46f5dae57 --- /dev/null +++ b/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.t.sol @@ -0,0 +1,502 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import 'forge-std/Test.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {AaveV3Ethereum} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol'; +import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {GhoEthereum} from 'aave-address-book/GhoEthereum.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {IClient} from 'src/interfaces/ccip/IClient.sol'; +import {IInternal} from 'src/interfaces/ccip/IInternal.sol'; +import {IRouter} from 'src/interfaces/ccip/IRouter.sol'; +import {ITypeAndVersion} from 'src/interfaces/ccip/ITypeAndVersion.sol'; +import {IProxyPool} from 'src/interfaces/ccip/IProxyPool.sol'; +import {IRateLimiter} from 'src/interfaces/ccip/IRateLimiter.sol'; +import {ITokenAdminRegistry} from 'src/interfaces/ccip/ITokenAdminRegistry.sol'; +import {IGhoCcipSteward} from 'src/interfaces/IGhoCcipSteward.sol'; +import {IUpgradeableLockReleaseTokenPool} from 'src/interfaces/ccip/IUpgradeableLockReleaseTokenPool.sol'; +import {CCIPUtils} from './utils/CCIPUtils.sol'; +import {AaveV3Ethereum_GHOCCIP150Upgrade_20241021} from './AaveV3Ethereum_GHOCCIP150Upgrade_20241021.sol'; + +/** + * @dev Test for AaveV3Ethereum_GHOCCIP150Upgrade_20241021 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.t.sol -vv + */ +contract AaveV3Ethereum_GHOCCIP150Upgrade_20241021_Test is ProtocolV3TestBase { + struct CCIPSendParams { + IRouter router; + uint256 amount; + bool migrated; + } + + AaveV3Ethereum_GHOCCIP150Upgrade_20241021 internal proposal; + IUpgradeableLockReleaseTokenPool internal ghoTokenPool; + IProxyPool internal proxyPool; + + address internal alice = makeAddr('alice'); + + uint64 internal constant ETH_CHAIN_SELECTOR = 5009297550715157269; + uint64 internal constant ARB_CHAIN_SELECTOR = 4949039107694359620; + address internal constant ARB_PROXY_POOL = 0x26329558f08cbb40d6a4CCA0E0C67b29D64A8c50; + ITokenAdminRegistry internal constant TOKEN_ADMIN_REGISTRY = + ITokenAdminRegistry(0xb22764f98dD05c789929716D677382Df22C05Cb6); + + address internal constant ON_RAMP_1_2 = 0x925228D7B82d883Dde340A55Fe8e6dA56244A22C; + address internal constant ON_RAMP_1_5 = 0x69eCC4E2D8ea56E2d0a05bF57f4Fd6aEE7f2c284; + address internal constant OFF_RAMP_1_2 = 0xeFC4a18af59398FF23bfe7325F2401aD44286F4d; + address internal constant OFF_RAMP_1_5 = 0xdf615eF8D4C64d0ED8Fd7824BBEd2f6a10245aC9; + + IGhoCcipSteward internal constant GHO_CCIP_STEWARD = + IGhoCcipSteward(0x101Efb7b9Beb073B1219Cd5473a7C8A2f2EB84f4); + + event Locked(address indexed sender, uint256 amount); + event Released(address indexed sender, address indexed recipient, uint256 amount); + event CCIPSendRequested(IInternal.EVM2EVMMessage message); + + error CallerIsNotARampOnRouter(address caller); + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21131872); + proposal = new AaveV3Ethereum_GHOCCIP150Upgrade_20241021(); + ghoTokenPool = IUpgradeableLockReleaseTokenPool(GhoEthereum.GHO_CCIP_TOKEN_POOL); + proxyPool = IProxyPool(proposal.GHO_CCIP_PROXY_POOL()); + + _validateConstants(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + assertEq( + ghoTokenPool.getCurrentInboundRateLimiterState(ARB_CHAIN_SELECTOR), + _getDisabledConfig() + ); + assertEq( + ghoTokenPool.getCurrentOutboundRateLimiterState(ARB_CHAIN_SELECTOR), + _getDisabledConfig() + ); + + bytes memory dynamicParamsBefore = _getDynamicParams(); + bytes memory staticParamsBefore = _getStaticParams(); + + defaultTest( + 'AaveV3Ethereum_GHOCCIP150Upgrade_20241021', + AaveV3Ethereum.POOL, + address(proposal) + ); + + assertEq(keccak256(_getDynamicParams()), keccak256(dynamicParamsBefore)); + assertEq(keccak256(_getStaticParams()), keccak256(staticParamsBefore)); + + assertEq( + ghoTokenPool.getCurrentInboundRateLimiterState(ARB_CHAIN_SELECTOR), + _getRateLimiterConfig() + ); + assertEq( + ghoTokenPool.getCurrentOutboundRateLimiterState(ARB_CHAIN_SELECTOR), + _getRateLimiterConfig() + ); + } + + function test_getProxyPool() public { + // proxyPool getter does not exist before the upgrade + vm.expectRevert(); + ghoTokenPool.getProxyPool(); + + executePayload(vm, address(proposal)); + + assertEq(ghoTokenPool.getProxyPool(), address(proxyPool)); + } + + function test_tokenPoolCannotBeInitializedAgain() public { + vm.expectRevert('Initializable: contract is already initialized'); + ghoTokenPool.initialize(makeAddr('owner'), new address[](0), makeAddr('router'), 0); + assertEq(_readInitialized(address(ghoTokenPool)), 1); + /// proxy implementation is initialized + assertEq(_readInitialized(_getImplementation(address(ghoTokenPool))), 255); + + executePayload(vm, address(proposal)); + + vm.expectRevert('Initializable: contract is already initialized'); + ghoTokenPool.initialize(makeAddr('owner'), new address[](0), makeAddr('router'), 0); + assertEq(_readInitialized(address(ghoTokenPool)), 1); + /// proxy implementation is initialized + assertEq(_readInitialized(_getImplementation(address(ghoTokenPool))), 255); + } + + function test_sendMessagePreCCIPMigration(uint256 amount) public { + executePayload(vm, address(proposal)); + + IERC20 gho = IERC20(address(ghoTokenPool.getToken())); + IRouter router = IRouter(ghoTokenPool.getRouter()); + amount = bound(amount, 1, _getRateLimiterConfig().capacity); + + // wait for the rate limiter to refill + skip(_getOutboundRefillTime(amount)); + + vm.prank(alice); + gho.approve(address(router), amount); + deal(address(gho), alice, amount); + + uint256 tokenPoolBalance = gho.balanceOf(address(ghoTokenPool)); + uint256 bridgedAmount = ghoTokenPool.getCurrentBridgedAmount(); + + ( + IClient.EVM2AnyMessage memory message, + IInternal.EVM2EVMMessage memory eventArg + ) = _getTokenMessage(CCIPSendParams({router: router, amount: amount, migrated: false})); + + vm.expectEmit(address(ghoTokenPool)); + emit Locked(ON_RAMP_1_2, amount); + vm.expectEmit(ON_RAMP_1_2); + emit CCIPSendRequested(eventArg); + vm.prank(alice); + router.ccipSend{value: eventArg.feeTokenAmount}(ARB_CHAIN_SELECTOR, message); + + assertEq(gho.balanceOf(address(ghoTokenPool)), tokenPoolBalance + amount); + assertEq(ghoTokenPool.getCurrentBridgedAmount(), bridgedAmount + amount); + } + + function test_sendMessagePostCCIPMigration(uint256 amount) public { + executePayload(vm, address(proposal)); + + _mockCCIPMigration(); + + IERC20 gho = IERC20(address(ghoTokenPool.getToken())); + IRouter router = IRouter(ghoTokenPool.getRouter()); + amount = bound(amount, 1, _getRateLimiterConfig().capacity); + + // wait for the rate limiter to refill + skip(_getOutboundRefillTime(amount)); + + vm.prank(alice); + gho.approve(address(router), amount); + deal(address(gho), alice, amount); + + uint256 tokenPoolBalance = gho.balanceOf(address(ghoTokenPool)); + uint256 bridgedAmount = ghoTokenPool.getCurrentBridgedAmount(); + + ( + IClient.EVM2AnyMessage memory message, + IInternal.EVM2EVMMessage memory eventArg + ) = _getTokenMessage(CCIPSendParams({router: router, amount: amount, migrated: true})); + + vm.expectEmit(address(ghoTokenPool)); + emit Locked(address(proxyPool), amount); + vm.expectEmit(address(proxyPool)); + emit Locked(ON_RAMP_1_5, amount); + vm.expectEmit(ON_RAMP_1_5); + emit CCIPSendRequested(eventArg); + vm.prank(alice); + router.ccipSend{value: eventArg.feeTokenAmount}(ARB_CHAIN_SELECTOR, message); + + assertEq(gho.balanceOf(address(ghoTokenPool)), tokenPoolBalance + amount); + assertEq(ghoTokenPool.getCurrentBridgedAmount(), bridgedAmount + amount); + } + + function test_executeMessagePreCCIPMigration(uint256 amount) public { + executePayload(vm, address(proposal)); + + IERC20 gho = IERC20(address(ghoTokenPool.getToken())); + amount = bound(amount, 1, _getRateLimiterConfig().capacity); + + // wait for the rate limiter to refill + skip(_getInboundRefillTime(amount)); + // mock previously locked gho + deal(address(gho), address(ghoTokenPool), amount); + + vm.expectEmit(address(ghoTokenPool)); + emit Released(OFF_RAMP_1_2, alice, amount); + vm.prank(OFF_RAMP_1_2); + ghoTokenPool.releaseOrMint(abi.encode(alice), alice, amount, ARB_CHAIN_SELECTOR, ''); + + assertEq(gho.balanceOf(alice), amount); + } + + function test_executeMessagePostCCIPMigration(uint256 amount) public { + executePayload(vm, address(proposal)); + + _mockCCIPMigration(); + + IERC20 gho = IERC20(address(ghoTokenPool.getToken())); + amount = bound(amount, 1, _getRateLimiterConfig().capacity); + // wait for the rate limiter to refill + skip(_getInboundRefillTime(amount)); + // mock previously locked gho + deal(address(gho), address(ghoTokenPool), amount); + + vm.expectEmit(address(ghoTokenPool)); + emit Released(OFF_RAMP_1_5, alice, amount); + vm.prank(OFF_RAMP_1_5); + ghoTokenPool.releaseOrMint(abi.encode(alice), alice, amount, ARB_CHAIN_SELECTOR, ''); + + assertEq(gho.balanceOf(alice), amount); + } + + function test_executeMessagePostCCIPMigrationViaLegacyOffRamp(uint256 amount) public { + executePayload(vm, address(proposal)); + + _mockCCIPMigration(); + + IERC20 gho = IERC20(address(ghoTokenPool.getToken())); + amount = bound(amount, 1, _getRateLimiterConfig().capacity); + + // wait for the rate limiter to refill + skip(_getInboundRefillTime(amount)); + // mock previously locked gho + deal(address(gho), address(ghoTokenPool), amount); + + vm.expectEmit(address(ghoTokenPool)); + emit Released(OFF_RAMP_1_2, alice, amount); + vm.prank(OFF_RAMP_1_2); + ghoTokenPool.releaseOrMint(abi.encode(alice), alice, amount, ARB_CHAIN_SELECTOR, ''); + + assertEq(gho.balanceOf(alice), amount); + } + + function test_proxyPoolCanOnRamp(uint256 amount) public { + amount = bound(amount, 1, _getRateLimiterConfig().capacity); + + uint256 bridgedAmount = ghoTokenPool.getCurrentBridgedAmount(); + + vm.expectRevert(abi.encodeWithSelector(CallerIsNotARampOnRouter.selector, proxyPool)); + vm.prank(address(proxyPool)); + ghoTokenPool.lockOrBurn(alice, abi.encode(alice), amount, ARB_CHAIN_SELECTOR, new bytes(0)); + + executePayload(vm, address(proposal)); + + // wait for the rate limiter to refill + skip(_getOutboundRefillTime(amount)); + + vm.expectEmit(address(ghoTokenPool)); + emit Locked(address(proxyPool), amount); + vm.prank(address(proxyPool)); + ghoTokenPool.lockOrBurn(alice, abi.encode(alice), amount, ARB_CHAIN_SELECTOR, new bytes(0)); + + assertEq(ghoTokenPool.getCurrentBridgedAmount(), bridgedAmount + amount); + } + + function test_proxyPoolCanOffRamp(uint256 amount) public { + amount = bound(amount, 1, _getRateLimiterConfig().capacity); + + vm.expectRevert(abi.encodeWithSelector(CallerIsNotARampOnRouter.selector, proxyPool)); + vm.prank(address(proxyPool)); + ghoTokenPool.releaseOrMint(abi.encode(alice), alice, amount, ARB_CHAIN_SELECTOR, new bytes(0)); + + executePayload(vm, address(proposal)); + // mock previously locked gho + deal(GhoEthereum.GHO_TOKEN, address(ghoTokenPool), amount); + // wait for the rate limiter to refill + skip(_getInboundRefillTime(amount)); + + vm.expectEmit(address(ghoTokenPool)); + emit Released(address(proxyPool), alice, amount); + vm.prank(address(proxyPool)); + ghoTokenPool.releaseOrMint(abi.encode(alice), alice, amount, ARB_CHAIN_SELECTOR, new bytes(0)); + } + + function test_stewardCanDisableRateLimit() public { + executePayload(vm, address(proposal)); + + assertEq(ghoTokenPool.getRateLimitAdmin(), address(GHO_CCIP_STEWARD)); + + vm.prank(GHO_CCIP_STEWARD.RISK_COUNCIL()); + GHO_CCIP_STEWARD.updateRateLimit(ARB_CHAIN_SELECTOR, false, 0, 0, false, 0, 0); + + assertEq( + abi.encode( + _tokenBucketToConfig(ghoTokenPool.getCurrentInboundRateLimiterState(ARB_CHAIN_SELECTOR)) + ), + abi.encode(_getDisabledConfig()) + ); + assertEq( + abi.encode( + _tokenBucketToConfig(ghoTokenPool.getCurrentOutboundRateLimiterState(ARB_CHAIN_SELECTOR)) + ), + abi.encode(_getDisabledConfig()) + ); + } + + function test_ownershipTransferOfGhoProxyPool() public { + executePayload(vm, address(proposal)); + _mockCCIPMigration(); + + assertEq(ghoTokenPool.owner(), AaveV3Ethereum.ACL_ADMIN); + + // CLL team transfers ownership of proxyPool and GHO token in TokenAdminRegistry + vm.prank(proxyPool.owner()); + proxyPool.transferOwnership(AaveV3Ethereum.ACL_ADMIN); + vm.prank(TOKEN_ADMIN_REGISTRY.owner()); + TOKEN_ADMIN_REGISTRY.transferAdminRole(GhoEthereum.GHO_TOKEN, AaveV3Ethereum.ACL_ADMIN); + + // new AIP to accept ownership + vm.startPrank(AaveV3Ethereum.ACL_ADMIN); + proxyPool.acceptOwnership(); + TOKEN_ADMIN_REGISTRY.acceptAdminRole(GhoEthereum.GHO_TOKEN); + vm.stopPrank(); + + assertEq(proxyPool.owner(), AaveV3Ethereum.ACL_ADMIN); + assertTrue( + TOKEN_ADMIN_REGISTRY.isAdministrator(GhoEthereum.GHO_TOKEN, AaveV3Ethereum.ACL_ADMIN) + ); + } + + function _mockCCIPMigration() private { + IRouter router = IRouter(ghoTokenPool.getRouter()); + + assertEq(TOKEN_ADMIN_REGISTRY.getPool(GhoEthereum.GHO_TOKEN), address(proxyPool)); + + assertEq(proxyPool.getRouter(), address(router)); + + assertTrue(proxyPool.isSupportedChain(ARB_CHAIN_SELECTOR)); + assertEq(proxyPool.getCurrentInboundRateLimiterState(ARB_CHAIN_SELECTOR), _getDisabledConfig()); + assertEq( + proxyPool.getCurrentOutboundRateLimiterState(ARB_CHAIN_SELECTOR), + _getDisabledConfig() + ); + assertEq(proxyPool.getRemotePool(ARB_CHAIN_SELECTOR), abi.encode(ARB_PROXY_POOL)); + assertEq( + proxyPool.getRemoteToken(ARB_CHAIN_SELECTOR), + abi.encode(AaveV3ArbitrumAssets.GHO_UNDERLYING) + ); + + IRouter.OnRamp[] memory onRampUpdates = new IRouter.OnRamp[](1); + onRampUpdates[0] = IRouter.OnRamp({ + destChainSelector: ARB_CHAIN_SELECTOR, + onRamp: ON_RAMP_1_5 // new onRamp + }); + IRouter.OffRamp[] memory offRampUpdates = new IRouter.OffRamp[](1); + offRampUpdates[0] = IRouter.OffRamp({ + sourceChainSelector: ARB_CHAIN_SELECTOR, + offRamp: OFF_RAMP_1_5 // new offRamp + }); + + vm.prank(router.owner()); + router.applyRampUpdates(onRampUpdates, new IRouter.OffRamp[](0), offRampUpdates); + } + + function _getTokenMessage( + CCIPSendParams memory params + ) internal returns (IClient.EVM2AnyMessage memory, IInternal.EVM2EVMMessage memory) { + IClient.EVM2AnyMessage memory message = CCIPUtils.generateMessage(alice, 1); + message.tokenAmounts[0] = IClient.EVMTokenAmount({ + token: GhoEthereum.GHO_TOKEN, + amount: params.amount + }); + + uint256 feeAmount = params.router.getFee(ARB_CHAIN_SELECTOR, message); + deal(alice, feeAmount); + + IInternal.EVM2EVMMessage memory eventArg = CCIPUtils.messageToEvent( + CCIPUtils.MessageToEventParams({ + message: message, + router: params.router, + sourceChainSelector: ETH_CHAIN_SELECTOR, + feeTokenAmount: feeAmount, + originalSender: alice, + destinationToken: AaveV3ArbitrumAssets.GHO_UNDERLYING, + migrated: params.migrated + }) + ); + + return (message, eventArg); + } + + function _getImplementation(address proxy) private view returns (address) { + bytes32 slot = bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1); + return address(uint160(uint256(vm.load(proxy, slot)))); + } + + function _readInitialized(address proxy) private view returns (uint8) { + /// slot 0 + // <1 byte ^ 1 byte ^ ---------- 20 bytes ----------> + // initialized initializing owner + return uint8(uint256(vm.load(proxy, bytes32(0)))); + } + + function _getStaticParams() private view returns (bytes memory) { + return + abi.encode( + address(ghoTokenPool.getToken()), + ghoTokenPool.getAllowList(), + ghoTokenPool.getArmProxy(), + ghoTokenPool.canAcceptLiquidity(), + ghoTokenPool.getRouter() + ); + } + + function _getDynamicParams() private view returns (bytes memory) { + return + abi.encode( + ghoTokenPool.owner(), + ghoTokenPool.getSupportedChains(), + ghoTokenPool.getAllowListEnabled(), + ghoTokenPool.getRateLimitAdmin(), + ghoTokenPool.getBridgeLimitAdmin(), + ghoTokenPool.getRebalancer(), + ghoTokenPool.getLockReleaseInterfaceId(), + ghoTokenPool.getBridgeLimit(), + ghoTokenPool.getCurrentBridgedAmount() + ); + } + + function _validateConstants() private view { + assertEq(TOKEN_ADMIN_REGISTRY.typeAndVersion(), 'TokenAdminRegistry 1.5.0'); + assertEq(proxyPool.typeAndVersion(), 'LockReleaseTokenPoolAndProxy 1.5.0'); + assertEq(ITypeAndVersion(ON_RAMP_1_2).typeAndVersion(), 'EVM2EVMOnRamp 1.2.0'); + assertEq(ITypeAndVersion(ON_RAMP_1_5).typeAndVersion(), 'EVM2EVMOnRamp 1.5.0'); + assertEq(ITypeAndVersion(OFF_RAMP_1_2).typeAndVersion(), 'EVM2EVMOffRamp 1.2.0'); + assertEq(ITypeAndVersion(OFF_RAMP_1_5).typeAndVersion(), 'EVM2EVMOffRamp 1.5.0'); + + assertEq(GHO_CCIP_STEWARD.GHO_TOKEN(), GhoEthereum.GHO_TOKEN); + assertEq(GHO_CCIP_STEWARD.GHO_TOKEN_POOL(), address(ghoTokenPool)); + + assertEq(proxyPool.getPreviousPool(), address(ghoTokenPool)); + } + + function _getOutboundRefillTime(uint256 amount) private view returns (uint256) { + uint128 rate = _getRateLimiterConfig().rate; + assertNotEq(rate, 0); + return amount / uint256(rate) + 1; // account for rounding + } + + function _getInboundRefillTime(uint256 amount) private view returns (uint256) { + uint128 rate = _getRateLimiterConfig().rate; + assertNotEq(rate, 0); + return amount / uint256(rate) + 1; // account for rounding + } + + function _tokenBucketToConfig( + IRateLimiter.TokenBucket memory bucket + ) private pure returns (IRateLimiter.Config memory) { + return + IRateLimiter.Config({ + isEnabled: bucket.isEnabled, + capacity: bucket.capacity, + rate: bucket.rate + }); + } + + function _getDisabledConfig() private pure returns (IRateLimiter.Config memory) { + return IRateLimiter.Config({isEnabled: false, capacity: 0, rate: 0}); + } + + function assertEq( + IRateLimiter.TokenBucket memory bucket, + IRateLimiter.Config memory config + ) internal pure { + assertEq(abi.encode(_tokenBucketToConfig(bucket)), abi.encode(config)); + } + + function _getRateLimiterConfig() internal view returns (IRateLimiter.Config memory) { + return + IRateLimiter.Config({ + isEnabled: true, + capacity: proposal.CCIP_RATE_LIMIT_CAPACITY(), + rate: proposal.CCIP_RATE_LIMIT_REFILL_RATE() + }); + } +} diff --git a/src/20241021_Multi_GHOCCIP150Upgrade/GHOCCIP150Upgrade.md b/src/20241021_Multi_GHOCCIP150Upgrade/GHOCCIP150Upgrade.md new file mode 100644 index 000000000..e0576475e --- /dev/null +++ b/src/20241021_Multi_GHOCCIP150Upgrade/GHOCCIP150Upgrade.md @@ -0,0 +1,35 @@ +--- +title: "GHO CCIP Integration Maintenance (CCIP v1.5 upgrade)" +author: "Aave Labs" +discussions: "https://governance.aave.com/t/bgd-technical-maintenance-proposals/15274/51" +--- + +## Simple Summary + +Proposal to update GHO CCIP Token Pools to ensure GHO’s CCIP integration remains functional during and after the upcoming migration to CCIP version 1.5. + +## Motivation + +The Chainlink Cross-Chain Interoperability Protocol (CCIP) is upgrading to version 1.5 in Q4 2024, introducing several new features and enhancements. We are expecting that a detailed description of this new version will be announced by Chainlink soon. +Currently, GHO CCIP Token Pools are based on version 1.4, and they are not compatible in their current form with CCIP 1.5. The Chainlink CCIP team cannot migrate the GHO CCIP Token Pools as part of the system-wide upgrade, as these are fully controlled by the Aave DAO. +Aave Labs will provide technical support to ensure that GHO CCIP Token Pools remain functional, secure, and aligned with the latest updates, enabling GHO to expand to other networks if needed. + +## Specification + +Below actions are taken in order to make GHO token pools work with the new CCIP 1.5 protocol by allowing the "Intermediary Contract" (proxyPool) to translate the interface between 1.4 & 1.5 OnRamps and OffRamps: + +- Configure an Intermediary Contract: This contract translates execution calls between the new OnRamp and the existing GHO Token Pools. It was developed and deployed by the Chainlink CCIP team on behalf of the Aave DAO. +- Upgrade the Existing GHO Token Pools: The existing Token Pools are adjusted to allow calls from both the old and new versions of the OnRamp and OffRamp, through the intermediary contract. +- Setup a Token Rate Limit: A token rate limit of 300,000 GHO as limit capacity and 60 GHO per second as refill rate is set for both directions of Ethereum <> Arbitrum lane. This is a temporary security measure that can be lifted later via AIP or by GHO Stewards. + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/c016f11d2d921748459bb0aaca37f462b2639e1a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/c016f11d2d921748459bb0aaca37f462b2639e1a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/c016f11d2d921748459bb0aaca37f462b2639e1a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Ethereum_GHOCCIP150Upgrade_20241021.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/c016f11d2d921748459bb0aaca37f462b2639e1a/src/20241021_Multi_GHOCCIP150Upgrade/AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.t.sol) +- Snapshot - Direct-to-AIP +- [Discussion](https://governance.aave.com/t/bgd-technical-maintenance-proposals/15274/51) +- Token Pool Contracts - [UpgradeableLockReleaseTokenPool](https://github.com/aave/ccip/blob/bc0561e6a9615f410086d4766839eaf3ca9b9f49/contracts/src/v0.8/ccip/pools/GHO/UpgradeableLockReleaseTokenPool.sol), [UpgradeableBurnMintTokenPool](https://github.com/aave/ccip/blob/bc0561e6a9615f410086d4766839eaf3ca9b9f49/contracts/src/v0.8/ccip/pools/GHO/UpgradeableBurnMintTokenPool.sol) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241021_Multi_GHOCCIP150Upgrade/GHOCCIP150Upgrade_20241021.s.sol b/src/20241021_Multi_GHOCCIP150Upgrade/GHOCCIP150Upgrade_20241021.s.sol new file mode 100644 index 000000000..728f912ec --- /dev/null +++ b/src/20241021_Multi_GHOCCIP150Upgrade/GHOCCIP150Upgrade_20241021.s.sol @@ -0,0 +1,87 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript, ArbitrumScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Ethereum_GHOCCIP150Upgrade_20241021} from './AaveV3Ethereum_GHOCCIP150Upgrade_20241021.sol'; +import {AaveV3Arbitrum_GHOCCIP150Upgrade_20241021} from './AaveV3Arbitrum_GHOCCIP150Upgrade_20241021.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241021_Multi_GHOCCIP150Upgrade/GHOCCIP150Upgrade_20241021.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/GHOCCIP150Upgrade_20241021.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_GHOCCIP150Upgrade_20241021).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Arbitrum + * deploy-command: make deploy-ledger contract=src/20241021_Multi_GHOCCIP150Upgrade/GHOCCIP150Upgrade_20241021.s.sol:DeployArbitrum chain=arbitrum + * verify-command: FOUNDRY_PROFILE=arbitrum npx catapulta-verify -b broadcast/GHOCCIP150Upgrade_20241021.s.sol/42161/run-latest.json + */ +contract DeployArbitrum is ArbitrumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Arbitrum_GHOCCIP150Upgrade_20241021).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/20241021_Multi_GHOCCIP150Upgrade/GHOCCIP150Upgrade_20241021.s.sol:CreateProposal chain=mainnet + */ +contract CreateProposal is EthereumScript { + function run() external { + // create payloads + PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](2); + + // compose actions for validation + IPayloadsControllerCore.ExecutionAction[] + memory actionsEthereum = new IPayloadsControllerCore.ExecutionAction[](1); + actionsEthereum[0] = GovV3Helpers.buildAction( + type(AaveV3Ethereum_GHOCCIP150Upgrade_20241021).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsArbitrum = new IPayloadsControllerCore.ExecutionAction[](1); + actionsArbitrum[0] = GovV3Helpers.buildAction( + type(AaveV3Arbitrum_GHOCCIP150Upgrade_20241021).creationCode + ); + payloads[1] = GovV3Helpers.buildArbitrumPayload(vm, actionsArbitrum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile(vm, 'src/20241021_Multi_GHOCCIP150Upgrade/GHOCCIP150Upgrade.md') + ); + } +} diff --git a/src/20241021_Multi_GHOCCIP150Upgrade/config.ts b/src/20241021_Multi_GHOCCIP150Upgrade/config.ts new file mode 100644 index 000000000..f1a49b82f --- /dev/null +++ b/src/20241021_Multi_GHOCCIP150Upgrade/config.ts @@ -0,0 +1,17 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3Ethereum', 'AaveV3Arbitrum'], + title: 'GHO CCIP 1.5.0 Upgrade', + shortName: 'GHOCCIP150Upgrade', + date: '20241021', + author: 'Aave Labs', + discussion: 'https://governance.aave.com/t/bgd-technical-maintenance-proposals/15274/51', + snapshot: 'Direct-to-AIP', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Ethereum: {configs: {OTHERS: {}}, cache: {blockNumber: 21131872}}, + AaveV3Arbitrum: {configs: {OTHERS: {}}, cache: {blockNumber: 271788784}}, + }, +}; diff --git a/src/20241021_Multi_GHOCCIP150Upgrade/utils/CCIPUtils.sol b/src/20241021_Multi_GHOCCIP150Upgrade/utils/CCIPUtils.sol new file mode 100644 index 000000000..c73b30175 --- /dev/null +++ b/src/20241021_Multi_GHOCCIP150Upgrade/utils/CCIPUtils.sol @@ -0,0 +1,161 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IClient} from 'src/interfaces/ccip/IClient.sol'; +import {IRouter} from 'src/interfaces/ccip/IRouter.sol'; +import {IInternal} from 'src/interfaces/ccip/IInternal.sol'; +import {IEVM2EVMOnRamp} from 'src/interfaces/ccip/IEVM2EVMOnRamp.sol'; + +library CCIPUtils { + uint64 internal constant ETH_CHAIN_SELECTOR = 5009297550715157269; + uint64 internal constant ARB_CHAIN_SELECTOR = 4949039107694359620; + + bytes32 internal constant LEAF_DOMAIN_SEPARATOR = + 0x0000000000000000000000000000000000000000000000000000000000000000; + bytes32 internal constant INTERNAL_DOMAIN_SEPARATOR = + 0x0000000000000000000000000000000000000000000000000000000000000001; + bytes32 internal constant EVM_2_EVM_MESSAGE_HASH = keccak256('EVM2EVMMessageHashV2'); + bytes4 public constant EVM_EXTRA_ARGS_V1_TAG = 0x97a657c9; + + struct SourceTokenData { + bytes sourcePoolAddress; + bytes destTokenAddress; + bytes extraData; + uint32 destGasAmount; + } + + struct MessageToEventParams { + IClient.EVM2AnyMessage message; + IRouter router; + uint64 sourceChainSelector; + uint256 feeTokenAmount; + address originalSender; + address destinationToken; + bool migrated; + } + + function generateMessage( + address receiver, + uint256 tokenAmountsLength + ) internal pure returns (IClient.EVM2AnyMessage memory) { + return + IClient.EVM2AnyMessage({ + receiver: abi.encode(receiver), + data: '', + tokenAmounts: new IClient.EVMTokenAmount[](tokenAmountsLength), + feeToken: address(0), + extraArgs: argsToBytes(IClient.EVMExtraArgsV1({gasLimit: 0})) + }); + } + + function messageToEvent( + MessageToEventParams memory params + ) public view returns (IInternal.EVM2EVMMessage memory) { + uint64 destChainSelector = params.sourceChainSelector == ETH_CHAIN_SELECTOR + ? ARB_CHAIN_SELECTOR + : ETH_CHAIN_SELECTOR; + IEVM2EVMOnRamp onRamp = IEVM2EVMOnRamp(params.router.getOnRamp(destChainSelector)); + + bytes memory args = new bytes(params.message.extraArgs.length - 4); + for (uint256 i = 4; i < params.message.extraArgs.length; ++i) { + args[i - 4] = params.message.extraArgs[i]; + } + + IInternal.EVM2EVMMessage memory messageEvent = IInternal.EVM2EVMMessage({ + sequenceNumber: onRamp.getExpectedNextSequenceNumber(), + feeTokenAmount: params.feeTokenAmount, + sender: params.originalSender, + nonce: onRamp.getSenderNonce(params.originalSender) + 1, + gasLimit: abi.decode(args, (IClient.EVMExtraArgsV1)).gasLimit, + strict: false, + sourceChainSelector: params.sourceChainSelector, + receiver: abi.decode(params.message.receiver, (address)), + data: params.message.data, + tokenAmounts: params.message.tokenAmounts, + sourceTokenData: new bytes[](params.message.tokenAmounts.length), + feeToken: params.router.getWrappedNative(), + messageId: '' + }); + + // change introduced in CCIP 1.5, hence we only apply if CCIP has migrated to 1.5 + if (params.migrated) { + for (uint256 i; i < params.message.tokenAmounts.length; ++i) { + messageEvent.sourceTokenData[i] = abi.encode( + SourceTokenData({ + sourcePoolAddress: abi.encode( + onRamp.getPoolBySourceToken(destChainSelector, params.message.tokenAmounts[i].token) + ), + destTokenAddress: abi.encode(params.destinationToken), + extraData: '', + destGasAmount: getDestGasAmount(onRamp, params.message.tokenAmounts[i].token) + }) + ); + } + } + + messageEvent.messageId = hash( + messageEvent, + generateMetadataHash(params.sourceChainSelector, destChainSelector, address(onRamp)) + ); + return messageEvent; + } + + function generateMetadataHash( + uint64 sourceChainSelector, + uint64 destChainSelector, + address onRamp + ) internal pure returns (bytes32) { + return + keccak256(abi.encode(EVM_2_EVM_MESSAGE_HASH, sourceChainSelector, destChainSelector, onRamp)); + } + + function argsToBytes( + IClient.EVMExtraArgsV1 memory extraArgs + ) internal pure returns (bytes memory bts) { + return abi.encodeWithSelector(EVM_EXTRA_ARGS_V1_TAG, extraArgs); + } + + /// @dev Used to hash messages for single-lane ramps. + /// OnRamp hash(EVM2EVMMessage) = OffRamp hash(EVM2EVMMessage) + /// The EVM2EVMMessage's messageId is expected to be the output of this hash function + /// @param original Message to hash + /// @param metadataHash Immutable metadata hash representing a lane with a fixed OnRamp + /// @return hashedMessage hashed message as a keccak256 + function hash( + IInternal.EVM2EVMMessage memory original, + bytes32 metadataHash + ) internal pure returns (bytes32) { + // Fixed-size message fields are included in nested hash to reduce stack pressure. + // This hashing scheme is also used by RMN. If changing it, please notify the RMN maintainers. + return + keccak256( + abi.encode( + LEAF_DOMAIN_SEPARATOR, + metadataHash, + keccak256( + abi.encode( + original.sender, + original.receiver, + original.sequenceNumber, + original.gasLimit, + original.strict, + original.nonce, + original.feeToken, + original.feeTokenAmount + ) + ), + keccak256(original.data), + keccak256(abi.encode(original.tokenAmounts)), + keccak256(abi.encode(original.sourceTokenData)) + ) + ); + } + + function getDestGasAmount(IEVM2EVMOnRamp onRamp, address token) internal view returns (uint32) { + IEVM2EVMOnRamp.TokenTransferFeeConfig memory config = onRamp.getTokenTransferFeeConfig(token); + return + config.isEnabled + ? config.destGasOverhead + : onRamp.getDynamicConfig().defaultTokenDestGasOverhead; + } +} diff --git a/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024.sol b/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024.sol new file mode 100644 index 000000000..0e5ee6ec3 --- /dev/null +++ b/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV3PayloadEthereum} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereum.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title wstETH Reserve Borrow Rate Update - Main Instance + * @author karpatkey_TokenLogic + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-weth-wsteth-borrow-rate-updates/19550 + */ +contract AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024 is + AaveV3PayloadEthereum +{ + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV3ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](1); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumAssets.wstETH_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: 0, + variableRateSlope1: 2_00, + variableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); + + return rateStrategies; + } +} diff --git a/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024.t.sol b/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024.t.sol new file mode 100644 index 000000000..631bd62ac --- /dev/null +++ b/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024.t.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Ethereum} from 'aave-address-book/AaveV3Ethereum.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024} from './AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024.sol'; + +/** + * @dev Test for AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024.t.sol -vv + */ +contract AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024_Test is + ProtocolV3TestBase +{ + AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21036418); + proposal = new AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024', + AaveV3Ethereum.POOL, + address(proposal) + ); + } +} diff --git a/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/WstETHReserveBorrowRateUpdateMainInstance.md b/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/WstETHReserveBorrowRateUpdateMainInstance.md new file mode 100644 index 000000000..259ebbb0c --- /dev/null +++ b/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/WstETHReserveBorrowRateUpdateMainInstance.md @@ -0,0 +1,38 @@ +--- +title: "wstETH Reserve Borrow Rate Update - Main Instance" +author: "karpatkey_TokenLogic" +discussions: "https://governance.aave.com/t/arfc-weth-wsteth-borrow-rate-updates/19550" +snapshot: "Direct-to-AIP" +--- + +## Simple Summary + +This publication proposes reducing wstETH Slope1 parameter on the Main instance of Aave v3 on Ethereum. + +## Motivation + +With the goal of encouraging user to borrow wstETH on the Main instance of Aave v3, the wstETH borrow rate will be lowered. + +The anticipated rsETH collateral and wETH debt eMode category is expected to create demand for wstETH debt. Given the size of the wstETH reserve the Uoptimal is not being increased by this proposal. + +After monitoring how the market responds, future borrow rate adjustments across the Aave v3 instances on Ethereum will be assessed and any change presented for discussion. + +## Specification + +The Main instance the wstETH Slope1 and base parameter is to be revised as follows: + +| Asset | Parameter | Current | Proposed | Change | +| :----: | :-------: | :-----: | :------: | :----: | +| wstETH | Base | 0.25% | 0.00% | -0.25% | +| wstETH | Slope1 | 4.50% | 2.00% | -2.50% | + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/3a0085b8e9db515f846ee6fd54f7801e47b64d90/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/3a0085b8e9db515f846ee6fd54f7801e47b64d90/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024.t.sol) +- [Snapshot](Direct-to-AIP) +- [Discussion](https://governance.aave.com/t/arfc-weth-wsteth-borrow-rate-updates/19550) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/WstETHReserveBorrowRateUpdateMainInstance_20241024.s.sol b/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/WstETHReserveBorrowRateUpdateMainInstance_20241024.s.sol new file mode 100644 index 000000000..92083f6db --- /dev/null +++ b/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/WstETHReserveBorrowRateUpdateMainInstance_20241024.s.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024} from './AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/WstETHReserveBorrowRateUpdateMainInstance_20241024.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/WstETHReserveBorrowRateUpdateMainInstance_20241024.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance_20241024).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/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/WstETHReserveBorrowRateUpdateMainInstance_20241024.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_WstETHReserveBorrowRateUpdateMainInstance_20241024).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/WstETHReserveBorrowRateUpdateMainInstance.md' + ) + ); + } +} diff --git a/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/config.ts b/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/config.ts new file mode 100644 index 000000000..04aec1ccf --- /dev/null +++ b/src/20241024_AaveV3Ethereum_WstETHReserveBorrowRateUpdateMainInstance/config.ts @@ -0,0 +1,31 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3Ethereum'], + title: 'wstETH Reserve Borrow Rate Update - Main Instance', + shortName: 'WstETHReserveBorrowRateUpdateMainInstance', + date: '20241024', + author: 'karpatkey_TokenLogic', + discussion: 'https://governance.aave.com/t/arfc-weth-wsteth-borrow-rate-updates/19550', + snapshot: 'Direct-to-AIP', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Ethereum: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'wstETH', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '0.00', + variableRateSlope1: '2.00', + variableRateSlope2: '', + }, + }, + ], + }, + cache: {blockNumber: 21036418}, + }, + }, +}; diff --git a/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.sol b/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.sol new file mode 100644 index 000000000..23bc54f7c --- /dev/null +++ b/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.sol @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV3PayloadEthereum} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereum.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {IEmissionManager} from 'aave-v3-origin/contracts/rewards/interfaces/IEmissionManager.sol'; + +/** + * @title PYUSD Reserve Configuration Update & Incentive Campaign + * @author karpatkey_TokenLogic + * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0xcd73f17361c7757cd94ec758b4d9f160b7cecefa7f4cb23b0b4ee49b5eb1b8b2 + * - Discussion: https://governance.aave.com/t/arfc-pyusd-reserve-configuration-update-incentive-campaign/19573 + */ +contract AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031 is + AaveV3PayloadEthereum +{ + address public constant ALC_SAFE = 0xA1c93D2687f7014Aaf588c764E3Ce80aF016229b; + address public constant ACI_TREASURY = 0xac140648435d03f784879cd789130F22Ef588Fcd; + uint256 public constant GHO_AMOUNT = 300_000 ether; + + function _postExecute() internal override { + AaveV3Ethereum.COLLECTOR.approve(AaveV3EthereumAssets.GHO_UNDERLYING, ALC_SAFE, GHO_AMOUNT); + + IEmissionManager(AaveV3Ethereum.EMISSION_MANAGER).setEmissionAdmin( + AaveV3EthereumAssets.PYUSD_UNDERLYING, + ACI_TREASURY + ); + IEmissionManager(AaveV3Ethereum.EMISSION_MANAGER).setEmissionAdmin( + AaveV3EthereumAssets.PYUSD_A_TOKEN, + ACI_TREASURY + ); + } + + function capsUpdates() public pure override returns (IAaveV3ConfigEngine.CapsUpdate[] memory) { + IAaveV3ConfigEngine.CapsUpdate[] memory capsUpdate = new IAaveV3ConfigEngine.CapsUpdate[](1); + + capsUpdate[0] = IAaveV3ConfigEngine.CapsUpdate({ + asset: AaveV3EthereumAssets.PYUSD_UNDERLYING, + supplyCap: EngineFlags.KEEP_CURRENT, + borrowCap: 15_000_000 + }); + + return capsUpdate; + } + + function collateralsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.CollateralUpdate[] memory) + { + IAaveV3ConfigEngine.CollateralUpdate[] + memory collateralUpdate = new IAaveV3ConfigEngine.CollateralUpdate[](1); + + collateralUpdate[0] = IAaveV3ConfigEngine.CollateralUpdate({ + asset: AaveV3EthereumAssets.PYUSD_UNDERLYING, + ltv: 75_00, + liqThreshold: 78_00, + liqBonus: 7_50, + debtCeiling: EngineFlags.KEEP_CURRENT, + liqProtocolFee: 10_00 + }); + + return collateralUpdate; + } +} diff --git a/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.t.sol b/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.t.sol new file mode 100644 index 000000000..ef29f76d2 --- /dev/null +++ b/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.t.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {IEmissionManager} from 'aave-v3-origin/contracts/rewards/interfaces/IEmissionManager.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031} from './AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.sol'; +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; + +/** + * @dev Test for AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.t.sol -vv + */ +contract AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031_Test is + ProtocolV3TestBase +{ + AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21085967); + proposal = new AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031', + AaveV3Ethereum.POOL, + address(proposal) + ); + } + + function test_checkAllowanceAndEmissionAdmin() public { + uint256 allowanceBefore = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).allowance( + address(AaveV3Ethereum.COLLECTOR), + proposal.ALC_SAFE() + ); + + GovV3Helpers.executePayload(vm, address(proposal)); + + uint256 allowanceAfter = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).allowance( + address(AaveV3Ethereum.COLLECTOR), + proposal.ALC_SAFE() + ); + + assertEq(allowanceAfter - allowanceBefore, proposal.GHO_AMOUNT()); + + address pyusdEmissionAdmin = IEmissionManager(AaveV3Ethereum.EMISSION_MANAGER).getEmissionAdmin( + AaveV3EthereumAssets.PYUSD_UNDERLYING + ); + assertEq(pyusdEmissionAdmin, proposal.ACI_TREASURY()); + address pyusdAEmissionAdmin = IEmissionManager(AaveV3Ethereum.EMISSION_MANAGER) + .getEmissionAdmin(AaveV3EthereumAssets.PYUSD_A_TOKEN); + assertEq(pyusdAEmissionAdmin, proposal.ACI_TREASURY()); + } +} diff --git a/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/PYUSDReserveConfigurationUpdateIncentiveCampaign.md b/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/PYUSDReserveConfigurationUpdateIncentiveCampaign.md new file mode 100644 index 000000000..7f08512ea --- /dev/null +++ b/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/PYUSDReserveConfigurationUpdateIncentiveCampaign.md @@ -0,0 +1,63 @@ +--- +title: "PYUSD Reserve Configuration Update & Incentive Campaign" +author: "karpatkey_TokenLogic" +discussions: "https://governance.aave.com/t/arfc-pyusd-reserve-configuration-update-incentive-campaign/19573" +snapshot: "https://snapshot.org/#/aave.eth/proposal/0xcd73f17361c7757cd94ec758b4d9f160b7cecefa7f4cb23b0b4ee49b5eb1b8b2" +--- + +## Simple Summary + +This publication proposes amendments to the PYUSD Reserve in preparation for an upcoming incentive campaign. + +Additionally, a co-incentive campaign is to be implemented to improve the PYUSD and GHO liquidity. + +## Motivation + +Trident Digital with support from PayPal, presents the Aave DAO with an opportunity to promote the adoption of PYUSD on Aave Protocol and PYUSD/GHO liquidity on Balancer for an initial 6 month period. + +Eligible Aave Protocol users are expected to receive up to 4.00% APR in Liquidity Mining (LM) rewards made available by Trident Digital on behalf of PayPal. The PYUSD reserve on Aave v3 is to be adjusted to align with the objectives of the PYUSD incentive campaign. Further details can be found on the governance forum. + +### PYUSD/GHO Liquidity + +As part of the PYUSD growth iniative, a 8M PYUSD/GHO Elliptic Liquidity Pool (ECLP) with an asymmetric concentrated liquidity profile will be used on Balancer. + +The pool will be funded and supported for an initial 6 month period with an additional 300k GHO made available to the ALC. + +## Specification + +The following PYUSD Reserve parameters are to be updated: + +| Parameter | PYUSD | +| ------------------------ | ------ | +| Borrowable | Yes | +| Collateral | Yes | +| Borrow Cap | 15M | +| LTV | 75.00% | +| LT | 78.00% | +| Liquidation Penalty | 7.50% | +| Liquidation Protocol Fee | 10.00% | + +Create 300k GHO Allowance for the ALC SAFE. + +ALC SAFE: `0xA1c93D2687f7014Aaf588c764E3Ce80aF016229b` +GHO: `0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f` + +Whilst not expected to be needed, in case aEthPYUSD Liquidity Mining rewards are to be distributed across Aave v3, the ACI is to be granted sufficient permission to do so. + +EMISSION_MANAGER.setEmissionAdmin(`PYUSD`,`ACI Treasury`) +EMISSION_MANAGER.setEmissionAdmin(`aEthPYUSD`,`ACI Treasury`) + +PYUSD: `0x6c3ea9036406852006290770BEdFcAbA0e23A0e8` +aEthPYUSD: `0x0C0d01AbF3e6aDfcA0989eBbA9d6e85dD58EaB1E` +ACI Treasury: `0xac140648435d03f784879cd789130F22Ef588Fcd` + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/b1d68042df145fd28071478bad0c980a835af5d4/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/b1d68042df145fd28071478bad0c980a835af5d4/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.t.sol) +- [Snapshot](https://snapshot.org/#/aave.eth/proposal/0xcd73f17361c7757cd94ec758b4d9f160b7cecefa7f4cb23b0b4ee49b5eb1b8b2) +- [Discussion](https://governance.aave.com/t/arfc-pyusd-reserve-configuration-update-incentive-campaign/19573) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.s.sol b/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.s.sol new file mode 100644 index 000000000..17200fd3f --- /dev/null +++ b/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.s.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031} from './AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031).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/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031.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_PYUSDReserveConfigurationUpdateIncentiveCampaign_20241031).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/PYUSDReserveConfigurationUpdateIncentiveCampaign.md' + ) + ); + } +} diff --git a/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/config.ts b/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/config.ts new file mode 100644 index 000000000..8b1e37273 --- /dev/null +++ b/src/20241031_AaveV3Ethereum_PYUSDReserveConfigurationUpdateIncentiveCampaign/config.ts @@ -0,0 +1,33 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3Ethereum'], + title: 'PYUSD Reserve Configuration Update & Incentive Campaign', + shortName: 'PYUSDReserveConfigurationUpdateIncentiveCampaign', + date: '20241031', + author: 'karpatkey_TokenLogic', + discussion: + 'https://governance.aave.com/t/arfc-pyusd-reserve-configuration-update-incentive-campaign/19573', + snapshot: + 'https://snapshot.org/#/aave.eth/proposal/0xcd73f17361c7757cd94ec758b4d9f160b7cecefa7f4cb23b0b4ee49b5eb1b8b2', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Ethereum: { + configs: { + CAPS_UPDATE: [{asset: 'PYUSD', supplyCap: '', borrowCap: '15000000'}], + COLLATERALS_UPDATE: [ + { + asset: 'PYUSD', + ltv: '75', + liqThreshold: '78', + liqBonus: '7.5', + debtCeiling: '', + liqProtocolFee: '10', + }, + ], + }, + cache: {blockNumber: 21085967}, + }, + }, +}; diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Arbitrum_UpdatePriceCapAdaptersCAPO_20241101.sol b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Arbitrum_UpdatePriceCapAdaptersCAPO_20241101.sol new file mode 100644 index 000000000..2af31246d --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Arbitrum_UpdatePriceCapAdaptersCAPO_20241101.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3PayloadArbitrum} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadArbitrum.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {AaveV3Arbitrum, AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol'; +import {PriceFeeds} from './Constants.sol'; + +/** + * @title Update Price Cap Adapters (CAPO) + * @author BGD Labs (@bgdlabs) + * - Discussion: https://governance.aave.com/t/technical-maintenance-proposals/15274/55 + */ +contract AaveV3Arbitrum_UpdatePriceCapAdaptersCAPO_20241101 is AaveV3PayloadArbitrum { + function priceFeedsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.PriceFeedUpdate[] memory) + { + IAaveV3ConfigEngine.PriceFeedUpdate[] + memory feedsUpdate = new IAaveV3ConfigEngine.PriceFeedUpdate[](7); + + feedsUpdate[0] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3ArbitrumAssets.USDC_UNDERLYING, + priceFeed: PriceFeeds.ARBITRUM_V3_USDC_FEED + }); + feedsUpdate[1] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3ArbitrumAssets.USDCn_UNDERLYING, + priceFeed: PriceFeeds.ARBITRUM_V3_USDC_FEED + }); + feedsUpdate[2] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3ArbitrumAssets.USDT_UNDERLYING, + priceFeed: PriceFeeds.ARBITRUM_V3_USDT_FEED + }); + feedsUpdate[3] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3ArbitrumAssets.DAI_UNDERLYING, + priceFeed: PriceFeeds.ARBITRUM_V3_DAI_FEED + }); + feedsUpdate[4] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3ArbitrumAssets.MAI_UNDERLYING, + priceFeed: PriceFeeds.ARBITRUM_V3_MAI_FEED + }); + feedsUpdate[5] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3ArbitrumAssets.LUSD_UNDERLYING, + priceFeed: PriceFeeds.ARBITRUM_V3_LUSD_FEED + }); + feedsUpdate[6] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3ArbitrumAssets.FRAX_UNDERLYING, + priceFeed: PriceFeeds.ARBITRUM_V3_FRAX_FEED + }); + + return feedsUpdate; + } +} diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Arbitrum_UpdatePriceCapAdaptersCAPO_20241101.t.sol b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Arbitrum_UpdatePriceCapAdaptersCAPO_20241101.t.sol new file mode 100644 index 000000000..ce709bdb0 --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Arbitrum_UpdatePriceCapAdaptersCAPO_20241101.t.sol @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Arbitrum, AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Arbitrum_UpdatePriceCapAdaptersCAPO_20241101} from './AaveV3Arbitrum_UpdatePriceCapAdaptersCAPO_20241101.sol'; +import {BasePayloadUSDFeedTest} from './BasePayloadUSDFeedTest.sol'; +import {PriceFeeds} from './Constants.sol'; + +/** + * @dev Test for AaveV3Arbitrum_UpdatePriceCapAdaptersCAPO_20241101 + * command: FOUNDRY_PROFILE=arbitrum forge test --match-path=src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Arbitrum_UpdatePriceCapAdaptersCAPO_20241101.t.sol -vv + */ +contract AaveV3Arbitrum_UpdatePriceCapAdaptersCAPO_20241101_Test is + BasePayloadUSDFeedTest, + ProtocolV3TestBase +{ + AaveV3Arbitrum_UpdatePriceCapAdaptersCAPO_20241101 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('arbitrum'), 285287812); + proposal = new AaveV3Arbitrum_UpdatePriceCapAdaptersCAPO_20241101(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Arbitrum_UpdatePriceCapAdaptersCAPO_20241101', + AaveV3Arbitrum.POOL, + address(proposal) + ); + } + + function test_priceFeeds() public { + executePayload(vm, address(proposal)); + + _validateUSDPriceFeed( + AaveV3ArbitrumAssets.USDC_UNDERLYING, + AaveV3ArbitrumAssets.USDC_ORACLE, + PriceFeeds.ARBITRUM_V3_USDC_FEED + ); + _validateUSDPriceFeed( + AaveV3ArbitrumAssets.USDCn_UNDERLYING, + AaveV3ArbitrumAssets.USDC_ORACLE, + PriceFeeds.ARBITRUM_V3_USDC_FEED + ); + _validateUSDPriceFeed( + AaveV3ArbitrumAssets.USDT_UNDERLYING, + AaveV3ArbitrumAssets.USDT_ORACLE, + PriceFeeds.ARBITRUM_V3_USDT_FEED + ); + _validateUSDPriceFeed( + AaveV3ArbitrumAssets.DAI_UNDERLYING, + AaveV3ArbitrumAssets.DAI_ORACLE, + PriceFeeds.ARBITRUM_V3_DAI_FEED + ); + _validateUSDPriceFeed( + AaveV3ArbitrumAssets.MAI_UNDERLYING, + AaveV3ArbitrumAssets.MAI_ORACLE, + PriceFeeds.ARBITRUM_V3_MAI_FEED + ); + _validateUSDPriceFeed( + AaveV3ArbitrumAssets.LUSD_UNDERLYING, + AaveV3ArbitrumAssets.LUSD_ORACLE, + PriceFeeds.ARBITRUM_V3_LUSD_FEED + ); + _validateUSDPriceFeed( + AaveV3ArbitrumAssets.FRAX_UNDERLYING, + AaveV3ArbitrumAssets.FRAX_ORACLE, + PriceFeeds.ARBITRUM_V3_FRAX_FEED + ); + } + + function getAaveOracle() public virtual override returns (address) { + return address(AaveV3Arbitrum.ORACLE); + } +} diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Avalanche_UpdatePriceCapAdaptersCAPO_20241101.sol b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Avalanche_UpdatePriceCapAdaptersCAPO_20241101.sol new file mode 100644 index 000000000..97c6c8dfb --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Avalanche_UpdatePriceCapAdaptersCAPO_20241101.sol @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3PayloadAvalanche} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadAvalanche.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {AaveV3Avalanche, AaveV3AvalancheAssets} from 'aave-address-book/AaveV3Avalanche.sol'; +import {AaveV2Avalanche, AaveV2AvalancheAssets} from 'aave-address-book/AaveV2Avalanche.sol'; +import {PriceFeeds} from './Constants.sol'; + +/** + * @title Update Price Cap Adapters (CAPO) + * @author BGD Labs (@bgdlabs) + * - Discussion: https://governance.aave.com/t/technical-maintenance-proposals/15274/55 + */ +contract AaveV3Avalanche_UpdatePriceCapAdaptersCAPO_20241101 is AaveV3PayloadAvalanche { + function _postExecute() internal override { + _updateV2PriceAdapters(); + } + + function priceFeedsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.PriceFeedUpdate[] memory) + { + IAaveV3ConfigEngine.PriceFeedUpdate[] + memory feedsUpdate = new IAaveV3ConfigEngine.PriceFeedUpdate[](5); + + feedsUpdate[0] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3AvalancheAssets.USDC_UNDERLYING, + priceFeed: PriceFeeds.AVALANCHE_V3_USDC_FEED + }); + feedsUpdate[1] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3AvalancheAssets.USDt_UNDERLYING, + priceFeed: PriceFeeds.AVALANCHE_V3_USDT_FEED + }); + feedsUpdate[2] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3AvalancheAssets.DAIe_UNDERLYING, + priceFeed: PriceFeeds.AVALANCHE_V3_DAI_FEED + }); + feedsUpdate[3] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3AvalancheAssets.FRAX_UNDERLYING, + priceFeed: PriceFeeds.AVALANCHE_V3_FRAX_FEED + }); + feedsUpdate[4] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3AvalancheAssets.MAI_UNDERLYING, + priceFeed: PriceFeeds.AVALANCHE_V3_MAI_FEED + }); + + return feedsUpdate; + } + + function _updateV2PriceAdapters() internal { + address[] memory assets = new address[](3); + address[] memory sources = new address[](3); + + assets[0] = AaveV2AvalancheAssets.USDCe_UNDERLYING; + sources[0] = PriceFeeds.AVALANCHE_V3_USDC_FEED; + + assets[1] = AaveV2AvalancheAssets.USDTe_UNDERLYING; + sources[1] = PriceFeeds.AVALANCHE_V3_USDT_FEED; + + assets[2] = AaveV2AvalancheAssets.DAIe_UNDERLYING; + sources[2] = PriceFeeds.AVALANCHE_V3_DAI_FEED; + + AaveV2Avalanche.ORACLE.setAssetSources(assets, sources); + } +} diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Avalanche_UpdatePriceCapAdaptersCAPO_20241101.t.sol b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Avalanche_UpdatePriceCapAdaptersCAPO_20241101.t.sol new file mode 100644 index 000000000..1bfd0917f --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Avalanche_UpdatePriceCapAdaptersCAPO_20241101.t.sol @@ -0,0 +1,93 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Avalanche, AaveV3AvalancheAssets} from 'aave-address-book/AaveV3Avalanche.sol'; +import {AaveV2Avalanche, AaveV2AvalancheAssets} from 'aave-address-book/AaveV2Avalanche.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Avalanche_UpdatePriceCapAdaptersCAPO_20241101} from './AaveV3Avalanche_UpdatePriceCapAdaptersCAPO_20241101.sol'; +import {BasePayloadUSDFeedTest} from './BasePayloadUSDFeedTest.sol'; +import {PriceFeeds} from './Constants.sol'; + +/** + * @dev Test for AaveV3Avalanche_UpdatePriceCapAdaptersCAPO_20241101 + * command: FOUNDRY_PROFILE=avalanche forge test --match-path=src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Avalanche_UpdatePriceCapAdaptersCAPO_20241101.t.sol -vv + */ +contract AaveV3Avalanche_UpdatePriceCapAdaptersCAPO_20241101_Test is + BasePayloadUSDFeedTest, + ProtocolV3TestBase +{ + AaveV3Avalanche_UpdatePriceCapAdaptersCAPO_20241101 internal proposal; + bool switchToV2Oracle; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('avalanche'), 54411933); + proposal = new AaveV3Avalanche_UpdatePriceCapAdaptersCAPO_20241101(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Avalanche_UpdatePriceCapAdaptersCAPO_20241101', + AaveV3Avalanche.POOL, + address(proposal) + ); + } + + function test_priceFeeds() public { + executePayload(vm, address(proposal)); + + _validateUSDPriceFeed( + AaveV3AvalancheAssets.USDC_UNDERLYING, + AaveV3AvalancheAssets.USDC_ORACLE, + PriceFeeds.AVALANCHE_V3_USDC_FEED + ); + _validateUSDPriceFeed( + AaveV3AvalancheAssets.USDt_UNDERLYING, + AaveV3AvalancheAssets.USDt_ORACLE, + PriceFeeds.AVALANCHE_V3_USDT_FEED + ); + _validateUSDPriceFeed( + AaveV3AvalancheAssets.DAIe_UNDERLYING, + AaveV3AvalancheAssets.DAIe_ORACLE, + PriceFeeds.AVALANCHE_V3_DAI_FEED + ); + _validateUSDPriceFeed( + AaveV3AvalancheAssets.FRAX_UNDERLYING, + AaveV3AvalancheAssets.FRAX_ORACLE, + PriceFeeds.AVALANCHE_V3_FRAX_FEED + ); + _validateUSDPriceFeed( + AaveV3AvalancheAssets.MAI_UNDERLYING, + AaveV3AvalancheAssets.MAI_ORACLE, + PriceFeeds.AVALANCHE_V3_MAI_FEED + ); + + switchToV2Oracle = true; + + _validateUSDPriceFeed( + AaveV2AvalancheAssets.USDCe_UNDERLYING, + AaveV2AvalancheAssets.USDCe_ORACLE, + PriceFeeds.AVALANCHE_V3_USDC_FEED // assetToPeg feed is the same as v3 + ); + _validateUSDPriceFeed( + AaveV2AvalancheAssets.USDTe_UNDERLYING, + AaveV2AvalancheAssets.USDTe_ORACLE, + PriceFeeds.AVALANCHE_V3_USDT_FEED + ); + _validateUSDPriceFeed( + AaveV2AvalancheAssets.DAIe_UNDERLYING, + AaveV2AvalancheAssets.DAIe_ORACLE, + PriceFeeds.AVALANCHE_V3_DAI_FEED + ); + } + + function getAaveOracle() public virtual override returns (address) { + if (switchToV2Oracle) { + return address(AaveV2Avalanche.ORACLE); + } else { + return address(AaveV3Avalanche.ORACLE); + } + } +} diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3BNB_UpdatePriceCapAdaptersCAPO_20241101.sol b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3BNB_UpdatePriceCapAdaptersCAPO_20241101.sol new file mode 100644 index 000000000..e61be0283 --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3BNB_UpdatePriceCapAdaptersCAPO_20241101.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3PayloadBNB} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadBNB.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {AaveV3BNB, AaveV3BNBAssets} from 'aave-address-book/AaveV3BNB.sol'; +import {PriceFeeds} from './Constants.sol'; + +/** + * @title Update Price Cap Adapters (CAPO) + * @author BGD Labs (@bgdlabs) + * - Discussion: https://governance.aave.com/t/technical-maintenance-proposals/15274/55 + */ +contract AaveV3BNB_UpdatePriceCapAdaptersCAPO_20241101 is AaveV3PayloadBNB { + function priceFeedsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.PriceFeedUpdate[] memory) + { + IAaveV3ConfigEngine.PriceFeedUpdate[] + memory feedsUpdate = new IAaveV3ConfigEngine.PriceFeedUpdate[](3); + + feedsUpdate[0] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3BNBAssets.USDC_UNDERLYING, + priceFeed: PriceFeeds.BNB_V3_USDC_FEED + }); + feedsUpdate[1] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3BNBAssets.USDT_UNDERLYING, + priceFeed: PriceFeeds.BNB_V3_USDT_FEED + }); + feedsUpdate[2] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3BNBAssets.FDUSD_UNDERLYING, + priceFeed: PriceFeeds.BNB_V3_FDUSD_FEED + }); + + return feedsUpdate; + } +} diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3BNB_UpdatePriceCapAdaptersCAPO_20241101.t.sol b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3BNB_UpdatePriceCapAdaptersCAPO_20241101.t.sol new file mode 100644 index 000000000..28a71414f --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3BNB_UpdatePriceCapAdaptersCAPO_20241101.t.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3BNB, AaveV3BNBAssets} from 'aave-address-book/AaveV3BNB.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3BNB_UpdatePriceCapAdaptersCAPO_20241101} from './AaveV3BNB_UpdatePriceCapAdaptersCAPO_20241101.sol'; +import {BasePayloadUSDFeedTest} from './BasePayloadUSDFeedTest.sol'; +import {PriceFeeds} from './Constants.sol'; + +/** + * @dev Test for AaveV3BNB_UpdatePriceCapAdaptersCAPO_20241101 + * command: FOUNDRY_PROFILE=bnb forge test --match-path=src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3BNB_UpdatePriceCapAdaptersCAPO_20241101.t.sol -vv + */ +contract AaveV3BNB_UpdatePriceCapAdaptersCAPO_20241101_Test is + BasePayloadUSDFeedTest, + ProtocolV3TestBase +{ + AaveV3BNB_UpdatePriceCapAdaptersCAPO_20241101 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('bnb'), 44917997); + proposal = new AaveV3BNB_UpdatePriceCapAdaptersCAPO_20241101(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest('AaveV3BNB_UpdatePriceCapAdaptersCAPO_20241101', AaveV3BNB.POOL, address(proposal)); + } + + function test_priceFeeds() public { + executePayload(vm, address(proposal)); + + _validateUSDPriceFeed( + AaveV3BNBAssets.USDC_UNDERLYING, + AaveV3BNBAssets.USDC_ORACLE, + PriceFeeds.BNB_V3_USDC_FEED + ); + _validateUSDPriceFeed( + AaveV3BNBAssets.USDT_UNDERLYING, + AaveV3BNBAssets.USDT_ORACLE, + PriceFeeds.BNB_V3_USDT_FEED + ); + _validateUSDPriceFeed( + AaveV3BNBAssets.FDUSD_UNDERLYING, + AaveV3BNBAssets.FDUSD_ORACLE, + PriceFeeds.BNB_V3_FDUSD_FEED + ); + } + + function getAaveOracle() public virtual override returns (address) { + return address(AaveV3BNB.ORACLE); + } +} diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Base_UpdatePriceCapAdaptersCAPO_20241101.sol b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Base_UpdatePriceCapAdaptersCAPO_20241101.sol new file mode 100644 index 000000000..09484e865 --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Base_UpdatePriceCapAdaptersCAPO_20241101.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3PayloadBase} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadBase.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {AaveV3Base, AaveV3BaseAssets} from 'aave-address-book/AaveV3Base.sol'; +import {PriceFeeds} from './Constants.sol'; + +/** + * @title Update Price Cap Adapters (CAPO) + * @author BGD Labs (@bgdlabs) + * - Discussion: https://governance.aave.com/t/technical-maintenance-proposals/15274/55 + */ +contract AaveV3Base_UpdatePriceCapAdaptersCAPO_20241101 is AaveV3PayloadBase { + function priceFeedsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.PriceFeedUpdate[] memory) + { + IAaveV3ConfigEngine.PriceFeedUpdate[] + memory feedsUpdate = new IAaveV3ConfigEngine.PriceFeedUpdate[](2); + + feedsUpdate[0] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3BaseAssets.USDC_UNDERLYING, + priceFeed: PriceFeeds.BASE_V3_USDC_FEED + }); + feedsUpdate[1] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3BaseAssets.USDbC_UNDERLYING, + priceFeed: PriceFeeds.BASE_V3_USDC_FEED + }); + + return feedsUpdate; + } +} diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Base_UpdatePriceCapAdaptersCAPO_20241101.t.sol b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Base_UpdatePriceCapAdaptersCAPO_20241101.t.sol new file mode 100644 index 000000000..720269e04 --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Base_UpdatePriceCapAdaptersCAPO_20241101.t.sol @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Base, AaveV3BaseAssets} from 'aave-address-book/AaveV3Base.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Base_UpdatePriceCapAdaptersCAPO_20241101} from './AaveV3Base_UpdatePriceCapAdaptersCAPO_20241101.sol'; +import {BasePayloadUSDFeedTest} from './BasePayloadUSDFeedTest.sol'; +import {PriceFeeds} from './Constants.sol'; + +/** + * @dev Test for AaveV3Base_UpdatePriceCapAdaptersCAPO_20241101 + * command: FOUNDRY_PROFILE=base forge test --match-path=src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Base_UpdatePriceCapAdaptersCAPO_20241101.t.sol -vv + */ +contract AaveV3Base_UpdatePriceCapAdaptersCAPO_20241101_Test is + BasePayloadUSDFeedTest, + ProtocolV3TestBase +{ + AaveV3Base_UpdatePriceCapAdaptersCAPO_20241101 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('base'), 23772801); + proposal = new AaveV3Base_UpdatePriceCapAdaptersCAPO_20241101(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Base_UpdatePriceCapAdaptersCAPO_20241101', + AaveV3Base.POOL, + address(proposal) + ); + } + + function test_priceFeeds() public { + executePayload(vm, address(proposal)); + + _validateUSDPriceFeed( + AaveV3BaseAssets.USDC_UNDERLYING, + AaveV3BaseAssets.USDC_ORACLE, + PriceFeeds.BASE_V3_USDC_FEED + ); + _validateUSDPriceFeed( + AaveV3BaseAssets.USDbC_UNDERLYING, + AaveV3BaseAssets.USDC_ORACLE, + PriceFeeds.BASE_V3_USDC_FEED + ); + } + + function getAaveOracle() public virtual override returns (address) { + return address(AaveV3Base.ORACLE); + } +} diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3EthereumEtherFi_UpdatePriceCapAdaptersCAPO_20241101.sol b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3EthereumEtherFi_UpdatePriceCapAdaptersCAPO_20241101.sol new file mode 100644 index 000000000..ada70c2ce --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3EthereumEtherFi_UpdatePriceCapAdaptersCAPO_20241101.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3PayloadEthereumEtherFi} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereumEtherFi.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {AaveV3EthereumEtherFiAssets} from 'aave-address-book/AaveV3EthereumEtherFi.sol'; +import {PriceFeeds} from './Constants.sol'; + +/** + * @title Update Price Cap Adapters (CAPO) + * @author BGD Labs (@bgdlabs) + * - Discussion: https://governance.aave.com/t/technical-maintenance-proposals/15274/55 + */ +contract AaveV3EthereumEtherFi_UpdatePriceCapAdaptersCAPO_20241101 is AaveV3PayloadEthereumEtherFi { + function priceFeedsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.PriceFeedUpdate[] memory) + { + IAaveV3ConfigEngine.PriceFeedUpdate[] + memory feedsUpdate = new IAaveV3ConfigEngine.PriceFeedUpdate[](3); + + feedsUpdate[0] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3EthereumEtherFiAssets.USDC_UNDERLYING, + priceFeed: PriceFeeds.ETHEREUM_V3_USDC_FEED + }); + feedsUpdate[1] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3EthereumEtherFiAssets.PYUSD_UNDERLYING, + priceFeed: PriceFeeds.ETHEREUM_V3_PYUSD_FEED + }); + feedsUpdate[2] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3EthereumEtherFiAssets.FRAX_UNDERLYING, + priceFeed: PriceFeeds.ETHEREUM_V3_FRAX_FEED + }); + + return feedsUpdate; + } +} diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3EthereumEtherFi_UpdatePriceCapAdaptersCAPO_20241101.t.sol b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3EthereumEtherFi_UpdatePriceCapAdaptersCAPO_20241101.t.sol new file mode 100644 index 000000000..43c2115ea --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3EthereumEtherFi_UpdatePriceCapAdaptersCAPO_20241101.t.sol @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumEtherFi, AaveV3EthereumEtherFiAssets} from 'aave-address-book/AaveV3EthereumEtherFi.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3EthereumEtherFi_UpdatePriceCapAdaptersCAPO_20241101} from './AaveV3EthereumEtherFi_UpdatePriceCapAdaptersCAPO_20241101.sol'; +import {PriceFeeds} from './Constants.sol'; +import {BasePayloadUSDFeedTest} from './BasePayloadUSDFeedTest.sol'; + +/** + * @dev Test for AaveV3EthereumEtherFi_UpdatePriceCapAdaptersCAPO_20241101 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3EthereumEtherFi_UpdatePriceCapAdaptersCAPO_20241101.t.sol -vv + */ +contract AaveV3EthereumEtherFi_UpdatePriceCapAdaptersCAPO_20241101_Test is + BasePayloadUSDFeedTest, + ProtocolV3TestBase +{ + AaveV3EthereumEtherFi_UpdatePriceCapAdaptersCAPO_20241101 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21413537); + proposal = new AaveV3EthereumEtherFi_UpdatePriceCapAdaptersCAPO_20241101(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3EthereumEtherFi_UpdatePriceCapAdaptersCAPO_20241101', + AaveV3EthereumEtherFi.POOL, + address(proposal) + ); + } + + function test_priceFeeds() public { + executePayload(vm, address(proposal)); + + _validateUSDPriceFeed( + AaveV3EthereumEtherFiAssets.USDC_UNDERLYING, + AaveV3EthereumEtherFiAssets.USDC_ORACLE, + PriceFeeds.ETHEREUM_V3_USDC_FEED + ); + _validateUSDPriceFeed( + AaveV3EthereumEtherFiAssets.PYUSD_UNDERLYING, + AaveV3EthereumEtherFiAssets.PYUSD_ORACLE, + PriceFeeds.ETHEREUM_V3_PYUSD_FEED + ); + _validateUSDPriceFeed( + AaveV3EthereumEtherFiAssets.FRAX_UNDERLYING, + AaveV3EthereumEtherFiAssets.FRAX_ORACLE, + PriceFeeds.ETHEREUM_V3_FRAX_FEED + ); + } + + function getAaveOracle() public virtual override returns (address) { + return address(AaveV3EthereumEtherFi.ORACLE); + } +} diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3EthereumLido_UpdatePriceCapAdaptersCAPO_20241101.sol b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3EthereumLido_UpdatePriceCapAdaptersCAPO_20241101.sol new file mode 100644 index 000000000..932697083 --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3EthereumLido_UpdatePriceCapAdaptersCAPO_20241101.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3PayloadEthereumLido} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereumLido.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {AaveV3EthereumLidoAssets} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {PriceFeeds} from './Constants.sol'; + +/** + * @title Update Price Cap Adapters (CAPO) + * @author BGD Labs (@bgdlabs) + * - Discussion: https://governance.aave.com/t/technical-maintenance-proposals/15274/55 + */ +contract AaveV3EthereumLido_UpdatePriceCapAdaptersCAPO_20241101 is AaveV3PayloadEthereumLido { + function priceFeedsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.PriceFeedUpdate[] memory) + { + IAaveV3ConfigEngine.PriceFeedUpdate[] + memory feedsUpdate = new IAaveV3ConfigEngine.PriceFeedUpdate[](2); + + feedsUpdate[0] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3EthereumLidoAssets.USDC_UNDERLYING, + priceFeed: PriceFeeds.ETHEREUM_V3_USDC_FEED + }); + feedsUpdate[1] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3EthereumLidoAssets.USDS_UNDERLYING, + priceFeed: PriceFeeds.ETHEREUM_V3_USDS_FEED + }); + + return feedsUpdate; + } +} diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3EthereumLido_UpdatePriceCapAdaptersCAPO_20241101.t.sol b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3EthereumLido_UpdatePriceCapAdaptersCAPO_20241101.t.sol new file mode 100644 index 000000000..3dc5cbccf --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3EthereumLido_UpdatePriceCapAdaptersCAPO_20241101.t.sol @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumLido, AaveV3EthereumLidoAssets} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3EthereumLido_UpdatePriceCapAdaptersCAPO_20241101} from './AaveV3EthereumLido_UpdatePriceCapAdaptersCAPO_20241101.sol'; +import {PriceFeeds} from './Constants.sol'; +import {BasePayloadUSDFeedTest} from './BasePayloadUSDFeedTest.sol'; + +/** + * @dev Test for AaveV3EthereumLido_UpdatePriceCapAdaptersCAPO_20241101 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3EthereumLido_UpdatePriceCapAdaptersCAPO_20241101.t.sol -vv + */ +contract AaveV3EthereumLido_UpdatePriceCapAdaptersCAPO_20241101_Test is + BasePayloadUSDFeedTest, + ProtocolV3TestBase +{ + AaveV3EthereumLido_UpdatePriceCapAdaptersCAPO_20241101 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21413537); + proposal = new AaveV3EthereumLido_UpdatePriceCapAdaptersCAPO_20241101(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3EthereumLido_UpdatePriceCapAdaptersCAPO_20241101', + AaveV3EthereumLido.POOL, + address(proposal) + ); + } + + function test_priceFeeds() public { + executePayload(vm, address(proposal)); + + _validateUSDPriceFeed( + AaveV3EthereumLidoAssets.USDC_UNDERLYING, + AaveV3EthereumLidoAssets.USDC_ORACLE, + PriceFeeds.ETHEREUM_V3_USDC_FEED + ); + _validateUSDPriceFeed( + AaveV3EthereumLidoAssets.USDS_UNDERLYING, + AaveV3EthereumLidoAssets.USDS_ORACLE, + PriceFeeds.ETHEREUM_V3_USDS_FEED + ); + } + + function getAaveOracle() public virtual override returns (address) { + return address(AaveV3EthereumLido.ORACLE); + } +} diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Ethereum_UpdatePriceCapAdaptersCAPO_20241101.sol b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Ethereum_UpdatePriceCapAdaptersCAPO_20241101.sol new file mode 100644 index 000000000..789210aba --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Ethereum_UpdatePriceCapAdaptersCAPO_20241101.sol @@ -0,0 +1,105 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3PayloadEthereum} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereum.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV2Ethereum, AaveV2EthereumAssets} from 'aave-address-book/AaveV2Ethereum.sol'; +import {PriceFeeds} from './Constants.sol'; + +/** + * @title Update Price Cap Adapters (CAPO) + * @author BGD Labs (@bgdlabs) + * - Discussion: https://governance.aave.com/t/technical-maintenance-proposals/15274/55 + */ +contract AaveV3Ethereum_UpdatePriceCapAdaptersCAPO_20241101 is AaveV3PayloadEthereum { + function _postExecute() internal override { + _updateV2PriceAdapters(); + } + + function priceFeedsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.PriceFeedUpdate[] memory) + { + IAaveV3ConfigEngine.PriceFeedUpdate[] + memory feedsUpdate = new IAaveV3ConfigEngine.PriceFeedUpdate[](9); + + feedsUpdate[0] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3EthereumAssets.USDC_UNDERLYING, + priceFeed: PriceFeeds.ETHEREUM_V3_USDC_FEED + }); + feedsUpdate[1] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3EthereumAssets.USDT_UNDERLYING, + priceFeed: PriceFeeds.ETHEREUM_V3_USDT_FEED + }); + feedsUpdate[2] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3EthereumAssets.DAI_UNDERLYING, + priceFeed: PriceFeeds.ETHEREUM_V3_DAI_FEED + }); + feedsUpdate[3] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3EthereumAssets.LUSD_UNDERLYING, + priceFeed: PriceFeeds.ETHEREUM_V3_LUSD_FEED + }); + feedsUpdate[4] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3EthereumAssets.FRAX_UNDERLYING, + priceFeed: PriceFeeds.ETHEREUM_V3_FRAX_FEED + }); + feedsUpdate[5] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3EthereumAssets.crvUSD_UNDERLYING, + priceFeed: PriceFeeds.ETHEREUM_V3_CRVUSD_FEED + }); + feedsUpdate[6] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3EthereumAssets.PYUSD_UNDERLYING, + priceFeed: PriceFeeds.ETHEREUM_V3_PYUSD_FEED + }); + feedsUpdate[7] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3EthereumAssets.sDAI_UNDERLYING, + priceFeed: PriceFeeds.ETHEREUM_V3_SDAI_FEED + }); + feedsUpdate[8] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3EthereumAssets.USDS_UNDERLYING, + priceFeed: PriceFeeds.ETHEREUM_V3_USDS_FEED + }); + + return feedsUpdate; + } + + function _updateV2PriceAdapters() internal { + address[] memory assets = new address[](10); + address[] memory sources = new address[](10); + + assets[0] = AaveV2EthereumAssets.USDC_UNDERLYING; + sources[0] = PriceFeeds.ETHEREUM_V2_USDC_FEED; + + assets[1] = AaveV2EthereumAssets.USDT_UNDERLYING; + sources[1] = PriceFeeds.ETHEREUM_V2_USDT_FEED; + + assets[2] = AaveV2EthereumAssets.DAI_UNDERLYING; + sources[2] = PriceFeeds.ETHEREUM_V2_DAI_FEED; + + assets[3] = AaveV2EthereumAssets.FRAX_UNDERLYING; + sources[3] = PriceFeeds.ETHEREUM_V2_FRAX_FEED; + + assets[4] = AaveV2EthereumAssets.LUSD_UNDERLYING; + sources[4] = PriceFeeds.ETHEREUM_V2_LUSD_FEED; + + assets[5] = AaveV2EthereumAssets.USDP_UNDERLYING; + sources[5] = PriceFeeds.ETHEREUM_V2_USDP_FEED; + + assets[6] = AaveV2EthereumAssets.sUSD_UNDERLYING; + sources[6] = PriceFeeds.ETHEREUM_V2_SUSD_FEED; + + assets[7] = AaveV2EthereumAssets.BUSD_UNDERLYING; + sources[7] = PriceFeeds.ETHEREUM_V2_BUSD_FEED; + + assets[8] = AaveV2EthereumAssets.TUSD_UNDERLYING; + sources[8] = PriceFeeds.ETHEREUM_V2_TUSD_FEED; + + assets[9] = AaveV2EthereumAssets.UST_UNDERLYING; + sources[9] = PriceFeeds.ETHEREUM_V2_UST_FEED; + + AaveV2Ethereum.ORACLE.setAssetSources(assets, sources); + } +} diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Ethereum_UpdatePriceCapAdaptersCAPO_20241101.t.sol b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Ethereum_UpdatePriceCapAdaptersCAPO_20241101.t.sol new file mode 100644 index 000000000..23788b9a4 --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Ethereum_UpdatePriceCapAdaptersCAPO_20241101.t.sol @@ -0,0 +1,166 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV2Ethereum, AaveV2EthereumAssets} from 'aave-address-book/AaveV2Ethereum.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Ethereum_UpdatePriceCapAdaptersCAPO_20241101} from './AaveV3Ethereum_UpdatePriceCapAdaptersCAPO_20241101.sol'; +import {PriceFeeds} from './Constants.sol'; +import {BasePayloadUSDFeedTest} from './BasePayloadUSDFeedTest.sol'; +import {BasePayloadETHFeedTest} from './BasePayloadETHFeedTest.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; + +/** + * @dev Test for AaveV3Ethereum_UpdatePriceCapAdaptersCAPO_20241101 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Ethereum_UpdatePriceCapAdaptersCAPO_20241101.t.sol -vv + */ +contract AaveV3Ethereum_UpdatePriceCapAdaptersCAPO_20241101_Test is + BasePayloadUSDFeedTest, + BasePayloadETHFeedTest, + ProtocolV3TestBase +{ + AaveV3Ethereum_UpdatePriceCapAdaptersCAPO_20241101 internal proposal; + bool switchToV2Oracle; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21413537); + proposal = new AaveV3Ethereum_UpdatePriceCapAdaptersCAPO_20241101(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_UpdatePriceCapAdaptersCAPO_20241101', + AaveV3Ethereum.POOL, + address(proposal) + ); + } + + function test_priceFeeds() public { + executePayload(vm, address(proposal)); + + _validateUSDPriceFeed( + AaveV3EthereumAssets.USDC_UNDERLYING, + AaveV3EthereumAssets.USDC_ORACLE, + PriceFeeds.ETHEREUM_V3_USDC_FEED + ); + _validateUSDPriceFeed( + AaveV3EthereumAssets.USDT_UNDERLYING, + AaveV3EthereumAssets.USDT_ORACLE, + PriceFeeds.ETHEREUM_V3_USDT_FEED + ); + _validateUSDPriceFeed( + AaveV3EthereumAssets.DAI_UNDERLYING, + AaveV3EthereumAssets.DAI_ORACLE, + PriceFeeds.ETHEREUM_V3_DAI_FEED + ); + _validateUSDPriceFeed( + AaveV3EthereumAssets.LUSD_UNDERLYING, + AaveV3EthereumAssets.LUSD_ORACLE, + PriceFeeds.ETHEREUM_V3_LUSD_FEED + ); + _validateUSDPriceFeed( + AaveV3EthereumAssets.FRAX_UNDERLYING, + AaveV3EthereumAssets.FRAX_ORACLE, + PriceFeeds.ETHEREUM_V3_FRAX_FEED + ); + _validateUSDPriceFeed( + AaveV3EthereumAssets.crvUSD_UNDERLYING, + AaveV3EthereumAssets.crvUSD_ORACLE, + PriceFeeds.ETHEREUM_V3_CRVUSD_FEED + ); + _validateUSDPriceFeed( + AaveV3EthereumAssets.PYUSD_UNDERLYING, + AaveV3EthereumAssets.PYUSD_ORACLE, + PriceFeeds.ETHEREUM_V3_PYUSD_FEED + ); + _validateUSDPriceFeed( + AaveV3EthereumAssets.sDAI_UNDERLYING, + AaveV3EthereumAssets.sDAI_ORACLE, + PriceFeeds.ETHEREUM_V3_SDAI_FEED + ); + _validateUSDPriceFeed( + AaveV3EthereumAssets.USDS_UNDERLYING, + AaveV3EthereumAssets.USDS_ORACLE, + PriceFeeds.ETHEREUM_V3_USDS_FEED + ); + + switchToV2Oracle = true; + + _validateETHPriceFeed( + AaveV2EthereumAssets.USDC_UNDERLYING, + AaveV2EthereumAssets.USDC_ORACLE, + PriceFeeds.ETHEREUM_V2_USDC_FEED, + PriceFeeds.ETHEREUM_V3_USDC_FEED // assetToPeg feed is the same as v3 + ); + _validateETHPriceFeed( + AaveV2EthereumAssets.USDT_UNDERLYING, + AaveV2EthereumAssets.USDT_ORACLE, + PriceFeeds.ETHEREUM_V2_USDT_FEED, + PriceFeeds.ETHEREUM_V3_USDT_FEED + ); + _validateETHPriceFeed( + AaveV2EthereumAssets.DAI_UNDERLYING, + AaveV2EthereumAssets.DAI_ORACLE, + PriceFeeds.ETHEREUM_V2_DAI_FEED, + PriceFeeds.ETHEREUM_V3_DAI_FEED + ); + _validateETHPriceFeed( + AaveV2EthereumAssets.FRAX_UNDERLYING, + AaveV2EthereumAssets.FRAX_ORACLE, + PriceFeeds.ETHEREUM_V2_FRAX_FEED, + PriceFeeds.ETHEREUM_V3_FRAX_FEED + ); + _validateETHPriceFeed( + AaveV2EthereumAssets.LUSD_UNDERLYING, + AaveV2EthereumAssets.LUSD_ORACLE, + PriceFeeds.ETHEREUM_V2_LUSD_FEED, + PriceFeeds.ETHEREUM_V3_LUSD_FEED + ); + _validateETHPriceFeed( + AaveV2EthereumAssets.USDP_UNDERLYING, + AaveV2EthereumAssets.USDP_ORACLE, + PriceFeeds.ETHEREUM_V2_USDP_FEED, + 0x09823a47Fd106d69925eD5867fdfaFddA5c333B2 // USDP/USD capo feed + ); + _validateETHPriceFeed( + AaveV2EthereumAssets.sUSD_UNDERLYING, + AaveV2EthereumAssets.sUSD_ORACLE, + PriceFeeds.ETHEREUM_V2_SUSD_FEED, + 0x92339c63fa1537079F10f9F142707F03e4e95703 // sUSD/USD capo feed + ); + _validateETHPriceFeed( + AaveV2EthereumAssets.BUSD_UNDERLYING, + AaveV2EthereumAssets.BUSD_ORACLE, + PriceFeeds.ETHEREUM_V2_BUSD_FEED, + 0x8b1d214b3556820d72219aa4cf19dcCA2DE43C9e // BUSD/USD capo feed + ); + _validateETHPriceFeed( + AaveV2EthereumAssets.TUSD_UNDERLYING, + AaveV2EthereumAssets.TUSD_ORACLE, + PriceFeeds.ETHEREUM_V2_TUSD_FEED, + 0x42FA344028123cbEFBDa821528Ab8bDbE5F9C4B7 // TUSD/USD capo feed + ); + _validateETHPriceFeed( + AaveV2EthereumAssets.UST_UNDERLYING, + AaveV2EthereumAssets.UST_ORACLE, + PriceFeeds.ETHEREUM_V2_UST_FEED, + 0x049971FAAF0E4474A883979a9696AfDa390abF0c // UST/USD capo feed + ); + } + + function getAaveOracle() + public + virtual + override(BasePayloadETHFeedTest, BasePayloadUSDFeedTest) + returns (address) + { + if (switchToV2Oracle) { + return address(AaveV2Ethereum.ORACLE); + } else { + return address(AaveV3Ethereum.ORACLE); + } + } +} diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Gnosis_UpdatePriceCapAdaptersCAPO_20241101.sol b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Gnosis_UpdatePriceCapAdaptersCAPO_20241101.sol new file mode 100644 index 000000000..3d48ef32d --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Gnosis_UpdatePriceCapAdaptersCAPO_20241101.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3PayloadGnosis} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadGnosis.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {AaveV3Gnosis, AaveV3GnosisAssets} from 'aave-address-book/AaveV3Gnosis.sol'; +import {PriceFeeds} from './Constants.sol'; + +/** + * @title Update Price Cap Adapters (CAPO) + * @author BGD Labs (@bgdlabs) + * - Discussion: https://governance.aave.com/t/technical-maintenance-proposals/15274/55 + */ +contract AaveV3Gnosis_UpdatePriceCapAdaptersCAPO_20241101 is AaveV3PayloadGnosis { + function priceFeedsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.PriceFeedUpdate[] memory) + { + IAaveV3ConfigEngine.PriceFeedUpdate[] + memory feedsUpdate = new IAaveV3ConfigEngine.PriceFeedUpdate[](4); + + feedsUpdate[0] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3GnosisAssets.USDC_UNDERLYING, + priceFeed: PriceFeeds.GNOSIS_V3_USDC_FEED + }); + feedsUpdate[1] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3GnosisAssets.USDCe_UNDERLYING, + priceFeed: PriceFeeds.GNOSIS_V3_USDC_FEED + }); + feedsUpdate[2] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3GnosisAssets.WXDAI_UNDERLYING, + priceFeed: PriceFeeds.GNOSIS_V3_WXDAI_FEED + }); + feedsUpdate[3] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3GnosisAssets.sDAI_UNDERLYING, + priceFeed: PriceFeeds.GNOSIS_V3_SDAI_FEED + }); + + return feedsUpdate; + } +} diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Gnosis_UpdatePriceCapAdaptersCAPO_20241101.t.sol b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Gnosis_UpdatePriceCapAdaptersCAPO_20241101.t.sol new file mode 100644 index 000000000..d37c9c0af --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Gnosis_UpdatePriceCapAdaptersCAPO_20241101.t.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Gnosis, AaveV3GnosisAssets} from 'aave-address-book/AaveV3Gnosis.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Gnosis_UpdatePriceCapAdaptersCAPO_20241101} from './AaveV3Gnosis_UpdatePriceCapAdaptersCAPO_20241101.sol'; +import {BasePayloadUSDFeedTest} from './BasePayloadUSDFeedTest.sol'; +import {PriceFeeds} from './Constants.sol'; + +/** + * @dev Test for AaveV3Gnosis_UpdatePriceCapAdaptersCAPO_20241101 + * command: FOUNDRY_PROFILE=gnosis forge test --match-path=src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Gnosis_UpdatePriceCapAdaptersCAPO_20241101.t.sol -vv + */ +contract AaveV3Gnosis_UpdatePriceCapAdaptersCAPO_20241101_Test is + BasePayloadUSDFeedTest, + ProtocolV3TestBase +{ + AaveV3Gnosis_UpdatePriceCapAdaptersCAPO_20241101 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('gnosis'), 37551987); + proposal = new AaveV3Gnosis_UpdatePriceCapAdaptersCAPO_20241101(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Gnosis_UpdatePriceCapAdaptersCAPO_20241101', + AaveV3Gnosis.POOL, + address(proposal) + ); + } + + function test_priceFeeds() public { + executePayload(vm, address(proposal)); + + _validateUSDPriceFeed( + AaveV3GnosisAssets.USDC_UNDERLYING, + AaveV3GnosisAssets.USDC_ORACLE, + PriceFeeds.GNOSIS_V3_USDC_FEED + ); + _validateUSDPriceFeed( + AaveV3GnosisAssets.USDCe_UNDERLYING, + AaveV3GnosisAssets.USDC_ORACLE, + PriceFeeds.GNOSIS_V3_USDC_FEED + ); + _validateUSDPriceFeed( + AaveV3GnosisAssets.WXDAI_UNDERLYING, + AaveV3GnosisAssets.WXDAI_ORACLE, + PriceFeeds.GNOSIS_V3_WXDAI_FEED + ); + _validateUSDPriceFeed( + AaveV3GnosisAssets.sDAI_UNDERLYING, + AaveV3GnosisAssets.sDAI_ORACLE, + PriceFeeds.GNOSIS_V3_SDAI_FEED + ); + } + + function getAaveOracle() public virtual override returns (address) { + return address(AaveV3Gnosis.ORACLE); + } +} diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Metis_UpdatePriceCapAdaptersCAPO_20241101.sol b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Metis_UpdatePriceCapAdaptersCAPO_20241101.sol new file mode 100644 index 000000000..ddc009410 --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Metis_UpdatePriceCapAdaptersCAPO_20241101.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3PayloadMetis} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadMetis.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {AaveV3Metis, AaveV3MetisAssets} from 'aave-address-book/AaveV3Metis.sol'; +import {PriceFeeds} from './Constants.sol'; + +/** + * @title Update Price Cap Adapters (CAPO) + * @author BGD Labs (@bgdlabs) + * - Discussion: https://governance.aave.com/t/technical-maintenance-proposals/15274/55 + */ +contract AaveV3Metis_UpdatePriceCapAdaptersCAPO_20241101 is AaveV3PayloadMetis { + function priceFeedsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.PriceFeedUpdate[] memory) + { + IAaveV3ConfigEngine.PriceFeedUpdate[] + memory feedsUpdate = new IAaveV3ConfigEngine.PriceFeedUpdate[](3); + + feedsUpdate[0] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3MetisAssets.mUSDC_UNDERLYING, + priceFeed: PriceFeeds.METIS_V3_USDC_FEED + }); + feedsUpdate[1] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3MetisAssets.mUSDT_UNDERLYING, + priceFeed: PriceFeeds.METIS_V3_USDT_FEED + }); + feedsUpdate[2] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3MetisAssets.mDAI_UNDERLYING, + priceFeed: PriceFeeds.METIS_V3_DAI_FEED + }); + + return feedsUpdate; + } +} diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Metis_UpdatePriceCapAdaptersCAPO_20241101.t.sol b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Metis_UpdatePriceCapAdaptersCAPO_20241101.t.sol new file mode 100644 index 000000000..b1b592796 --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Metis_UpdatePriceCapAdaptersCAPO_20241101.t.sol @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Metis, AaveV3MetisAssets} from 'aave-address-book/AaveV3Metis.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Metis_UpdatePriceCapAdaptersCAPO_20241101} from './AaveV3Metis_UpdatePriceCapAdaptersCAPO_20241101.sol'; +import {BasePayloadUSDFeedTest} from './BasePayloadUSDFeedTest.sol'; +import {PriceFeeds} from './Constants.sol'; + +/** + * @dev Test for AaveV3Metis_UpdatePriceCapAdaptersCAPO_20241101 + * command: FOUNDRY_PROFILE=metis forge test --match-path=src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Metis_UpdatePriceCapAdaptersCAPO_20241101.t.sol -vv + */ +contract AaveV3Metis_UpdatePriceCapAdaptersCAPO_20241101_Test is + BasePayloadUSDFeedTest, + ProtocolV3TestBase +{ + AaveV3Metis_UpdatePriceCapAdaptersCAPO_20241101 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('metis'), 19201936); + proposal = new AaveV3Metis_UpdatePriceCapAdaptersCAPO_20241101(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Metis_UpdatePriceCapAdaptersCAPO_20241101', + AaveV3Metis.POOL, + address(proposal) + ); + } + + function test_priceFeeds() public { + executePayload(vm, address(proposal)); + + _validateUSDPriceFeed( + AaveV3MetisAssets.mUSDC_UNDERLYING, + AaveV3MetisAssets.mUSDC_ORACLE, + PriceFeeds.METIS_V3_USDC_FEED + ); + _validateUSDPriceFeed( + AaveV3MetisAssets.mUSDT_UNDERLYING, + AaveV3MetisAssets.mUSDT_ORACLE, + PriceFeeds.METIS_V3_USDT_FEED + ); + _validateUSDPriceFeed( + AaveV3MetisAssets.mDAI_UNDERLYING, + AaveV3MetisAssets.mDAI_ORACLE, + PriceFeeds.METIS_V3_DAI_FEED + ); + } + + function getAaveOracle() public virtual override returns (address) { + return address(AaveV3Metis.ORACLE); + } +} diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Optimism_UpdatePriceCapAdaptersCAPO_20241101.sol b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Optimism_UpdatePriceCapAdaptersCAPO_20241101.sol new file mode 100644 index 000000000..c72e475ea --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Optimism_UpdatePriceCapAdaptersCAPO_20241101.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3PayloadOptimism} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadOptimism.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {AaveV3Optimism, AaveV3OptimismAssets} from 'aave-address-book/AaveV3Optimism.sol'; +import {PriceFeeds} from './Constants.sol'; + +/** + * @title Update Price Cap Adapters (CAPO) + * @author BGD Labs (@bgdlabs) + * - Discussion: https://governance.aave.com/t/technical-maintenance-proposals/15274/55 + */ +contract AaveV3Optimism_UpdatePriceCapAdaptersCAPO_20241101 is AaveV3PayloadOptimism { + function priceFeedsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.PriceFeedUpdate[] memory) + { + IAaveV3ConfigEngine.PriceFeedUpdate[] + memory feedsUpdate = new IAaveV3ConfigEngine.PriceFeedUpdate[](7); + + feedsUpdate[0] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3OptimismAssets.USDC_UNDERLYING, + priceFeed: PriceFeeds.OPTIMISM_V3_USDC_FEED + }); + feedsUpdate[1] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3OptimismAssets.USDCn_UNDERLYING, + priceFeed: PriceFeeds.OPTIMISM_V3_USDC_FEED + }); + feedsUpdate[2] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3OptimismAssets.USDT_UNDERLYING, + priceFeed: PriceFeeds.OPTIMISM_V3_USDT_FEED + }); + feedsUpdate[3] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3OptimismAssets.DAI_UNDERLYING, + priceFeed: PriceFeeds.OPTIMISM_V3_DAI_FEED + }); + feedsUpdate[4] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3OptimismAssets.MAI_UNDERLYING, + priceFeed: PriceFeeds.OPTIMISM_V3_MAI_FEED + }); + feedsUpdate[5] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3OptimismAssets.LUSD_UNDERLYING, + priceFeed: PriceFeeds.OPTIMISM_V3_LUSD_FEED + }); + feedsUpdate[6] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3OptimismAssets.sUSD_UNDERLYING, + priceFeed: PriceFeeds.OPTIMISM_V3_SUSD_FEED + }); + + return feedsUpdate; + } +} diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Optimism_UpdatePriceCapAdaptersCAPO_20241101.t.sol b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Optimism_UpdatePriceCapAdaptersCAPO_20241101.t.sol new file mode 100644 index 000000000..0e67c8904 --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Optimism_UpdatePriceCapAdaptersCAPO_20241101.t.sol @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Optimism, AaveV3OptimismAssets} from 'aave-address-book/AaveV3Optimism.sol'; +import {PriceFeeds} from './Constants.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {BasePayloadUSDFeedTest} from './BasePayloadUSDFeedTest.sol'; +import {AaveV3Optimism_UpdatePriceCapAdaptersCAPO_20241101} from './AaveV3Optimism_UpdatePriceCapAdaptersCAPO_20241101.sol'; + +/** + * @dev Test for AaveV3Optimism_UpdatePriceCapAdaptersCAPO_20241101 + * command: FOUNDRY_PROFILE=optimism forge test --match-path=src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Optimism_UpdatePriceCapAdaptersCAPO_20241101.t.sol -vv + */ +contract AaveV3Optimism_UpdatePriceCapAdaptersCAPO_20241101_Test is + BasePayloadUSDFeedTest, + ProtocolV3TestBase +{ + AaveV3Optimism_UpdatePriceCapAdaptersCAPO_20241101 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('optimism'), 129368356); + proposal = new AaveV3Optimism_UpdatePriceCapAdaptersCAPO_20241101(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Optimism_UpdatePriceCapAdaptersCAPO_20241101', + AaveV3Optimism.POOL, + address(proposal) + ); + } + + function test_priceFeeds() public { + executePayload(vm, address(proposal)); + + _validateUSDPriceFeed( + AaveV3OptimismAssets.USDC_UNDERLYING, + AaveV3OptimismAssets.USDC_ORACLE, + PriceFeeds.OPTIMISM_V3_USDC_FEED + ); + _validateUSDPriceFeed( + AaveV3OptimismAssets.USDCn_UNDERLYING, + AaveV3OptimismAssets.USDC_ORACLE, + PriceFeeds.OPTIMISM_V3_USDC_FEED + ); + _validateUSDPriceFeed( + AaveV3OptimismAssets.USDT_UNDERLYING, + AaveV3OptimismAssets.USDT_ORACLE, + PriceFeeds.OPTIMISM_V3_USDT_FEED + ); + _validateUSDPriceFeed( + AaveV3OptimismAssets.DAI_UNDERLYING, + AaveV3OptimismAssets.DAI_ORACLE, + PriceFeeds.OPTIMISM_V3_DAI_FEED + ); + _validateUSDPriceFeed( + AaveV3OptimismAssets.MAI_UNDERLYING, + AaveV3OptimismAssets.MAI_ORACLE, + PriceFeeds.OPTIMISM_V3_MAI_FEED + ); + _validateUSDPriceFeed( + AaveV3OptimismAssets.LUSD_UNDERLYING, + AaveV3OptimismAssets.LUSD_ORACLE, + PriceFeeds.OPTIMISM_V3_LUSD_FEED + ); + _validateUSDPriceFeed( + AaveV3OptimismAssets.sUSD_UNDERLYING, + AaveV3OptimismAssets.sUSD_ORACLE, + PriceFeeds.OPTIMISM_V3_SUSD_FEED + ); + } + + function getAaveOracle() public virtual override returns (address) { + return address(AaveV3Optimism.ORACLE); + } +} diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Polygon_UpdatePriceCapAdaptersCAPO_20241101.sol b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Polygon_UpdatePriceCapAdaptersCAPO_20241101.sol new file mode 100644 index 000000000..07a0f1469 --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Polygon_UpdatePriceCapAdaptersCAPO_20241101.sol @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3PayloadPolygon} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadPolygon.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {AaveV3PolygonAssets} from 'aave-address-book/AaveV3Polygon.sol'; +import {AaveV2Polygon, AaveV2PolygonAssets} from 'aave-address-book/AaveV2Polygon.sol'; +import {PriceFeeds} from './Constants.sol'; + +/** + * @title Update Price Cap Adapters (CAPO) + * @author BGD Labs (@bgdlabs) + * - Discussion: https://governance.aave.com/t/technical-maintenance-proposals/15274/55 + */ +contract AaveV3Polygon_UpdatePriceCapAdaptersCAPO_20241101 is AaveV3PayloadPolygon { + function _postExecute() internal override { + _updateV2PriceAdapters(); + } + + function priceFeedsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.PriceFeedUpdate[] memory) + { + IAaveV3ConfigEngine.PriceFeedUpdate[] + memory feedsUpdate = new IAaveV3ConfigEngine.PriceFeedUpdate[](5); + + feedsUpdate[0] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3PolygonAssets.USDC_UNDERLYING, + priceFeed: PriceFeeds.POLYGON_V3_USDC_FEED + }); + feedsUpdate[1] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3PolygonAssets.USDCn_UNDERLYING, + priceFeed: PriceFeeds.POLYGON_V3_USDC_FEED + }); + feedsUpdate[2] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3PolygonAssets.USDT_UNDERLYING, + priceFeed: PriceFeeds.POLYGON_V3_USDT_FEED + }); + feedsUpdate[3] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3PolygonAssets.DAI_UNDERLYING, + priceFeed: PriceFeeds.POLYGON_V3_DAI_FEED + }); + feedsUpdate[4] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3PolygonAssets.miMATIC_UNDERLYING, + priceFeed: PriceFeeds.POLYGON_V3_MIMATIC_FEED + }); + + return feedsUpdate; + } + + function _updateV2PriceAdapters() internal { + address[] memory assets = new address[](3); + address[] memory sources = new address[](3); + + assets[0] = AaveV2PolygonAssets.USDC_UNDERLYING; + sources[0] = PriceFeeds.POLYGON_V2_USDC_FEED; + + assets[1] = AaveV2PolygonAssets.USDT_UNDERLYING; + sources[1] = PriceFeeds.POLYGON_V2_USDT_FEED; + + assets[2] = AaveV2PolygonAssets.DAI_UNDERLYING; + sources[2] = PriceFeeds.POLYGON_V2_DAI_FEED; + + AaveV2Polygon.ORACLE.setAssetSources(assets, sources); + } +} diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Polygon_UpdatePriceCapAdaptersCAPO_20241101.t.sol b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Polygon_UpdatePriceCapAdaptersCAPO_20241101.t.sol new file mode 100644 index 000000000..cdec4cdf2 --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Polygon_UpdatePriceCapAdaptersCAPO_20241101.t.sol @@ -0,0 +1,105 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Polygon, AaveV3PolygonAssets} from 'aave-address-book/AaveV3Polygon.sol'; +import {AaveV2Polygon, AaveV2PolygonAssets} from 'aave-address-book/AaveV2Polygon.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Polygon_UpdatePriceCapAdaptersCAPO_20241101} from './AaveV3Polygon_UpdatePriceCapAdaptersCAPO_20241101.sol'; +import {PriceFeeds} from './Constants.sol'; +import {BasePayloadUSDFeedTest} from './BasePayloadUSDFeedTest.sol'; +import {BasePayloadETHFeedTest} from './BasePayloadETHFeedTest.sol'; +import {IERC20Detailed} from 'aave-v3-origin/contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol'; + +/** + * @dev Test for AaveV3Polygon_UpdatePriceCapAdaptersCAPO_20241101 + * command: FOUNDRY_PROFILE=polygon forge test --match-path=src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Polygon_UpdatePriceCapAdaptersCAPO_20241101.t.sol -vv + */ +contract AaveV3Polygon_UpdatePriceCapAdaptersCAPO_20241101_Test is + BasePayloadUSDFeedTest, + BasePayloadETHFeedTest, + ProtocolV3TestBase +{ + AaveV3Polygon_UpdatePriceCapAdaptersCAPO_20241101 internal proposal; + bool switchToV2Oracle; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('polygon'), 65544393); + proposal = new AaveV3Polygon_UpdatePriceCapAdaptersCAPO_20241101(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Polygon_UpdatePriceCapAdaptersCAPO_20241101', + AaveV3Polygon.POOL, + address(proposal), + false + ); + } + + function test_priceFeeds() public { + executePayload(vm, address(proposal)); + + _validateUSDPriceFeed( + AaveV3PolygonAssets.USDC_UNDERLYING, + AaveV3PolygonAssets.USDC_ORACLE, + PriceFeeds.POLYGON_V3_USDC_FEED + ); + _validateUSDPriceFeed( + AaveV3PolygonAssets.USDCn_UNDERLYING, + AaveV3PolygonAssets.USDC_ORACLE, + PriceFeeds.POLYGON_V3_USDC_FEED + ); + _validateUSDPriceFeed( + AaveV3PolygonAssets.USDT_UNDERLYING, + AaveV3PolygonAssets.USDT_ORACLE, + PriceFeeds.POLYGON_V3_USDT_FEED + ); + _validateUSDPriceFeed( + AaveV3PolygonAssets.DAI_UNDERLYING, + AaveV3PolygonAssets.DAI_ORACLE, + PriceFeeds.POLYGON_V3_DAI_FEED + ); + _validateUSDPriceFeed( + AaveV3PolygonAssets.miMATIC_UNDERLYING, + AaveV3PolygonAssets.miMATIC_ORACLE, + PriceFeeds.POLYGON_V3_MIMATIC_FEED + ); + + switchToV2Oracle = true; + + _validateETHPriceFeed( + AaveV2PolygonAssets.USDC_UNDERLYING, + AaveV2PolygonAssets.USDC_ORACLE, + PriceFeeds.POLYGON_V2_USDC_FEED, + PriceFeeds.POLYGON_V3_USDC_FEED // assetToPeg feed is the same as v3 + ); + _validateETHPriceFeed( + AaveV2PolygonAssets.USDT_UNDERLYING, + AaveV2PolygonAssets.USDT_ORACLE, + PriceFeeds.POLYGON_V2_USDT_FEED, + PriceFeeds.POLYGON_V3_USDT_FEED + ); + _validateETHPriceFeed( + AaveV2PolygonAssets.DAI_UNDERLYING, + AaveV2PolygonAssets.DAI_ORACLE, + PriceFeeds.POLYGON_V2_DAI_FEED, + PriceFeeds.POLYGON_V3_DAI_FEED + ); + } + + function getAaveOracle() + public + virtual + override(BasePayloadETHFeedTest, BasePayloadUSDFeedTest) + returns (address) + { + if (switchToV2Oracle) { + return address(AaveV2Polygon.ORACLE); + } else { + return address(AaveV3Polygon.ORACLE); + } + } +} diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Scroll_UpdatePriceCapAdaptersCAPO_20241101.sol b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Scroll_UpdatePriceCapAdaptersCAPO_20241101.sol new file mode 100644 index 000000000..6b6114218 --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Scroll_UpdatePriceCapAdaptersCAPO_20241101.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3PayloadScroll} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadScroll.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {AaveV3Scroll, AaveV3ScrollAssets} from 'aave-address-book/AaveV3Scroll.sol'; +import {PriceFeeds} from './Constants.sol'; + +/** + * @title Update Price Cap Adapters (CAPO) + * @author BGD Labs (@bgdlabs) + * - Discussion: https://governance.aave.com/t/technical-maintenance-proposals/15274/55 + */ +contract AaveV3Scroll_UpdatePriceCapAdaptersCAPO_20241101 is AaveV3PayloadScroll { + function priceFeedsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.PriceFeedUpdate[] memory) + { + IAaveV3ConfigEngine.PriceFeedUpdate[] + memory feedsUpdate = new IAaveV3ConfigEngine.PriceFeedUpdate[](1); + + feedsUpdate[0] = IAaveV3ConfigEngine.PriceFeedUpdate({ + asset: AaveV3ScrollAssets.USDC_UNDERLYING, + priceFeed: PriceFeeds.SCROLL_V3_USDC_FEED + }); + + return feedsUpdate; + } +} diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Scroll_UpdatePriceCapAdaptersCAPO_20241101.t.sol b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Scroll_UpdatePriceCapAdaptersCAPO_20241101.t.sol new file mode 100644 index 000000000..38352b57b --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Scroll_UpdatePriceCapAdaptersCAPO_20241101.t.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Scroll, AaveV3ScrollAssets} from 'aave-address-book/AaveV3Scroll.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Scroll_UpdatePriceCapAdaptersCAPO_20241101} from './AaveV3Scroll_UpdatePriceCapAdaptersCAPO_20241101.sol'; +import {BasePayloadUSDFeedTest} from './BasePayloadUSDFeedTest.sol'; +import {PriceFeeds} from './Constants.sol'; + +/** + * @dev Test for AaveV3Scroll_UpdatePriceCapAdaptersCAPO_20241101 + * command: FOUNDRY_PROFILE=scroll forge test --match-path=src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Scroll_UpdatePriceCapAdaptersCAPO_20241101.t.sol -vv + */ +contract AaveV3Scroll_UpdatePriceCapAdaptersCAPO_20241101_Test is + BasePayloadUSDFeedTest, + ProtocolV3TestBase +{ + AaveV3Scroll_UpdatePriceCapAdaptersCAPO_20241101 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('scroll'), 11953169); + proposal = new AaveV3Scroll_UpdatePriceCapAdaptersCAPO_20241101(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Scroll_UpdatePriceCapAdaptersCAPO_20241101', + AaveV3Scroll.POOL, + address(proposal) + ); + } + + function test_priceFeeds() public { + executePayload(vm, address(proposal)); + + _validateUSDPriceFeed( + AaveV3ScrollAssets.USDC_UNDERLYING, + AaveV3ScrollAssets.USDC_ORACLE, + PriceFeeds.SCROLL_V3_USDC_FEED + ); + } + + function getAaveOracle() public virtual override returns (address) { + return address(AaveV3Scroll.ORACLE); + } +} diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/BasePayloadETHFeedTest.sol b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/BasePayloadETHFeedTest.sol new file mode 100644 index 000000000..ac6657d90 --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/BasePayloadETHFeedTest.sol @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Test} from 'forge-std/Test.sol'; +import {IAaveOracle} from 'aave-v3-origin/contracts/interfaces/IAaveOracle.sol'; +import {IPriceCapAdapterStable} from './interfaces/IPriceCapAdapterStable.sol'; +import {ICLSynchronicityPriceAdapterBaseToPeg} from './interfaces/ICLSynchronicityPriceAdapterBaseToPeg.sol'; + +abstract contract BasePayloadETHFeedTest is Test { + function _validateETHPriceFeed( + address underlying, + address previousFeed, + address newFeed, + address newAssetToPeg + ) public { + assertEq( + ICLSynchronicityPriceAdapterBaseToPeg(previousFeed).latestAnswer(), + ICLSynchronicityPriceAdapterBaseToPeg(newFeed).latestAnswer() + ); + assertEq( + ICLSynchronicityPriceAdapterBaseToPeg(previousFeed).BASE_TO_PEG(), + ICLSynchronicityPriceAdapterBaseToPeg(newFeed).BASE_TO_PEG() + ); + assertNotEq( + ICLSynchronicityPriceAdapterBaseToPeg(newFeed).BASE_TO_PEG(), + ICLSynchronicityPriceAdapterBaseToPeg(newFeed).ASSET_TO_PEG() + ); + assertEq(ICLSynchronicityPriceAdapterBaseToPeg(newFeed).ASSET_TO_PEG(), newAssetToPeg); + assertEq( + ICLSynchronicityPriceAdapterBaseToPeg(previousFeed).description(), + ICLSynchronicityPriceAdapterBaseToPeg(newFeed).description() + ); + + assertFalse(IPriceCapAdapterStable(newAssetToPeg).isCapped()); + + // we expect revert as the previousFeed's ASSET_TO_PEG does not have this method + address prevFeedAssetToPeg = ICLSynchronicityPriceAdapterBaseToPeg(previousFeed).ASSET_TO_PEG(); + vm.expectRevert(); + IPriceCapAdapterStable(prevFeedAssetToPeg).getPriceCap(); + + assertEq(IAaveOracle(getAaveOracle()).getSourceOfAsset(underlying), newFeed); + + if ( + keccak256(bytes(IPriceCapAdapterStable(newAssetToPeg).description())) == + keccak256(bytes('Capped LUSD/USD')) + ) { + assertEq(IPriceCapAdapterStable(newAssetToPeg).getPriceCap(), 1_10000000); + } else { + assertEq(IPriceCapAdapterStable(newAssetToPeg).getPriceCap(), 1_04000000); + } + } + + function getAaveOracle() public virtual returns (address); +} diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/BasePayloadUSDFeedTest.sol b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/BasePayloadUSDFeedTest.sol new file mode 100644 index 000000000..2aee9a719 --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/BasePayloadUSDFeedTest.sol @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Test} from 'forge-std/Test.sol'; +import {IAaveOracle} from 'aave-v3-origin/contracts/interfaces/IAaveOracle.sol'; +import {IPriceCapAdapterStable} from './interfaces/IPriceCapAdapterStable.sol'; +import {AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; + +abstract contract BasePayloadUSDFeedTest is Test { + function _validateUSDPriceFeed(address underlying, address previousFeed, address newFeed) public { + assertFalse(IPriceCapAdapterStable(newFeed).isCapped()); + + assertEq(IAaveOracle(getAaveOracle()).getSourceOfAsset(underlying), newFeed); + + if (previousFeed != AaveV3EthereumAssets.USDS_ORACLE) { + // we expect revert as the previousFeed does not have this method, USDS is exception + // as it has this method in prevFeed + vm.expectRevert(); + IPriceCapAdapterStable(previousFeed).getPriceCap(); + + // USDS is exception as we change the underlying feed from DAI/USD to USDS/USD + assertEq( + IPriceCapAdapterStable(previousFeed).latestAnswer(), + IPriceCapAdapterStable(newFeed).latestAnswer() + ); + } + + // sDAI feed was not a capo feed before, hence this exception + if ( + keccak256(bytes(IPriceCapAdapterStable(newFeed).description())) != + keccak256(bytes('Capped sDAI / DAI / USD')) + ) { + if (previousFeed != AaveV3EthereumAssets.USDS_ORACLE) { + assertEq( + IPriceCapAdapterStable(previousFeed).ASSET_TO_USD_AGGREGATOR(), + IPriceCapAdapterStable(newFeed).ASSET_TO_USD_AGGREGATOR() + ); + assertEq( + IPriceCapAdapterStable(previousFeed).description(), + IPriceCapAdapterStable(newFeed).description() + ); + } + + // price cap for all stable capo feed is same except LUSD + if ( + keccak256(bytes(IPriceCapAdapterStable(newFeed).description())) == + keccak256(bytes('Capped LUSD/USD')) + ) { + assertEq(IPriceCapAdapterStable(newFeed).getPriceCap(), 1_10000000); + } else { + assertEq(IPriceCapAdapterStable(newFeed).getPriceCap(), 1_04000000); + } + } + } + + function getAaveOracle() public virtual returns (address); +} diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/Constants.sol b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/Constants.sol new file mode 100644 index 000000000..2119721b4 --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/Constants.sol @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +library PriceFeeds { + address public constant ETHEREUM_V3_USDC_FEED = 0xB6557F02F0a5dA7b9D3C2d979cc19e00e756F6dA; + address public constant ETHEREUM_V3_USDT_FEED = 0x260326c220E469358846b187eE53328303Efe19C; + address public constant ETHEREUM_V3_DAI_FEED = 0x5c66322CA59bB61e867B28195576DbD8dA4b08dE; + address public constant ETHEREUM_V3_LUSD_FEED = 0xEbb721daf3DA9f1b3dcEc590cDf648137172d7CB; + address public constant ETHEREUM_V3_FRAX_FEED = 0xeF50f8DC65402c3019586bc8725fCD0b99B8AAd7; + address public constant ETHEREUM_V3_CRVUSD_FEED = 0x9Dc30dc58c72f5B669aEa01d02A2e4da194eE893; + address public constant ETHEREUM_V3_PYUSD_FEED = 0x36964C0579D02E0a5AaAb89E24Cf8d7CDF3549EE; + address public constant ETHEREUM_V3_SDAI_FEED = 0xf14f501863F5db3A6D5b7e37af24e2Ca25d7Aea8; + address public constant ETHEREUM_V3_USDS_FEED = 0x94C7FD62fd0506e71d8142E9D36687fC72A86B02; + + address public constant ETHEREUM_V2_USDC_FEED = 0x0B9a09cc52afc0d38ACcbd649aca1Da299d34454; + address public constant ETHEREUM_V2_USDT_FEED = 0xCB45B5c861a6468145b1720A620C38f55f736B74; + address public constant ETHEREUM_V2_DAI_FEED = 0x53a7856Cb3092E9c7C2c50e05E5b24462B7B9698; + address public constant ETHEREUM_V2_FRAX_FEED = 0xfD4A67F3c42CCA8ab4De6fba35dc11ffc87EE65e; + address public constant ETHEREUM_V2_LUSD_FEED = 0xd44d9a2E4643d55c1FA503C01a6cbB874a48Ae2E; + address public constant ETHEREUM_V2_USDP_FEED = 0x09e57964e9F314c61aA3614f9DdE037779Fc9ff1; + address public constant ETHEREUM_V2_SUSD_FEED = 0xC3c79aa824373c793E60901428e11884BFeD83Ed; + address public constant ETHEREUM_V2_BUSD_FEED = 0x190be7269f53b4C3d8057b8c7a058A750ded1356; + address public constant ETHEREUM_V2_TUSD_FEED = 0x34A99cE5B513Baa1e27af7eED8E9E190e0F92ce1; + address public constant ETHEREUM_V2_UST_FEED = 0x774a7BC8b395A3F9879197D21cF6e7c6a2639937; + + address public constant POLYGON_V3_USDC_FEED = 0x31Ebeb03223AaC82C8EB24C77624Ea40F4D849Fb; + address public constant POLYGON_V3_USDT_FEED = 0x01Aba1Fe7D72a3490bEef7CD0C09e1Ba2dD88D83; + address public constant POLYGON_V3_DAI_FEED = 0xa1913Df228db08F02F3F3Dc0f397Af3A2d2f96A1; + address public constant POLYGON_V3_MIMATIC_FEED = 0x1e2Ba4725c6847dC8304466c4eA25A872A7D43a8; + address public constant POLYGON_V2_USDC_FEED = 0xeAa310d63670b8C36699cE53E3e926b23355F3df; + address public constant POLYGON_V2_USDT_FEED = 0xf44Fee6877F2f1a0b84c8bC49ff4Ec35DF089Ea0; + address public constant POLYGON_V2_DAI_FEED = 0xC368bAB13A2b46D02c20c28AeBaB79bbE7E067AA; + + address public constant AVALANCHE_V3_USDC_FEED = 0xb0D7A8bbDcdb1203850b742bB4d7f57a1F1C8483; + address public constant AVALANCHE_V3_USDT_FEED = 0x5b7810a910B4a878AaA4800a824E5E5796838009; + address public constant AVALANCHE_V3_DAI_FEED = 0x0b47c51CCD4FaDe1D93C750bFCAB0a5ce8734ED0; + address public constant AVALANCHE_V3_FRAX_FEED = 0x0b7c356de5E68A8A257fcD23Ac1e8204D753A6fb; + address public constant AVALANCHE_V3_MAI_FEED = 0x85142981C14D98a4B69B04225ca74b764648D443; + + address public constant ARBITRUM_V3_USDC_FEED = 0x6200A5122Af8D5D9e69f4d526311Cd85241ACeC9; + address public constant ARBITRUM_V3_USDT_FEED = 0x476494a850eec47301F74C8c9c2652495c47C56c; + address public constant ARBITRUM_V3_DAI_FEED = 0x9F221bfD2d3F226b187d4419b49117aD7E698977; + address public constant ARBITRUM_V3_LUSD_FEED = 0xc8b3e2776260c7e7A9C158a2344776e65E10ceE8; + address public constant ARBITRUM_V3_FRAX_FEED = 0xC1d2Faa98935eA2f2eD34Bc84edb00B387061376; + address public constant ARBITRUM_V3_MAI_FEED = 0xAF92b0A685a15F4E26B6d7DA86F1a9C8C01E2a09; + + address public constant OPTIMISM_V3_USDC_FEED = 0x6379A975Ef93EC2bE87f56A02CCF8535dFAde201; + address public constant OPTIMISM_V3_USDT_FEED = 0xDb4E371F8dc7D834D3F1359295c669352ECe7D9c; + address public constant OPTIMISM_V3_DAI_FEED = 0xf116891adaBb21Df94663c8Aa62f87fC1bc19d53; + address public constant OPTIMISM_V3_LUSD_FEED = 0x5a602E33B935415477550c709a79cDF23E1355d5; + address public constant OPTIMISM_V3_SUSD_FEED = 0x8ea108096AdEA6Ac059cbEaE6862ce9BB52B4E87; + address public constant OPTIMISM_V3_MAI_FEED = 0x1D85F6eB05f618154ac520D2fDa74C40D21BD93e; + + address public constant BASE_V3_USDC_FEED = 0xfcF82bFa2485253263969167583Ea4de09e9993b; + + address public constant BNB_V3_USDC_FEED = 0x9102a9553B470dbD0dC74009a870A5886C92902C; + address public constant BNB_V3_USDT_FEED = 0xee845A7A40A090Da256420A293803C35B7F436b6; + address public constant BNB_V3_FDUSD_FEED = 0x72Cb7a00D439296A6fC3c9face9Eca96bfdEf825; + + address public constant GNOSIS_V3_USDC_FEED = 0x1450C4BE9dd66889CddAB77e5947B6166ACbfAE2; + address public constant GNOSIS_V3_WXDAI_FEED = 0x7443afE82986d7475Cea0c5b04C6F1581fdAce87; + address public constant GNOSIS_V3_SDAI_FEED = 0x38fe17BA2dfF456C6c980dD2227B0abA89FCB105; + + address public constant METIS_V3_USDC_FEED = 0x0b9cA640284cf2636577703f785D5aEEc466BC56; + address public constant METIS_V3_USDT_FEED = 0x433636CB0136Cfd75145ccca608Bb548E6C037dE; + address public constant METIS_V3_DAI_FEED = 0xf577E512687C83706ccfeD31C1939C75E8ea966F; + + address public constant SCROLL_V3_USDC_FEED = 0x1685D81212580DD4cDA287616C2f6F4794927e18; +} diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/UpdatePriceCapAdaptersCAPO.md b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/UpdatePriceCapAdaptersCAPO.md new file mode 100644 index 000000000..6412a60be --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/UpdatePriceCapAdaptersCAPO.md @@ -0,0 +1,70 @@ +--- +title: "CAPO Adapter Maintenance Update" +author: "BGD Labs (@bgdlabs)" +discussions: "https://governance.aave.com/t/technical-maintenance-proposals/15274/55" +--- + +## Simple Summary + +Maintenance proposal to update stable price cap adapters across all v2 and v3 instances to the latest version. +The sDAI adapters on Ethereum and Gnosis Aave instances are also updated from non-capo to capo adapters, and USDS adapters are updated to use USDS/USD feed from the previous DAI/USD feed, given that liquidity of USDS is perfectly normalized. + +## Motivation + +With the Aave Generalized Risk Stewards (AGRS) being activated on proposal 197 it is important to update the CAPO adapters for stablecoins across both Aave V2 and V3 instances for it to work seamlessly with the new system. Currently this is not possible, because certain CAPOs are missing a getter method getPriceCap() which prevents the AGRS system from updating the price caps. + +The CAPO adapter for sDAI was not activated before due to its un-stability on its growth rate, but with positive signaling from Chaos Labs, it is now to be enabled on Aave V3 Ethereum and Aave V3 Gnosis instances. + +USDS asset was listed with a Chainlink DAI/USD underlying feed as given the asset was just released, and its underlying equivalence with DAI. Since USDS is totally stable now, it is reasonable to migrate to an USDS/USD feed. + +## Specification + +The following stable-coin CAPO feeds are being updated across all networks and instances: + +| Aave Instances | Underlying assets for which CAPO feed is updated | +| --------------------- | -------------------------------------------------------- | +| AaveV3Ethereum | USDC, USDT, USDS, DAI, LUSD, FRAX, crvUSD, pyUSD, sDAI | +| AaveV3EthereumLido | USDC, USDS | +| AaveV3EthereumEtherFi | USDC, pyUSD, FRAX | +| AaveV2Ethereum | USDC, USDT, DAI, FRAX, LUSD, USDP, sUSD, BUSD, TUSD, UST | +| AaveV3Polygon | USDC, USDCn, USDT, DAI, miMATIC, | +| AaveV2Polygon | USDC, USDT, DAI | +| AaveV3Avalanche | USDC, USDT, DAI, FRAX, MAI | +| AaveV2Avalanche | USDC, USDT, DAI | +| AaveV3Arbitrum | USDC, USDCn, USDT, DAI, MAI, LUSD, FRAX | +| AaveV3Optimism | USDC, USDCn, USDT, DAI, MAI, LUSD, FRAX | +| AaveV3Base | USDC, USDbC | +| AaveV3BNB | USDC, USDT, fdUSD | +| AaveV3Gnosis | USDC, USDCe, wxDAI, sDAI | +| AaveV3Metis | USDC, USDT, DAI | +| AaveV3Scroll | USDC | + +Price Feeds will be updated using `AAVE_ORACLE.setAssetSource()` method on Aave V2 Instances and using config-engine on Aave V3 Instances. + +_Please note that the configurations for the Price Caps adapters and the underlying chainlink feeds are exactly the same as before. Also, price feeds of AaveV2 instances are updated as their underlying feed used ASSET/USD could also be updated via the Stewards using the AaveV3 ACL_MANAGER contract_ + +To be more explicit on the code changes between the previous stablecoin CAPO feed and the new one on v3 markets, the following method is being added on the new stablecoin CAPO feed: + +``` +/// @inheritdoc IPriceCapAdapterStable +function getPriceCap() external view returns (int256) { + return _priceCap; +} +``` + +On v2 markets, the code diff between the previous feed and the new feed is zero, however the `ASSET_TO_PEG` underlying feed of the `CLSynchronicityPriceAdapterBaseToPeg` contract uses the new CAPO feed than the previous. + +As suggested by Risk Contributors (Chaos Labs), the following configuration for CAPO has been set for sDAI on Aave V3 Ethereum and Gnosis instances: +| maxYearlyRatioGrowthPercent | MINIMUM_SNAPSHOT_DELAY | +| --- | --- | +| 16% | 7 days | + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/3fbd35ad5f68b8a91262bb10a9d585ea882142eb/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Ethereum_UpdatePriceCapAdaptersCAPO_20241101.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/3fbd35ad5f68b8a91262bb10a9d585ea882142eb/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Polygon_UpdatePriceCapAdaptersCAPO_20241101.sol), [AaveV3Avalanche](https://github.com/bgd-labs/aave-proposals-v3/blob/3fbd35ad5f68b8a91262bb10a9d585ea882142eb/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Avalanche_UpdatePriceCapAdaptersCAPO_20241101.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/3fbd35ad5f68b8a91262bb10a9d585ea882142eb/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Optimism_UpdatePriceCapAdaptersCAPO_20241101.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/3fbd35ad5f68b8a91262bb10a9d585ea882142eb/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Arbitrum_UpdatePriceCapAdaptersCAPO_20241101.sol), [AaveV3Metis](https://github.com/bgd-labs/aave-proposals-v3/blob/3fbd35ad5f68b8a91262bb10a9d585ea882142eb/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Metis_UpdatePriceCapAdaptersCAPO_20241101.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/3fbd35ad5f68b8a91262bb10a9d585ea882142eb/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Base_UpdatePriceCapAdaptersCAPO_20241101.sol), [AaveV3Gnosis](https://github.com/bgd-labs/aave-proposals-v3/blob/3fbd35ad5f68b8a91262bb10a9d585ea882142eb/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Gnosis_UpdatePriceCapAdaptersCAPO_20241101.sol), [AaveV3Scroll](https://github.com/bgd-labs/aave-proposals-v3/blob/3fbd35ad5f68b8a91262bb10a9d585ea882142eb/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Scroll_UpdatePriceCapAdaptersCAPO_20241101.sol), [AaveV3BNB](https://github.com/bgd-labs/aave-proposals-v3/blob/3fbd35ad5f68b8a91262bb10a9d585ea882142eb/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3BNB_UpdatePriceCapAdaptersCAPO_20241101.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/3fbd35ad5f68b8a91262bb10a9d585ea882142eb/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Ethereum_UpdatePriceCapAdaptersCAPO_20241101.t.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/3fbd35ad5f68b8a91262bb10a9d585ea882142eb/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Polygon_UpdatePriceCapAdaptersCAPO_20241101.t.sol), [AaveV3Avalanche](https://github.com/bgd-labs/aave-proposals-v3/blob/3fbd35ad5f68b8a91262bb10a9d585ea882142eb/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Avalanche_UpdatePriceCapAdaptersCAPO_20241101.t.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/3fbd35ad5f68b8a91262bb10a9d585ea882142eb/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Optimism_UpdatePriceCapAdaptersCAPO_20241101.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/3fbd35ad5f68b8a91262bb10a9d585ea882142eb/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Arbitrum_UpdatePriceCapAdaptersCAPO_20241101.t.sol), [AaveV3Metis](https://github.com/bgd-labs/aave-proposals-v3/blob/3fbd35ad5f68b8a91262bb10a9d585ea882142eb/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Metis_UpdatePriceCapAdaptersCAPO_20241101.t.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/3fbd35ad5f68b8a91262bb10a9d585ea882142eb/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Base_UpdatePriceCapAdaptersCAPO_20241101.t.sol), [AaveV3Gnosis](https://github.com/bgd-labs/aave-proposals-v3/blob/3fbd35ad5f68b8a91262bb10a9d585ea882142eb/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Gnosis_UpdatePriceCapAdaptersCAPO_20241101.t.sol), [AaveV3Scroll](https://github.com/bgd-labs/aave-proposals-v3/blob/3fbd35ad5f68b8a91262bb10a9d585ea882142eb/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3Scroll_UpdatePriceCapAdaptersCAPO_20241101.t.sol), [AaveV3BNB](https://github.com/bgd-labs/aave-proposals-v3/blob/3fbd35ad5f68b8a91262bb10a9d585ea882142eb/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/AaveV3BNB_UpdatePriceCapAdaptersCAPO_20241101.t.sol) +- [Discussion](https://governance.aave.com/t/technical-maintenance-proposals/15274/55) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/UpdatePriceCapAdaptersCAPO_20241101.s.sol b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/UpdatePriceCapAdaptersCAPO_20241101.s.sol new file mode 100644 index 000000000..e9fe3c730 --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/UpdatePriceCapAdaptersCAPO_20241101.s.sol @@ -0,0 +1,346 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript, PolygonScript, AvalancheScript, OptimismScript, ArbitrumScript, MetisScript, BaseScript, GnosisScript, ScrollScript, BNBScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Ethereum_UpdatePriceCapAdaptersCAPO_20241101} from './AaveV3Ethereum_UpdatePriceCapAdaptersCAPO_20241101.sol'; +import {AaveV3EthereumLido_UpdatePriceCapAdaptersCAPO_20241101} from './AaveV3EthereumLido_UpdatePriceCapAdaptersCAPO_20241101.sol'; +import {AaveV3EthereumEtherFi_UpdatePriceCapAdaptersCAPO_20241101} from './AaveV3EthereumEtherFi_UpdatePriceCapAdaptersCAPO_20241101.sol'; +import {AaveV3Polygon_UpdatePriceCapAdaptersCAPO_20241101} from './AaveV3Polygon_UpdatePriceCapAdaptersCAPO_20241101.sol'; +import {AaveV3Avalanche_UpdatePriceCapAdaptersCAPO_20241101} from './AaveV3Avalanche_UpdatePriceCapAdaptersCAPO_20241101.sol'; +import {AaveV3Optimism_UpdatePriceCapAdaptersCAPO_20241101} from './AaveV3Optimism_UpdatePriceCapAdaptersCAPO_20241101.sol'; +import {AaveV3Arbitrum_UpdatePriceCapAdaptersCAPO_20241101} from './AaveV3Arbitrum_UpdatePriceCapAdaptersCAPO_20241101.sol'; +import {AaveV3Metis_UpdatePriceCapAdaptersCAPO_20241101} from './AaveV3Metis_UpdatePriceCapAdaptersCAPO_20241101.sol'; +import {AaveV3Base_UpdatePriceCapAdaptersCAPO_20241101} from './AaveV3Base_UpdatePriceCapAdaptersCAPO_20241101.sol'; +import {AaveV3Gnosis_UpdatePriceCapAdaptersCAPO_20241101} from './AaveV3Gnosis_UpdatePriceCapAdaptersCAPO_20241101.sol'; +import {AaveV3Scroll_UpdatePriceCapAdaptersCAPO_20241101} from './AaveV3Scroll_UpdatePriceCapAdaptersCAPO_20241101.sol'; +import {AaveV3BNB_UpdatePriceCapAdaptersCAPO_20241101} from './AaveV3BNB_UpdatePriceCapAdaptersCAPO_20241101.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241101_Multi_UpdatePriceCapAdaptersCAPO/UpdatePriceCapAdaptersCAPO_20241101.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/UpdatePriceCapAdaptersCAPO_20241101.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_UpdatePriceCapAdaptersCAPO_20241101).creationCode + ); + address payload1 = GovV3Helpers.deployDeterministic( + type(AaveV3EthereumLido_UpdatePriceCapAdaptersCAPO_20241101).creationCode + ); + address payload2 = GovV3Helpers.deployDeterministic( + type(AaveV3EthereumEtherFi_UpdatePriceCapAdaptersCAPO_20241101).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](3); + actions[0] = GovV3Helpers.buildAction(payload0); + actions[1] = GovV3Helpers.buildAction(payload1); + actions[2] = GovV3Helpers.buildAction(payload2); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Polygon + * deploy-command: make deploy-ledger contract=src/20241101_Multi_UpdatePriceCapAdaptersCAPO/UpdatePriceCapAdaptersCAPO_20241101.s.sol:DeployPolygon chain=polygon + * verify-command: FOUNDRY_PROFILE=polygon npx catapulta-verify -b broadcast/UpdatePriceCapAdaptersCAPO_20241101.s.sol/137/run-latest.json + */ +contract DeployPolygon is PolygonScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Polygon_UpdatePriceCapAdaptersCAPO_20241101).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Avalanche + * deploy-command: make deploy-ledger contract=src/20241101_Multi_UpdatePriceCapAdaptersCAPO/UpdatePriceCapAdaptersCAPO_20241101.s.sol:DeployAvalanche chain=avalanche + * verify-command: FOUNDRY_PROFILE=avalanche npx catapulta-verify -b broadcast/UpdatePriceCapAdaptersCAPO_20241101.s.sol/43114/run-latest.json + */ +contract DeployAvalanche is AvalancheScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Avalanche_UpdatePriceCapAdaptersCAPO_20241101).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Optimism + * deploy-command: make deploy-ledger contract=src/20241101_Multi_UpdatePriceCapAdaptersCAPO/UpdatePriceCapAdaptersCAPO_20241101.s.sol:DeployOptimism chain=optimism + * verify-command: FOUNDRY_PROFILE=optimism npx catapulta-verify -b broadcast/UpdatePriceCapAdaptersCAPO_20241101.s.sol/10/run-latest.json + */ +contract DeployOptimism is OptimismScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Optimism_UpdatePriceCapAdaptersCAPO_20241101).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Arbitrum + * deploy-command: make deploy-ledger contract=src/20241101_Multi_UpdatePriceCapAdaptersCAPO/UpdatePriceCapAdaptersCAPO_20241101.s.sol:DeployArbitrum chain=arbitrum + * verify-command: FOUNDRY_PROFILE=arbitrum npx catapulta-verify -b broadcast/UpdatePriceCapAdaptersCAPO_20241101.s.sol/42161/run-latest.json + */ +contract DeployArbitrum is ArbitrumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Arbitrum_UpdatePriceCapAdaptersCAPO_20241101).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Metis + * deploy-command: make deploy-ledger contract=src/20241101_Multi_UpdatePriceCapAdaptersCAPO/UpdatePriceCapAdaptersCAPO_20241101.s.sol:DeployMetis chain=metis + * verify-command: FOUNDRY_PROFILE=metis npx catapulta-verify -b broadcast/UpdatePriceCapAdaptersCAPO_20241101.s.sol/1088/run-latest.json + */ +contract DeployMetis is MetisScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Metis_UpdatePriceCapAdaptersCAPO_20241101).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Base + * deploy-command: make deploy-ledger contract=src/20241101_Multi_UpdatePriceCapAdaptersCAPO/UpdatePriceCapAdaptersCAPO_20241101.s.sol:DeployBase chain=base + * verify-command: FOUNDRY_PROFILE=base npx catapulta-verify -b broadcast/UpdatePriceCapAdaptersCAPO_20241101.s.sol/8453/run-latest.json + */ +contract DeployBase is BaseScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Base_UpdatePriceCapAdaptersCAPO_20241101).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Gnosis + * deploy-command: make deploy-ledger contract=src/20241101_Multi_UpdatePriceCapAdaptersCAPO/UpdatePriceCapAdaptersCAPO_20241101.s.sol:DeployGnosis chain=gnosis + * verify-command: FOUNDRY_PROFILE=gnosis npx catapulta-verify -b broadcast/UpdatePriceCapAdaptersCAPO_20241101.s.sol/100/run-latest.json + */ +contract DeployGnosis is GnosisScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Gnosis_UpdatePriceCapAdaptersCAPO_20241101).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Scroll + * deploy-command: make deploy-ledger contract=src/20241101_Multi_UpdatePriceCapAdaptersCAPO/UpdatePriceCapAdaptersCAPO_20241101.s.sol:DeployScroll chain=scroll + * verify-command: FOUNDRY_PROFILE=scroll npx catapulta-verify -b broadcast/UpdatePriceCapAdaptersCAPO_20241101.s.sol/534352/run-latest.json + */ +contract DeployScroll is ScrollScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Scroll_UpdatePriceCapAdaptersCAPO_20241101).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy BNB + * deploy-command: make deploy-ledger contract=src/20241101_Multi_UpdatePriceCapAdaptersCAPO/UpdatePriceCapAdaptersCAPO_20241101.s.sol:DeployBNB chain=bnb + * verify-command: FOUNDRY_PROFILE=bnb npx catapulta-verify -b broadcast/UpdatePriceCapAdaptersCAPO_20241101.s.sol/56/run-latest.json + */ +contract DeployBNB is BNBScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3BNB_UpdatePriceCapAdaptersCAPO_20241101).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/20241101_Multi_UpdatePriceCapAdaptersCAPO/UpdatePriceCapAdaptersCAPO_20241101.s.sol:CreateProposal chain=mainnet + */ +contract CreateProposal is EthereumScript { + function run() external { + // create payloads + PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](10); + + // compose actions for validation + IPayloadsControllerCore.ExecutionAction[] + memory actionsEthereum = new IPayloadsControllerCore.ExecutionAction[](3); + actionsEthereum[0] = GovV3Helpers.buildAction( + type(AaveV3Ethereum_UpdatePriceCapAdaptersCAPO_20241101).creationCode + ); + actionsEthereum[1] = GovV3Helpers.buildAction( + type(AaveV3EthereumLido_UpdatePriceCapAdaptersCAPO_20241101).creationCode + ); + actionsEthereum[2] = GovV3Helpers.buildAction( + type(AaveV3EthereumEtherFi_UpdatePriceCapAdaptersCAPO_20241101).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsPolygon = new IPayloadsControllerCore.ExecutionAction[](1); + actionsPolygon[0] = GovV3Helpers.buildAction( + type(AaveV3Polygon_UpdatePriceCapAdaptersCAPO_20241101).creationCode + ); + payloads[1] = GovV3Helpers.buildPolygonPayload(vm, actionsPolygon); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsAvalanche = new IPayloadsControllerCore.ExecutionAction[](1); + actionsAvalanche[0] = GovV3Helpers.buildAction( + type(AaveV3Avalanche_UpdatePriceCapAdaptersCAPO_20241101).creationCode + ); + payloads[2] = GovV3Helpers.buildAvalanchePayload(vm, actionsAvalanche); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsOptimism = new IPayloadsControllerCore.ExecutionAction[](1); + actionsOptimism[0] = GovV3Helpers.buildAction( + type(AaveV3Optimism_UpdatePriceCapAdaptersCAPO_20241101).creationCode + ); + payloads[3] = GovV3Helpers.buildOptimismPayload(vm, actionsOptimism); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsArbitrum = new IPayloadsControllerCore.ExecutionAction[](1); + actionsArbitrum[0] = GovV3Helpers.buildAction( + type(AaveV3Arbitrum_UpdatePriceCapAdaptersCAPO_20241101).creationCode + ); + payloads[4] = GovV3Helpers.buildArbitrumPayload(vm, actionsArbitrum); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsMetis = new IPayloadsControllerCore.ExecutionAction[](1); + actionsMetis[0] = GovV3Helpers.buildAction( + type(AaveV3Metis_UpdatePriceCapAdaptersCAPO_20241101).creationCode + ); + payloads[5] = GovV3Helpers.buildMetisPayload(vm, actionsMetis); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsBase = new IPayloadsControllerCore.ExecutionAction[](1); + actionsBase[0] = GovV3Helpers.buildAction( + type(AaveV3Base_UpdatePriceCapAdaptersCAPO_20241101).creationCode + ); + payloads[6] = GovV3Helpers.buildBasePayload(vm, actionsBase); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsGnosis = new IPayloadsControllerCore.ExecutionAction[](1); + actionsGnosis[0] = GovV3Helpers.buildAction( + type(AaveV3Gnosis_UpdatePriceCapAdaptersCAPO_20241101).creationCode + ); + payloads[7] = GovV3Helpers.buildGnosisPayload(vm, actionsGnosis); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsScroll = new IPayloadsControllerCore.ExecutionAction[](1); + actionsScroll[0] = GovV3Helpers.buildAction( + type(AaveV3Scroll_UpdatePriceCapAdaptersCAPO_20241101).creationCode + ); + payloads[8] = GovV3Helpers.buildScrollPayload(vm, actionsScroll); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsBNB = new IPayloadsControllerCore.ExecutionAction[](1); + actionsBNB[0] = GovV3Helpers.buildAction( + type(AaveV3BNB_UpdatePriceCapAdaptersCAPO_20241101).creationCode + ); + payloads[9] = GovV3Helpers.buildBNBPayload(vm, actionsBNB); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241101_Multi_UpdatePriceCapAdaptersCAPO/UpdatePriceCapAdaptersCAPO.md' + ) + ); + } +} diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/config.ts b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/config.ts new file mode 100644 index 000000000..648b5ae4e --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/config.ts @@ -0,0 +1,36 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: [ + 'AaveV3Ethereum', + 'AaveV3Polygon', + 'AaveV3Avalanche', + 'AaveV3Optimism', + 'AaveV3Arbitrum', + 'AaveV3Metis', + 'AaveV3Base', + 'AaveV3Gnosis', + 'AaveV3Scroll', + 'AaveV3BNB', + ], + title: 'Update Price Cap Adapters (CAPO)', + shortName: 'UpdatePriceCapAdaptersCAPO', + date: '20241101', + author: 'BGD Labs (@bgdlabs)', + discussion: '', + snapshot: '', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Ethereum: {configs: {OTHERS: {}}, cache: {blockNumber: 21092620}}, + AaveV3Polygon: {configs: {OTHERS: {}}, cache: {blockNumber: 63752907}}, + AaveV3Avalanche: {configs: {OTHERS: {}}, cache: {blockNumber: 52520148}}, + AaveV3Optimism: {configs: {OTHERS: {}}, cache: {blockNumber: 127431611}}, + AaveV3Arbitrum: {configs: {OTHERS: {}}, cache: {blockNumber: 269904022}}, + AaveV3Metis: {configs: {OTHERS: {}}, cache: {blockNumber: 18853015}}, + AaveV3Base: {configs: {OTHERS: {}}, cache: {blockNumber: 21836329}}, + AaveV3Gnosis: {configs: {OTHERS: {}}, cache: {blockNumber: 36800741}}, + AaveV3Scroll: {configs: {OTHERS: {}}, cache: {blockNumber: 10718504}}, + AaveV3BNB: {configs: {OTHERS: {}}, cache: {blockNumber: 43627345}}, + }, +}; diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/interfaces/ICLSynchronicityPriceAdapterBaseToPeg.sol b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/interfaces/ICLSynchronicityPriceAdapterBaseToPeg.sol new file mode 100644 index 000000000..9ab0a189f --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/interfaces/ICLSynchronicityPriceAdapterBaseToPeg.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface ICLSynchronicityPriceAdapterBaseToPeg { + /** + * @notice Calculates the current answer based on the aggregators. + * @return int256 latestAnswer + */ + function latestAnswer() external view returns (int256); + + /** + * @notice Returns the description of the feed + * @return string desciption + */ + function description() external view returns (string memory); + + /** + * @notice Returns the feed decimals + * @return uint8 decimals + */ + function decimals() external view returns (uint8); + + /** + * @notice Price feed for (Base / Peg) pair + */ + function BASE_TO_PEG() external view returns (address); + + /** + * @notice Price feed for (Asset / Peg) pair + */ + function ASSET_TO_PEG() external view returns (address); +} diff --git a/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/interfaces/IPriceCapAdapterStable.sol b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/interfaces/IPriceCapAdapterStable.sol new file mode 100644 index 000000000..fbbd1f8e8 --- /dev/null +++ b/src/20241101_Multi_UpdatePriceCapAdaptersCAPO/interfaces/IPriceCapAdapterStable.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface IPriceCapAdapterStable { + /** + * @notice Get price cap value + */ + function getPriceCap() external view returns (int256); + + /** + * @notice Returns if the price is currently capped + */ + function isCapped() external view returns (bool); + + /** + * @notice Price feed for (ASSET / USD) pair + */ + function ASSET_TO_USD_AGGREGATOR() external view returns (address); + + /** + * @notice Calculates the current answer based on the aggregators. + * @return int256 latestAnswer + */ + function latestAnswer() external view returns (int256); + + /** + * @notice Returns the description of the feed + * @return string desciption + */ + function description() external view returns (string memory); + + /** + * @notice Returns the feed decimals + * @return uint8 decimals + */ + function decimals() external view returns (uint8); +} diff --git a/src/20241104_AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance/AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance_20241104.sol b/src/20241104_AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance/AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance_20241104.sol new file mode 100644 index 000000000..054e15780 --- /dev/null +++ b/src/20241104_AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance/AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance_20241104.sol @@ -0,0 +1,192 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {CollectorUtils, ICollector} from 'aave-helpers/src/CollectorUtils.sol'; +import {AaveSwapper} from 'aave-helpers/src/swaps/AaveSwapper.sol'; +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV2Ethereum, AaveV2EthereumAssets} from 'aave-address-book/AaveV2Ethereum.sol'; +import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {AaveV3EthereumLido, AaveV3EthereumLidoEModes} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {AaveV3PayloadEthereumLido} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereumLido.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol'; + +/** + * @title Onboard GHO and Migrate Streams to Lido Instance + * @author karpatkey_TokenLogic + * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x5c27aa8f1de66a3e56f535d60e4c1666a5617a36f8f81c09df2b0ea184a90290 + * - Discussion: https://governance.aave.com/t/arfc-onboard-gho-and-migrate-streams-to-lido-instance/19686 + */ +contract AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance_20241104 is + AaveV3PayloadEthereumLido +{ + using SafeERC20 for IERC20; + using CollectorUtils for ICollector; + + uint256 public constant INITIAL_GHO_SUPPLY = 3_000_000e18; + + uint256 public constant A_USDT_WITHDRAW_AMOUNT = 1_500_000e6; + uint256 public constant A_ETH_USDT_WITHDRAW_AMOUNT = 500_000e6; + uint256 public constant A_ETH_USDC_WITHDRAW_AMOUNT = 1_000_000e6; + + // https://etherscan.io/address/0x060373D064d0168931dE2AB8DDA7410923d06E88 + address public constant MILKMAN = 0x060373D064d0168931dE2AB8DDA7410923d06E88; + // https://etherscan.io/address/0xe80a1C615F75AFF7Ed8F08c9F21f9d00982D666c + address public constant PRICE_CHECKER = 0xe80a1C615F75AFF7Ed8F08c9F21f9d00982D666c; + // https://etherscan.io/address/0x3f12643D3f6f874d39C2a4c9f2Cd6f2DbAC877FC + address public constant GHO_USD_FEED = 0x3f12643D3f6f874d39C2a4c9f2Cd6f2DbAC877FC; + + address public constant AGD_MULTISIG = 0x89C51828427F70D77875C6747759fB17Ba10Ceb0; + address public constant MERIT_MULTISIG = 0xdeadD8aB03075b7FBA81864202a2f59EE25B312b; + + function _postExecute() internal override { + // agd + if ( + IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).allowance( + address(AaveV3EthereumLido.COLLECTOR), + AGD_MULTISIG + ) > 0 + ) { + AaveV3EthereumLido.COLLECTOR.approve(AaveV3EthereumAssets.GHO_UNDERLYING, AGD_MULTISIG, 0); + } + + // merit + uint256 meritAllowance = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).allowance( + address(AaveV3EthereumLido.COLLECTOR), + MERIT_MULTISIG + ); + if (meritAllowance > 0) { + (address aTokenAddress, , ) = AaveV3EthereumLido + .AAVE_PROTOCOL_DATA_PROVIDER + .getReserveTokensAddresses(AaveV3EthereumAssets.GHO_UNDERLYING); + AaveV3EthereumLido.COLLECTOR.approve(AaveV3EthereumAssets.GHO_UNDERLYING, MERIT_MULTISIG, 0); + AaveV3EthereumLido.COLLECTOR.approve(aTokenAddress, MERIT_MULTISIG, meritAllowance); + } + + AaveV3EthereumLido.COLLECTOR.depositToV3( + CollectorUtils.IOInput({ + pool: address(AaveV3EthereumLido.POOL), + underlying: AaveV3EthereumAssets.GHO_UNDERLYING, + amount: INITIAL_GHO_SUPPLY + }) + ); + + // swap + // usdt + AaveV3Ethereum.COLLECTOR.withdrawFromV2( + CollectorUtils.IOInput({ + pool: address(AaveV2Ethereum.POOL), + underlying: AaveV3EthereumAssets.USDT_UNDERLYING, + amount: A_USDT_WITHDRAW_AMOUNT + }), + MiscEthereum.AAVE_SWAPPER + ); + AaveV3Ethereum.COLLECTOR.withdrawFromV3( + CollectorUtils.IOInput({ + pool: address(AaveV3Ethereum.POOL), + underlying: AaveV3EthereumAssets.USDT_UNDERLYING, + amount: A_ETH_USDT_WITHDRAW_AMOUNT + }), + MiscEthereum.AAVE_SWAPPER + ); + + AaveSwapper(MiscEthereum.AAVE_SWAPPER).swap( + MILKMAN, + PRICE_CHECKER, + AaveV3EthereumAssets.USDT_UNDERLYING, + AaveV3EthereumAssets.GHO_UNDERLYING, + AaveV3EthereumAssets.USDT_ORACLE, + GHO_USD_FEED, + address(AaveV3EthereumLido.COLLECTOR), + IERC20(AaveV3EthereumAssets.USDT_UNDERLYING).balanceOf(MiscEthereum.AAVE_SWAPPER), + 100 + ); + + // usdc + AaveV3Ethereum.COLLECTOR.withdrawFromV3( + CollectorUtils.IOInput({ + pool: address(AaveV3Ethereum.POOL), + underlying: AaveV3EthereumAssets.USDC_UNDERLYING, + amount: A_ETH_USDC_WITHDRAW_AMOUNT + }), + MiscEthereum.AAVE_SWAPPER + ); + + AaveSwapper(MiscEthereum.AAVE_SWAPPER).swap( + MILKMAN, + PRICE_CHECKER, + AaveV3EthereumAssets.USDC_UNDERLYING, + AaveV3EthereumAssets.GHO_UNDERLYING, + AaveV3EthereumAssets.USDC_ORACLE, + GHO_USD_FEED, + address(AaveV3EthereumLido.COLLECTOR), + IERC20(AaveV3EthereumAssets.USDC_UNDERLYING).balanceOf(MiscEthereum.AAVE_SWAPPER), + 100 + ); + } + + function newListings() public pure override returns (IAaveV3ConfigEngine.Listing[] memory) { + IAaveV3ConfigEngine.Listing[] memory listings = new IAaveV3ConfigEngine.Listing[](1); + + listings[0] = IAaveV3ConfigEngine.Listing({ + asset: AaveV3EthereumAssets.GHO_UNDERLYING, + assetSymbol: 'GHO', + priceFeed: AaveV3EthereumAssets.GHO_ORACLE, + enabledToBorrow: EngineFlags.ENABLED, + borrowableInIsolation: EngineFlags.DISABLED, + withSiloedBorrowing: EngineFlags.DISABLED, + flashloanable: EngineFlags.ENABLED, + ltv: 0, + liqThreshold: 0, + liqBonus: 0, + reserveFactor: 10_00, + supplyCap: 20_000_000, + borrowCap: 2_500_000, + debtCeiling: 0, + liqProtocolFee: 0, + rateStrategyParams: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: 92_00, + baseVariableBorrowRate: 10_50, + variableRateSlope1: 3_00, + variableRateSlope2: 50_00 + }) + }); + + return listings; + } + + function assetsEModeUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.AssetEModeUpdate[] memory) + { + IAaveV3ConfigEngine.AssetEModeUpdate[] + memory assetEModeUpdates = new IAaveV3ConfigEngine.AssetEModeUpdate[](3); + + assetEModeUpdates[0] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3EthereumAssets.GHO_UNDERLYING, + eModeCategory: AaveV3EthereumLidoEModes.SUSDE_STABLECOINS, + borrowable: EngineFlags.ENABLED, + collateral: EngineFlags.DISABLED + }); + + assetEModeUpdates[1] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3EthereumAssets.USDC_UNDERLYING, + eModeCategory: AaveV3EthereumLidoEModes.LRT_STABLECOINS_MAIN, + borrowable: EngineFlags.ENABLED, + collateral: EngineFlags.DISABLED + }); + + assetEModeUpdates[2] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3EthereumAssets.GHO_UNDERLYING, + eModeCategory: AaveV3EthereumLidoEModes.LRT_STABLECOINS_MAIN, + borrowable: EngineFlags.ENABLED, + collateral: EngineFlags.DISABLED + }); + + return assetEModeUpdates; + } +} diff --git a/src/20241104_AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance/AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance_20241104.t.sol b/src/20241104_AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance/AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance_20241104.t.sol new file mode 100644 index 000000000..58f46aee2 --- /dev/null +++ b/src/20241104_AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance/AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance_20241104.t.sol @@ -0,0 +1,197 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV2EthereumAssets} from 'aave-address-book/AaveV2Ethereum.sol'; +import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {AaveV3EthereumLido, AaveV3EthereumLidoAssets} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance_20241104} from './AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance_20241104.sol'; + +/** + * @dev Test for AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance_20241104 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241104_AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance/AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance_20241104.t.sol -vv + */ +contract AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance_20241104_Test is + ProtocolV3TestBase +{ + event SwapRequested( + address milkman, + address indexed fromToken, + address indexed toToken, + address fromOracle, + address toOracle, + uint256 amount, + address indexed recipient, + uint256 slippage + ); + + AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance_20241104 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21328964); + proposal = new AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance_20241104(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance_20241104', + AaveV3EthereumLido.POOL, + address(proposal) + ); + } + + function test_swap() public { + uint256 collectorAUsdtBalanceBefore = IERC20(AaveV2EthereumAssets.USDT_A_TOKEN).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + uint256 collectorAEthUsdtBalanceBefore = IERC20(AaveV3EthereumAssets.USDT_A_TOKEN).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + uint256 collectorAEthUsdcBalanceBefore = IERC20(AaveV3EthereumAssets.USDC_A_TOKEN).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + + vm.expectEmit(true, true, true, true, MiscEthereum.AAVE_SWAPPER); + emit SwapRequested( + proposal.MILKMAN(), + AaveV3EthereumAssets.USDT_UNDERLYING, + AaveV3EthereumAssets.GHO_UNDERLYING, + AaveV3EthereumAssets.USDT_ORACLE, + proposal.GHO_USD_FEED(), + proposal.A_USDT_WITHDRAW_AMOUNT() + proposal.A_ETH_USDT_WITHDRAW_AMOUNT(), + address(AaveV3EthereumLido.COLLECTOR), + 100 + ); + + vm.expectEmit(true, true, true, true, MiscEthereum.AAVE_SWAPPER); + emit SwapRequested( + proposal.MILKMAN(), + AaveV3EthereumAssets.USDC_UNDERLYING, + AaveV3EthereumAssets.GHO_UNDERLYING, + AaveV3EthereumAssets.USDC_ORACLE, + proposal.GHO_USD_FEED(), + proposal.A_ETH_USDC_WITHDRAW_AMOUNT(), + address(AaveV3EthereumLido.COLLECTOR), + 100 + ); + + executePayload(vm, address(proposal)); + + uint256 collectorAUsdtBalanceAfter = IERC20(AaveV2EthereumAssets.USDT_A_TOKEN).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + uint256 collectorAEthUsdtBalanceAfter = IERC20(AaveV3EthereumAssets.USDT_A_TOKEN).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + uint256 collectorAEthUsdcBalanceAfter = IERC20(AaveV3EthereumAssets.USDC_A_TOKEN).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + + assertApproxEqAbs( + collectorAUsdtBalanceBefore, + collectorAUsdtBalanceAfter + proposal.A_USDT_WITHDRAW_AMOUNT(), + 1_000e6 + ); + assertApproxEqAbs( + collectorAEthUsdtBalanceBefore, + collectorAEthUsdtBalanceAfter + proposal.A_ETH_USDT_WITHDRAW_AMOUNT(), + 1e6 + ); + assertApproxEqAbs( + collectorAEthUsdcBalanceBefore, + collectorAEthUsdcBalanceAfter + proposal.A_ETH_USDC_WITHDRAW_AMOUNT(), + 1e6 + ); + + assertEq( + IERC20(AaveV3EthereumAssets.USDT_UNDERLYING).balanceOf( + 0x1D18380041Ba52ef4011e8264E2F9605D7a023Fe // milkmanInstance contract + ), + proposal.A_USDT_WITHDRAW_AMOUNT() + proposal.A_ETH_USDT_WITHDRAW_AMOUNT() + ); + assertEq( + IERC20(AaveV3EthereumAssets.USDC_UNDERLYING).balanceOf( + 0xe798354288DB1A06da83beF6e2915325a16A300a // milkmanInstance contract + ), + proposal.A_ETH_USDC_WITHDRAW_AMOUNT() + ); + } + + function test_initialFund() public { + uint256 initialGhoFund = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf( + address(AaveV3EthereumLido.COLLECTOR) + ); + + executePayload(vm, address(proposal)); + + (address aTokenAddress, , ) = AaveV3EthereumLido + .AAVE_PROTOCOL_DATA_PROVIDER + .getReserveTokensAddresses(AaveV3EthereumAssets.GHO_UNDERLYING); + + assertEq( + IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(address(AaveV3EthereumLido.COLLECTOR)), + initialGhoFund - proposal.INITIAL_GHO_SUPPLY() + ); + assertEq( + IERC20(aTokenAddress).balanceOf(address(AaveV3EthereumLido.COLLECTOR)), + proposal.INITIAL_GHO_SUPPLY() + ); + } + + function test_allowance() public { + address agdMultiSig = proposal.AGD_MULTISIG(); + + uint256 allowance = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).allowance( + address(AaveV3EthereumLido.COLLECTOR), + agdMultiSig + ); + assertGt(allowance, 0); + + uint256 meritGhoAllowanceBefore = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).allowance( + address(AaveV3EthereumLido.COLLECTOR), + proposal.MERIT_MULTISIG() + ); + + executePayload(vm, address(proposal)); + + (address aTokenAddress, , ) = AaveV3EthereumLido + .AAVE_PROTOCOL_DATA_PROVIDER + .getReserveTokensAddresses(AaveV3EthereumAssets.GHO_UNDERLYING); + + allowance = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).allowance( + address(AaveV3EthereumLido.COLLECTOR), + agdMultiSig + ); + assertEq(allowance, 0); + + vm.startPrank(agdMultiSig); + + vm.expectRevert(stdError.arithmeticError); + IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).transferFrom( + address(AaveV3Ethereum.COLLECTOR), + agdMultiSig, + 1e18 + ); + vm.stopPrank(); + + uint256 meritGhoAllowanceAfter = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).allowance( + address(AaveV3EthereumLido.COLLECTOR), + proposal.MERIT_MULTISIG() + ); + uint256 meritAEthGhoAllowanceAfter = IERC20(aTokenAddress).allowance( + address(AaveV3EthereumLido.COLLECTOR), + proposal.MERIT_MULTISIG() + ); + + assertEq(meritGhoAllowanceBefore, meritAEthGhoAllowanceAfter); + assertEq(meritGhoAllowanceAfter, 0); + } +} diff --git a/src/20241104_AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance/OnboardGHOAndMigrateStreamsToLidoInstance.md b/src/20241104_AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance/OnboardGHOAndMigrateStreamsToLidoInstance.md new file mode 100644 index 000000000..978059277 --- /dev/null +++ b/src/20241104_AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance/OnboardGHOAndMigrateStreamsToLidoInstance.md @@ -0,0 +1,110 @@ +--- +title: "Onboard GHO and Migrate Streams to Prime Instance" +author: "karpatkey_TokenLogic" +discussions: "https://governance.aave.com/t/arfc-onboard-gho-and-migrate-streams-to-lido-instance/19686" +snapshot: "https://snapshot.org/#/aave.eth/proposal/0x5c27aa8f1de66a3e56f535d60e4c1666a5617a36f8f81c09df2b0ea184a90290" +--- + +## Simple Summary + +This publication proposes the following: + +- Onboarding GHO to the Prime instance of Aave v3 with 3M seed from Collector; +- Acquire 3M GHO from spot market and send to the Collector +- Migrate Merit allowance +- Cancel AGD GHO allowance + +## Motivation + +### Onboard GHO Prime Instance with 3M seed from Collector + +With the circulating supply nearing 180M and nearly 50M in DEX liquidity on Ethereum, this publication proposes adding GHO to the Prime instance of Aave v3. + +Adding GHO to the Prime instance of Aave v3 would provide the DAO with several opportunities: + +- Mint GHO through a Facilitator and deposit it into the Reserve to generate revenue; +- Enable Aave DAO to earn yield on existing GHO holdings; and, +- Establish a GHO reserve that provides an organic deposit yield. + +Each of these options offers clear advantages for the Aave DAO and GHO users. GHO is to be onboarded as a borrow-only asset, similar to the current configurations of USDC and USDS. + +The seeded 3M GHO should be sufficient to sustain two months of Merit, with a sufficient buffer to ensure timely fund withdrawals. Allowance will be migrated from Core to Prime market. + +### Acquire GHO from spot market and send to the collector + +3M GHO is to be acquired from spot market and sent to the Collector. + +Within this publication, the Aave Grants DAO GHO Allowance is to be cancelled. + +## Specification + +The below details the parameter configuration of the GHO Reserve on the Prime instance of Aave v3. + +| Parameter | Value | +| ------------------------- | -----------------------------------------: | +| Isolation Mode | false | +| Borrowable | ENABLED | +| Collateral Enabled | false | +| Supply Cap (GHO) | 20,000,000 | +| Borrow Cap (GHO) | 2,500,000 | +| Debt Ceiling | USD 0 | +| LTV | 0 % | +| LT | 0 % | +| Liquidation Bonus | 0 % | +| Liquidation Protocol Fee | 0 % | +| Reserve Factor | 10 % | +| Base Variable Borrow Rate | 10.50 % | +| Variable Slope 1 | 3.00 % | +| Variable Slope 2 | 50 % | +| Uoptimal | 92 % | +| Flashloanable | ENABLED | +| Siloed Borrowing | DISABLED | +| Borrowable in Isolation | DISABLED | +| Oracle | 0xD110cac5d8682A3b045D5524a9903E031d70FCCd | + +GHO is to be included in the sUSDe and ezETH eMode as shown below: + +**sUSDe eMode** + +| Parameter | Value | Value | Value | Value | +| :-------------------: | :---: | :---: | :---: | :---: | +| Asset | sUSDe | USDS | USDC | GHO | +| Collateral | Yes | No | No | No | +| Borrowable | No | Yes | Yes | Yes | +| Max LTV | 90% | - | - | - | +| Liquidation Threshold | 92% | - | - | - | +| Liquidation Bonus | 3.0% | - | - | - | + +**ezETH eMode** + +| Parameter | Value | Value | Value | Value | +| :-------------------: | :---: | :---: | :---: | :---: | +| Asset | ezETH | USDS | USDC | GHO | +| Collateral | Yes | No | No | No | +| Borrowable | No | Yes | Yes | Yes | +| Max LTV | 75% | - | - | - | +| Liquidation Threshold | 80% | - | - | - | +| Liquidation Bonus | 7.5% | - | - | - | + +This proposal includes swap the following asset for GHO: + +| Asset Holding | +| :-------------: | +| aUSDT (1.5M) | +| aEthUSDT (0.5M) | +| aEthUSDC (1.0M) | + +Cancel Aave Grants DAO GHO [Allowance](https://governance.aave.com/t/update-from-aave-grants-winding-down-agd-1-0-and-what-s-next/18707). + +Migrate Merit allowance from Core to Prime market. + +## References + +- Implementation: [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/2ccea23f34b42c480651aa629f810783e273b83f/src/20241104_AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance/AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance_20241104.sol) +- Tests: [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/2ccea23f34b42c480651aa629f810783e273b83f/src/20241104_AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance/AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance_20241104.t.sol) +- [Snapshot](https://snapshot.org/#/aave.eth/proposal/0x5c27aa8f1de66a3e56f535d60e4c1666a5617a36f8f81c09df2b0ea184a90290) +- [Discussion](https://governance.aave.com/t/arfc-onboard-gho-and-migrate-streams-to-lido-instance/19686) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241104_AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance/OnboardGHOAndMigrateStreamsToLidoInstance_20241104.s.sol b/src/20241104_AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance/OnboardGHOAndMigrateStreamsToLidoInstance_20241104.s.sol new file mode 100644 index 000000000..2bc76dc4e --- /dev/null +++ b/src/20241104_AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance/OnboardGHOAndMigrateStreamsToLidoInstance_20241104.s.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance_20241104} from './AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance_20241104.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241104_AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance/OnboardGHOAndMigrateStreamsToLidoInstance_20241104.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/OnboardGHOAndMigrateStreamsToLidoInstance_20241104.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance_20241104).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/20241104_AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance/OnboardGHOAndMigrateStreamsToLidoInstance_20241104.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(AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance_20241104).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241104_AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance/OnboardGHOAndMigrateStreamsToLidoInstance.md' + ) + ); + } +} diff --git a/src/20241104_AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance/config.ts b/src/20241104_AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance/config.ts new file mode 100644 index 000000000..8adbf0232 --- /dev/null +++ b/src/20241104_AaveV3EthereumLido_OnboardGHOAndMigrateStreamsToLidoInstance/config.ts @@ -0,0 +1,69 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3EthereumLido'], + title: 'Onboard GHO and Migrate Streams to Lido Instance', + shortName: 'OnboardGHOAndMigrateStreamsToLidoInstance', + date: '20241104', + author: 'karpatkey_TokenLogic', + discussion: + 'https://governance.aave.com/t/arfc-onboard-gho-and-migrate-streams-to-lido-instance/19686', + snapshot: + 'https://snapshot.org/#/aave.eth/proposal/0x5c27aa8f1de66a3e56f535d60e4c1666a5617a36f8f81c09df2b0ea184a90290', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3EthereumLido: { + configs: { + ASSET_LISTING: [ + { + assetSymbol: 'GHO', + decimals: 18, + priceFeed: '0xD110cac5d8682A3b045D5524a9903E031d70FCCd', + ltv: '0', + liqThreshold: '0', + liqBonus: '0', + debtCeiling: '0', + liqProtocolFee: '0', + enabledToBorrow: 'ENABLED', + flashloanable: 'ENABLED', + borrowableInIsolation: 'DISABLED', + withSiloedBorrowing: 'DISABLED', + reserveFactor: '10', + supplyCap: '20000000', + borrowCap: '2500000', + rateStrategyParams: { + optimalUtilizationRate: '92', + baseVariableBorrowRate: '10.50', + variableRateSlope1: '3.00', + variableRateSlope2: '50', + }, + asset: '0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f', + admin: '', + }, + ], + EMODES_ASSETS: [ + { + asset: 'GHO', + eModeCategory: 'AaveV3EthereumLidoEModes.SUSDE_STABLECOINS', + collateral: 'DISABLED', + borrowable: 'ENABLED', + }, + { + asset: 'USDC', + eModeCategory: 'AaveV3EthereumLidoEModes.LRT_STABLECOINS_MAIN', + collateral: 'DISABLED', + borrowable: 'ENABLED', + }, + { + asset: 'GHO', + eModeCategory: 'AaveV3EthereumLidoEModes.LRT_STABLECOINS_MAIN', + collateral: 'DISABLED', + borrowable: 'ENABLED', + }, + ], + }, + cache: {blockNumber: 21118528}, + }, + }, +}; diff --git a/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104.sol b/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104.sol new file mode 100644 index 000000000..31f719080 --- /dev/null +++ b/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104.sol @@ -0,0 +1,131 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV3PayloadEthereum} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereum.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol'; +import {IEmissionManager} from 'aave-v3-origin/contracts/rewards/interfaces/IEmissionManager.sol'; +/** + * @title Onboard rsETH to Aave V3 Ethereum + * @author ACI + * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0xe83b67dfdddd469c298ce6133f4fdb84c9796c671c023b88617d5a25b5933c7f + * - Discussion: https://governance.aave.com/t/arfc-add-rseth-to-aave-v3-ethereum/17696 + */ +contract AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104 is AaveV3PayloadEthereum { + using SafeERC20 for IERC20; + + address public constant rsETH = 0xA1290d69c65A6Fe4DF752f95823fae25cB99e5A7; + uint256 public constant rsETH_SEED_AMOUNT = 4e16; + address public constant rsETH_ADMIN = 0xac140648435d03f784879cd789130F22Ef588Fcd; + + function _postExecute() internal override { + IERC20(rsETH).forceApprove(address(AaveV3Ethereum.POOL), rsETH_SEED_AMOUNT); + AaveV3Ethereum.POOL.supply(rsETH, rsETH_SEED_AMOUNT, address(AaveV3Ethereum.COLLECTOR), 0); + + (address arsETH, , ) = AaveV3Ethereum.AAVE_PROTOCOL_DATA_PROVIDER.getReserveTokensAddresses( + rsETH + ); + IEmissionManager(AaveV3Ethereum.EMISSION_MANAGER).setEmissionAdmin(rsETH, rsETH_ADMIN); + IEmissionManager(AaveV3Ethereum.EMISSION_MANAGER).setEmissionAdmin(arsETH, rsETH_ADMIN); + } + + function capsUpdates() public pure override returns (IAaveV3ConfigEngine.CapsUpdate[] memory) { + IAaveV3ConfigEngine.CapsUpdate[] memory capsUpdate = new IAaveV3ConfigEngine.CapsUpdate[](2); + + capsUpdate[0] = IAaveV3ConfigEngine.CapsUpdate({ + asset: AaveV3EthereumAssets.wstETH_UNDERLYING, + supplyCap: EngineFlags.KEEP_CURRENT, + borrowCap: 60_000 + }); + capsUpdate[1] = IAaveV3ConfigEngine.CapsUpdate({ + asset: AaveV3EthereumAssets.ETHx_UNDERLYING, + supplyCap: EngineFlags.KEEP_CURRENT, + borrowCap: 5_000 + }); + + return capsUpdate; + } + function eModeCategoriesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.EModeCategoryUpdate[] memory) + { + IAaveV3ConfigEngine.EModeCategoryUpdate[] + memory eModeUpdates = new IAaveV3ConfigEngine.EModeCategoryUpdate[](1); + + eModeUpdates[0] = IAaveV3ConfigEngine.EModeCategoryUpdate({ + eModeCategory: 3, + ltv: 92_50, + liqThreshold: 94_50, + liqBonus: 1_00, + label: 'rsETH LST main' + }); + + return eModeUpdates; + } + function assetsEModeUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.AssetEModeUpdate[] memory) + { + IAaveV3ConfigEngine.AssetEModeUpdate[] + memory assetEModeUpdates = new IAaveV3ConfigEngine.AssetEModeUpdate[](3); + + assetEModeUpdates[0] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: rsETH, + eModeCategory: 3, + borrowable: EngineFlags.DISABLED, + collateral: EngineFlags.ENABLED + }); + + assetEModeUpdates[1] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3EthereumAssets.wstETH_UNDERLYING, + eModeCategory: 3, + borrowable: EngineFlags.ENABLED, + collateral: EngineFlags.DISABLED + }); + + assetEModeUpdates[2] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3EthereumAssets.ETHx_UNDERLYING, + eModeCategory: 3, + borrowable: EngineFlags.ENABLED, + collateral: EngineFlags.DISABLED + }); + + return assetEModeUpdates; + } + function newListings() public pure override returns (IAaveV3ConfigEngine.Listing[] memory) { + IAaveV3ConfigEngine.Listing[] memory listings = new IAaveV3ConfigEngine.Listing[](1); + + listings[0] = IAaveV3ConfigEngine.Listing({ + asset: rsETH, + assetSymbol: 'rsETH', + priceFeed: 0x47F52B2e43D0386cF161e001835b03Ad49889e3b, + enabledToBorrow: EngineFlags.ENABLED, + borrowableInIsolation: EngineFlags.DISABLED, + withSiloedBorrowing: EngineFlags.DISABLED, + flashloanable: EngineFlags.ENABLED, + ltv: 72_00, + liqThreshold: 75_00, + liqBonus: 7_50, + reserveFactor: 15_00, + supplyCap: 19_000, + borrowCap: 1_900, + debtCeiling: 0, + liqProtocolFee: 10_00, + rateStrategyParams: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: 45_00, + baseVariableBorrowRate: 0, + variableRateSlope1: 7_00, + variableRateSlope2: 300_00 + }) + }); + + return listings; + } +} diff --git a/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104.t.sol b/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104.t.sol new file mode 100644 index 000000000..b9db591db --- /dev/null +++ b/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104.t.sol @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3Ethereum} from 'aave-address-book/AaveV3Ethereum.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {IEmissionManager} from 'aave-v3-origin/contracts/rewards/interfaces/IEmissionManager.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104} from './AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104.sol'; + +/** + * @dev Test for AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104.t.sol -vv + */ +contract AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104_Test is ProtocolV3TestBase { + AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21136339); + proposal = new AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104', + AaveV3Ethereum.POOL, + address(proposal) + ); + } + + function test_collectorHasrsETHFunds() public { + GovV3Helpers.executePayload(vm, address(proposal)); + (address aTokenAddress, , ) = AaveV3Ethereum + .AAVE_PROTOCOL_DATA_PROVIDER + .getReserveTokensAddresses(proposal.rsETH()); + assertGe(IERC20(aTokenAddress).balanceOf(address(AaveV3Ethereum.COLLECTOR)), 4 * 10 ** 16); + } + + function test_rsETHAdmin() public { + GovV3Helpers.executePayload(vm, address(proposal)); + (address arsETH, , ) = AaveV3Ethereum.AAVE_PROTOCOL_DATA_PROVIDER.getReserveTokensAddresses( + proposal.rsETH() + ); + assertEq( + IEmissionManager(AaveV3Ethereum.EMISSION_MANAGER).getEmissionAdmin(proposal.rsETH()), + proposal.rsETH_ADMIN() + ); + assertEq( + IEmissionManager(AaveV3Ethereum.EMISSION_MANAGER).getEmissionAdmin(arsETH), + proposal.rsETH_ADMIN() + ); + } +} diff --git a/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/OnboardRsETHToAaveV3Ethereum.md b/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/OnboardRsETHToAaveV3Ethereum.md new file mode 100644 index 000000000..2ed78cae4 --- /dev/null +++ b/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/OnboardRsETHToAaveV3Ethereum.md @@ -0,0 +1,71 @@ +--- +title: "Onboard rsETH to Aave V3 Ethereum" +author: "ACI" +discussions: "https://governance.aave.com/t/arfc-add-rseth-to-aave-v3-ethereum/17696" +snapshot: "https://snapshot.org/#/aave.eth/proposal/0xe83b67dfdddd469c298ce6133f4fdb84c9796c671c023b88617d5a25b5933c7f" +--- + +## Simple Summary + +Kelp DAO is seeking community support for adding its Liquid Restaking Token, rsETH, to Aave V3 on Ethereum. In addition, rsETH depositors into Aave will accumulate additional Kelp miles and EigenLayer points. + +## Motivation + +KelpDAO (https://www.kelpdao.xyz/restake/) is one of the largest liquid restaking protocol built on top of the Eigen Layer. Restakers on Kelp get access to multiple benefits like restaking rewards, staking rewards and DeFi yields. + +## Specification + +The table below illustrates the configured risk parameters for **rsETH** + +| Parameter | Value | +| ------------------------- | -----------------------------------------: | +| Isolation Mode | false | +| Borrowable | ENABLED | +| Collateral Enabled | true | +| Supply Cap (rsETH) | 19,000 | +| Borrow Cap (rsETH) | 1,900 | +| Debt Ceiling | USD 0 | +| LTV | 72 % | +| LT | 75 % | +| Liquidation Bonus | 7.5 % | +| Liquidation Protocol Fee | 10 % | +| Reserve Factor | 15 % | +| Base Variable Borrow Rate | 0 % | +| Variable Slope 1 | 7 % | +| Variable Slope 2 | 300 % | +| Uoptimal | 45 % | +| Flashloanable | ENABLED | +| Siloed Borrowing | DISABLED | +| Borrowable in Isolation | DISABLED | +| Oracle | 0x47F52B2e43D0386cF161e001835b03Ad49889e3b | + +Additionaly [0xac140648435d03f784879cd789130F22Ef588Fcd](https://etherscan.io/address/0xac140648435d03f784879cd789130F22Ef588Fcd) has been set as the emission admin for rsETH and the corresponding aToken. + +A new rsETH LST main e-mode has also been added: + +| Parameter | Value | Value | Value | +| --------------------- | ----- | ------ | ----- | +| Asset | rsETH | wstETH | ETHx | +| Collateral | Yes | No | No | +| Borrowable | No | Yes | Yes | +| Max LTV | 92.5% | - | - | +| Liquidation Threshold | 94.5% | - | - | +| Liquidation Penalty | 1.00% | - | - | + +The caps of the e-mode related assets have also been updated: + +| | Current Borrow Cap | Recommended Borrow Cap | +| ------ | ------------------ | ---------------------- | +| wstETH | 48,000 | 60,000 | +| ETHx | 320 | 5,000 | + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/7a55e9d529097bedca83167e2dfd5c82380e2ab6/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/7a55e9d529097bedca83167e2dfd5c82380e2ab6/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104.t.sol) +- [Snapshot](https://snapshot.org/#/aave.eth/proposal/0xe83b67dfdddd469c298ce6133f4fdb84c9796c671c023b88617d5a25b5933c7f) +- [Discussion](https://governance.aave.com/t/arfc-add-rseth-to-aave-v3-ethereum/17696) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/OnboardRsETHToAaveV3Ethereum_20241104.s.sol b/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/OnboardRsETHToAaveV3Ethereum_20241104.s.sol new file mode 100644 index 000000000..d196d03b9 --- /dev/null +++ b/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/OnboardRsETHToAaveV3Ethereum_20241104.s.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3Ethereum} from 'aave-address-book/AaveV3Ethereum.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104} from './AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/OnboardRsETHToAaveV3Ethereum_20241104.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/OnboardRsETHToAaveV3Ethereum_20241104.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum_20241104).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/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/OnboardRsETHToAaveV3Ethereum_20241104.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_OnboardRsETHToAaveV3Ethereum_20241104).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/OnboardRsETHToAaveV3Ethereum.md' + ) + ); + } +} diff --git a/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/config.ts b/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/config.ts new file mode 100644 index 000000000..21a064df4 --- /dev/null +++ b/src/20241104_AaveV3Ethereum_OnboardRsETHToAaveV3Ethereum/config.ts @@ -0,0 +1,61 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3Ethereum'], + title: 'Onboard rsETH to Aave V3 Ethereum', + shortName: 'OnboardRsETHToAaveV3Ethereum', + date: '20241104', + author: 'ACI', + discussion: 'https://governance.aave.com/t/arfc-add-rseth-to-aave-v3-ethereum/17696', + snapshot: + 'https://snapshot.org/#/aave.eth/proposal/0xe83b67dfdddd469c298ce6133f4fdb84c9796c671c023b88617d5a25b5933c7f', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Ethereum: { + configs: { + CAPS_UPDATE: [ + {asset: 'wstETH', supplyCap: '', borrowCap: '60000'}, + {asset: 'ETHx', supplyCap: '', borrowCap: '5000'}, + ], + EMODES_UPDATES: [ + { + eModeCategory: 3, + ltv: '92.5', + liqThreshold: '94.5', + liqBonus: '1', + label: 'rsETH LST main', + }, + ], + ASSET_LISTING: [ + { + assetSymbol: 'rsETH', + decimals: 18, + priceFeed: '0x47F52B2e43D0386cF161e001835b03Ad49889e3b', + ltv: '72', + liqThreshold: '75', + liqBonus: '7.5', + debtCeiling: '0', + liqProtocolFee: '10', + enabledToBorrow: 'ENABLED', + flashloanable: 'ENABLED', + borrowableInIsolation: 'DISABLED', + withSiloedBorrowing: 'DISABLED', + reserveFactor: '15', + supplyCap: '19000', + borrowCap: '1900', + rateStrategyParams: { + optimalUtilizationRate: '45', + baseVariableBorrowRate: '0', + variableRateSlope1: '7', + variableRateSlope2: '300', + }, + asset: '0xA1290d69c65A6Fe4DF752f95823fae25cB99e5A7', + admin: '0xac140648435d03f784879cd789130F22Ef588Fcd', + }, + ], + }, + cache: {blockNumber: 21116205}, + }, + }, +}; diff --git a/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.sol b/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.sol new file mode 100644 index 000000000..c70f3fd7e --- /dev/null +++ b/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV3PayloadEthereum} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereum.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title Remove Frax from Isolation Mode on Aave v3 Mainnet + * @author Aave Chan Initiative + * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x9bc3f3d8e38d70f55887f2f2498e1b39f59467489158923488aceab73cd4f144 + * - Discussion: https://governance.aave.com/t/arfc-remove-frax-from-isolation-mode-on-aave-v3-mainnet/19337 + */ +contract AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105 is + AaveV3PayloadEthereum +{ + function collateralsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.CollateralUpdate[] memory) + { + IAaveV3ConfigEngine.CollateralUpdate[] + memory collateralUpdate = new IAaveV3ConfigEngine.CollateralUpdate[](1); + + collateralUpdate[0] = IAaveV3ConfigEngine.CollateralUpdate({ + asset: AaveV3EthereumAssets.FRAX_UNDERLYING, + ltv: EngineFlags.KEEP_CURRENT, + liqThreshold: EngineFlags.KEEP_CURRENT, + liqBonus: EngineFlags.KEEP_CURRENT, + debtCeiling: 0, + liqProtocolFee: EngineFlags.KEEP_CURRENT + }); + + return collateralUpdate; + } +} diff --git a/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.t.sol b/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.t.sol new file mode 100644 index 000000000..484b4b878 --- /dev/null +++ b/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.t.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Ethereum} from 'aave-address-book/AaveV3Ethereum.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105} from './AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.sol'; + +/** + * @dev Test for AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.t.sol -vv + */ +contract AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105_Test is + ProtocolV3TestBase +{ + AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21123714); + proposal = new AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105', + AaveV3Ethereum.POOL, + address(proposal) + ); + } +} diff --git a/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/RemoveFraxFromIsolationModeOnAaveV3Mainnet.md b/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/RemoveFraxFromIsolationModeOnAaveV3Mainnet.md new file mode 100644 index 000000000..59d6d9c98 --- /dev/null +++ b/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/RemoveFraxFromIsolationModeOnAaveV3Mainnet.md @@ -0,0 +1,36 @@ +--- +title: "Remove Frax from Isolation Mode on Aave v3 Mainnet" +author: "Aave Chan Initiative" +discussions: "https://governance.aave.com/t/arfc-remove-frax-from-isolation-mode-on-aave-v3-mainnet/19337" +snapshot: "https://snapshot.org/#/aave.eth/proposal/0x9bc3f3d8e38d70f55887f2f2498e1b39f59467489158923488aceab73cd4f144" +--- + +## Simple Summary + +This is an AIP to remove FRAX from isolation mode. This is a reboot with minor changes of a [previous ARFC](https://governance.aave.com/t/arfc-remove-frax-from-isolation-mode-and-onboard-sfrax-to-aave-v3-mainnet/18506) which passed Snapshot but has not yet been implemented. + +## Motivation + +FRAX and Aave DAO have found more synergies over the last months. The FRAX team has responded with major updates to security on sfrxETH in response to BGD Labs feedback. FRAX has also initated governance proposals to add GHO to Frax Lend. There are ongoing conversations to have a FRAX AMO included into Aave v3. sFRAX was [previously accepted](https://governance.aave.com/t/arfc-add-sfrax-on-ethereum-v3/16303) for onboarding in a previous [ARFC vote](https://snapshot.org/#/aave.eth/proposal/0xdba99e9c8da24424447d7c7b70eff93ad5b6055714b5f34cf9859c923fb3a38a) before the introduction of CAPO feeds. + +This proposal suggests removing FRAX from isolation mode to facilitate further AMO deployments. + +## Specification + +- FRAX will be removed from Isolation Mode on Aave v3 instances. + +| **Parameter** | FRAX | +| -------------- | ---- | +| Isolation Mode | No | +| Debt Ceiling | 0 | + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/b81d0fbc70b75e3fc601d8ca3f0ad1df87c84a44/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/b81d0fbc70b75e3fc601d8ca3f0ad1df87c84a44/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.t.sol) +- [Snapshot](https://snapshot.org/#/aave.eth/proposal/0x9bc3f3d8e38d70f55887f2f2498e1b39f59467489158923488aceab73cd4f144) +- [Discussion](https://governance.aave.com/t/arfc-remove-frax-from-isolation-mode-on-aave-v3-mainnet/19337) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.s.sol b/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.s.sol new file mode 100644 index 000000000..e46d79331 --- /dev/null +++ b/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.s.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105} from './AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105).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/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105.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_RemoveFraxFromIsolationModeOnAaveV3Mainnet_20241105).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/RemoveFraxFromIsolationModeOnAaveV3Mainnet.md' + ) + ); + } +} diff --git a/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/config.ts b/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/config.ts new file mode 100644 index 000000000..df673383a --- /dev/null +++ b/src/20241105_AaveV3Ethereum_RemoveFraxFromIsolationModeOnAaveV3Mainnet/config.ts @@ -0,0 +1,42 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + author: 'Aave Chan Initiative', + pools: ['AaveV3Ethereum'], + title: 'Remove Frax from Isolation Mode on Aave v3 Mainnet', + shortName: 'RemoveFraxFromIsolationModeOnAaveV3Mainnet', + date: '20241105', + discussion: + 'https://governance.aave.com/t/arfc-remove-frax-from-isolation-mode-on-aave-v3-mainnet/19337', + snapshot: + 'https://snapshot.org/#/aave.eth/proposal/0x9bc3f3d8e38d70f55887f2f2498e1b39f59467489158923488aceab73cd4f144', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Ethereum: { + configs: { + COLLATERALS_UPDATE: [ + { + asset: 'FRAX', + ltv: '0', + liqThreshold: 'KEEP_CURRENT', + liqBonus: 'KEEP_CURRENT', + debtCeiling: '0', + liqProtocolFee: 'KEEP_CURRENT', + }, + ], + BORROWS_UPDATE: [ + { + enabledToBorrow: 'KEEP_CURRENT', + flashloanable: 'KEEP_CURRENT', + borrowableInIsolation: 'KEEP_CURRENT', + withSiloedBorrowing: 'KEEP_CURRENT', + reserveFactor: 'KEEP_CURRENT', + asset: 'FRAX', + }, + ], + }, + cache: {blockNumber: 21123714}, + }, + }, +}; diff --git a/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106.sol b/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106.sol new file mode 100644 index 000000000..d0fb54f43 --- /dev/null +++ b/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {AaveSafetyModule} from 'aave-address-book/AaveSafetyModule.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; + +import {IStakeToken} from 'aave-address-book/common/IStakeToken.sol'; + +/** + * @title Safety Module stkAAVE - Re-enable Rewards + * @author @karpatkey_TokenLogic + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-amend-safety-module-emissions/16640/13 + */ +contract AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106 is IProposalGenericExecutor { + uint256 public constant DISTRIBUTION_DURATION = 180 days; + uint128 public constant AAVE_EMISSION_PER_SECOND_STK_AAVE = uint128(360e18) / 1 days; // 360 AAVE per day + + function execute() external { + uint256 remainingAllowance = IERC20(AaveV3EthereumAssets.AAVE_UNDERLYING).allowance( + address(MiscEthereum.ECOSYSTEM_RESERVE), + AaveSafetyModule.STK_AAVE + ); + + // Approval needs to be reset in order to increase it + MiscEthereum.AAVE_ECOSYSTEM_RESERVE_CONTROLLER.approve( + MiscEthereum.ECOSYSTEM_RESERVE, + AaveV3EthereumAssets.AAVE_UNDERLYING, + AaveSafetyModule.STK_AAVE, + 0 + ); + + MiscEthereum.AAVE_ECOSYSTEM_RESERVE_CONTROLLER.approve( + MiscEthereum.ECOSYSTEM_RESERVE, + AaveV3EthereumAssets.AAVE_UNDERLYING, + AaveSafetyModule.STK_AAVE, + remainingAllowance + (AAVE_EMISSION_PER_SECOND_STK_AAVE * DISTRIBUTION_DURATION) + ); + } +} diff --git a/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106.t.sol b/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106.t.sol new file mode 100644 index 000000000..474616977 --- /dev/null +++ b/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106.t.sol @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {AaveSafetyModule} from 'aave-address-book/AaveSafetyModule.sol'; +import {IStakeToken} from 'aave-address-book/common/IStakeToken.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; + +import {AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106} from './AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106.sol'; + +/** + * @dev Test for AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106.t.sol -vv + */ +contract AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106_Test is ProtocolV3TestBase { + AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21128772); + proposal = new AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106(); + } + + function test_checkConfig() public { + (uint128 emissionPerSecondBeforeStkAAVE, , ) = IStakeToken(AaveSafetyModule.STK_AAVE).assets( + AaveSafetyModule.STK_AAVE + ); + + assertEq( + emissionPerSecondBeforeStkAAVE, + proposal.AAVE_EMISSION_PER_SECOND_STK_AAVE(), + 'emissions before not equal stkAAVE' + ); + + executePayload(vm, address(proposal)); + + (uint128 emissionPerSecondAfterStkAAVE, , ) = IStakeToken(AaveSafetyModule.STK_AAVE).assets( + AaveSafetyModule.STK_AAVE + ); + + assertEq( + emissionPerSecondAfterStkAAVE, + proposal.AAVE_EMISSION_PER_SECOND_STK_AAVE(), + 'emissions after not equal stkAAVE' + ); + assertApproxEqAbs( + emissionPerSecondAfterStkAAVE, + emissionPerSecondBeforeStkAAVE, + 1, + 'stkAAVE emissions not same as previous' + ); + } + + function test_checkRewards_stkAAVE() public { + address staker = 0x5a801a9418D036fD453078c3ADCB761fdc5Ae695; + uint256 rewardsPerDay = proposal.AAVE_EMISSION_PER_SECOND_STK_AAVE(); + + executePayload(vm, address(proposal)); + + vm.startPrank(staker); + IERC20(AaveV3EthereumAssets.AAVE_UNDERLYING).approve(AaveSafetyModule.STK_AAVE, 1e18); + + IStakeToken(AaveSafetyModule.STK_AAVE).stake(staker, 1e18); + + vm.warp(block.timestamp + 1 days); + + uint256 rewardsBalance = IStakeToken(AaveSafetyModule.STK_AAVE).getTotalRewardsBalance(staker); + + assertTrue(rewardsBalance > 0 && rewardsBalance <= rewardsPerDay); + + vm.stopPrank(); + } +} diff --git a/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/SafetyModuleStkAAVEReEnableRewards.md b/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/SafetyModuleStkAAVEReEnableRewards.md new file mode 100644 index 000000000..46ab8b8b0 --- /dev/null +++ b/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/SafetyModuleStkAAVEReEnableRewards.md @@ -0,0 +1,35 @@ +--- +title: "Safety Module stkAAVE - Re-enable Rewards" +author: "@karpatkey_TokenLogic" +discussions: "https://governance.aave.com/t/arfc-amend-safety-module-emissions/16640/13" +snapshot: "Direct-to-AIP" +--- + +## Simple Summary + +This publication proposes renewing the AAVE emissions to stkAAVE holders for the following 180 days. + +## Motivation + +With the conclusion of the recent reward cycle, this proposal aims to renew $AAVE emissions for stkAAVE holders. The stkAAVE module has proven to be a crucial mechanism as an AAVE supply sink, currently holding a TVL of $480M and accounting for 18.8% of the supply. It is recommended to maintain these emissions in anticipation of upcoming Umbrella developments, with adjustments to be made following the outcomes of the Umbrella upgrade. + +More information on stkAAVE can be found in these dashboards, [here](https://dune.com/xmc2/aave-safety-module) and [here](https://dune.com/KARTOD/AAVE-Staking). + +## Specification + +This proposal will implement the following changes to the AAVE emissions across the three SM categories: + +| Asset | Current AAVE/Day | Proposed AAVE/Day | +| ------- | ---------------- | ----------------- | +| stkAAVE | 360 | 360 | + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/3f98ef3473db6db5009d9e4e369fde61ddbe8265/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/3f98ef3473db6db5009d9e4e369fde61ddbe8265/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106.t.sol) +- [Snapshot]: Direct-to-AIP +- [Discussion](https://governance.aave.com/t/arfc-amend-safety-module-emissions/16640/13) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/SafetyModuleStkAAVEReEnableRewards_20241106.s.sol b/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/SafetyModuleStkAAVEReEnableRewards_20241106.s.sol new file mode 100644 index 000000000..3594948c4 --- /dev/null +++ b/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/SafetyModuleStkAAVEReEnableRewards_20241106.s.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106} from './AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/SafetyModuleStkAAVEReEnableRewards_20241106.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/SafetyModuleStkAAVEReEnableRewards_20241106.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards_20241106).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/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/SafetyModuleStkAAVEReEnableRewards_20241106.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_SafetyModuleStkAAVEReEnableRewards_20241106).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/SafetyModuleStkAAVEReEnableRewards.md' + ) + ); + } +} diff --git a/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/config.ts b/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/config.ts new file mode 100644 index 000000000..84ba8e736 --- /dev/null +++ b/src/20241106_AaveV3Ethereum_SafetyModuleStkAAVEReEnableRewards/config.ts @@ -0,0 +1,14 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3Ethereum'], + title: 'Safety Module stkAAVE - Re-enable Rewards', + shortName: 'SafetyModuleStkAAVEReEnableRewards', + date: '20241106', + author: '@karpatkey_TokenLogic', + discussion: '', + snapshot: 'Direct-to-AIP', + votingNetwork: 'POLYGON', + }, + poolOptions: {AaveV3Ethereum: {configs: {OTHERS: {}}, cache: {blockNumber: 21128772}}}, +}; diff --git a/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AaveV3EthereumLido_AutomatedAGRSActivation_20241108.sol b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AaveV3EthereumLido_AutomatedAGRSActivation_20241108.sol new file mode 100644 index 000000000..1f79fbb96 --- /dev/null +++ b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AaveV3EthereumLido_AutomatedAGRSActivation_20241108.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {IAaveCLRobotOperator} from './interfaces/IAaveCLRobotOperator.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV3EthereumLido} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {CollectorUtils} from 'aave-helpers/src/CollectorUtils.sol'; +import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol'; +import {SafeCast} from 'solidity-utils/contracts/oz-common/SafeCast.sol'; + +/** + * @title Automated AGRS Activation + * @author BGD Labs (@bgdlabs) + * - Discussion: https://governance.aave.com/t/arfc-aave-generalized-risk-stewards-agrs-activation/19178/3 + * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x4809f179e517e5745ec13eba8f40d98dab73ca65f8a141bd2f18cc16dcd0cc16 + */ +contract AaveV3EthereumLido_AutomatedAGRSActivation_20241108 is IProposalGenericExecutor { + using SafeERC20 for IERC20; + using SafeCast for uint256; + + address public constant EDGE_RISK_STEWARD = 0x81aFd0F99c2Afa2f2DD7E387c2Ef9CD2a29b6E1A; + address public constant AAVE_STEWARD_INJECTOR = 0x834a5aC6e9D05b92F599A031941262F761c34859; + uint256 public constant LINK_AMOUNT = 600 ether; + + function execute() external { + AaveV3EthereumLido.ACL_MANAGER.addRiskAdmin(EDGE_RISK_STEWARD); + + uint256 linkAmount = CollectorUtils.withdrawFromV3( + AaveV3Ethereum.COLLECTOR, + CollectorUtils.IOInput({ + pool: address(AaveV3Ethereum.POOL), + underlying: AaveV3EthereumAssets.LINK_UNDERLYING, + amount: LINK_AMOUNT + }), + address(this) + ); + + IERC20(AaveV3EthereumAssets.LINK_UNDERLYING).forceApprove( + MiscEthereum.AAVE_CL_ROBOT_OPERATOR, + linkAmount + ); + IAaveCLRobotOperator(MiscEthereum.AAVE_CL_ROBOT_OPERATOR).register( + 'LIDO WETH AGRS Injector', + AAVE_STEWARD_INJECTOR, + '', + 5_000_000, + linkAmount.toUint96(), + 0, + '' + ); + } +} diff --git a/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AaveV3EthereumLido_AutomatedAGRSActivation_20241108.t.sol b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AaveV3EthereumLido_AutomatedAGRSActivation_20241108.t.sol new file mode 100644 index 000000000..54170ddbc --- /dev/null +++ b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AaveV3EthereumLido_AutomatedAGRSActivation_20241108.t.sol @@ -0,0 +1,108 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumLido, AaveV3EthereumLidoAssets} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {IRiskSteward} from './interfaces/IRiskSteward.sol'; +import {IRiskOracle} from './interfaces/IRiskOracle.sol'; +import {IAaveStewardInjector} from './interfaces/IAaveStewardInjector.sol'; +import {AutomationCompatibleInterface} from './interfaces/AutomationCompatibleInterface.sol'; +import {AaveV3EthereumLido_AutomatedAGRSActivation_20241108} from './AaveV3EthereumLido_AutomatedAGRSActivation_20241108.sol'; +import {IAaveV3ConfigEngine as IEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {IDefaultInterestRateStrategyV2} from 'aave-v3-origin/contracts/interfaces/IDefaultInterestRateStrategyV2.sol'; + +/** + * @dev Test for AaveV3EthereumLido_AutomatedAGRSActivation_20241108 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AaveV3EthereumLido_AutomatedAGRSActivation_20241108.t.sol -vv + */ +contract AaveV3EthereumLido_AutomatedAGRSActivation_20241108_Test is ProtocolV3TestBase { + AaveV3EthereumLido_AutomatedAGRSActivation_20241108 internal proposal; + address public constant RISK_ORACLE_OWNER = 0x42939e82DF15afc586bb95f7dD69Afb6Dc24A6f9; + IRiskOracle public RISK_ORACLE; + + event KeeperRegistered(uint256 indexed id, address indexed upkeep, uint96 indexed amount); + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21142784); + proposal = new AaveV3EthereumLido_AutomatedAGRSActivation_20241108(); + RISK_ORACLE = IRiskOracle(IAaveStewardInjector(proposal.AAVE_STEWARD_INJECTOR()).RISK_ORACLE()); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3EthereumLido_AutomatedAGRSActivation_20241108', + AaveV3EthereumLido.POOL, + address(proposal) + ); + } + + function test_permissions() public { + executePayload(vm, address(proposal)); + + assertEq(AaveV3EthereumLido.ACL_MANAGER.isRiskAdmin(proposal.EDGE_RISK_STEWARD()), true); + assertEq( + IRiskSteward(proposal.EDGE_RISK_STEWARD()).RISK_COUNCIL(), + proposal.AAVE_STEWARD_INJECTOR() + ); + } + + function test_robotInjectorRegistered() public { + vm.expectEmit(false, true, true, true); + emit KeeperRegistered( + uint256(0), + proposal.AAVE_STEWARD_INJECTOR(), + uint96(proposal.LINK_AMOUNT()) + ); + executePayload(vm, address(proposal)); + } + + function test_injectUpdateToProtocol() public { + executePayload(vm, address(proposal)); + address rateStrategyAddress = AaveV3EthereumLido + .AAVE_PROTOCOL_DATA_PROVIDER + .getInterestRateStrategyAddress(AaveV3EthereumLidoAssets.WETH_UNDERLYING); + + IDefaultInterestRateStrategyV2.InterestRateData + memory currentRate = IDefaultInterestRateStrategyV2(rateStrategyAddress) + .getInterestRateDataBps(AaveV3EthereumLidoAssets.WETH_UNDERLYING); + + IEngine.InterestRateInputData memory newRate = IEngine.InterestRateInputData({ + optimalUsageRatio: currentRate.optimalUsageRatio + 3_00, + baseVariableBorrowRate: currentRate.baseVariableBorrowRate, + variableRateSlope1: currentRate.variableRateSlope1 + 50, + variableRateSlope2: currentRate.variableRateSlope2 + 5_00 + }); + + _addUpdateToRiskOracle(newRate); + + (bool upkeepNeeded, bytes memory performData) = AutomationCompatibleInterface( + proposal.AAVE_STEWARD_INJECTOR() + ).checkUpkeep(''); + assertTrue(upkeepNeeded); + + AutomationCompatibleInterface(proposal.AAVE_STEWARD_INJECTOR()).performUpkeep(performData); + + currentRate = IDefaultInterestRateStrategyV2(rateStrategyAddress).getInterestRateDataBps( + AaveV3EthereumLidoAssets.WETH_UNDERLYING + ); + assertEq(newRate.optimalUsageRatio, currentRate.optimalUsageRatio); + assertEq(newRate.baseVariableBorrowRate, currentRate.baseVariableBorrowRate); + assertEq(newRate.variableRateSlope1, currentRate.variableRateSlope1); + assertEq(newRate.variableRateSlope2, currentRate.variableRateSlope2); + } + + function _addUpdateToRiskOracle(IEngine.InterestRateInputData memory rate) internal { + vm.startPrank(RISK_ORACLE_OWNER); + RISK_ORACLE.publishRiskParameterUpdate( + 'referenceId', + abi.encode(rate), + 'RateStrategyUpdate', + address(AaveV3EthereumLidoAssets.WETH_UNDERLYING), + 'additionalData' + ); + vm.stopPrank(); + } +} diff --git a/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AutomatedAGRSActivation.md b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AutomatedAGRSActivation.md new file mode 100644 index 000000000..f7dc818a5 --- /dev/null +++ b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AutomatedAGRSActivation.md @@ -0,0 +1,79 @@ +--- +title: "Automated (Edge) AGRS Activation" +author: "BGD Labs (@bgdlabs)" +discussions: "https://governance.aave.com/t/arfc-aave-generalized-risk-stewards-agrs-activation/19178/3" +snapshot: "https://snapshot.org/#/aave.eth/proposal/0x4809f179e517e5745ec13eba8f40d98dab73ca65f8a141bd2f18cc16dcd0cc16" +--- + +## Simple Summary + +This proposal activates the automated Aave Generalized Risk Stewards (AGRS) system on the Aave Ethereum Lido Instance to perform automated interest rate updates for the WETH asset. +Under the hood, the AGRS consumes the Edge infrastructure by Chaos Labs. + +## Motivation + +With the manual Aave Generalized Risk Stewards (AGRS) already being activated via this [proposal](https://vote.onaave.com/proposal/?proposalId=197), we think it's fair to also activate the automated AGRS system to perform automated interest rate update for WETH on Lido instance using the [Edge Risk Oracle](https://chaoslabs.xyz/posts/introducing-edge-the-next-generation-oracle) proposed by Chaos Labs. + +Regarding this pilot integration of automated AGRS with Chaos Labs new Edge infrastructure, it has the following rationale: + +- Whenever aligned with other strategic and technical aspects, Aave should benefit from infrastructure built by service providers, in this case, Chaos Labs. +- This pilot will be very non-invasive and with only positive outcomes, as the AGRS layer will guarantee that only acceptable interest rate recommendations will reach the Aave protocol, while ideally having a way more dynamic rate. + +The Aave Lido Market facilitates leveraged staking strategy by allowing users to supply wstETH as collateral for WETH borrowing. The market's viability hinges on maintaining WETH borrowing rates below Lido's daily rebasing staking rewards. However, when utilization approaches the Optimal Utilization point and enters Slope2 of the interest rate model, even minor utilization increases can trigger sharp borrowing rate spikes due to the steeper curve and can make the looping strategy unpredictable and deter user participation. + +The enhanced Liquid E-Mode configurations in the Lido Instance have significantly impacted market dynamics by driving increased demand for wstETH borrowing, as users pursue looping strategies for wstETH interest accrual. This heightened demand creates upward pressure on ETH interest rates, affecting what users are willing to pay. To stabilize rates in this environment, the risk oracle should consider the wstETH supply rate. + +To optimize market dynamics, the interest rate updates being proposed by the risk oracle and updated via AGRS aligns WETH borrowing rates with Lido's staking rewards while considering the impact of pool utilization and E-Mode demand. This alignment helps maintain stable lending conditions and keeps the looping strategy viable for users. + +## Specification + +The automated AGRS will use another instance of AGRS (exactly the same codebase as the other model), but with the following constraints: + +- This instance will only have configurable rate-related parameters: base variable borrow rate, Slope 1, and Slope 2 and uOptimal (Kink). +- Recommendations of these parameters will be submitted to [RiskOracle](https://github.com/ChaosLabsInc/risk-oracle/blob/main/src/RiskOracle.sol) smart contract, from the Edge off-chain infrastructure. +- Between the risk oracle smart contract and the AGRS contract, there will be a very thin middleware [AaveStewardsInjector](https://etherscan.io/address/0x834a5aC6e9D05b92F599A031941262F761c34859), which will have the following logic: + - Will take recommendations from the Edge Risk Oracle side and propagate them to the AGRS contract. + - Enforce that only the WETH asset can be acted upon. + - Given the protections (percentage constraints and time delay) on the AGRS side and that it is an assumption that risk recommendation will be the time correct on the Edge Risk Oracle, the propagation will be permissionless. + +The [AaveStewardsInjector](https://etherscan.io/address/0x834a5aC6e9D05b92F599A031941262F761c34859) middleware, technically being part of the Aave Robot infrastructure, will run on Chainlink Automation and will be registered using the [AaveCLRobotOperator](https://etherscan.io/address/0x1cDF8879eC8bE012bA959EB515b11008E0cb6323) contract with 600 LINK from the Ethereum Collector. + +The new instance of the [RiskSteward](https://etherscan.io/address/0x81aFd0F99c2Afa2f2DD7E387c2Ef9CD2a29b6E1A) will be given the RiskAdmin role with the following method: `ACL_MANAGER.addRiskAdmin()` + +### AGRS + +The automated AGRS system will be configured with the following params: + +| Parameter | Percent change allowed | minimumDelay | +| ------------------------- | ---------------------- | ------------ | +| Base Variable Borrow Rate | 0.5% (absolute change) | 1 day | +| Slope 1 | 0.5% (absolute change) | 1 day | +| Slope 2 | 5% (absolute change) | 1 day | +| Optimal Point (Kink) | 3% (absolute change) | 1 day | + +### Edge Risk Oracle + +- The risk oracle will retrieve the current Lido staking rewards rate once a day, aligning with the stETH rebasing schedule. +- The new Slope1 will be set to Lido’s staking rewards minus a predefined buffer (initially 0.5%) to account for market volatility and incentives. +- The initial buffer of 0.5% provides a safety margin to accommodate minor fluctuations in staking rewards and market conditions. +- The buffer may be adjusted based on the level of incentives and market feedback to optimize profitability and risk management. +- Update Frequency: + - Adjustments will occur once daily to align with stETH rebasing. +- Parameter Adjustments: + - While the risk oracle has the technical capability to adjust the entire interest rate strategy (base rate, optimal utilization, slope 1, slope 2) under the constraints of the risk stewards, the most updated parameter will be slop 1. +- Monitoring and Transparency: + - All adjustments and calculations will be transparent and auditable, with data available for community review. + +## References + +- Implementation: [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/d7f260e226e42cf6b87e348ab5601aec27f48d1d/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AaveV3EthereumLido_AutomatedAGRSActivation_20241108.sol) +- Tests: [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/d7f260e226e42cf6b87e348ab5601aec27f48d1d/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AaveV3EthereumLido_AutomatedAGRSActivation_20241108.t.sol) +- [Snapshot](https://snapshot.org/#/aave.eth/proposal/0x4809f179e517e5745ec13eba8f40d98dab73ca65f8a141bd2f18cc16dcd0cc16) +- [Discussion](https://governance.aave.com/t/arfc-aave-generalized-risk-stewards-agrs-activation/19178/3) +- AaveStewardsInjector: [github](https://github.com/aave-dao/aave-v3-risk-stewards/blob/650d51e2ec6bb1f4d9ae56da5a341436ef9bb8a1/src/contracts/AaveStewardInjector.sol), [deployed-contract](https://etherscan.io/address/0x834a5aC6e9D05b92F599A031941262F761c34859) +- EdgeRiskSteward: [github](https://github.com/aave-dao/aave-v3-risk-stewards/blob/650d51e2ec6bb1f4d9ae56da5a341436ef9bb8a1/src/contracts/EdgeRiskSteward.sol), [deployed-contract](https://etherscan.io/address/0x81aFd0F99c2Afa2f2DD7E387c2Ef9CD2a29b6E1A) +- EdgeRiskOracle: [github](https://github.com/ChaosLabsInc/risk-oracle/blob/be09f47d749985f9537e185016d0f81c003a9fc9/src/RiskOracle.sol), [deployed-contract](https://etherscan.io/address/0x7ABB46C690C52E919687D19ebF89C81A6136C1F2) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AutomatedAGRSActivation_20241108.s.sol b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AutomatedAGRSActivation_20241108.s.sol new file mode 100644 index 000000000..b6e4a37c4 --- /dev/null +++ b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AutomatedAGRSActivation_20241108.s.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3EthereumLido_AutomatedAGRSActivation_20241108} from './AaveV3EthereumLido_AutomatedAGRSActivation_20241108.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AutomatedAGRSActivation_20241108.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/AutomatedAGRSActivation_20241108.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3EthereumLido_AutomatedAGRSActivation_20241108).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/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AutomatedAGRSActivation_20241108.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(AaveV3EthereumLido_AutomatedAGRSActivation_20241108).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/AutomatedAGRSActivation.md' + ) + ); + } +} diff --git a/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/config.ts b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/config.ts new file mode 100644 index 000000000..05aa92912 --- /dev/null +++ b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/config.ts @@ -0,0 +1,15 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3EthereumLido'], + title: 'Automated AGRS Activation', + shortName: 'AutomatedAGRSActivation', + date: '20241108', + author: 'BGD Labs (@bgdlabs)', + discussion: + 'https://governance.aave.com/t/arfc-aave-generalized-risk-stewards-agrs-activation/19178/3', + snapshot: '', + votingNetwork: 'POLYGON', + }, + poolOptions: {AaveV3EthereumLido: {configs: {OTHERS: {}}, cache: {blockNumber: 21142503}}}, +}; diff --git a/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/AutomationCompatibleInterface.sol b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/AutomationCompatibleInterface.sol new file mode 100644 index 000000000..6d30ab5d5 --- /dev/null +++ b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/AutomationCompatibleInterface.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface AutomationCompatibleInterface { + /** + * @notice method that is simulated by the keepers to see if any work actually + * needs to be performed. This method does does not actually need to be + * executable, and since it is only ever simulated it can consume lots of gas. + * @dev To ensure that it is never called, you may want to add the + * cannotExecute modifier from KeeperBase to your implementation of this + * method. + * @param checkData specified in the upkeep registration so it is always the + * same for a registered upkeep. This can easily be broken down into specific + * arguments using `abi.decode`, so multiple upkeeps can be registered on the + * same contract and easily differentiated by the contract. + * @return upkeepNeeded boolean to indicate whether the keeper should call + * performUpkeep or not. + * @return performData bytes that the keeper should call performUpkeep with, if + * upkeep is needed. If you would like to encode data to decode later, try + * `abi.encode`. + */ + function checkUpkeep( + bytes calldata checkData + ) external returns (bool upkeepNeeded, bytes memory performData); + + /** + * @notice method that is actually executed by the keepers, via the registry. + * The data returned by the checkUpkeep simulation will be passed into + * this method to actually be executed. + * @dev The input to this method should not be trusted, and the caller of the + * method should not even be restricted to any single registry. Anyone should + * be able call it, and the input should be validated, there is no guarantee + * that the data passed in is the performData returned from checkUpkeep. This + * could happen due to malicious keepers, racing keepers, or simply a state + * change while the performUpkeep transaction is waiting for confirmation. + * Always validate the data passed in. + * @param performData is the data which was passed back from the checkData + * simulation. If it is encoded, it can easily be decoded into other types by + * calling `abi.decode`. This data should not be trusted, and should be + * validated against the contract's current state. + */ + function performUpkeep(bytes calldata performData) external; +} diff --git a/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/IAaveCLRobotOperator.sol b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/IAaveCLRobotOperator.sol new file mode 100644 index 000000000..884e4d2af --- /dev/null +++ b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/IAaveCLRobotOperator.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IAaveCLRobotOperator + * @author BGD Labs + * @notice Defines the interface for the robot operator contract to perform admin actions on the automation keepers. + **/ +interface IAaveCLRobotOperator { + /** + * @notice method called by owner to register the automation robot keeper. + * @param name name of keeper. + * @param upkeepContract upkeepContract of the keeper. + * @param upkeepCheckData checkData of the keeper which get passed to the checkUpkeep. + * @param gasLimit max gasLimit which the chainlink automation node can execute for the automation. + * @param amountToFund amount of link to fund the keeper with. + * @param triggerType type of robot keeper to register, 0 for conditional and 1 for event log based. + * @param triggerConfig encoded trigger config for event log based robots, unused for conditional type robots. + * @return chainlink id for the registered keeper. + **/ + function register( + string calldata name, + address upkeepContract, + bytes calldata upkeepCheckData, + uint32 gasLimit, + uint96 amountToFund, + uint8 triggerType, + bytes calldata triggerConfig + ) external returns (uint256); +} diff --git a/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/IAaveStewardInjector.sol b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/IAaveStewardInjector.sol new file mode 100644 index 000000000..2991eab06 --- /dev/null +++ b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/IAaveStewardInjector.sol @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AutomationCompatibleInterface} from './AutomationCompatibleInterface.sol'; + +/** + * @title IAaveStewardInjector + * @author BGD Labs + * @notice Defines the interface for the injector contract to automate actions for Risk Steward. + **/ +interface IAaveStewardInjector is AutomationCompatibleInterface { + /** + * @notice Emitted when performUpkeep is called and an update is injected into the risk steward. + * @param updateId the risk oracle update id injected into the risk steward. + */ + event ActionSucceeded(uint256 indexed updateId); + + /** + * @notice Emitted when injection of a updateId is disabled/enabled. + * @param updateId the risk oracle update id for which automation is disabled/enabled. + * @param disabled true if updateId is disabled, false otherwise. + */ + event UpdateDisabled(uint256 indexed updateId, bool indexed disabled); + + /** + * @notice The following update cannot be injected in the steward injector because the conditions are not met. + */ + error UpdateCannotBeInjected(); + + /** + * @notice method to check if injection of a updateId on risk steward is disabled. + * @param updateId updateId from risk oracle to check if disabled. + * @return bool if updateId is disabled or not. + **/ + function isDisabled(uint256 updateId) external view returns (bool); + + /** + * @notice method called by owner to disable/enabled injection of a updateId on risk steward. + * @param updateId updateId from risk oracle for which we need to disable/enable injection. + * @param disabled true if updateId should be disabled, false otherwise. + */ + function disableUpdateById(uint256 updateId, bool disabled) external; + + /** + * @notice method to check if the updateId from the risk oracle has been executed/injected into the risk steward. + * @param updateid the updateId from the risk oracle to check if already executed/injected. + * @return bool true if the updateId is executed/injected, false otherwise. + */ + function isUpdateIdExecuted(uint256 updateid) external view returns (bool); + + /** + * @notice method to get the address of the edge risk oracle contract. + * @return edge risk oracle contract address. + */ + function RISK_ORACLE() external view returns (address); + + /** + * @notice method to get the address of the aave risk steward contract. + * @return aave risk steward contract address. + */ + function RISK_STEWARD() external view returns (address); + + /** + * @notice method to get the expiration time for an update from the risk oracle. + * @return time in seconds of the expiration time. + */ + function EXPIRATION_PERIOD() external view returns (uint256); + + /** + * @notice method to get the whitelisted update type for which injection is allowed from the risk oracle into the stewards. + * @return string for the whitelisted update type - interest rate update. + */ + function WHITELISTED_UPDATE_TYPE() external view returns (string memory); + + /** + * @notice method to get the whitelisted asset for which injection is allowed from the risk oracle into the stewards. + * @return address for the whitelisted asset. + */ + function WHITELISTED_ASSET() external view returns (address); +} diff --git a/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/IRiskOracle.sol b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/IRiskOracle.sol new file mode 100644 index 000000000..16d757589 --- /dev/null +++ b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/IRiskOracle.sol @@ -0,0 +1,114 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface IRiskOracle { + struct RiskParameterUpdate { + uint256 timestamp; // Timestamp of the update + bytes newValue; // Encoded parameters, flexible for various data types + string referenceId; // External reference, potentially linking to a document or off-chain data + bytes previousValue; // Previous value of the parameter for historical comparison + string updateType; // Classification of the update for validation purposes + uint256 updateId; // Unique identifier for this specific update + address market; // Address for market of the parameter update + bytes additionalData; // Additional data for the update + } + + event ParameterUpdated( + string referenceId, + bytes newValue, + bytes previousValue, + uint256 timestamp, + string indexed updateType, + uint256 indexed updateId, + address indexed market, + bytes additionalData + ); + + event AuthorizedSenderAdded(address indexed sender); + event AuthorizedSenderRemoved(address indexed sender); + event UpdateTypeAdded(string indexed updateType); + + /** + * @notice Adds a new sender to the list of addresses authorized to perform updates. + * @param sender Address to be authorized. + */ + function addAuthorizedSender(address sender) external; + + /** + * @notice Removes an address from the list of authorized senders. + * @param sender Address to be unauthorized. + */ + function removeAuthorizedSender(address sender) external; + + /** + * @notice Method to fetch the counter which tracks of the total number of updates. + * @return The latest update counter. + */ + function updateCounter() external view returns (uint256); + + /** + * @notice Adds a new type of update to the list of authorized update types. + * @param newUpdateType New type of update to allow. + */ + function addUpdateType(string memory newUpdateType) external; + + /** + * @notice Publishes a new risk parameter update. + * @param referenceId An external reference ID associated with the update. + * @param newValue The new value of the risk parameter being updated. + * @param updateType Type of update performed, must be previously authorized. + * @param market Address for market of the parameter update + * @param additionalData Additional data for the update + */ + function publishRiskParameterUpdate( + string memory referenceId, + bytes memory newValue, + string memory updateType, + address market, + bytes memory additionalData + ) external; + + /** + * @notice Publishes multiple risk parameter updates in a single transaction. + * @param referenceIds Array of external reference IDs. + * @param newValues Array of new values for each update. + * @param updateTypes Array of types for each update, all must be authorized. + * @param markets Array of addresses for markets of the parameter updates + * @param additionalData Array of additional data for the updates + * + */ + function publishBulkRiskParameterUpdates( + string[] memory referenceIds, + bytes[] memory newValues, + string[] memory updateTypes, + address[] memory markets, + bytes[] memory additionalData + ) external; + + function getAllUpdateTypes() external view returns (string[] memory); + + /** + * @notice Fetches the most recent update for a specific parameter in a specific market. + * @param updateType The identifier for the parameter. + * @param market The market identifier. + * @return The most recent RiskParameterUpdate for the specified parameter and market. + */ + function getLatestUpdateByParameterAndMarket( + string memory updateType, + address market + ) external view returns (RiskParameterUpdate memory); + + /* + * @notice Fetches the update for a provided updateId. + * @param updateId Update ID. + * @return The most recent RiskParameterUpdate for the specified id. + */ + function getUpdateById(uint256 updateId) external view returns (RiskParameterUpdate memory); + + /** + * @notice Checks if an address is authorized to perform updates. + * @param sender Address to check. + * @return Boolean indicating whether the address is authorized. + */ + function isAuthorized(address sender) external view returns (bool); +} diff --git a/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/IRiskSteward.sol b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/IRiskSteward.sol new file mode 100644 index 000000000..16a27ba9e --- /dev/null +++ b/src/20241108_AaveV3EthereumLido_AutomatedAGRSActivation/interfaces/IRiskSteward.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/** + * @title IRiskSteward + * @author BGD labs + * @notice Defines the interface for the contract to manage the risk params updates on aave v3 pool + */ +interface IRiskSteward { + /** + * @notice The safe controlling the steward + */ + function RISK_COUNCIL() external view returns (address); +} diff --git a/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol new file mode 100644 index 000000000..923b799b9 --- /dev/null +++ b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol @@ -0,0 +1,120 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumLido, AaveV3EthereumLidoAssets, AaveV3EthereumLidoEModes} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {AaveV3PayloadEthereumLido} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereumLido.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol'; +import {IEmissionManager} from 'aave-v3-origin/contracts/rewards/interfaces/IEmissionManager.sol'; +/** + * @title Onboard and Enable sUSDe liquid E-Mode on Aave v3 Mainnet and Lido Instances + * @author ACI + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-enable-susde-liquid-e-mode-on-aave-v3-mainnet-and-lido-instance/19703 + */ +contract AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108 is + AaveV3PayloadEthereumLido +{ + using SafeERC20 for IERC20; + + address public constant sUSDe = 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497; + uint256 public constant sUSDe_SEED_AMOUNT = 100 * 1e18; + address public constant sUSDe_ADMIN = 0xac140648435d03f784879cd789130F22Ef588Fcd; + + function _postExecute() internal override { + IERC20(sUSDe).forceApprove(address(AaveV3EthereumLido.POOL), sUSDe_SEED_AMOUNT); + AaveV3EthereumLido.POOL.supply( + sUSDe, + sUSDe_SEED_AMOUNT, + address(AaveV3EthereumLido.COLLECTOR), + 0 + ); + + (address asUSDe, , ) = AaveV3EthereumLido.AAVE_PROTOCOL_DATA_PROVIDER.getReserveTokensAddresses( + sUSDe + ); + IEmissionManager(AaveV3EthereumLido.EMISSION_MANAGER).setEmissionAdmin(sUSDe, sUSDe_ADMIN); + IEmissionManager(AaveV3EthereumLido.EMISSION_MANAGER).setEmissionAdmin(asUSDe, sUSDe_ADMIN); + } + + function eModeCategoriesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.EModeCategoryUpdate[] memory) + { + IAaveV3ConfigEngine.EModeCategoryUpdate[] + memory eModeUpdates = new IAaveV3ConfigEngine.EModeCategoryUpdate[](1); + + eModeUpdates[0] = IAaveV3ConfigEngine.EModeCategoryUpdate({ + eModeCategory: 4, + ltv: 90_00, + liqThreshold: 92_00, + liqBonus: 3_00, + label: 'sUSDe Stablecoins' + }); + + return eModeUpdates; + } + function assetsEModeUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.AssetEModeUpdate[] memory) + { + IAaveV3ConfigEngine.AssetEModeUpdate[] + memory assetEModeUpdates = new IAaveV3ConfigEngine.AssetEModeUpdate[](3); + + assetEModeUpdates[0] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: sUSDe, + eModeCategory: 4, + borrowable: EngineFlags.DISABLED, + collateral: EngineFlags.ENABLED + }); + assetEModeUpdates[1] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3EthereumLidoAssets.USDS_UNDERLYING, + eModeCategory: 4, + borrowable: EngineFlags.ENABLED, + collateral: EngineFlags.DISABLED + }); + assetEModeUpdates[2] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3EthereumLidoAssets.USDC_UNDERLYING, + eModeCategory: 4, + borrowable: EngineFlags.ENABLED, + collateral: EngineFlags.DISABLED + }); + + return assetEModeUpdates; + } + function newListings() public pure override returns (IAaveV3ConfigEngine.Listing[] memory) { + IAaveV3ConfigEngine.Listing[] memory listings = new IAaveV3ConfigEngine.Listing[](1); + + listings[0] = IAaveV3ConfigEngine.Listing({ + asset: sUSDe, + assetSymbol: 'sUSDe', + priceFeed: 0xb37aE8aBa6C0C1Bf2c509fc06E11aa4AF29B665A, + enabledToBorrow: EngineFlags.DISABLED, + borrowableInIsolation: EngineFlags.DISABLED, + withSiloedBorrowing: EngineFlags.DISABLED, + flashloanable: EngineFlags.ENABLED, + ltv: 5, + liqThreshold: 10, + liqBonus: 7_50, + reserveFactor: 10_00, + supplyCap: 20_000_000, + borrowCap: 1000, + debtCeiling: 0, + liqProtocolFee: 10_00, + rateStrategyParams: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: 1_00, + baseVariableBorrowRate: 5, + variableRateSlope1: 10, + variableRateSlope2: 300 + }) + }); + + return listings; + } +} diff --git a/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol new file mode 100644 index 000000000..f40d0b820 --- /dev/null +++ b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3EthereumLido} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {IEmissionManager} from 'aave-v3-origin/contracts/rewards/interfaces/IEmissionManager.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108} from './AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol'; + +/** + * @dev Test for AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol -vv + */ +contract AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_Test is + ProtocolV3TestBase +{ + AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108 + internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21171005); + proposal = new AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108', + AaveV3EthereumLido.POOL, + address(proposal) + ); + } + + function test_collectorHassUSDeFunds() public { + GovV3Helpers.executePayload(vm, address(proposal)); + (address aTokenAddress, , ) = AaveV3EthereumLido + .AAVE_PROTOCOL_DATA_PROVIDER + .getReserveTokensAddresses(proposal.sUSDe()); + assertGe( + IERC20(aTokenAddress).balanceOf(address(AaveV3EthereumLido.COLLECTOR)), + 100 * 10 ** 18 + ); + } + + function test_sUSDeAdmin() public { + GovV3Helpers.executePayload(vm, address(proposal)); + (address asUSDe, , ) = AaveV3EthereumLido.AAVE_PROTOCOL_DATA_PROVIDER.getReserveTokensAddresses( + proposal.sUSDe() + ); + assertEq( + IEmissionManager(AaveV3EthereumLido.EMISSION_MANAGER).getEmissionAdmin(proposal.sUSDe()), + proposal.sUSDe_ADMIN() + ); + assertEq( + IEmissionManager(AaveV3EthereumLido.EMISSION_MANAGER).getEmissionAdmin(asUSDe), + proposal.sUSDe_ADMIN() + ); + } +} diff --git a/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol new file mode 100644 index 000000000..5e9bce0c9 --- /dev/null +++ b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumAssets, AaveV3EthereumEModes} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV3PayloadEthereum} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereum.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title Onboard and Enable sUSDe liquid E-Mode on Aave v3 Mainnet and Lido Instances + * @author ACI + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-enable-susde-liquid-e-mode-on-aave-v3-mainnet-and-lido-instance/19703 + */ +contract AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108 is + AaveV3PayloadEthereum +{ + function eModeCategoriesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.EModeCategoryUpdate[] memory) + { + IAaveV3ConfigEngine.EModeCategoryUpdate[] + memory eModeUpdates = new IAaveV3ConfigEngine.EModeCategoryUpdate[](1); + + eModeUpdates[0] = IAaveV3ConfigEngine.EModeCategoryUpdate({ + eModeCategory: 2, + ltv: 90_00, + liqThreshold: 92_00, + liqBonus: 3_00, + label: 'sUSDe Stablecoins' + }); + + return eModeUpdates; + } + function assetsEModeUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.AssetEModeUpdate[] memory) + { + IAaveV3ConfigEngine.AssetEModeUpdate[] + memory assetEModeUpdates = new IAaveV3ConfigEngine.AssetEModeUpdate[](3); + + assetEModeUpdates[0] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3EthereumAssets.USDC_UNDERLYING, + eModeCategory: 2, + borrowable: EngineFlags.ENABLED, + collateral: EngineFlags.DISABLED + }); + assetEModeUpdates[1] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3EthereumAssets.sUSDe_UNDERLYING, + eModeCategory: 2, + borrowable: EngineFlags.DISABLED, + collateral: EngineFlags.ENABLED + }); + assetEModeUpdates[2] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3EthereumAssets.USDS_UNDERLYING, + eModeCategory: 2, + borrowable: EngineFlags.ENABLED, + collateral: EngineFlags.DISABLED + }); + + return assetEModeUpdates; + } + function collateralsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.CollateralUpdate[] memory) + { + IAaveV3ConfigEngine.CollateralUpdate[] + memory collateralUpdate = new IAaveV3ConfigEngine.CollateralUpdate[](1); + + collateralUpdate[0] = IAaveV3ConfigEngine.CollateralUpdate({ + asset: AaveV3EthereumAssets.sUSDe_UNDERLYING, + ltv: EngineFlags.KEEP_CURRENT, + liqThreshold: EngineFlags.KEEP_CURRENT, + liqBonus: EngineFlags.KEEP_CURRENT, + debtCeiling: 0, + liqProtocolFee: EngineFlags.KEEP_CURRENT + }); + + return collateralUpdate; + } +} diff --git a/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol new file mode 100644 index 000000000..e6c27b1bc --- /dev/null +++ b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Ethereum} from 'aave-address-book/AaveV3Ethereum.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108} from './AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol'; + +/** + * @dev Test for AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol -vv + */ +contract AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108_Test is + ProtocolV3TestBase +{ + AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108 + internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21171005); + proposal = new AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108', + AaveV3Ethereum.POOL, + address(proposal) + ); + } +} diff --git a/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances.md b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances.md new file mode 100644 index 000000000..ca19549d2 --- /dev/null +++ b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances.md @@ -0,0 +1,72 @@ +--- +title: "Onboard and Enable sUSDe liquid E-Mode on Aave v3 Mainnet and Lido Instances" +author: "ACI" +discussions: "https://governance.aave.com/t/arfc-enable-susde-liquid-e-mode-on-aave-v3-mainnet-and-lido-instance/19703" +snapshot: "Direct-to-AIP" +--- + +## Simple Summary + +This proposal aims to enable sUSDe liquid E-Mode on Aave v3 Mainnet for the Main and Lido instances. By implementing this change, we seek to enhance capital efficiency for borrowers using sUSDe as collateral, particularly for borrowing other stablecoins. This is a Direct to AIP proposal. + +## Motivation + +The motivation behind this proposal stems from several key factors: + +- High Utilization: sUSDe has demonstrated significant usage as collateral for borrowing stablecoins on the platform. + Capital Efficiency: Enabling liquid E-Mode for sUSDe will allow borrowers to substantially improve their capital efficiency when using this asset as collateral. +- Controlled Growth: Liquid E-Mode provides a mechanism for more precise control over the growth and borrow demand in relation to the overall stablecoin liquidity within Aave v3 on Mainnet. +- Enhanced Borrowing Capacity: This change will enable users to borrow larger amounts of other stablecoins against their sUSDe collateral, potentially increasing platform utilization and revenue. + By implementing this proposal, we aim to optimize the use of sUSDe within the Aave ecosystem, attracting more liquidity for stablecoins. + +## Specification + +The table below illustrates the configured risk parameters for **sUSDe** on Aave V3 Lido Instance: + +| Parameter | Value | +| ------------------------- | -----------------------------------------: | +| Isolation Mode | false | +| Borrowable | DISABLED | +| Collateral Enabled | true | +| Supply Cap (sUSDe) | 20,000,000 | +| Borrow Cap (sUSDe) | 1000 | +| Debt Ceiling | USD 0 | +| LTV | 0.05 % | +| LT | 0.1 % | +| Liquidation Bonus | 7.5 % | +| Liquidation Protocol Fee | 10 % | +| Reserve Factor | 10 % | +| Base Variable Borrow Rate | 0.05 % | +| Variable Slope 1 | 0.1 % | +| Variable Slope 2 | 3 % | +| Uoptimal | 1 % | +| Flashloanable | ENABLED | +| Siloed Borrowing | DISABLED | +| Borrowable in Isolation | DISABLED | +| Oracle | 0xb37aE8aBa6C0C1Bf2c509fc06E11aa4AF29B665A | + +Additionaly [0xac140648435d03f784879cd789130F22Ef588Fcd](https://etherscan.io/address/0xac140648435d03f784879cd789130F22Ef588Fcd) has been set as the emission admin for sUSDe and the corresponding aToken. + +The table below illustrate the configured "sUSDe Stablecoins" Liquid E-mode + +| Parameter | Value | Value | Value | +| --------------------- | ----- | ----- | ----- | +| Asset | sUSDe | USDS | USDC | +| Collateral | Yes | No | No | +| Borrowable | No | Yes | Yes | +| Max LTV | 90% | - | - | +| Liquidation Threshold | 92% | - | - | +| Liquidation Bonus | 3.0% | - | - | + +Finally, sUSDe on Aave V3 Mainnet will be removed from Isolation Mode on Aave v3 instance. + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/5ad1d7f8b6810d084d6c09cafbf03083dd9fb17f/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/5ad1d7f8b6810d084d6c09cafbf03083dd9fb17f/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/5ad1d7f8b6810d084d6c09cafbf03083dd9fb17f/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/5ad1d7f8b6810d084d6c09cafbf03083dd9fb17f/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.t.sol) +- Snapshot: Direct-to-AIP +- [Discussion](https://governance.aave.com/t/arfc-enable-susde-liquid-e-mode-on-aave-v3-mainnet-and-lido-instance/19703) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.s.sol b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.s.sol new file mode 100644 index 000000000..8eadb7b56 --- /dev/null +++ b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.s.sol @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108} from './AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol'; +import {AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108} from './AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108) + .creationCode + ); + address payload1 = GovV3Helpers.deployDeterministic( + type( + AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108 + ).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](2); + actions[0] = GovV3Helpers.buildAction(payload0); + actions[1] = GovV3Helpers.buildAction(payload1); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Create Proposal + * command: make deploy-ledger contract=src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108.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[](2); + actionsEthereum[0] = GovV3Helpers.buildAction( + type(AaveV3Ethereum_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108) + .creationCode + ); + actionsEthereum[1] = GovV3Helpers.buildAction( + type( + AaveV3EthereumLido_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances_20241108 + ).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances.md' + ) + ); + } +} diff --git a/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/config.ts b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/config.ts new file mode 100644 index 000000000..debc03f14 --- /dev/null +++ b/src/20241108_Multi_OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances/config.ts @@ -0,0 +1,109 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3Ethereum', 'AaveV3EthereumLido'], + title: 'Onboard and Enable sUSDe liquid E-Mode on Aave v3 Mainnet and Lido Instances', + shortName: 'OnboardAndEnableSUSDeLiquidEModeOnAaveV3MainnetAndLidoInstances', + date: '20241108', + author: 'ACI', + discussion: + 'https://governance.aave.com/t/arfc-enable-susde-liquid-e-mode-on-aave-v3-mainnet-and-lido-instance/1970', + snapshot: 'Direct-to-AIP', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Ethereum: { + configs: { + EMODES_UPDATES: [ + {eModeCategory: 2, ltv: '90', liqThreshold: '92', liqBonus: '3', label: 'sUSDe'}, + ], + EMODES_ASSETS: [ + { + asset: 'USDC', + eModeCategory: 'AaveV3EthereumEModes.ETH_CORRELATED', + collateral: 'DISABLED', + borrowable: 'ENABLED', + }, + { + asset: 'sUSDe', + eModeCategory: 'AaveV3EthereumEModes.ETH_CORRELATED', + collateral: 'ENABLED', + borrowable: 'DISABLED', + }, + { + asset: 'USDS', + eModeCategory: 'AaveV3EthereumEModes.ETH_CORRELATED', + collateral: 'DISABLED', + borrowable: 'ENABLED', + }, + ], + BORROWS_UPDATE: [ + { + enabledToBorrow: 'KEEP_CURRENT', + flashloanable: 'KEEP_CURRENT', + borrowableInIsolation: 'DISABLED', + withSiloedBorrowing: 'KEEP_CURRENT', + reserveFactor: 'KEEP_CURRENT', + asset: 'sUSDe', + }, + ], + }, + cache: {blockNumber: 21142896}, + }, + AaveV3EthereumLido: { + configs: { + EMODES_UPDATES: [ + {eModeCategory: 2, ltv: '90', liqThreshold: '92', liqBonus: '3', label: 'sUSDe'}, + ], + EMODES_ASSETS: [ + { + asset: 'WETH', + eModeCategory: 'AaveV3EthereumLidoEModes.ETH_CORRELATED', + collateral: 'ENABLED', + borrowable: 'DISABLED', + }, + { + asset: 'USDS', + eModeCategory: 'AaveV3EthereumLidoEModes.ETH_CORRELATED', + collateral: 'DISABLED', + borrowable: 'ENABLED', + }, + { + asset: 'USDC', + eModeCategory: 'AaveV3EthereumLidoEModes.ETH_CORRELATED', + collateral: 'DISABLED', + borrowable: 'ENABLED', + }, + ], + ASSET_LISTING: [ + { + assetSymbol: 'sUSDe', + decimals: 18, + priceFeed: '0xb37aE8aBa6C0C1Bf2c509fc06E11aa4AF29B665A', + ltv: '0.05', + liqThreshold: '0.1', + liqBonus: '7.5', + debtCeiling: '0', + liqProtocolFee: '10', + enabledToBorrow: 'DISABLED', + flashloanable: 'ENABLED', + borrowableInIsolation: 'DISABLED', + withSiloedBorrowing: 'DISABLED', + reserveFactor: '10', + supplyCap: '20000000', + borrowCap: '0', + rateStrategyParams: { + optimalUtilizationRate: '1', + baseVariableBorrowRate: '0', + variableRateSlope1: '0', + variableRateSlope2: '0', + }, + asset: '0x9D39A5DE30e57443BfF2A8307A4256c8797A3497', + admin: '0xac140648435d03f784879cd789130F22Ef588Fcd', + }, + ], + }, + cache: {blockNumber: 21142900}, + }, + }, +}; diff --git a/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113.sol b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113.sol new file mode 100644 index 000000000..314b86f81 --- /dev/null +++ b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol'; +import {AaveV3Arbitrum, AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol'; +import {MiscArbitrum} from 'aave-address-book/MiscArbitrum.sol'; +import {AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {CollectorUtils, ICollector} from 'aave-helpers/src/CollectorUtils.sol'; + +interface IAaveArbEthERC20Bridge { + function bridge(address token, address l1token, address gateway, uint256 amount) external; +} + +/** + * @title September Funding Update - Part A + * @author karpatkey_TokenLogic + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-september-funding-update/19162 + */ +contract AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113 is IProposalGenericExecutor { + using SafeERC20 for IERC20; + using CollectorUtils for ICollector; + + IAaveArbEthERC20Bridge public constant BRIDGE = + IAaveArbEthERC20Bridge(MiscArbitrum.AAVE_ARB_ETH_BRIDGE); + // https://arbiscan.io/address/0x096760F208390250649E3e8763348E783AEF5562 + address public constant USDC_GATEWAY = 0x096760F208390250649E3e8763348E783AEF5562; + // https://arbiscan.io/address/0x09e9222E96E7B4AE2a407B98d48e330053351EEe + address public constant LUSD_GATEWAY = 0x09e9222E96E7B4AE2a407B98d48e330053351EEe; + + function execute() external { + AaveV3Arbitrum.COLLECTOR.withdrawFromV3( + CollectorUtils.IOInput({ + pool: address(AaveV3Arbitrum.POOL), + underlying: AaveV3ArbitrumAssets.USDC_UNDERLYING, + amount: IERC20(AaveV3ArbitrumAssets.USDC_A_TOKEN).balanceOf( + address(AaveV3Arbitrum.COLLECTOR) + ) - 100e6 + }), + address(BRIDGE) + ); + + BRIDGE.bridge( + AaveV3ArbitrumAssets.USDC_UNDERLYING, + AaveV3EthereumAssets.USDC_UNDERLYING, + USDC_GATEWAY, + IERC20(AaveV3ArbitrumAssets.USDC_UNDERLYING).balanceOf(address(BRIDGE)) + ); + + AaveV3Arbitrum.COLLECTOR.withdrawFromV3( + CollectorUtils.IOInput({ + pool: address(AaveV3Arbitrum.POOL), + underlying: AaveV3ArbitrumAssets.LUSD_UNDERLYING, + amount: IERC20(AaveV3ArbitrumAssets.LUSD_A_TOKEN).balanceOf( + address(AaveV3Arbitrum.COLLECTOR) + ) - 1e18 + }), + address(BRIDGE) + ); + + BRIDGE.bridge( + AaveV3ArbitrumAssets.LUSD_UNDERLYING, + AaveV3EthereumAssets.LUSD_UNDERLYING, + LUSD_GATEWAY, + IERC20(AaveV3ArbitrumAssets.LUSD_UNDERLYING).balanceOf(address(BRIDGE)) + ); + } +} diff --git a/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113.t.sol b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113.t.sol new file mode 100644 index 000000000..b429fe6f1 --- /dev/null +++ b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113.t.sol @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3Arbitrum, AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol'; + +import 'forge-std/Test.sol'; +import {stdStorage, StdStorage} from 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113} from './AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113.sol'; + +contract GatewayMock { + function outboundTransfer(address, address, uint256, bytes calldata) external {} +} + +/** + * @dev Test for AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113 + * command: FOUNDRY_PROFILE=arbitrum forge test --match-path=src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113.t.sol -vv + */ +contract AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113_Test is ProtocolV3TestBase { + using stdStorage for StdStorage; + + event Bridge(address indexed token, uint256 amount); + + AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113 internal proposal; + + address internal COLLECTOR = address(AaveV3Arbitrum.COLLECTOR); + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('arbitrum'), 274046247); + proposal = new AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113(); + + GatewayMock mock = new GatewayMock(); + vm.etch(proposal.USDC_GATEWAY(), address(mock).code); + vm.etch(proposal.LUSD_GATEWAY(), address(mock).code); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113', + AaveV3Arbitrum.POOL, + address(proposal) + ); + } + + function test_bridgeUSDC() public { + uint256 collectorAUsdcBalanceBefore = IERC20(AaveV3ArbitrumAssets.USDC_A_TOKEN).balanceOf( + COLLECTOR + ); + + vm.expectEmit(true, false, false, true, address(proposal.BRIDGE())); + emit Bridge(AaveV3ArbitrumAssets.USDC_UNDERLYING, collectorAUsdcBalanceBefore - 100e6); + executePayload(vm, address(proposal)); + + uint256 collectorAUsdcBalanceAfter = IERC20(AaveV3ArbitrumAssets.USDC_A_TOKEN).balanceOf( + COLLECTOR + ); + + assertApproxEqAbs(collectorAUsdcBalanceAfter, 100e6, 5_000e6); + } + + function test_bridgeLUSD() public { + uint256 collectorALusdBalanceBefore = IERC20(AaveV3ArbitrumAssets.LUSD_A_TOKEN).balanceOf( + COLLECTOR + ); + + vm.expectEmit(true, false, false, true, address(proposal.BRIDGE())); + emit Bridge(AaveV3ArbitrumAssets.LUSD_UNDERLYING, collectorALusdBalanceBefore - 1e18); + executePayload(vm, address(proposal)); + + uint256 collectorALusdBalanceAfter = IERC20(AaveV3ArbitrumAssets.LUSD_A_TOKEN).balanceOf( + COLLECTOR + ); + + assertApproxEqAbs(collectorALusdBalanceAfter, 1e18, 2_000e18); + } +} diff --git a/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113.sol b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113.sol new file mode 100644 index 000000000..b4dc753ea --- /dev/null +++ b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113.sol @@ -0,0 +1,263 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol'; +import {ILegacyProxyAdmin} from 'src/interfaces/ILegacyProxyAdmin.sol'; +import {ITransparentUpgradeableProxy} from 'solidity-utils/contracts/transparent-proxy/TransparentUpgradeableProxy.sol'; +import {AaveV2Ethereum, AaveV2EthereumAssets} from 'aave-address-book/AaveV2Ethereum.sol'; +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {AaveSwapper} from 'aave-helpers/src/swaps/AaveSwapper.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {CollectorUtils, ICollector} from 'aave-helpers/src/CollectorUtils.sol'; + +interface IRescuable { + /** + * @notice Emergency rescue for token stuck on this contract, as failsafe mechanism + * @dev Funds should never remain in this contract more time than during transactions + * @dev Only callable by the owner + * @param token The address of the stuck token to rescue + */ + function rescueTokens(IERC20 token) external; +} + +/** + * @title September Funding Update - Part A + * @author karpatkey_TokenLogic + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-september-funding-update/19162 + */ +contract AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113 is IProposalGenericExecutor { + using SafeERC20 for IERC20; + using CollectorUtils for ICollector; + + // https://etherscan.io/address/0xD80F4cE4Df649d8D6A88cf365f0560Bed9aE688F + address public constant NEW_AAVE_SWAPPER_IMPL = 0xD80F4cE4Df649d8D6A88cf365f0560Bed9aE688F; + + // https://etherscan.io/address/0x6A6FA664D4Fa49a6a780a1D6143f079f8dd7C33d + address public constant DEBT_SWAP_ADAPTER = 0x6A6FA664D4Fa49a6a780a1D6143f079f8dd7C33d; + // https://etherscan.io/address/0x8761e0370f94f68Db8EaA731f4fC581f6AD0Bd68 + address public constant DEBT_SWAP_ADAPTER_V3 = 0x8761e0370f94f68Db8EaA731f4fC581f6AD0Bd68; + // https://etherscan.io/address/0x02e7B8511831B1b02d9018215a0f8f500Ea5c6B3 + address public constant REPAY_WITH_COLLATERAL_ADAPTER = + 0x02e7B8511831B1b02d9018215a0f8f500Ea5c6B3; + + // https://etherscan.io/address/0x818C277dBE886b934e60aa047250A73529E26A99 + address public constant KARPATKEY = 0x818C277dBE886b934e60aa047250A73529E26A99; + uint256 public constant GAS_REBATE_AMOUNT = 0.264 ether; + + // https://etherscan.io/address/0xdeadD8aB03075b7FBA81864202a2f59EE25B312b + address public constant MERIT_SAFE = 0xdeadD8aB03075b7FBA81864202a2f59EE25B312b; + uint256 public constant GHO_ALLOWANCE = 3_000_000 ether; + uint256 public constant WETH_A_ALLOWANCE = 800 ether; + + // https://etherscan.io/address/0x060373D064d0168931dE2AB8DDA7410923d06E88 + address public constant MILKMAN = 0x060373D064d0168931dE2AB8DDA7410923d06E88; + + // https://etherscan.io/address/0xe80a1C615F75AFF7Ed8F08c9F21f9d00982D666c + address public constant PRICE_CHECKER = 0xe80a1C615F75AFF7Ed8F08c9F21f9d00982D666c; + // https://etherscan.io/address/0x3f12643D3f6f874d39C2a4c9f2Cd6f2DbAC877FC + address public constant GHO_USD_FEED = 0x3f12643D3f6f874d39C2a4c9f2Cd6f2DbAC877FC; + uint256 public constant USDC_A_AMOUNT = 1_250_000e6; + uint256 public constant USDT_A_AMOUNT = 1_250_000e6; + uint256 public constant DAI_A_AMOUNT = 500_000e18; + + function execute() external override { + // New AaveSwapper implementation: + ILegacyProxyAdmin(MiscEthereum.PROXY_ADMIN).upgrade( + ITransparentUpgradeableProxy(payable(MiscEthereum.AAVE_SWAPPER)), + NEW_AAVE_SWAPPER_IMPL + ); + + _withdrawAndSwapForGHO(); + _rescueParaswap(); + + AaveV3Ethereum.COLLECTOR.transfer( + AaveV3EthereumAssets.WETH_A_TOKEN, + KARPATKEY, + GAS_REBATE_AMOUNT + ); + + AaveV3Ethereum.COLLECTOR.approve( + AaveV3EthereumAssets.GHO_UNDERLYING, + MERIT_SAFE, + GHO_ALLOWANCE + ); + AaveV3Ethereum.COLLECTOR.approve( + AaveV3EthereumAssets.WETH_A_TOKEN, + MERIT_SAFE, + WETH_A_ALLOWANCE + ); + } + + function _withdrawAndSwapForGHO() internal { + // usdc + AaveV3Ethereum.COLLECTOR.withdrawFromV3( + CollectorUtils.IOInput({ + pool: address(AaveV3Ethereum.POOL), + underlying: AaveV3EthereumAssets.USDC_UNDERLYING, + amount: USDC_A_AMOUNT + }), + address(AaveV3Ethereum.COLLECTOR) + ); + + AaveV3Ethereum.COLLECTOR.swap( + MiscEthereum.AAVE_SWAPPER, + CollectorUtils.SwapInput({ + milkman: MILKMAN, + priceChecker: PRICE_CHECKER, + fromUnderlying: AaveV3EthereumAssets.USDC_UNDERLYING, + toUnderlying: AaveV3EthereumAssets.GHO_UNDERLYING, + fromUnderlyingPriceFeed: AaveV3EthereumAssets.USDC_ORACLE, + toUnderlyingPriceFeed: GHO_USD_FEED, + amount: type(uint256).max, + slippage: 50 + }) + ); + + // usdt + AaveV3Ethereum.COLLECTOR.withdrawFromV3( + CollectorUtils.IOInput({ + pool: address(AaveV3Ethereum.POOL), + underlying: AaveV3EthereumAssets.USDT_UNDERLYING, + amount: USDT_A_AMOUNT + }), + address(AaveV3Ethereum.COLLECTOR) + ); + + AaveV3Ethereum.COLLECTOR.swap( + MiscEthereum.AAVE_SWAPPER, + CollectorUtils.SwapInput({ + milkman: MILKMAN, + priceChecker: PRICE_CHECKER, + fromUnderlying: AaveV3EthereumAssets.USDT_UNDERLYING, + toUnderlying: AaveV3EthereumAssets.GHO_UNDERLYING, + fromUnderlyingPriceFeed: AaveV3EthereumAssets.USDT_ORACLE, + toUnderlyingPriceFeed: GHO_USD_FEED, + amount: type(uint256).max, + slippage: 50 + }) + ); + + // aDai + uint256 aDaiAvailableBalance = IERC20(AaveV2EthereumAssets.DAI_UNDERLYING).balanceOf( + AaveV2EthereumAssets.DAI_A_TOKEN + ); + uint256 aDaiBalance = IERC20(AaveV2EthereumAssets.DAI_A_TOKEN).balanceOf( + address(AaveV2Ethereum.COLLECTOR) + ); + AaveV2Ethereum.COLLECTOR.withdrawFromV2( + CollectorUtils.IOInput({ + pool: address(AaveV2Ethereum.POOL), + underlying: AaveV2EthereumAssets.DAI_UNDERLYING, + amount: (aDaiBalance > aDaiAvailableBalance ? aDaiAvailableBalance : aDaiBalance) - 1e18 + }), + address(AaveV3Ethereum.COLLECTOR) + ); + // aEthDai + AaveV3Ethereum.COLLECTOR.withdrawFromV3( + CollectorUtils.IOInput({ + pool: address(AaveV3Ethereum.POOL), + underlying: AaveV3EthereumAssets.DAI_UNDERLYING, + amount: DAI_A_AMOUNT + }), + address(AaveV3Ethereum.COLLECTOR) + ); + + AaveV3Ethereum.COLLECTOR.swap( + MiscEthereum.AAVE_SWAPPER, + CollectorUtils.SwapInput({ + milkman: MILKMAN, + priceChecker: PRICE_CHECKER, + fromUnderlying: AaveV3EthereumAssets.DAI_UNDERLYING, + toUnderlying: AaveV3EthereumAssets.GHO_UNDERLYING, + fromUnderlyingPriceFeed: AaveV3EthereumAssets.DAI_ORACLE, + toUnderlyingPriceFeed: GHO_USD_FEED, + amount: type(uint256).max, + slippage: 100 + }) + ); + + // aLusd + uint256 aLusdAvailableBalance = IERC20(AaveV2EthereumAssets.LUSD_UNDERLYING).balanceOf( + AaveV2EthereumAssets.LUSD_A_TOKEN + ); + uint256 aLusdBalance = IERC20(AaveV2EthereumAssets.LUSD_A_TOKEN).balanceOf( + address(AaveV2Ethereum.COLLECTOR) + ); + AaveV2Ethereum.COLLECTOR.withdrawFromV2( + CollectorUtils.IOInput({ + pool: address(AaveV2Ethereum.POOL), + underlying: AaveV2EthereumAssets.LUSD_UNDERLYING, + amount: (aLusdBalance > aLusdAvailableBalance ? aLusdAvailableBalance : aLusdBalance) - 1e18 + }), + address(AaveV3Ethereum.COLLECTOR) + ); + + AaveV3Ethereum.COLLECTOR.swap( + MiscEthereum.AAVE_SWAPPER, + CollectorUtils.SwapInput({ + milkman: MILKMAN, + priceChecker: PRICE_CHECKER, + fromUnderlying: AaveV3EthereumAssets.LUSD_UNDERLYING, + toUnderlying: AaveV3EthereumAssets.GHO_UNDERLYING, + fromUnderlyingPriceFeed: AaveV3EthereumAssets.LUSD_ORACLE, + toUnderlyingPriceFeed: GHO_USD_FEED, + amount: type(uint256).max, + slippage: 300 + }) + ); + + // aFrax + uint256 aFraxAvailableBalance = IERC20(AaveV2EthereumAssets.FRAX_UNDERLYING).balanceOf( + AaveV2EthereumAssets.FRAX_A_TOKEN + ); + uint256 aFraxBalance = IERC20(AaveV2EthereumAssets.FRAX_A_TOKEN).balanceOf( + address(AaveV2Ethereum.COLLECTOR) + ); + AaveV2Ethereum.COLLECTOR.withdrawFromV2( + CollectorUtils.IOInput({ + pool: address(AaveV2Ethereum.POOL), + underlying: AaveV2EthereumAssets.FRAX_UNDERLYING, + amount: (aFraxBalance > aFraxAvailableBalance ? aFraxAvailableBalance : aFraxBalance) - 1e18 + }), + address(AaveV3Ethereum.COLLECTOR) + ); + + AaveV3Ethereum.COLLECTOR.swap( + MiscEthereum.AAVE_SWAPPER, + CollectorUtils.SwapInput({ + milkman: MILKMAN, + priceChecker: PRICE_CHECKER, + fromUnderlying: AaveV3EthereumAssets.FRAX_UNDERLYING, + toUnderlying: AaveV3EthereumAssets.GHO_UNDERLYING, + fromUnderlyingPriceFeed: AaveV3EthereumAssets.FRAX_ORACLE, + toUnderlyingPriceFeed: GHO_USD_FEED, + amount: type(uint256).max, + slippage: 500 + }) + ); + } + + function _rescueParaswap() internal { + IRescuable(DEBT_SWAP_ADAPTER).rescueTokens(IERC20(AaveV2EthereumAssets.sUSD_UNDERLYING)); + IRescuable(DEBT_SWAP_ADAPTER).rescueTokens(IERC20(AaveV2EthereumAssets.USDC_UNDERLYING)); + IRescuable(REPAY_WITH_COLLATERAL_ADAPTER).rescueTokens( + IERC20(AaveV3EthereumAssets.GHO_UNDERLYING) + ); + + IERC20(AaveV2EthereumAssets.sUSD_UNDERLYING).transfer( + address(AaveV3Ethereum.COLLECTOR), + IERC20(AaveV2EthereumAssets.sUSD_UNDERLYING).balanceOf(address(this)) + ); + IERC20(AaveV2EthereumAssets.USDC_UNDERLYING).transfer( + address(AaveV3Ethereum.COLLECTOR), + IERC20(AaveV2EthereumAssets.USDC_UNDERLYING).balanceOf(address(this)) + ); + IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).transfer( + address(AaveV3Ethereum.COLLECTOR), + IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(address(this)) + ); + } +} diff --git a/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113.t.sol b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113.t.sol new file mode 100644 index 000000000..cda30514a --- /dev/null +++ b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113.t.sol @@ -0,0 +1,444 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV2Ethereum, AaveV2EthereumAssets} from 'aave-address-book/AaveV2Ethereum.sol'; +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113} from './AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113.sol'; + +/** + * @dev Test for AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113.t.sol -vv + */ +contract AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113_Test is ProtocolV3TestBase { + event SwapRequested( + address milkman, + address indexed fromToken, + address indexed toToken, + address fromOracle, + address toOracle, + uint256 amount, + address indexed recipient, + uint256 slippage + ); + + AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21262170); + proposal = new AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113', + AaveV3Ethereum.POOL, + address(proposal) + ); + } + + function test_withdrawUsdcAndSwapForGho() public { + uint256 collectorAUsdcBalanceBefore = IERC20(AaveV3EthereumAssets.USDC_A_TOKEN).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + + executePayload(vm, address(proposal)); + + uint256 collectorAUsdcBalanceAfter = IERC20(AaveV3EthereumAssets.USDC_A_TOKEN).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + + assertApproxEqAbs( + collectorAUsdcBalanceAfter, + collectorAUsdcBalanceBefore - proposal.USDC_A_AMOUNT() - 1, + 1, + 'Collector balance after swap' + ); + assertApproxEqAbs( + IERC20(AaveV3EthereumAssets.USDC_UNDERLYING).balanceOf( + 0xA866e48A6ef92e0191358Cb606C99e6187083567 // milkmanInstance contract + ), + proposal.USDC_A_AMOUNT(), + 6_000e6 + ); + } + + function test_withdrawUsdtAndSwapForGho() public { + uint256 collectorAUsdtBalanceBefore = IERC20(AaveV3EthereumAssets.USDT_A_TOKEN).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + + executePayload(vm, address(proposal)); + + uint256 collectorAUsdtBalanceAfter = IERC20(AaveV3EthereumAssets.USDT_A_TOKEN).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + + assertApproxEqAbs( + collectorAUsdtBalanceAfter, + collectorAUsdtBalanceBefore - proposal.USDT_A_AMOUNT() - 1, + 1, + 'Collector balance after swap' + ); + assertApproxEqAbs( + IERC20(AaveV3EthereumAssets.USDT_UNDERLYING).balanceOf( + 0x520A820040199C9f4b4420aE72aa9F8b91171262 // milkmanInstance contract + ), + proposal.USDT_A_AMOUNT(), + 3_500e6 + ); + } + + function test_withdrawDaiAndSwapForGho() public { + uint256 collectorDaiBalanceBefore = IERC20(AaveV3EthereumAssets.DAI_UNDERLYING).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + uint256 collectorADaiBalanceBefore = IERC20(AaveV2EthereumAssets.DAI_A_TOKEN).balanceOf( + address(AaveV2Ethereum.COLLECTOR) + ); + uint256 collectorAEthDaiBalanceBefore = IERC20(AaveV3EthereumAssets.DAI_A_TOKEN).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + + executePayload(vm, address(proposal)); + + uint256 collectorDaiBalanceAfter = IERC20(AaveV3EthereumAssets.DAI_UNDERLYING).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + uint256 collectorADaiBalanceAfter = IERC20(AaveV2EthereumAssets.DAI_A_TOKEN).balanceOf( + address(AaveV2Ethereum.COLLECTOR) + ); + uint256 collectorAEthDaiBalanceAfter = IERC20(AaveV3EthereumAssets.DAI_A_TOKEN).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + + assertEq(collectorDaiBalanceAfter, 0, 'Collector v3 underlying balance after swap'); + assertApproxEqAbs(collectorADaiBalanceAfter, 1e18, 80_000e18); + assertApproxEqAbs( + collectorAEthDaiBalanceAfter, + collectorAEthDaiBalanceBefore - proposal.DAI_A_AMOUNT(), + 50_000e18 + ); + assertApproxEqAbs( + IERC20(AaveV3EthereumAssets.DAI_UNDERLYING).balanceOf( + 0x6F828AF1D84C996DF4be14Ce178DcFC0cb3A4EEf // milkmanInstance contract + ), + collectorDaiBalanceBefore + collectorADaiBalanceBefore + proposal.DAI_A_AMOUNT() - 1e18, + 1e18 + ); + } + + function test_withdrawLusdAndSwapForGho() public { + executePayload(vm, address(proposal)); + + uint256 collectorLusdBalanceAfter = IERC20(AaveV3EthereumAssets.LUSD_UNDERLYING).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + uint256 collectorALusdBalanceAfter = IERC20(AaveV2EthereumAssets.LUSD_A_TOKEN).balanceOf( + address(AaveV2Ethereum.COLLECTOR) + ); + + assertEq(collectorLusdBalanceAfter, 0, 'Collector v3 underlying balance after swap'); + assertEq( + collectorALusdBalanceAfter, + 27626783961961316333562, // dynamic calculated because can't withdraw all due lack of liquidity + 'Collector v2 a token balance after swap' + ); + assertEq( + IERC20(AaveV3EthereumAssets.LUSD_UNDERLYING).balanceOf( + 0xD9d89a3979347934a70D78E1Da8eb5D1f0863ED6 // milkmanInstance contract + ), + 76843009601435302316637, // dynamic calculated because can't withdraw all due lack of liquidity + 'Swapper balance after swap' + ); + } + + function test_withdrawFraxAndSwapForGho() public { + uint256 collectorFraxBalanceBefore = IERC20(AaveV3EthereumAssets.FRAX_UNDERLYING).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + uint256 collectorAFraxBalanceBefore = IERC20(AaveV2EthereumAssets.FRAX_A_TOKEN).balanceOf( + address(AaveV2Ethereum.COLLECTOR) + ); + + executePayload(vm, address(proposal)); + + uint256 collectorFraxBalanceAfter = IERC20(AaveV3EthereumAssets.FRAX_UNDERLYING).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + uint256 collectorAFraxBalanceAfter = IERC20(AaveV2EthereumAssets.FRAX_A_TOKEN).balanceOf( + address(AaveV2Ethereum.COLLECTOR) + ); + + assertEq(collectorFraxBalanceAfter, 0, 'Collector v3 underlying balance after swap'); + assertApproxEqAbs(collectorAFraxBalanceAfter, 1e18, 900e18); + assertEq( + IERC20(AaveV3EthereumAssets.FRAX_UNDERLYING).balanceOf( + 0xfBdaD08dF908C30956AdB380cdC33074A4F37Ee4 // milkmanInstance contract + ), + collectorFraxBalanceBefore + collectorAFraxBalanceBefore - 1e18, + 'Swapper balance after swap' + ); + } + + function test_swapEvents() public { + vm.expectEmit(true, true, true, true, MiscEthereum.AAVE_SWAPPER); + emit SwapRequested( + proposal.MILKMAN(), + AaveV3EthereumAssets.USDC_UNDERLYING, + AaveV3EthereumAssets.GHO_UNDERLYING, + AaveV3EthereumAssets.USDC_ORACLE, + proposal.GHO_USD_FEED(), + 1255824963385, // Hardcoded as dynamic + address(AaveV3Ethereum.COLLECTOR), + 50 + ); + + vm.expectEmit(true, true, true, true, MiscEthereum.AAVE_SWAPPER); + emit SwapRequested( + proposal.MILKMAN(), + AaveV3EthereumAssets.USDT_UNDERLYING, + AaveV3EthereumAssets.GHO_UNDERLYING, + AaveV3EthereumAssets.USDT_ORACLE, + proposal.GHO_USD_FEED(), + 1253318999591, // Hardcoded as dynamic + address(AaveV3Ethereum.COLLECTOR), + 50 + ); + + vm.expectEmit(true, true, true, true, MiscEthereum.AAVE_SWAPPER); + emit SwapRequested( + proposal.MILKMAN(), + AaveV3EthereumAssets.DAI_UNDERLYING, + AaveV3EthereumAssets.GHO_UNDERLYING, + AaveV3EthereumAssets.DAI_ORACLE, + proposal.GHO_USD_FEED(), + 1362327582832050751435002, // Hardcoded as dynamic + address(AaveV3Ethereum.COLLECTOR), + 100 + ); + + vm.expectEmit(true, true, true, true, MiscEthereum.AAVE_SWAPPER); + emit SwapRequested( + proposal.MILKMAN(), + AaveV3EthereumAssets.LUSD_UNDERLYING, + AaveV3EthereumAssets.GHO_UNDERLYING, + AaveV3EthereumAssets.LUSD_ORACLE, + proposal.GHO_USD_FEED(), + 76843009601435302316637, // Hardcoded as dynamic + address(AaveV3Ethereum.COLLECTOR), + 300 + ); + + vm.expectEmit(true, true, true, true, MiscEthereum.AAVE_SWAPPER); + emit SwapRequested( + proposal.MILKMAN(), + AaveV2EthereumAssets.FRAX_UNDERLYING, + AaveV3EthereumAssets.GHO_UNDERLYING, + AaveV3EthereumAssets.FRAX_ORACLE, + proposal.GHO_USD_FEED(), + 5725614971954349972007, // Hardcoded as dynamic + address(AaveV3Ethereum.COLLECTOR), + 500 + ); + + executePayload(vm, address(proposal)); + } + + function test_gasRebate() public { + uint256 balanceKpkBefore = IERC20(AaveV3EthereumAssets.WETH_A_TOKEN).balanceOf( + proposal.KARPATKEY() + ); + + executePayload(vm, address(proposal)); + + assertEq( + IERC20(AaveV3EthereumAssets.WETH_A_TOKEN).balanceOf(proposal.KARPATKEY()), + balanceKpkBefore + proposal.GAS_REBATE_AMOUNT() + ); + } + + function test_meritAllowance() public { + executePayload(vm, address(proposal)); + + assertEq( + IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).allowance( + address(AaveV3Ethereum.COLLECTOR), + proposal.MERIT_SAFE() + ), + proposal.GHO_ALLOWANCE() + ); + assertEq( + IERC20(AaveV3EthereumAssets.WETH_A_TOKEN).allowance( + address(AaveV3Ethereum.COLLECTOR), + proposal.MERIT_SAFE() + ), + proposal.WETH_A_ALLOWANCE() + ); + + uint256 ghoBalanceBefore = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf( + proposal.MERIT_SAFE() + ); + uint256 wethBalanceBefore = IERC20(AaveV3EthereumAssets.WETH_A_TOKEN).balanceOf( + proposal.MERIT_SAFE() + ); + + vm.startPrank(proposal.MERIT_SAFE()); + IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).transferFrom( + address(AaveV3Ethereum.COLLECTOR), + proposal.MERIT_SAFE(), + proposal.GHO_ALLOWANCE() + ); + IERC20(AaveV3EthereumAssets.WETH_A_TOKEN).transferFrom( + address(AaveV3Ethereum.COLLECTOR), + proposal.MERIT_SAFE(), + proposal.WETH_A_ALLOWANCE() + ); + vm.stopPrank(); + + uint256 ghoBalanceAfter = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf( + proposal.MERIT_SAFE() + ); + uint256 wethBalanceAfter = IERC20(AaveV3EthereumAssets.WETH_A_TOKEN).balanceOf( + proposal.MERIT_SAFE() + ); + + assertEq(ghoBalanceAfter, ghoBalanceBefore + proposal.GHO_ALLOWANCE()); + assertEq(wethBalanceAfter, wethBalanceBefore + proposal.WETH_A_ALLOWANCE()); + } + + function test_isTokensRescuedV2() external { + uint256 sUSDCollectorInitialBalance = IERC20(AaveV2EthereumAssets.sUSD_UNDERLYING).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + + uint256 sUSDTransferred = IERC20(AaveV2EthereumAssets.sUSD_UNDERLYING).balanceOf( + proposal.DEBT_SWAP_ADAPTER() + ); + uint256 USDCTransferred = IERC20(AaveV2EthereumAssets.USDC_UNDERLYING).balanceOf( + proposal.DEBT_SWAP_ADAPTER() + ); + + executePayload(vm, address(proposal)); + + // AaveV2Ethereum current + assertEq( + IERC20(AaveV2EthereumAssets.sUSD_UNDERLYING).balanceOf(proposal.DEBT_SWAP_ADAPTER()), + 0, + 'Unexpected sUSD_UNDERLYING remaining' + ); + assertEq( + sUSDCollectorInitialBalance + sUSDTransferred, + IERC20(AaveV2EthereumAssets.sUSD_UNDERLYING).balanceOf(address(AaveV3Ethereum.COLLECTOR)), + 'Unexpected sUSD_UNDERLYING final treasury balance' + ); + assertEq( + IERC20(AaveV2EthereumAssets.USDC_UNDERLYING).balanceOf(proposal.DEBT_SWAP_ADAPTER()), + 0, + 'Unexpected USDC_UNDERLYING remaining' + ); + assertEq( + USDCTransferred, + IERC20(AaveV2EthereumAssets.USDC_UNDERLYING).balanceOf(address(AaveV3Ethereum.COLLECTOR)), + 'Unexpected USDC_UNDERLYING final treasury balance' + ); + } + + function test_isTokensRescuedV3() external { + uint256 crvUSDCollectorInitialBalance = IERC20(AaveV3EthereumAssets.crvUSD_UNDERLYING) + .balanceOf(address(AaveV3Ethereum.COLLECTOR)); + uint256 GHOCollectorInitialBalance = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + uint256 rETHCollectorInitialBalance = IERC20(AaveV3EthereumAssets.rETH_UNDERLYING).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + uint256 WBTCCollectorInitialBalance = IERC20(AaveV3EthereumAssets.WBTC_UNDERLYING).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + + uint256 USDTTransferred = IERC20(AaveV3EthereumAssets.USDT_UNDERLYING).balanceOf( + proposal.DEBT_SWAP_ADAPTER_V3() + ); + uint256 crvUSDTransferred = IERC20(AaveV3EthereumAssets.crvUSD_UNDERLYING).balanceOf( + proposal.DEBT_SWAP_ADAPTER_V3() + ); + uint256 GHOTransferred = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf( + proposal.REPAY_WITH_COLLATERAL_ADAPTER() + ); + uint256 rETHTransferred = IERC20(AaveV3EthereumAssets.rETH_UNDERLYING).balanceOf( + proposal.REPAY_WITH_COLLATERAL_ADAPTER() + ); + uint256 WBTCTransferred = IERC20(AaveV3EthereumAssets.WBTC_UNDERLYING).balanceOf( + proposal.REPAY_WITH_COLLATERAL_ADAPTER() + ); + + executePayload(vm, address(proposal)); + + // AaveV3Ethereum current + assertEq( + IERC20(AaveV3EthereumAssets.USDT_UNDERLYING).balanceOf(proposal.DEBT_SWAP_ADAPTER_V3()), + 0, + 'Unexpected USDT_UNDERLYING remaining' + ); + assertEq( + IERC20(AaveV3EthereumAssets.crvUSD_UNDERLYING).balanceOf(proposal.DEBT_SWAP_ADAPTER_V3()), + 0, + 'Unexpected crvUSD_UNDERLYING remaining' + ); + assertEq( + crvUSDCollectorInitialBalance + crvUSDTransferred, + IERC20(AaveV3EthereumAssets.crvUSD_UNDERLYING).balanceOf(address(AaveV3Ethereum.COLLECTOR)), + 'Unexpected crvUSD_UNDERLYING final treasury balance' + ); + assertEq( + IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf( + proposal.REPAY_WITH_COLLATERAL_ADAPTER() + ), + 0, + 'Unexpected GHO_UNDERLYING remaining' + ); + assertEq( + GHOCollectorInitialBalance + GHOTransferred, + IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf(address(AaveV3Ethereum.COLLECTOR)), + 'Unexpected GHO_UNDERLYING final treasury balance' + ); + assertEq( + IERC20(AaveV3EthereumAssets.rETH_UNDERLYING).balanceOf( + proposal.REPAY_WITH_COLLATERAL_ADAPTER() + ), + 0, + 'Unexpected rETH_UNDERLYING remaining' + ); + assertEq( + rETHCollectorInitialBalance + rETHTransferred, + IERC20(AaveV3EthereumAssets.rETH_UNDERLYING).balanceOf(address(AaveV3Ethereum.COLLECTOR)), + 'Unexpected rETH_UNDERLYING final treasury balance' + ); + assertEq( + IERC20(AaveV3EthereumAssets.WBTC_UNDERLYING).balanceOf( + proposal.REPAY_WITH_COLLATERAL_ADAPTER() + ), + 0, + 'Unexpected WBTC_UNDERLYING remaining' + ); + assertEq( + WBTCCollectorInitialBalance + WBTCTransferred, + IERC20(AaveV3EthereumAssets.WBTC_UNDERLYING).balanceOf(address(AaveV3Ethereum.COLLECTOR)), + 'Unexpected WBTC_UNDERLYING final treasury balance' + ); + assertEq( + USDTTransferred, + IERC20(AaveV3EthereumAssets.USDT_UNDERLYING).balanceOf(address(AaveV3Ethereum.COLLECTOR)), + 'Unexpected USDT_UNDERLYING final treasury balance' + ); + } +} diff --git a/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113.sol b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113.sol new file mode 100644 index 000000000..04dd0288f --- /dev/null +++ b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {AaveV3Optimism, AaveV3OptimismAssets} from 'aave-address-book/AaveV3Optimism.sol'; +import {AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {MiscOptimism} from 'aave-address-book/MiscOptimism.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol'; +import {CollectorUtils, ICollector} from 'aave-helpers/src/CollectorUtils.sol'; + +interface IAaveOpEthERC20Bridge { + function bridge(address token, address l1Token, uint256 amount) external; +} + +/** + * @title September Funding Update - Part A + * @author karpatkey_TokenLogic + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-september-funding-update/19162 + */ +contract AaveV3Optimism_SeptemberFundingUpdatePartA_20241113 is IProposalGenericExecutor { + using SafeERC20 for IERC20; + using CollectorUtils for ICollector; + + IAaveOpEthERC20Bridge public constant BRIDGE = + IAaveOpEthERC20Bridge(MiscOptimism.AAVE_OPT_ETH_BRIDGE); + + function execute() external override { + AaveV3Optimism.COLLECTOR.withdrawFromV3( + CollectorUtils.IOInput({ + pool: address(AaveV3Optimism.POOL), + underlying: AaveV3OptimismAssets.USDC_UNDERLYING, + amount: IERC20(AaveV3OptimismAssets.USDC_A_TOKEN).balanceOf( + address(AaveV3Optimism.COLLECTOR) + ) - 100e6 + }), + address(BRIDGE) + ); + + BRIDGE.bridge( + AaveV3OptimismAssets.USDC_UNDERLYING, + AaveV3EthereumAssets.USDC_UNDERLYING, + IERC20(AaveV3OptimismAssets.USDC_UNDERLYING).balanceOf(address(BRIDGE)) + ); + + AaveV3Optimism.COLLECTOR.withdrawFromV3( + CollectorUtils.IOInput({ + pool: address(AaveV3Optimism.POOL), + underlying: AaveV3OptimismAssets.LUSD_UNDERLYING, + amount: IERC20(AaveV3OptimismAssets.LUSD_A_TOKEN).balanceOf( + address(AaveV3Optimism.COLLECTOR) + ) - 1e18 + }), + address(BRIDGE) + ); + + BRIDGE.bridge( + AaveV3OptimismAssets.LUSD_UNDERLYING, + AaveV3EthereumAssets.LUSD_UNDERLYING, + IERC20(AaveV3OptimismAssets.LUSD_UNDERLYING).balanceOf(address(BRIDGE)) + ); + } +} diff --git a/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113.t.sol b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113.t.sol new file mode 100644 index 000000000..bcedaaf9c --- /dev/null +++ b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113.t.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Optimism, AaveV3OptimismAssets} from 'aave-address-book/AaveV3Optimism.sol'; +import {GovernanceV3Optimism} from 'aave-address-book/GovernanceV3Optimism.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Optimism_SeptemberFundingUpdatePartA_20241113} from './AaveV3Optimism_SeptemberFundingUpdatePartA_20241113.sol'; + +/** + * @dev Test for AaveV3Optimism_SeptemberFundingUpdatePartA_20241113 + * command: FOUNDRY_PROFILE=optimism forge test --match-path=src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113.t.sol -vv + */ +contract AaveV3Optimism_SeptemberFundingUpdatePartA_20241113_Test is ProtocolV3TestBase { + event Bridge(address indexed token, uint256 amount); + + AaveV3Optimism_SeptemberFundingUpdatePartA_20241113 internal proposal; + + address internal COLLECTOR = address(AaveV3Optimism.COLLECTOR); + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('optimism'), 127952448); + proposal = new AaveV3Optimism_SeptemberFundingUpdatePartA_20241113(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Optimism_SeptemberFundingUpdatePartA_20241113', + AaveV3Optimism.POOL, + address(proposal) + ); + } + + function test_bridgeUSDC() public { + uint256 collectorAUsdcBalanceBefore = IERC20(AaveV3OptimismAssets.USDC_A_TOKEN).balanceOf( + COLLECTOR + ); + + vm.expectEmit(true, false, false, true, address(proposal.BRIDGE())); + emit Bridge(AaveV3OptimismAssets.USDC_UNDERLYING, collectorAUsdcBalanceBefore - 100e6); + executePayload(vm, address(proposal)); + + uint256 collectorAUsdcBalanceAfter = IERC20(AaveV3OptimismAssets.USDC_A_TOKEN).balanceOf( + COLLECTOR + ); + + assertApproxEqAbs(collectorAUsdcBalanceAfter, 1e6, 4_500e6); + } + + function test_bridgeLUSD() public { + uint256 collectorALusdBalanceBefore = IERC20(AaveV3OptimismAssets.LUSD_A_TOKEN).balanceOf( + COLLECTOR + ); + + vm.expectEmit(true, false, false, true, address(proposal.BRIDGE())); + emit Bridge(AaveV3OptimismAssets.LUSD_UNDERLYING, collectorALusdBalanceBefore - 1e18 - 1); + executePayload(vm, address(proposal)); + + uint256 collectorALusdBalanceAfter = IERC20(AaveV3OptimismAssets.LUSD_A_TOKEN).balanceOf( + COLLECTOR + ); + + assertApproxEqAbs(collectorALusdBalanceAfter, 1e18, 300e18); + } +} diff --git a/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113.sol b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113.sol new file mode 100644 index 000000000..1a0e850f1 --- /dev/null +++ b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113.sol @@ -0,0 +1,145 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {MiscPolygon} from 'aave-address-book/MiscPolygon.sol'; +import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol'; +import {AaveV2Polygon, AaveV2PolygonAssets} from 'aave-address-book/AaveV2Polygon.sol'; +import {AaveV3Polygon, AaveV3PolygonAssets} from 'aave-address-book/AaveV3Polygon.sol'; +import {CollectorUtils, ICollector} from 'aave-helpers/src/CollectorUtils.sol'; + +interface IAavePolEthERC20Bridge { + function bridge(address token, uint256 amount) external; +} + +/** + * @title September Funding Update - Part A + * @author karpatkey_TokenLogic + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-september-funding-update/19162 + */ +contract AaveV3Polygon_SeptemberFundingUpdatePartA_20241113 is IProposalGenericExecutor { + using SafeERC20 for IERC20; + using CollectorUtils for ICollector; + + struct Migration { + address underlying; + address aToken; + uint256 leaveBehind; + } + + IAavePolEthERC20Bridge public constant BRIDGE = + IAavePolEthERC20Bridge(MiscPolygon.AAVE_POL_ETH_BRIDGE); + + function execute() external override { + _migrateToken(); + _bridge(); + } + + function _migrateToken() internal { + Migration[] memory migrations = new Migration[](6); + + migrations[0] = Migration({ + underlying: AaveV2PolygonAssets.USDT_UNDERLYING, + aToken: AaveV2PolygonAssets.USDT_A_TOKEN, + leaveBehind: 100 * 10 ** AaveV2PolygonAssets.USDT_DECIMALS + }); + migrations[1] = Migration({ + underlying: AaveV2PolygonAssets.DAI_UNDERLYING, + aToken: AaveV2PolygonAssets.DAI_A_TOKEN, + leaveBehind: 10 ** AaveV2PolygonAssets.DAI_DECIMALS + }); + migrations[2] = Migration({ + underlying: AaveV2PolygonAssets.WPOL_UNDERLYING, + aToken: AaveV2PolygonAssets.WPOL_A_TOKEN, + leaveBehind: 10 ** AaveV2PolygonAssets.WPOL_DECIMALS + }); + migrations[3] = Migration({ + underlying: AaveV2PolygonAssets.WETH_UNDERLYING, + aToken: AaveV2PolygonAssets.WETH_A_TOKEN, + leaveBehind: 10 ** AaveV2PolygonAssets.WETH_DECIMALS + }); + migrations[4] = Migration({ + underlying: AaveV2PolygonAssets.WBTC_UNDERLYING, + aToken: AaveV2PolygonAssets.WBTC_A_TOKEN, + leaveBehind: 10 ** AaveV2PolygonAssets.WBTC_DECIMALS + }); + migrations[5] = Migration({ + underlying: AaveV2PolygonAssets.LINK_UNDERLYING, + aToken: AaveV2PolygonAssets.LINK_A_TOKEN, + leaveBehind: 10 ** AaveV2PolygonAssets.LINK_DECIMALS + }); + + for (uint256 i = 0; i < 6; ) { + uint256 aTokenBalance = IERC20(migrations[i].aToken).balanceOf( + address(AaveV3Polygon.COLLECTOR) + ); + uint256 aTokenAvailableBalance = IERC20(migrations[i].underlying).balanceOf( + migrations[i].aToken + ); + + aTokenAvailableBalance = aTokenAvailableBalance > aTokenBalance + ? aTokenBalance + : aTokenAvailableBalance; + + if (aTokenAvailableBalance > migrations[i].leaveBehind) { + AaveV3Polygon.COLLECTOR.withdrawFromV2( + CollectorUtils.IOInput({ + pool: address(AaveV2Polygon.POOL), + underlying: migrations[i].underlying, + amount: aTokenAvailableBalance - migrations[i].leaveBehind + }), + address(AaveV3Polygon.COLLECTOR) + ); + + /// deposit + AaveV3Polygon.COLLECTOR.depositToV3( + CollectorUtils.IOInput({ + pool: address(AaveV3Polygon.POOL), + underlying: migrations[i].underlying, + amount: type(uint256).max + }) + ); + } + + unchecked { + ++i; + } + } + } + + function _bridge() internal { + AaveV3Polygon.COLLECTOR.withdrawFromV3( + CollectorUtils.IOInput({ + pool: address(AaveV3Polygon.POOL), + underlying: AaveV3PolygonAssets.USDC_UNDERLYING, + amount: IERC20(AaveV3PolygonAssets.USDC_A_TOKEN).balanceOf( + address(AaveV3Polygon.COLLECTOR) + ) - 100e6 + }), + address(BRIDGE) + ); + + uint256 aUsdcAvailableBalance = IERC20(AaveV2PolygonAssets.USDC_UNDERLYING).balanceOf( + AaveV2PolygonAssets.USDC_A_TOKEN + ); + uint256 aUsdcBalance = IERC20(AaveV2PolygonAssets.USDC_A_TOKEN).balanceOf( + address(AaveV2Polygon.COLLECTOR) + ); + AaveV2Polygon.COLLECTOR.withdrawFromV2( + CollectorUtils.IOInput({ + pool: address(AaveV2Polygon.POOL), + underlying: AaveV2PolygonAssets.USDC_UNDERLYING, + amount: (aUsdcBalance > aUsdcAvailableBalance ? aUsdcAvailableBalance : aUsdcBalance) - + 100e6 + }), + address(BRIDGE) + ); + + BRIDGE.bridge( + AaveV2PolygonAssets.USDC_UNDERLYING, + IERC20(AaveV2PolygonAssets.USDC_UNDERLYING).balanceOf(address(BRIDGE)) + ); + } +} diff --git a/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113.t.sol b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113.t.sol new file mode 100644 index 000000000..ac7033e4b --- /dev/null +++ b/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113.t.sol @@ -0,0 +1,203 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Polygon, AaveV3PolygonAssets} from 'aave-address-book/AaveV3Polygon.sol'; +import {AaveV2Polygon, AaveV2PolygonAssets} from 'aave-address-book/AaveV2Polygon.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {MiscPolygon} from 'aave-address-book/MiscPolygon.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {AaveV3Polygon_SeptemberFundingUpdatePartA_20241113} from './AaveV3Polygon_SeptemberFundingUpdatePartA_20241113.sol'; + +/** + * @dev Test for AaveV3Polygon_SeptemberFundingUpdatePartA_20241113 + * command: FOUNDRY_PROFILE=polygon forge test --match-path=src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113.t.sol -vv + */ +contract AaveV3Polygon_SeptemberFundingUpdatePartA_20241113_Test is ProtocolV3TestBase { + event Bridge(address token, uint256 amount); + event Transfer(address from, address to, uint256 amount); + + AaveV3Polygon_SeptemberFundingUpdatePartA_20241113 internal proposal; + + address internal COLLECTOR = address(AaveV3Polygon.COLLECTOR); + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('polygon'), 64236044); + proposal = new AaveV3Polygon_SeptemberFundingUpdatePartA_20241113(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Polygon_SeptemberFundingUpdatePartA_20241113', + AaveV3Polygon.POOL, + address(proposal) + ); + } + + function test_migrate_USDT() public { + uint256 collectorUsdtV2BalanceBefore = IERC20(AaveV2PolygonAssets.USDT_A_TOKEN).balanceOf( + COLLECTOR + ); + uint256 collectorUsdtV3BalanceBefore = IERC20(AaveV3PolygonAssets.USDT_A_TOKEN).balanceOf( + COLLECTOR + ); + + executePayload(vm, address(proposal)); + + uint256 collectorUsdtV2BalanceAfter = IERC20(AaveV2PolygonAssets.USDT_A_TOKEN).balanceOf( + COLLECTOR + ); + uint256 collectorUsdtV3BalanceAfter = IERC20(AaveV3PolygonAssets.USDT_A_TOKEN).balanceOf( + COLLECTOR + ); + + assertApproxEqAbs(collectorUsdtV2BalanceAfter, 1e6, 45_000e6); + assertApproxEqAbs( + collectorUsdtV3BalanceAfter, + collectorUsdtV3BalanceBefore + collectorUsdtV2BalanceBefore, + 45_000e6 + ); + } + + function test_migrate_DAI() public { + uint256 collectorDaiV2BalanceBefore = IERC20(AaveV2PolygonAssets.DAI_A_TOKEN).balanceOf( + COLLECTOR + ); + uint256 collectorDaiV3BalanceBefore = IERC20(AaveV3PolygonAssets.DAI_A_TOKEN).balanceOf( + COLLECTOR + ); + + executePayload(vm, address(proposal)); + + uint256 collectorDaiV2BalanceAfter = IERC20(AaveV2PolygonAssets.DAI_A_TOKEN).balanceOf( + COLLECTOR + ); + uint256 collectorDaiV3BalanceAfter = IERC20(AaveV3PolygonAssets.DAI_A_TOKEN).balanceOf( + COLLECTOR + ); + + assertApproxEqAbs(collectorDaiV2BalanceAfter, 1e18, 19_000e18); + assertApproxEqAbs( + collectorDaiV3BalanceAfter, + collectorDaiV3BalanceBefore + collectorDaiV2BalanceBefore, + 26_000e18 + ); + } + + function test_migrate_WPOL() public { + uint256 collectorWPolV2BalanceBefore = IERC20(AaveV2PolygonAssets.WPOL_A_TOKEN).balanceOf( + COLLECTOR + ); + uint256 collectorWPolV3BalanceBefore = IERC20(AaveV3PolygonAssets.WPOL_A_TOKEN).balanceOf( + COLLECTOR + ); + + executePayload(vm, address(proposal)); + + uint256 collectorWPolV2BalanceAfter = IERC20(AaveV2PolygonAssets.WPOL_A_TOKEN).balanceOf( + COLLECTOR + ); + uint256 collectorWPolV3BalanceAfter = IERC20(AaveV3PolygonAssets.WPOL_A_TOKEN).balanceOf( + COLLECTOR + ); + + assertApproxEqAbs(collectorWPolV2BalanceAfter, 1e18, 400e18); + assertApproxEqAbs( + collectorWPolV3BalanceAfter, + collectorWPolV3BalanceBefore + collectorWPolV2BalanceBefore, + 5_000e18 + ); + } + + function test_migrate_WETH() public { + uint256 collectorWEthV2BalanceBefore = IERC20(AaveV2PolygonAssets.WETH_A_TOKEN).balanceOf( + COLLECTOR + ); + uint256 collectorWEthV3BalanceBefore = IERC20(AaveV3PolygonAssets.WETH_A_TOKEN).balanceOf( + COLLECTOR + ); + + executePayload(vm, address(proposal)); + + uint256 collectorWEthV2BalanceAfter = IERC20(AaveV2PolygonAssets.WETH_A_TOKEN).balanceOf( + COLLECTOR + ); + uint256 collectorWEthV3BalanceAfter = IERC20(AaveV3PolygonAssets.WETH_A_TOKEN).balanceOf( + COLLECTOR + ); + + assertApproxEqAbs(collectorWEthV2BalanceAfter, 1e18, 1e18); + assertApproxEqAbs( + collectorWEthV3BalanceAfter, + collectorWEthV3BalanceBefore + collectorWEthV2BalanceBefore, + 3e18 + ); + } + + function test_migrate_WBTC() public { + uint256 collectorWBtcV2BalanceBefore = IERC20(AaveV2PolygonAssets.WBTC_A_TOKEN).balanceOf( + COLLECTOR + ); + uint256 collectorWBtcV3BalanceBefore = IERC20(AaveV3PolygonAssets.WBTC_A_TOKEN).balanceOf( + COLLECTOR + ); + + executePayload(vm, address(proposal)); + + uint256 collectorWBtcV2BalanceAfter = IERC20(AaveV2PolygonAssets.WBTC_A_TOKEN).balanceOf( + COLLECTOR + ); + uint256 collectorWBtcV3BalanceAfter = IERC20(AaveV3PolygonAssets.WBTC_A_TOKEN).balanceOf( + COLLECTOR + ); + + // doesn't migrated because balance is below than unit + assertEq(collectorWBtcV2BalanceBefore, collectorWBtcV2BalanceAfter); + assertEq(collectorWBtcV3BalanceAfter, collectorWBtcV3BalanceBefore); + } + + function test_migrate_LINK() public { + uint256 collectorLinkV2BalanceBefore = IERC20(AaveV2PolygonAssets.LINK_A_TOKEN).balanceOf( + COLLECTOR + ); + uint256 collectorLinkV3BalanceBefore = IERC20(AaveV3PolygonAssets.LINK_A_TOKEN).balanceOf( + COLLECTOR + ); + + executePayload(vm, address(proposal)); + + uint256 collectorLinkV2BalanceAfter = IERC20(AaveV2PolygonAssets.LINK_A_TOKEN).balanceOf( + COLLECTOR + ); + uint256 collectorLinkV3BalanceAfter = IERC20(AaveV3PolygonAssets.LINK_A_TOKEN).balanceOf( + COLLECTOR + ); + + assertApproxEqAbs(collectorLinkV2BalanceAfter, 1e18, 1e18); + assertApproxEqAbs( + collectorLinkV3BalanceAfter, + collectorLinkV3BalanceBefore + collectorLinkV2BalanceBefore, + 45e18 + ); + } + + function test_bridge() public { + vm.expectEmit(true, false, false, true, MiscPolygon.AAVE_POL_ETH_BRIDGE); + emit Bridge(AaveV3PolygonAssets.USDC_UNDERLYING, 287195325014); // dynamically calculated + executePayload(vm, address(proposal)); + + uint256 collectorAUsdcV2BalanceAfter = IERC20(AaveV2PolygonAssets.USDC_A_TOKEN).balanceOf( + COLLECTOR + ); + uint256 collectorAUsdcV3BalanceAfter = IERC20(AaveV3PolygonAssets.USDC_A_TOKEN).balanceOf( + COLLECTOR + ); + + assertApproxEqAbs(collectorAUsdcV2BalanceAfter, 1e6, 15_000e6); + assertApproxEqAbs(collectorAUsdcV3BalanceAfter, 1e6, 10_000e6); + } +} diff --git a/src/20241113_Multi_SeptemberFundingUpdatePartA/SeptemberFundingUpdatePartA.md b/src/20241113_Multi_SeptemberFundingUpdatePartA/SeptemberFundingUpdatePartA.md new file mode 100644 index 000000000..120f3e3e8 --- /dev/null +++ b/src/20241113_Multi_SeptemberFundingUpdatePartA/SeptemberFundingUpdatePartA.md @@ -0,0 +1,70 @@ +--- +title: "September Funding Update - Part A" +author: "karpatkey_TokenLogic" +discussions: "https://governance.aave.com/t/arfc-september-funding-update/19162" +snapshot: "Direct-to-AIP" +--- + +## Simple Summary + +This AIP will migrate funds from Aave v2 to v3 on Polygon, withdraw funds from Polygon, Arbitrum and Optimism to Ethereum, rescue Paraswap funds. This AIP also executes for reimbursing for the [funding of Guardian signers](https://governance.aave.com/t/arfc-renewal-of-aave-guardian-2024/17523/32), and create allowances to the Merit and Ahab. + +## Motivation + +As part of our ongoing Treasury asset rebalancing, this proposal when implemented will continue the migration of assets from v2 instances of Aave to v3. In response to recent events, funds currently locked in the Paraswap adapter contracts will be send to the DAOs Treasury. Due to size of these holding, this will only be performed on Polygon, Optimism, Ethereum and Arbitrum where this proposal is already intending updating the DAOs holdings. + +## Specification + +### Migrate the following assets from Aave v2 to v3 Polygon. + +amUSDT (All-100x10^6) +amDAI (All-1.0x10^18) +amWMATIC (All-1.0x10^18) +amWETH (All-1.0x10^18) +amWBTC (All-1.0x10^8) +amLINK (All-1.0x10^18) + +### Transfer the following assets to Ethereum. + +| Polygon | Arbitrum | Optimism | +| ----------------------- | ------------------------ | ------------------------ | +| amUSDC.e (All-100x10^6) | aArbUSDC (All-100x10^6) | aOptUSDC (All-100x10^6) | +| aPolUSDC (All-100x10^6) | aArbLUSD (All-1.0x10^18) | aOptLUSD (All-1.0x10^18) | + +### Rescue Paraswap Funds + +Rescue funds held in the Paraswap adapter contracts and send back to Treasury in line with this [PR 454](https://github.com/bgd-labs/aave-proposals-v3/pull/454) on Ethereum. + +### Gas Rebate + +Transfer 0.264 ETH to 0x818C277dBE886b934e60aa047250A73529E26A99 (karpatkey) reimbursing for the [funding of Guardian signers](https://governance.aave.com/t/arfc-renewal-of-aave-guardian-2024/17523/32). + +### Swap funds to GHO + +| Ethereum | +| :--------------------: | +| aUSDC (1.25M) | +| aUSDT (1.25M) | +| DAI (All) | +| aDAI (All-1.0x10^-18) | +| aEthDAI (0.5M) | +| aLUSD (All-1.0x10^-18) | +| LUSD (All) | +| FRAX (All) | +| aFRAX (All-1.0x10^-18) | + +### Merit + Ahab Programs + +Create allowances to the Merit and Ahab, 3M GHO and 800 aEthWETH from Aave v3 Ethereum: +SAFE: 0xdeadD8aB03075b7FBA81864202a2f59EE25B312b + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/1aab63b1461e28bcf74d70844654b968c4aab1b2/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/1aab63b1461e28bcf74d70844654b968c4aab1b2/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/1aab63b1461e28bcf74d70844654b968c4aab1b2/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/1aab63b1461e28bcf74d70844654b968c4aab1b2/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/1aab63b1461e28bcf74d70844654b968c4aab1b2/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113.t.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/1aab63b1461e28bcf74d70844654b968c4aab1b2/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Polygon_SeptemberFundingUpdatePartA_20241113.t.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/1aab63b1461e28bcf74d70844654b968c4aab1b2/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Optimism_SeptemberFundingUpdatePartA_20241113.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/1aab63b1461e28bcf74d70844654b968c4aab1b2/src/20241113_Multi_SeptemberFundingUpdatePartA/AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113.t.sol) +- Snapshot: Direct-to-AIP +- [Discussion](https://governance.aave.com/t/arfc-september-funding-update/19162) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241113_Multi_SeptemberFundingUpdatePartA/SeptemberFundingUpdatePartA_20241113.s.sol b/src/20241113_Multi_SeptemberFundingUpdatePartA/SeptemberFundingUpdatePartA_20241113.s.sol new file mode 100644 index 000000000..4815c6cb4 --- /dev/null +++ b/src/20241113_Multi_SeptemberFundingUpdatePartA/SeptemberFundingUpdatePartA_20241113.s.sol @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript, PolygonScript, OptimismScript, ArbitrumScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113} from './AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113.sol'; +import {AaveV3Polygon_SeptemberFundingUpdatePartA_20241113} from './AaveV3Polygon_SeptemberFundingUpdatePartA_20241113.sol'; +import {AaveV3Optimism_SeptemberFundingUpdatePartA_20241113} from './AaveV3Optimism_SeptemberFundingUpdatePartA_20241113.sol'; +import {AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113} from './AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241113_Multi_SeptemberFundingUpdatePartA/SeptemberFundingUpdatePartA_20241113.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/SeptemberFundingUpdatePartA_20241113.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Polygon + * deploy-command: make deploy-ledger contract=src/20241113_Multi_SeptemberFundingUpdatePartA/SeptemberFundingUpdatePartA_20241113.s.sol:DeployPolygon chain=polygon + * verify-command: FOUNDRY_PROFILE=polygon npx catapulta-verify -b broadcast/SeptemberFundingUpdatePartA_20241113.s.sol/137/run-latest.json + */ +contract DeployPolygon is PolygonScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Polygon_SeptemberFundingUpdatePartA_20241113).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Optimism + * deploy-command: make deploy-ledger contract=src/20241113_Multi_SeptemberFundingUpdatePartA/SeptemberFundingUpdatePartA_20241113.s.sol:DeployOptimism chain=optimism + * verify-command: FOUNDRY_PROFILE=optimism npx catapulta-verify -b broadcast/SeptemberFundingUpdatePartA_20241113.s.sol/10/run-latest.json + */ +contract DeployOptimism is OptimismScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Optimism_SeptemberFundingUpdatePartA_20241113).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Arbitrum + * deploy-command: make deploy-ledger contract=src/20241113_Multi_SeptemberFundingUpdatePartA/SeptemberFundingUpdatePartA_20241113.s.sol:DeployArbitrum chain=arbitrum + * verify-command: FOUNDRY_PROFILE=arbitrum npx catapulta-verify -b broadcast/SeptemberFundingUpdatePartA_20241113.s.sol/42161/run-latest.json + */ +contract DeployArbitrum is ArbitrumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113).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/20241113_Multi_SeptemberFundingUpdatePartA/SeptemberFundingUpdatePartA_20241113.s.sol:CreateProposal chain=mainnet + */ +contract CreateProposal is EthereumScript { + function run() external { + // create payloads + PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](4); + + // compose actions for validation + IPayloadsControllerCore.ExecutionAction[] + memory actionsEthereum = new IPayloadsControllerCore.ExecutionAction[](1); + actionsEthereum[0] = GovV3Helpers.buildAction( + type(AaveV3Ethereum_SeptemberFundingUpdatePartA_20241113).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsPolygon = new IPayloadsControllerCore.ExecutionAction[](1); + actionsPolygon[0] = GovV3Helpers.buildAction( + type(AaveV3Polygon_SeptemberFundingUpdatePartA_20241113).creationCode + ); + payloads[1] = GovV3Helpers.buildPolygonPayload(vm, actionsPolygon); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsOptimism = new IPayloadsControllerCore.ExecutionAction[](1); + actionsOptimism[0] = GovV3Helpers.buildAction( + type(AaveV3Optimism_SeptemberFundingUpdatePartA_20241113).creationCode + ); + payloads[2] = GovV3Helpers.buildOptimismPayload(vm, actionsOptimism); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsArbitrum = new IPayloadsControllerCore.ExecutionAction[](1); + actionsArbitrum[0] = GovV3Helpers.buildAction( + type(AaveV3Arbitrum_SeptemberFundingUpdatePartA_20241113).creationCode + ); + payloads[3] = GovV3Helpers.buildArbitrumPayload(vm, actionsArbitrum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241113_Multi_SeptemberFundingUpdatePartA/SeptemberFundingUpdatePartA.md' + ) + ); + } +} diff --git a/src/20241113_Multi_SeptemberFundingUpdatePartA/config.ts b/src/20241113_Multi_SeptemberFundingUpdatePartA/config.ts new file mode 100644 index 000000000..47ec67131 --- /dev/null +++ b/src/20241113_Multi_SeptemberFundingUpdatePartA/config.ts @@ -0,0 +1,19 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3Ethereum', 'AaveV3Polygon', 'AaveV3Optimism', 'AaveV3Arbitrum'], + title: 'September Funding Update - Part A', + shortName: 'SeptemberFundingUpdatePartA', + date: '20241113', + author: 'karpatkey_TokenLogic', + discussion: 'https://governance.aave.com/t/arfc-september-funding-update/19162', + snapshot: 'Direct-to-AIP', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Ethereum: {configs: {}, cache: {blockNumber: 21179000}}, + AaveV3Polygon: {configs: {}, cache: {blockNumber: 64236044}}, + AaveV3Optimism: {configs: {}, cache: {blockNumber: 127952448}}, + AaveV3Arbitrum: {configs: {}, cache: {blockNumber: 274046247}}, + }, +}; diff --git a/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118.sol b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118.sol new file mode 100644 index 000000000..14d665288 --- /dev/null +++ b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Arbitrum} from 'aave-address-book/AaveV3Arbitrum.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {FlashBorrowersDataArbitrum} from './FlashBorrowersData.sol'; +/** + * @title Add dHEDGE Protocol to flashBorrowers + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-add-dhedge-protocol-to-flashborrowers/19547 + */ +contract AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118 is IProposalGenericExecutor { + function execute() external { + address[] memory flashBorrowers = FlashBorrowersDataArbitrum.getFlashBorrowers(); + for (uint i = 0; i < flashBorrowers.length; i++) { + AaveV3Arbitrum.ACL_MANAGER.addFlashBorrower(flashBorrowers[i]); + } + } +} diff --git a/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol new file mode 100644 index 000000000..709dafaa5 --- /dev/null +++ b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3Arbitrum} from 'aave-address-book/AaveV3Arbitrum.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118} from './AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118.sol'; +import {FlashBorrowersDataArbitrum} from './FlashBorrowersData.sol'; + +/** + * @dev Test for AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118 + * command: FOUNDRY_PROFILE=arbitrum forge test --match-path=src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol -vv + */ +contract AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118_Test is ProtocolV3TestBase { + AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('arbitrum'), 275871816); + proposal = new AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118', + AaveV3Arbitrum.POOL, + address(proposal) + ); + } + + function test_isFlashBorrower() external { + GovV3Helpers.executePayload(vm, address(proposal)); + address[] memory flashBorrowers = FlashBorrowersDataArbitrum.getFlashBorrowers(); + for (uint i = 0; i < flashBorrowers.length; i++) { + bool isFlashBorrower = AaveV3Arbitrum.ACL_MANAGER.isFlashBorrower(flashBorrowers[i]); + assertEq(isFlashBorrower, true); + } + } +} diff --git a/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118.sol b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118.sol new file mode 100644 index 000000000..79aba8f78 --- /dev/null +++ b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Base} from 'aave-address-book/AaveV3Base.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {FlashBorrowersDataBase} from './FlashBorrowersData.sol'; +/** + * @title Add dHEDGE Protocol to flashBorrowers + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-add-dhedge-protocol-to-flashborrowers/19547 + */ +contract AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118 is IProposalGenericExecutor { + function execute() external { + address[] memory flashBorrowers = FlashBorrowersDataBase.getFlashBorrowers(); + for (uint i = 0; i < flashBorrowers.length; i++) { + AaveV3Base.ACL_MANAGER.addFlashBorrower(flashBorrowers[i]); + } + } +} diff --git a/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol new file mode 100644 index 000000000..596795ced --- /dev/null +++ b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3Base} from 'aave-address-book/AaveV3Base.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118} from './AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118.sol'; +import {FlashBorrowersDataBase} from './FlashBorrowersData.sol'; + +/** + * @dev Test for AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118 + * command: FOUNDRY_PROFILE=base forge test --match-path=src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol -vv + */ +contract AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118_Test is ProtocolV3TestBase { + AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('base'), 22586604); + proposal = new AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118', + AaveV3Base.POOL, + address(proposal) + ); + } + + function test_isFlashBorrower() external { + GovV3Helpers.executePayload(vm, address(proposal)); + address[] memory flashBorrowers = FlashBorrowersDataBase.getFlashBorrowers(); + for (uint i = 0; i < flashBorrowers.length; i++) { + bool isFlashBorrower = AaveV3Base.ACL_MANAGER.isFlashBorrower(flashBorrowers[i]); + assertEq(isFlashBorrower, true); + } + } +} diff --git a/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118.sol b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118.sol new file mode 100644 index 000000000..b0c5b6e51 --- /dev/null +++ b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Optimism} from 'aave-address-book/AaveV3Optimism.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {FlashBorrowersDataOptimism} from './FlashBorrowersData.sol'; +/** + * @title Add dHEDGE Protocol to flashBorrowers + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-add-dhedge-protocol-to-flashborrowers/19547 + */ +contract AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118 is IProposalGenericExecutor { + function execute() external { + address[] memory flashBorrowers = FlashBorrowersDataOptimism.getFlashBorrowers(); + for (uint i = 0; i < flashBorrowers.length; i++) { + AaveV3Optimism.ACL_MANAGER.addFlashBorrower(flashBorrowers[i]); + } + } +} diff --git a/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol new file mode 100644 index 000000000..f4ceca7d7 --- /dev/null +++ b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3Optimism} from 'aave-address-book/AaveV3Optimism.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118} from './AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118.sol'; +import {FlashBorrowersDataOptimism} from './FlashBorrowersData.sol'; + +/** + * @dev Test for AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118 + * command: FOUNDRY_PROFILE=optimism forge test --match-path=src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol -vv + */ +contract AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118_Test is ProtocolV3TestBase { + AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('optimism'), 128181628); + proposal = new AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118', + AaveV3Optimism.POOL, + address(proposal) + ); + } + + function test_isFlashBorrower() external { + GovV3Helpers.executePayload(vm, address(proposal)); + address[] memory flashBorrowers = FlashBorrowersDataOptimism.getFlashBorrowers(); + for (uint i = 0; i < flashBorrowers.length; i++) { + bool isFlashBorrower = AaveV3Optimism.ACL_MANAGER.isFlashBorrower(flashBorrowers[i]); + assertEq(isFlashBorrower, true); + } + } +} diff --git a/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118.sol b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118.sol new file mode 100644 index 000000000..d50c79044 --- /dev/null +++ b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Polygon} from 'aave-address-book/AaveV3Polygon.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; + +import {FlashBorrowersDataPolygon} from './FlashBorrowersData.sol'; +/** + * @title Add dHEDGE Protocol to flashBorrowers + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-add-dhedge-protocol-to-flashborrowers/19547 + */ +contract AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118 is IProposalGenericExecutor { + function execute() external { + address[] memory flashBorrowers = FlashBorrowersDataPolygon.getFlashBorrowers(); + for (uint i = 0; i < flashBorrowers.length; i++) { + AaveV3Polygon.ACL_MANAGER.addFlashBorrower(flashBorrowers[i]); + } + } +} diff --git a/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol new file mode 100644 index 000000000..ad76e8433 --- /dev/null +++ b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3Polygon} from 'aave-address-book/AaveV3Polygon.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118} from './AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118.sol'; +import {FlashBorrowersDataPolygon} from './FlashBorrowersData.sol'; +/** + * @dev Test for AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118 + * command: FOUNDRY_PROFILE=polygon forge test --match-path=src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol -vv + */ +contract AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118_Test is ProtocolV3TestBase { + AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('polygon'), 64447789); + proposal = new AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118', + AaveV3Polygon.POOL, + address(proposal) + ); + } + + function test_isFlashBorrower() external { + GovV3Helpers.executePayload(vm, address(proposal)); + address[] memory flashBorrowers = FlashBorrowersDataPolygon.getFlashBorrowers(); + for (uint i = 0; i < flashBorrowers.length; i++) { + bool isFlashBorrower = AaveV3Polygon.ACL_MANAGER.isFlashBorrower(flashBorrowers[i]); + assertEq(isFlashBorrower, true); + } + } +} diff --git a/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AddDHEDGEProtocolToFlashBorrowers.md b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AddDHEDGEProtocolToFlashBorrowers.md new file mode 100644 index 000000000..03a6073c7 --- /dev/null +++ b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AddDHEDGEProtocolToFlashBorrowers.md @@ -0,0 +1,89 @@ +--- +title: "Add dHEDGE Protocol to flashBorrowers" +author: "Aave Chan Initiative" +discussions: "https://governance.aave.com/t/arfc-add-dhedge-protocol-to-flashborrowers/19547" +--- + +## Simple Summary + +The following proposal plans to add dHEDGE Protocol as a whitelisted actor of the Flashborrowers of Aave V3 on Base, Polygon, Arbitrum, and Optimism liquidity pools. + +## Motivation + +If this proposal is implemented, all flashLoan fees for dHEGDE Protocol using Aave would be waived. + +dHEDGE is a tokenized vault protocol that allows users to build, manage, and automate vault strategies. dHEDGE has many vaults that currently use AAVE V3, most notably Toros Finance Leverge tokens. + +[dHEDGE Protocol](https://dhedge.org/)[Toros Finance](https://toros.finance/) + +Given [[ARFC] Add Contango Protocol, CIAN Protocol and Index Coop to flashBorrowers on Aave v3](https://governance.aave.com/t/arfc-add-contango-protocol-cian-protocol-and-index-coop-to-flashborrowers-on-aave-v3/16478) passed [Snapshot](https://snapshot.org/#/aave.eth/proposal/0x09bb9e7cffc974d330d82ce7a0b0502b573d6f3b4f839ea15d6629613901e96d) with 595k votes in favour, this proposal intends to utilize the Direct-to-AIP proposes to whitelisted permissions on dHEDGE Protocol. + +## Specification + +Whitelist dHEDGE Protocol as part of FlashBorrowers of Aave V3 on Base, Polygon, Arbitrum & Optimism liquidity pools. + +This proposal aims to implement a single AIP, utilizing four similar payloads (one for each network), which will call addFlashBorrower() on the ACL_MANAGER contract for the followings addresses. + +**Optimism** + +- [0x83d1fa384ec44c2769a3562ede372484f26e141b](https://optimistic.etherscan.io/address/0x83d1fa384ec44c2769a3562ede372484f26e141b) +- [0x32ad28356ef70adc3ec051d8aacdeeaa10135296](https://optimistic.etherscan.io/address/0x32ad28356ef70adc3ec051d8aacdeeaa10135296) +- [0xb03818de4992388260b62259361778cf98485dfe](https://optimistic.etherscan.io/address/0xb03818de4992388260b62259361778cf98485dfe) +- [0x11b55966527ff030ca9c7b1c548b4be5e7eaee6d](https://optimistic.etherscan.io/address/0x11b55966527ff030ca9c7b1c548b4be5e7eaee6d) +- [0xcacb5a722a36cff6baeb359e21c098a4acbffdfa](https://optimistic.etherscan.io/address/0xcacb5a722a36cff6baeb359e21c098a4acbffdfa) +- [0x9573c7b691cdcebbfa9d655181f291799dfb7cf5](https://optimistic.etherscan.io/address/0x9573c7b691cdcebbfa9d655181f291799dfb7cf5) +- [0x32b1d1bfd4b3b0cb9ff2dcd9dac757aa64d4cb69](https://optimistic.etherscan.io/address/0x32b1d1bfd4b3b0cb9ff2dcd9dac757aa64d4cb69) +- [0x7d3c9c6566375d7ad6e89169ca5c01b5edc15364](https://optimistic.etherscan.io/address/0x7d3c9c6566375d7ad6e89169ca5c01b5edc15364) +- [0xcc7d6ed524760539311ed0cdb41d0852b4eb77eb](https://optimistic.etherscan.io/address/0xcc7d6ed524760539311ed0cdb41d0852b4eb77eb) +- [0xb9243c495117343981ec9f8aa2abffee54396fc0](https://optimistic.etherscan.io/address/0xb9243c495117343981ec9f8aa2abffee54396fc0) +- [0x1ec50880101022c11530a069690f5446d1464592](https://optimistic.etherscan.io/address/0x1ec50880101022c11530a069690f5446d1464592) +- [0x49bf093277bf4dde49c48c6aa55a3bda3eedef68](https://optimistic.etherscan.io/address/0x49bf093277bf4dde49c48c6aa55a3bda3eedef68) +- [0xb2cfb909e8657c0ec44d3dd898c1053b87804755](https://optimistic.etherscan.io/address/0xb2cfb909e8657c0ec44d3dd898c1053b87804755) +- [0x59babc14dd73761e38e5bda171b2298dc14da92d](https://optimistic.etherscan.io/address/0x59babc14dd73761e38e5bda171b2298dc14da92d) + +**Arbitrum** + +- [0x27d8fdb0251b48d8edd1ad7bedf553cf99abe7b0](https://arbiscan.io/address/0x27d8fdb0251b48d8edd1ad7bedf553cf99abe7b0) +- [0xe3254397f5d9c0b69917ebb49b49e103367b406f](https://arbiscan.io/address/0xe3254397f5d9c0b69917ebb49b49e103367b406f) +- [0xad38255febd566809ae387d5be66ecd287947cb9](https://arbiscan.io/address/0xad38255febd566809ae387d5be66ecd287947cb9) +- [0x40d30b13666c55b1f41ee11645b5ea3ea2ca31f8](https://arbiscan.io/address/0x40d30b13666c55b1f41ee11645b5ea3ea2ca31f8) +- [0x696f6d66c2da2aa4a400a4317eec8da88f7a378c](https://arbiscan.io/address/0x696f6d66c2da2aa4a400a4317eec8da88f7a378c) +- [0xf715724abba480d4d45f4cb52bef5ce5e3513ccc](https://arbiscan.io/address/0xf715724abba480d4d45f4cb52bef5ce5e3513ccc) +- [0xe9b5260d99d283ff887859c569baf8ad1bd12aac](https://arbiscan.io/address/0xe9b5260d99d283ff887859c569baf8ad1bd12aac) +- [0x43da9b0ab53242c55a9ff9c722ffc2a373d639c7](https://arbiscan.io/address/0x43da9b0ab53242c55a9ff9c722ffc2a373d639c7) +- [0x678569fc403ea2ba46b549a4d0e15e883d7cadf5](https://arbiscan.io/address/0x678569fc403ea2ba46b549a4d0e15e883d7cadf5) +- [0xc3198eb5102fb3335c0e911ef1da4bc07e403dd1](https://arbiscan.io/address/0xc3198eb5102fb3335c0e911ef1da4bc07e403dd1) +- [0xddd6b1f34e12c0230ab23cbd4514560b24438514](https://arbiscan.io/address/0xddd6b1f34e12c0230ab23cbd4514560b24438514) + +**Base** + +- [0xa672e882acbb96486393d43e0efdab5ebebddc1d](https://basescan.io/address/0xa672e882acbb96486393d43e0efdab5ebebddc1d) +- [0x15e2f06138aed58ca2a6afb5a1333bbc5f728f80](https://basescan.io/address/0x15e2f06138aed58ca2a6afb5a1333bbc5f728f80) +- [0xba5f6a0d2ac21a3fec7a6c40facd23407aa84663](https://basescan.io/address/0xba5f6a0d2ac21a3fec7a6c40facd23407aa84663) +- [0xc1e02884af4a283ca25ab63c45360d220d69da52](https://basescan.io/address/0xc1e02884af4a283ca25ab63c45360d220d69da52) +- [0x1c980456751ae40315ff73caac0843be643321be](https://basescan.io/address/0x1c980456751ae40315ff73caac0843be643321be) +- [0xede61eefa4850b459e3b09fe6d8d371480d6ff00](https://basescan.io/address/0xede61eefa4850b459e3b09fe6d8d371480d6ff00) +- [0x53a4716a8f7dbc9543ebf9cd711952033cc64d43](https://basescan.io/address/0x53a4716a8f7dbc9543ebf9cd711952033cc64d43) +- [0xd2f23773bf5e2d59f6bb925c2232f6e83f3f79e0](https://basescan.io/address/0xd2f23773bf5e2d59f6bb925c2232f6e83f3f79e0) +- [0x9e0501537723c71250307f5b1a8ee60e167d21c9](https://basescan.io/address/0x9e0501537723c71250307f5b1a8ee60e167d21c9) +- [0xcaf08bf08d0c87e2c74dd9ebec9c776037bd7e8e](https://basescan.io/address/0xcaf08bf08d0c87e2c74dd9ebec9c776037bd7e8e) + +**Polygon** + +- [0x86c3dd18baf4370495d9228b58fd959771285c55](https://polygonscan.io/address/0x86c3dd18baf4370495d9228b58fd959771285c55) +- [0xdb88ab5b485b38edbeef866314f9e49d095bce39](https://polygonscan.io/address/0xdb88ab5b485b38edbeef866314f9e49d095bce39) +- [0x79d2aefe6a21b26b024d9341a51f6b7897852499](https://polygonscan.io/address/0x79d2aefe6a21b26b024d9341a51f6b7897852499) +- [0x460b60565cb73845d56564384ab84bf84c13e47d](https://polygonscan.io/address/0x460b60565cb73845d56564384ab84bf84c13e47d) + +This AIP grants permission to whitelist any dHEDGE Protocol contract for all use cases, such as leveraged positions, EMODE, debt and collateral swaps, with one exception: no smart-contract that migrates a position outside of the Aave ecosystem is eligible for whitelisting. + +## References + +- Implementation: [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/b537d861c6636003e985d83f1f622346ea62c1ac/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/b537d861c6636003e985d83f1f622346ea62c1ac/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/b537d861c6636003e985d83f1f622346ea62c1ac/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/b537d861c6636003e985d83f1f622346ea62c1ac/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118.sol) +- Tests: [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/b537d861c6636003e985d83f1f622346ea62c1ac/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/b537d861c6636003e985d83f1f622346ea62c1ac/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/b537d861c6636003e985d83f1f622346ea62c1ac/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/b537d861c6636003e985d83f1f622346ea62c1ac/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118.t.sol) +- Snapshot: Direct-to-AIP +- [Discussion](https://governance.aave.com/t/arfc-add-dhedge-protocol-to-flashborrowers/19547) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AddDHEDGEProtocolToFlashBorrowers_20241118.s.sol b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AddDHEDGEProtocolToFlashBorrowers_20241118.s.sol new file mode 100644 index 000000000..a87a69c19 --- /dev/null +++ b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AddDHEDGEProtocolToFlashBorrowers_20241118.s.sol @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript, PolygonScript, OptimismScript, ArbitrumScript, BaseScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118} from './AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118.sol'; +import {AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118} from './AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118.sol'; +import {AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118} from './AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118.sol'; +import {AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118} from './AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118.sol'; + +/** + * @dev Deploy Polygon + * deploy-command: make deploy-ledger contract=src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AddDHEDGEProtocolToFlashBorrowers_20241118.s.sol:DeployPolygon chain=polygon + * verify-command: FOUNDRY_PROFILE=polygon npx catapulta-verify -b broadcast/AddDHEDGEProtocolToFlashBorrowers_20241118.s.sol/137/run-latest.json + */ +contract DeployPolygon is PolygonScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Optimism + * deploy-command: make deploy-ledger contract=src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AddDHEDGEProtocolToFlashBorrowers_20241118.s.sol:DeployOptimism chain=optimism + * verify-command: FOUNDRY_PROFILE=optimism npx catapulta-verify -b broadcast/AddDHEDGEProtocolToFlashBorrowers_20241118.s.sol/10/run-latest.json + */ +contract DeployOptimism is OptimismScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Arbitrum + * deploy-command: make deploy-ledger contract=src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AddDHEDGEProtocolToFlashBorrowers_20241118.s.sol:DeployArbitrum chain=arbitrum + * verify-command: FOUNDRY_PROFILE=arbitrum npx catapulta-verify -b broadcast/AddDHEDGEProtocolToFlashBorrowers_20241118.s.sol/42161/run-latest.json + */ +contract DeployArbitrum is ArbitrumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Base + * deploy-command: make deploy-ledger contract=src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AddDHEDGEProtocolToFlashBorrowers_20241118.s.sol:DeployBase chain=base + * verify-command: FOUNDRY_PROFILE=base npx catapulta-verify -b broadcast/AddDHEDGEProtocolToFlashBorrowers_20241118.s.sol/8453/run-latest.json + */ +contract DeployBase is BaseScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118).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/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AddDHEDGEProtocolToFlashBorrowers_20241118.s.sol:CreateProposal chain=mainnet + */ +contract CreateProposal is EthereumScript { + function run() external { + // create payloads + PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](4); + + // compose actions for validation + IPayloadsControllerCore.ExecutionAction[] + memory actionsPolygon = new IPayloadsControllerCore.ExecutionAction[](1); + actionsPolygon[0] = GovV3Helpers.buildAction( + type(AaveV3Polygon_AddDHEDGEProtocolToFlashBorrowers_20241118).creationCode + ); + payloads[0] = GovV3Helpers.buildPolygonPayload(vm, actionsPolygon); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsOptimism = new IPayloadsControllerCore.ExecutionAction[](1); + actionsOptimism[0] = GovV3Helpers.buildAction( + type(AaveV3Optimism_AddDHEDGEProtocolToFlashBorrowers_20241118).creationCode + ); + payloads[1] = GovV3Helpers.buildOptimismPayload(vm, actionsOptimism); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsArbitrum = new IPayloadsControllerCore.ExecutionAction[](1); + actionsArbitrum[0] = GovV3Helpers.buildAction( + type(AaveV3Arbitrum_AddDHEDGEProtocolToFlashBorrowers_20241118).creationCode + ); + payloads[2] = GovV3Helpers.buildArbitrumPayload(vm, actionsArbitrum); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsBase = new IPayloadsControllerCore.ExecutionAction[](1); + actionsBase[0] = GovV3Helpers.buildAction( + type(AaveV3Base_AddDHEDGEProtocolToFlashBorrowers_20241118).creationCode + ); + payloads[3] = GovV3Helpers.buildBasePayload(vm, actionsBase); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/AddDHEDGEProtocolToFlashBorrowers.md' + ) + ); + } +} diff --git a/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/FlashBorrowersData.sol b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/FlashBorrowersData.sol new file mode 100644 index 000000000..d7fc0231d --- /dev/null +++ b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/FlashBorrowersData.sol @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +library FlashBorrowersDataArbitrum { + function getFlashBorrowers() internal pure returns (address[] memory) { + address[] memory flashBorrowers = new address[](11); + flashBorrowers[0] = 0x27D8FDb0251B48D8EdD1Ad7bEDf553cF99AbE7B0; + flashBorrowers[1] = 0xe3254397f5D9C0B69917EBb49B49e103367B406f; + flashBorrowers[2] = 0xaD38255fEbd566809aE387d5bE66ECD287947cb9; + flashBorrowers[3] = 0x40d30B13666c55B1F41eE11645B5ea3Ea2CA31f8; + flashBorrowers[4] = 0x696f6d66C2da2AA4A400a4317EEC8da88f7A378c; + flashBorrowers[5] = 0xF715724abba480D4D45f4cb52BEF5ce5E3513CCC; + flashBorrowers[6] = 0xe9b5260D99d283ff887859C569bAF8aD1bd12AAc; + flashBorrowers[7] = 0x43DA9b0aB53242c55A9Ff9c722FfC2a373D639c7; + flashBorrowers[8] = 0x678569FC403EA2BA46B549a4D0E15E883D7cAdF5; + flashBorrowers[9] = 0xc3198eb5102fB3335C0E911eF1DA4BC07e403Dd1; + flashBorrowers[10] = 0xDDd6b1f34e12C0230ab23cbd4514560b24438514; + + return flashBorrowers; + } +} + +library FlashBorrowersDataBase { + function getFlashBorrowers() internal pure returns (address[] memory) { + address[] memory flashBorrowers = new address[](10); + flashBorrowers[0] = 0xA672e882aCBB96486393D43E0efdab5EBEbDDC1d; + flashBorrowers[1] = 0x15E2F06138aed58ca2A6AfB5A1333bBC5f728f80; + flashBorrowers[2] = 0xbA5F6A0D2AC21a3feC7a6C40FACd23407AA84663; + flashBorrowers[3] = 0xC1E02884AF4A283cA25ab63C45360d220d69DA52; + flashBorrowers[4] = 0x1c980456751AE40315Ff73CaaC0843Be643321Be; + flashBorrowers[5] = 0xeDE61eefa4850b459E3B09Fe6d8d371480D6fF00; + flashBorrowers[6] = 0x53a4716a8f7DBC9543ebf9cd711952033cC64d43; + flashBorrowers[7] = 0xd2f23773bF5e2d59F6bB925c2232F6e83f3f79e0; + flashBorrowers[8] = 0x9e0501537723c71250307F5B1A8eE60e167D21C9; + flashBorrowers[9] = 0xCAF08BF08D0c87e2c74dd9EBEC9C776037bD7e8E; + + return flashBorrowers; + } +} + +library FlashBorrowersDataOptimism { + function getFlashBorrowers() internal pure returns (address[] memory) { + address[] memory flashBorrowers = new address[](14); + flashBorrowers[0] = 0x83d1Fa384EC44C2769A3562EDe372484f26E141B; + flashBorrowers[1] = 0x32Ad28356EF70adC3EC051D8AAcdEEaA10135296; + flashBorrowers[2] = 0xB03818de4992388260b62259361778CF98485dFE; + flashBorrowers[3] = 0x11b55966527FF030ca9c7B1c548B4bE5e7EaEe6D; + flashBorrowers[4] = 0xcACb5A722a36cFf6bAeB359e21C098a4ACbffDfa; + flashBorrowers[5] = 0x9573c7b691cDcEbBFa9D655181f291799dfB7Cf5; + flashBorrowers[6] = 0x32b1D1bFd4B3b0CB9FF2DcD9DAc757aA64d4cb69; + flashBorrowers[7] = 0x7D3c9C6566375d7ad6e89169cA5C01B5Edc15364; + flashBorrowers[8] = 0xcC7d6ED524760539311ed0Cdb41D0852b4eb77eb; + flashBorrowers[9] = 0xB9243C495117343981EC9f8AA2ABfFEe54396Fc0; + flashBorrowers[10] = 0x1eC50880101022C11530A069690F5446d1464592; + flashBorrowers[11] = 0x49bF093277Bf4dDe49c48c6AA55A3bDA3eeDEF68; + flashBorrowers[12] = 0xb2cFb909e8657C0EC44D3dD898C1053b87804755; + flashBorrowers[13] = 0x59bAbc14Dd73761e38E5bdA171b2298DC14da92d; + + return flashBorrowers; + } +} + +library FlashBorrowersDataPolygon { + function getFlashBorrowers() internal pure returns (address[] memory) { + address[] memory flashBorrowers = new address[](4); + flashBorrowers[0] = 0x86C3Dd18bAF4370495d9228b58fD959771285C55; + flashBorrowers[1] = 0xdB88AB5b485b38EDbEEf866314F9E49d095BCe39; + flashBorrowers[2] = 0x79D2aeFE6A21b26B024d9341A51f6b7897852499; + flashBorrowers[3] = 0x460b60565cb73845d56564384ab84BF84c13e47D; + + return flashBorrowers; + } +} diff --git a/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/config.ts b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/config.ts new file mode 100644 index 000000000..6addc81da --- /dev/null +++ b/src/20241118_Multi_AddDHEDGEProtocolToFlashBorrowers/config.ts @@ -0,0 +1,31 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + author: 'Aave Chan Initiative', + pools: ['AaveV3Polygon', 'AaveV3Optimism', 'AaveV3Arbitrum', 'AaveV3Base'], + title: 'Add dHEDGE Protocol to flashBorrowers', + shortName: 'AddDHEDGEProtocolToFlashBorrowers', + date: '20241118', + discussion: 'https://governance.aave.com/t/arfc-add-dhedge-protocol-to-flashborrowers/19547', + snapshot: 'Direct-to-AIP', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Polygon: { + configs: {FLASH_BORROWER: {address: '0x83d1fa384ec44c2769a3562ede372484f26e141b'}}, + cache: {blockNumber: 64447789}, + }, + AaveV3Optimism: { + configs: {FLASH_BORROWER: {address: '0x83d1fa384ec44c2769a3562ede372484f26e141b'}}, + cache: {blockNumber: 128181628}, + }, + AaveV3Arbitrum: { + configs: {FLASH_BORROWER: {address: '0x27d8fdb0251b48d8edd1ad7bedf553cf99abe7b0'}}, + cache: {blockNumber: 275871816}, + }, + AaveV3Base: { + configs: {FLASH_BORROWER: {address: '0xa672e882acbb96486393d43e0efdab5ebebddc1d'}}, + cache: {blockNumber: 22586604}, + }, + }, +}; diff --git a/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120.sol b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120.sol new file mode 100644 index 000000000..d3b3ed565 --- /dev/null +++ b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol'; +import {AaveV3PayloadArbitrum} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadArbitrum.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title WBTC Reserve Factor and UOptimal Increase + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-chaos-labs-risk-parameter-updates-wbtc-reserve-factor-and-uoptimal-increase-10-25-24/19596 + */ +contract AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120 is AaveV3PayloadArbitrum { + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV3ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](1); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3ArbitrumAssets.WBTC_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: 80_00, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: EngineFlags.KEEP_CURRENT, + variableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); + + return rateStrategies; + } + function borrowsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.BorrowUpdate[] memory) + { + IAaveV3ConfigEngine.BorrowUpdate[] + memory borrowUpdates = new IAaveV3ConfigEngine.BorrowUpdate[](1); + + borrowUpdates[0] = IAaveV3ConfigEngine.BorrowUpdate({ + asset: AaveV3ArbitrumAssets.WBTC_UNDERLYING, + enabledToBorrow: EngineFlags.KEEP_CURRENT, + flashloanable: EngineFlags.KEEP_CURRENT, + borrowableInIsolation: EngineFlags.KEEP_CURRENT, + withSiloedBorrowing: EngineFlags.KEEP_CURRENT, + reserveFactor: 50_00 + }); + + return borrowUpdates; + } +} diff --git a/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol new file mode 100644 index 000000000..0cd53b7e8 --- /dev/null +++ b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Arbitrum} from 'aave-address-book/AaveV3Arbitrum.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120} from './AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120.sol'; + +/** + * @dev Test for AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120 + * command: FOUNDRY_PROFILE=arbitrum forge test --match-path=src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol -vv + */ +contract AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120_Test is ProtocolV3TestBase { + AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('arbitrum'), 276532623); + proposal = new AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120', + AaveV3Arbitrum.POOL, + address(proposal) + ); + } +} diff --git a/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120.sol b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120.sol new file mode 100644 index 000000000..9d7f154f4 --- /dev/null +++ b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV3PayloadEthereum} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereum.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title WBTC Reserve Factor and UOptimal Increase + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-chaos-labs-risk-parameter-updates-wbtc-reserve-factor-and-uoptimal-increase-10-25-24/19596 + */ +contract AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120 is AaveV3PayloadEthereum { + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV3ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](1); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumAssets.WBTC_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: 80_00, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: EngineFlags.KEEP_CURRENT, + variableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); + + return rateStrategies; + } + function borrowsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.BorrowUpdate[] memory) + { + IAaveV3ConfigEngine.BorrowUpdate[] + memory borrowUpdates = new IAaveV3ConfigEngine.BorrowUpdate[](1); + + borrowUpdates[0] = IAaveV3ConfigEngine.BorrowUpdate({ + asset: AaveV3EthereumAssets.WBTC_UNDERLYING, + enabledToBorrow: EngineFlags.KEEP_CURRENT, + flashloanable: EngineFlags.KEEP_CURRENT, + borrowableInIsolation: EngineFlags.KEEP_CURRENT, + withSiloedBorrowing: EngineFlags.KEEP_CURRENT, + reserveFactor: 50_00 + }); + + return borrowUpdates; + } +} diff --git a/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol new file mode 100644 index 000000000..dffa5e34f --- /dev/null +++ b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Ethereum} from 'aave-address-book/AaveV3Ethereum.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120} from './AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120.sol'; + +/** + * @dev Test for AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol -vv + */ +contract AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120_Test is ProtocolV3TestBase { + AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21230828); + proposal = new AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120', + AaveV3Ethereum.POOL, + address(proposal) + ); + } +} diff --git a/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120.sol b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120.sol new file mode 100644 index 000000000..eca72f78b --- /dev/null +++ b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3OptimismAssets} from 'aave-address-book/AaveV3Optimism.sol'; +import {AaveV3PayloadOptimism} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadOptimism.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title WBTC Reserve Factor and UOptimal Increase + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-chaos-labs-risk-parameter-updates-wbtc-reserve-factor-and-uoptimal-increase-10-25-24/19596 + */ +contract AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120 is AaveV3PayloadOptimism { + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV3ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](1); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3OptimismAssets.WBTC_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: 80_00, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: EngineFlags.KEEP_CURRENT, + variableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); + + return rateStrategies; + } + function borrowsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.BorrowUpdate[] memory) + { + IAaveV3ConfigEngine.BorrowUpdate[] + memory borrowUpdates = new IAaveV3ConfigEngine.BorrowUpdate[](1); + + borrowUpdates[0] = IAaveV3ConfigEngine.BorrowUpdate({ + asset: AaveV3OptimismAssets.WBTC_UNDERLYING, + enabledToBorrow: EngineFlags.KEEP_CURRENT, + flashloanable: EngineFlags.KEEP_CURRENT, + borrowableInIsolation: EngineFlags.KEEP_CURRENT, + withSiloedBorrowing: EngineFlags.KEEP_CURRENT, + reserveFactor: 50_00 + }); + + return borrowUpdates; + } +} diff --git a/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol new file mode 100644 index 000000000..9618bdb8b --- /dev/null +++ b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Optimism} from 'aave-address-book/AaveV3Optimism.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120} from './AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120.sol'; + +/** + * @dev Test for AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120 + * command: FOUNDRY_PROFILE=optimism forge test --match-path=src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol -vv + */ +contract AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120_Test is ProtocolV3TestBase { + AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('optimism'), 128264864); + proposal = new AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120', + AaveV3Optimism.POOL, + address(proposal) + ); + } +} diff --git a/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120.sol b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120.sol new file mode 100644 index 000000000..f09b57e05 --- /dev/null +++ b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3PolygonAssets} from 'aave-address-book/AaveV3Polygon.sol'; +import {AaveV3PayloadPolygon} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadPolygon.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title WBTC Reserve Factor and UOptimal Increase + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-chaos-labs-risk-parameter-updates-wbtc-reserve-factor-and-uoptimal-increase-10-25-24/19596 + */ +contract AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120 is AaveV3PayloadPolygon { + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV3ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](1); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3PolygonAssets.WBTC_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: 80_00, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: EngineFlags.KEEP_CURRENT, + variableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); + + return rateStrategies; + } + function borrowsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.BorrowUpdate[] memory) + { + IAaveV3ConfigEngine.BorrowUpdate[] + memory borrowUpdates = new IAaveV3ConfigEngine.BorrowUpdate[](1); + + borrowUpdates[0] = IAaveV3ConfigEngine.BorrowUpdate({ + asset: AaveV3PolygonAssets.WBTC_UNDERLYING, + enabledToBorrow: EngineFlags.KEEP_CURRENT, + flashloanable: EngineFlags.KEEP_CURRENT, + borrowableInIsolation: EngineFlags.KEEP_CURRENT, + withSiloedBorrowing: EngineFlags.KEEP_CURRENT, + reserveFactor: 50_00 + }); + + return borrowUpdates; + } +} diff --git a/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol new file mode 100644 index 000000000..27662e4fd --- /dev/null +++ b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Polygon} from 'aave-address-book/AaveV3Polygon.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120} from './AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120.sol'; + +/** + * @dev Test for AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120 + * command: FOUNDRY_PROFILE=polygon forge test --match-path=src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol -vv + */ +contract AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120_Test is ProtocolV3TestBase { + AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('polygon'), 64525193); + proposal = new AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120', + AaveV3Polygon.POOL, + address(proposal) + ); + } +} diff --git a/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/WBTCReserveFactorAndUOptimalIncrease.md b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/WBTCReserveFactorAndUOptimalIncrease.md new file mode 100644 index 000000000..86a0d6ddf --- /dev/null +++ b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/WBTCReserveFactorAndUOptimalIncrease.md @@ -0,0 +1,70 @@ +--- +title: " WBTC Reserve Factor and UOptimal Increase " +author: "Aave Chan Initiative" +discussions: "https://governance.aave.com/t/arfc-chaos-labs-risk-parameter-updates-wbtc-reserve-factor-and-uoptimal-increase-10-25-24/19596" +snapshot: "Direct-to-AIP" +--- + +## Simple Summary + +Chaos Labs recommends adjusting WBTC’s parameters on all Aave V3 instances to increase the Aave DAO revenue while optimizing to meet the demand from yield-bearing BTC collateral assets. In this proposal, we recommend the following changes to WBTC: + +- Increasing the Reserve Factor +- Increasing the UOptimal + +## Motivation + +The incoming addition of BTC correlated E-Modes with the launch of Aave v3.2 Liquid E-Modes, and the increasing popularity of staked, yield-bearing BTC assets is expected to boost the demand for borrowing non-yield-bearing assets like WBTC. + +Given WBTC’s historical use mainly as a collateral asset and its supply being largely unaffected by changes in the supply rate, we see this as an opportunity to significantly boost DAO revenue without adversely impacting WBTC deposits. + +The adjustments to the Reserve Factor and UOptimal are designed to manage this increased demand while ensuring the protocol’s stability and attractiveness. + +### Reserve Factor + +WBTC has historically been an asset predominantly used as collateral, as evidenced by the borrow distribution, where stablecoins represent over 87% of the borrows against WBTC collateral. Additionally, more than 99% of the current WBTC supply is enabled as collateral, further supporting its primary use case within the market. + +As illustrated in the plot below, previous increases in the supply rate for WBTC have not significantly boosted deposits. While the protocol attracted over $2.5B in WBTC, the supply rate never exceeded 0.15%, a minimal and inconsequential yield. This indicates that most WBTC suppliers are largely indifferent to supply rates, using WBTC primarily as collateral rather than for yield generation. + +Given the minimal impact of WBTC’s supply rate on its supply behavior, we propose raising WBTC’s Reserve Factor from 20% to 50%. A similar change was done for weETH shortly after the launch of incentives and it had a positive effect on aligning the users with the market’s main goal. + +This substantial increase is also expected to significantly boost revenue for the Aave protocol, with additional revenue growth anticipated as the introduction of BTC/BTC E-Modes drives further borrow demand for WBTC. + +Chaos Labs will closely monitor the market and user’s behavior and will recommend further adjustments to the Reserve Factor accordingly. + +### UOptimal + +We recommend increasing UOptimal from 45% to 80%. This adjustment will accommodate a higher utilization rate, enabling the market to meet an increase in borrow demand. The current Kink set at 45% is optimal for assets that either lack significant borrow demand or are yield-bearing. However, with the emergence and growth of liquid-staked BTC assets, WBTC transitions from a category of limited borrow demand to one with substantial borrow demand. This shift necessitates the recommended change in UOptimal to better align with the new market dynamics. + +While this adjustment will lead to a further reduction in the supply rate, we anticipate it will not negatively impact WBTC supply. + +### Revenue + +Given the current market’s minimal borrow demand and low supply rates, these changes are unlikely to negatively impact existing users and suppliers. Following the adjustments, the APY for supplying WBTC on Ethereum is expected to decrease from 0.0414% to 0.0146%. In turn, we anticipate that the DAO’s annual revenue from all the WBTC markets will increase by over 40% before the addition of new BTC/BTC E-Modes. + +## Specification + +By implementing these recommendations, Aave adapts itself to the evolving market while improving the DAO’s revenue. As always, Chaos Labs will continue monitoring market conditions closely and recommend additional adjustments to ensure Aave’s safety and efficiency. + +| **Parameter** | **Current Value** | Recommended Value | +| -------------- | ----------------- | ----------------- | +| Reserve Factor | 20% | 50% | +| UOptimal | 45% | 80% | + +We recommend applying the changes to the following V3 deployments: + +- Ethereum - Main +- Optimism +- Arbitrum +- Polygon + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/bc6cb8c2474e2ca9a09e757e07269139f2295eb6/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/bc6cb8c2474e2ca9a09e757e07269139f2295eb6/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/bc6cb8c2474e2ca9a09e757e07269139f2295eb6/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/bc6cb8c2474e2ca9a09e757e07269139f2295eb6/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/bc6cb8c2474e2ca9a09e757e07269139f2295eb6/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/bc6cb8c2474e2ca9a09e757e07269139f2295eb6/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/bc6cb8c2474e2ca9a09e757e07269139f2295eb6/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/bc6cb8c2474e2ca9a09e757e07269139f2295eb6/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120.t.sol) +- Snapshot: Direct-to-AIP +- [Discussion](https://governance.aave.com/t/arfc-chaos-labs-risk-parameter-updates-wbtc-reserve-factor-and-uoptimal-increase-10-25-24/19596) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/WBTCReserveFactorAndUOptimalIncrease_20241120.s.sol b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/WBTCReserveFactorAndUOptimalIncrease_20241120.s.sol new file mode 100644 index 000000000..8348caed9 --- /dev/null +++ b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/WBTCReserveFactorAndUOptimalIncrease_20241120.s.sol @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript, PolygonScript, OptimismScript, ArbitrumScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120} from './AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120.sol'; +import {AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120} from './AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120.sol'; +import {AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120} from './AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120.sol'; +import {AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120} from './AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/WBTCReserveFactorAndUOptimalIncrease_20241120.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/WBTCReserveFactorAndUOptimalIncrease_20241120.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Polygon + * deploy-command: make deploy-ledger contract=src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/WBTCReserveFactorAndUOptimalIncrease_20241120.s.sol:DeployPolygon chain=polygon + * verify-command: FOUNDRY_PROFILE=polygon npx catapulta-verify -b broadcast/WBTCReserveFactorAndUOptimalIncrease_20241120.s.sol/137/run-latest.json + */ +contract DeployPolygon is PolygonScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Optimism + * deploy-command: make deploy-ledger contract=src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/WBTCReserveFactorAndUOptimalIncrease_20241120.s.sol:DeployOptimism chain=optimism + * verify-command: FOUNDRY_PROFILE=optimism npx catapulta-verify -b broadcast/WBTCReserveFactorAndUOptimalIncrease_20241120.s.sol/10/run-latest.json + */ +contract DeployOptimism is OptimismScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Arbitrum + * deploy-command: make deploy-ledger contract=src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/WBTCReserveFactorAndUOptimalIncrease_20241120.s.sol:DeployArbitrum chain=arbitrum + * verify-command: FOUNDRY_PROFILE=arbitrum npx catapulta-verify -b broadcast/WBTCReserveFactorAndUOptimalIncrease_20241120.s.sol/42161/run-latest.json + */ +contract DeployArbitrum is ArbitrumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120).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/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/WBTCReserveFactorAndUOptimalIncrease_20241120.s.sol:CreateProposal chain=mainnet + */ +contract CreateProposal is EthereumScript { + function run() external { + // create payloads + PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](4); + + // compose actions for validation + IPayloadsControllerCore.ExecutionAction[] + memory actionsEthereum = new IPayloadsControllerCore.ExecutionAction[](1); + actionsEthereum[0] = GovV3Helpers.buildAction( + type(AaveV3Ethereum_WBTCReserveFactorAndUOptimalIncrease_20241120).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsPolygon = new IPayloadsControllerCore.ExecutionAction[](1); + actionsPolygon[0] = GovV3Helpers.buildAction( + type(AaveV3Polygon_WBTCReserveFactorAndUOptimalIncrease_20241120).creationCode + ); + payloads[1] = GovV3Helpers.buildPolygonPayload(vm, actionsPolygon); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsOptimism = new IPayloadsControllerCore.ExecutionAction[](1); + actionsOptimism[0] = GovV3Helpers.buildAction( + type(AaveV3Optimism_WBTCReserveFactorAndUOptimalIncrease_20241120).creationCode + ); + payloads[2] = GovV3Helpers.buildOptimismPayload(vm, actionsOptimism); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsArbitrum = new IPayloadsControllerCore.ExecutionAction[](1); + actionsArbitrum[0] = GovV3Helpers.buildAction( + type(AaveV3Arbitrum_WBTCReserveFactorAndUOptimalIncrease_20241120).creationCode + ); + payloads[3] = GovV3Helpers.buildArbitrumPayload(vm, actionsArbitrum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/WBTCReserveFactorAndUOptimalIncrease.md' + ) + ); + } +} diff --git a/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/config.ts b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/config.ts new file mode 100644 index 000000000..6e3cf0c90 --- /dev/null +++ b/src/20241120_Multi_WBTCReserveFactorAndUOptimalIncrease/config.ts @@ -0,0 +1,120 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + author: 'Aave Chan Initiative', + pools: ['AaveV3Ethereum', 'AaveV3Polygon', 'AaveV3Optimism', 'AaveV3Arbitrum'], + title: ' WBTC Reserve Factor and UOptimal Increase ', + shortName: 'WBTCReserveFactorAndUOptimalIncrease', + date: '20241120', + discussion: + 'https://governance.aave.com/t/arfc-chaos-labs-risk-parameter-updates-wbtc-reserve-factor-and-uoptimal-increase-10-25-24/19596', + snapshot: 'Direct-to-AIP', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Ethereum: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'WBTC', + params: { + optimalUtilizationRate: '80', + baseVariableBorrowRate: '', + variableRateSlope1: '', + variableRateSlope2: '', + }, + }, + ], + BORROWS_UPDATE: [ + { + enabledToBorrow: 'KEEP_CURRENT', + flashloanable: 'KEEP_CURRENT', + borrowableInIsolation: 'KEEP_CURRENT', + withSiloedBorrowing: 'KEEP_CURRENT', + reserveFactor: '50', + asset: 'WBTC', + }, + ], + }, + cache: {blockNumber: 21230828}, + }, + AaveV3Polygon: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'WBTC', + params: { + optimalUtilizationRate: '80', + baseVariableBorrowRate: '', + variableRateSlope1: '', + variableRateSlope2: '', + }, + }, + ], + BORROWS_UPDATE: [ + { + enabledToBorrow: 'KEEP_CURRENT', + flashloanable: 'KEEP_CURRENT', + borrowableInIsolation: 'KEEP_CURRENT', + withSiloedBorrowing: 'KEEP_CURRENT', + reserveFactor: '50', + asset: 'WBTC', + }, + ], + }, + cache: {blockNumber: 64525193}, + }, + AaveV3Optimism: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'WBTC', + params: { + optimalUtilizationRate: '80', + baseVariableBorrowRate: '', + variableRateSlope1: '', + variableRateSlope2: '', + }, + }, + ], + BORROWS_UPDATE: [ + { + enabledToBorrow: 'KEEP_CURRENT', + flashloanable: 'KEEP_CURRENT', + borrowableInIsolation: 'KEEP_CURRENT', + withSiloedBorrowing: 'KEEP_CURRENT', + reserveFactor: '50', + asset: 'WBTC', + }, + ], + }, + cache: {blockNumber: 128264864}, + }, + AaveV3Arbitrum: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'WBTC', + params: { + optimalUtilizationRate: '80', + baseVariableBorrowRate: '', + variableRateSlope1: '', + variableRateSlope2: '', + }, + }, + ], + BORROWS_UPDATE: [ + { + enabledToBorrow: 'KEEP_CURRENT', + flashloanable: 'KEEP_CURRENT', + borrowableInIsolation: 'KEEP_CURRENT', + withSiloedBorrowing: 'KEEP_CURRENT', + reserveFactor: '50', + asset: 'WBTC', + }, + ], + }, + cache: {blockNumber: 276532623}, + }, + }, +}; diff --git a/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.sol b/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.sol new file mode 100644 index 000000000..1066a1d33 --- /dev/null +++ b/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumLido, AaveV3EthereumLidoAssets} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {AaveV3PayloadEthereumLido} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereumLido.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title USDS borrow rate update on Core and Prime Instances + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-usds-borrow-rate-update-on-core-and-prime-instances/19901 + */ +contract AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122 is + AaveV3PayloadEthereumLido +{ + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV3ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](1); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumLidoAssets.USDS_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 9_25, + variableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); + + return rateStrategies; + } +} diff --git a/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.t.sol b/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.t.sol new file mode 100644 index 000000000..838e759f4 --- /dev/null +++ b/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.t.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumLido} from 'aave-address-book/AaveV3EthereumLido.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122} from './AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.sol'; + +/** + * @dev Test for AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.t.sol -vv + */ +contract AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_Test is + ProtocolV3TestBase +{ + AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21243125); + proposal = new AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122', + AaveV3EthereumLido.POOL, + address(proposal) + ); + } +} diff --git a/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.sol b/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.sol new file mode 100644 index 000000000..0032bb748 --- /dev/null +++ b/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV3PayloadEthereum} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereum.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title USDS borrow rate update on Core and Prime Instances + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-usds-borrow-rate-update-on-core-and-prime-instances/19901 + */ +contract AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122 is + AaveV3PayloadEthereum +{ + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV3ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](1); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumAssets.USDS_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: 9_25, + variableRateSlope1: EngineFlags.KEEP_CURRENT, + variableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); + + return rateStrategies; + } +} diff --git a/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.t.sol b/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.t.sol new file mode 100644 index 000000000..87e76f1c7 --- /dev/null +++ b/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.t.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Ethereum} from 'aave-address-book/AaveV3Ethereum.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122} from './AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.sol'; + +/** + * @dev Test for AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.t.sol -vv + */ +contract AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122_Test is + ProtocolV3TestBase +{ + AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21243091); + proposal = new AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122', + AaveV3Ethereum.POOL, + address(proposal) + ); + } +} diff --git a/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/USDSBorrowRateUpdateOnCoreAndPrimeInstances.md b/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/USDSBorrowRateUpdateOnCoreAndPrimeInstances.md new file mode 100644 index 000000000..c4d8653e6 --- /dev/null +++ b/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/USDSBorrowRateUpdateOnCoreAndPrimeInstances.md @@ -0,0 +1,63 @@ +--- +title: "USDS borrow rate update on Core and Prime Instances" +author: "Aave Chan Initiative" +discussions: "https://governance.aave.com/t/arfc-usds-borrow-rate-update-on-core-and-prime-instances/19901" +--- + +## Simple Summary + +This proposal recommends increasing the USDS Core Instance Base Rate (currently at 6.25%) and Slope1 (currently at 6.25%) on Prime Market. + +Raising USDS borrowing rates ensures the SSR remains competitive, attracting demand while discouraging excessive borrowing at unsustainable levels. + +We also propose pausing sUSDe operations in the Prime instance to focus on scaling USDS liquidity in the Core Market, where there is significant demand. + +This is a Direct to AIP Proposal. + +## Motivation + +Recent observations in the market have highlighted issues stemming from **sUSDe** in the Prime instance: + +1. **sUSDe’s Impact on USDS Borrow Rate**:The presence of sUSDe is driving up the USDS Borrow Rate, creating pressure in the Prime Instance. The high rates pose a risk of cascading rebalances, particularly: + +- wstETH collateral migrates to Spark for USDS liquidity. +- ezETH loopers exit due to spiking wstETH borrow rates. +- Resulting in a significant outflow of AUM from the market. + +2. **Mismatch Between Liquidity and Risk**: + +- The liquidity needs of sUSDe are not being met effectively, leading to imbalance. +- The market is unable to accommodate the current sUSDe scale without affecting overall stability. + +While at same time there is substantial **Untapped Demand in the Core Instance**: + +- The substantial demand in the Core Instance presents an opportunity to scale USDS aggressively while mitigating risk. + +## Specification + +### 1. **Increase USDS Base Rate 3% on Core Instance and 3% Slope1 on Prime Instance** + +- Adjusting the borrow rate is a necessary step to manage the borrowing cost dynamics and balance the market risk posed by sUSDe. +- This adjustment should be implemented across both the Prime and Core Instances. + +| **Parameter** | **Current** | **Proposed** | **Change** | +| -------------- | ----------- | ------------ | ---------- | +| _Prime Market_ | | | | +| Base | 0.75% | 0.75% | No change | +| Slope1 | 6.25% | 9.25% | +3% | +| Slope2 | 75% | 75% | No change | +| _Core Market_ | | | | +| Base | 6.25% | 9.25% | +3% | +| Slope1 | 0.75% | 0.75% | No change | +| Slope2 | 75% | 75% | No change | + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/e2930ccf4ebec53708aec1b09e430430c701a24e/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/e2930ccf4ebec53708aec1b09e430430c701a24e/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/e2930ccf4ebec53708aec1b09e430430c701a24e/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.t.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/e2930ccf4ebec53708aec1b09e430430c701a24e/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.t.sol) +- Snapshot : Direct-to-AIP +- [Discussion](https://governance.aave.com/t/arfc-usds-borrow-rate-update-on-core-and-prime-instances/19901) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.s.sol b/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.s.sol new file mode 100644 index 000000000..bc72b3daa --- /dev/null +++ b/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.s.sol @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122} from './AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.sol'; +import {AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122} from './AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122).creationCode + ); + address payload1 = GovV3Helpers.deployDeterministic( + type(AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](2); + actions[0] = GovV3Helpers.buildAction(payload0); + actions[1] = GovV3Helpers.buildAction(payload1); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Create Proposal + * command: make deploy-ledger contract=src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122.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[](2); + actionsEthereum[0] = GovV3Helpers.buildAction( + type(AaveV3Ethereum_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122).creationCode + ); + actionsEthereum[1] = GovV3Helpers.buildAction( + type(AaveV3EthereumLido_USDSBorrowRateUpdateOnCoreAndPrimeInstances_20241122).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/USDSBorrowRateUpdateOnCoreAndPrimeInstances.md' + ) + ); + } +} diff --git a/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/config.ts b/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/config.ts new file mode 100644 index 000000000..f6572ea03 --- /dev/null +++ b/src/20241122_Multi_USDSBorrowRateUpdateOnCoreAndPrimeInstances/config.ts @@ -0,0 +1,49 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + configFile: 'src/20241122_Multi_IncreaseUSDSCoreAndPrimeInstanceBaseRateTo825/config.ts', + author: 'Aave Chan Initiative', + pools: ['AaveV3Ethereum', 'AaveV3EthereumLido'], + title: 'USDS borrow rate update on Core and Prime Instances', + shortName: 'USDSBorrowRateUpdateOnCoreAndPrimeInstances', + date: '20241122', + discussion: + 'https://governance.aave.com/t/arfc-usds-borrow-rate-update-on-core-and-prime-instances/19901', + snapshot: 'Direct-to-AIP', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Ethereum: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'USDS', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '9.25', + variableRateSlope1: '', + variableRateSlope2: '', + }, + }, + ], + }, + cache: {blockNumber: 21243091}, + }, + AaveV3EthereumLido: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'USDS', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '9.25', + variableRateSlope2: '', + }, + }, + ], + }, + cache: {blockNumber: 21243125}, + }, + }, +}; diff --git a/src/20241125_AaveV3Avalanche_OnboardAUSD/AaveV3Avalanche_OnboardAUSD_20241125.sol b/src/20241125_AaveV3Avalanche_OnboardAUSD/AaveV3Avalanche_OnboardAUSD_20241125.sol new file mode 100644 index 000000000..eb4473203 --- /dev/null +++ b/src/20241125_AaveV3Avalanche_OnboardAUSD/AaveV3Avalanche_OnboardAUSD_20241125.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Avalanche} from 'aave-address-book/AaveV3Avalanche.sol'; +import {GovernanceV3Avalanche} from 'aave-address-book/GovernanceV3Avalanche.sol'; +import {AaveV3PayloadAvalanche} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadAvalanche.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol'; +import {IEmissionManager} from 'aave-v3-origin/contracts/rewards/interfaces/IEmissionManager.sol'; +/** + * @title Onboard AUSD + * @author ACI + * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0x021b40c7042ce770c0ce1ee5ff63591c132a9f0f12e3a1cb92fa209299793dec + * - Discussion: https://governance.aave.com/t/arfc-onboard-ausd-to-aave-v3-on-avalanche/19689 + */ +contract AaveV3Avalanche_OnboardAUSD_20241125 is AaveV3PayloadAvalanche { + using SafeERC20 for IERC20; + + address public constant AUSD = 0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a; + uint256 public constant AUSD_SEED_AMOUNT = 100e6; + address public constant AUSD_ADMIN = 0xac140648435d03f784879cd789130F22Ef588Fcd; + + function _postExecute() internal override { + // transfer AUSD seed amount from collector to executor (fix the mistakes of wrong AUSD seed amount reicipient) + AaveV3Avalanche.COLLECTOR.transfer( + AUSD, + GovernanceV3Avalanche.EXECUTOR_LVL_1, + AUSD_SEED_AMOUNT + ); + + IERC20(AUSD).forceApprove(address(AaveV3Avalanche.POOL), AUSD_SEED_AMOUNT); + AaveV3Avalanche.POOL.supply(AUSD, AUSD_SEED_AMOUNT, address(AaveV3Avalanche.COLLECTOR), 0); + + (address aAUSD, , ) = AaveV3Avalanche.AAVE_PROTOCOL_DATA_PROVIDER.getReserveTokensAddresses( + AUSD + ); + IEmissionManager(AaveV3Avalanche.EMISSION_MANAGER).setEmissionAdmin(AUSD, AUSD_ADMIN); + IEmissionManager(AaveV3Avalanche.EMISSION_MANAGER).setEmissionAdmin(aAUSD, AUSD_ADMIN); + } + + function newListings() public pure override returns (IAaveV3ConfigEngine.Listing[] memory) { + IAaveV3ConfigEngine.Listing[] memory listings = new IAaveV3ConfigEngine.Listing[](1); + + listings[0] = IAaveV3ConfigEngine.Listing({ + asset: AUSD, + assetSymbol: 'AUSD', + priceFeed: 0x83f32c0882B12Ef16214c417efF11FD9e764bf34, + enabledToBorrow: EngineFlags.ENABLED, + borrowableInIsolation: EngineFlags.DISABLED, + withSiloedBorrowing: EngineFlags.DISABLED, + flashloanable: EngineFlags.ENABLED, + ltv: 0, + liqThreshold: 0, + liqBonus: 0, + reserveFactor: 10_00, + supplyCap: 19_000_000, + borrowCap: 17_400_000, + debtCeiling: 0, + liqProtocolFee: 0, + rateStrategyParams: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: 90_00, + baseVariableBorrowRate: 0, + variableRateSlope1: 5_50, + variableRateSlope2: 75_00 + }) + }); + + return listings; + } +} diff --git a/src/20241125_AaveV3Avalanche_OnboardAUSD/AaveV3Avalanche_OnboardAUSD_20241125.t.sol b/src/20241125_AaveV3Avalanche_OnboardAUSD/AaveV3Avalanche_OnboardAUSD_20241125.t.sol new file mode 100644 index 000000000..84ffc0223 --- /dev/null +++ b/src/20241125_AaveV3Avalanche_OnboardAUSD/AaveV3Avalanche_OnboardAUSD_20241125.t.sol @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3Avalanche} from 'aave-address-book/AaveV3Avalanche.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {IEmissionManager} from 'aave-v3-origin/contracts/rewards/interfaces/IEmissionManager.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Avalanche_OnboardAUSD_20241125} from './AaveV3Avalanche_OnboardAUSD_20241125.sol'; + +/** + * @dev Test for AaveV3Avalanche_OnboardAUSD_20241125 + * command: FOUNDRY_PROFILE=avalanche forge test --match-path=src/20241125_AaveV3Avalanche_OnboardAUSD/AaveV3Avalanche_OnboardAUSD_20241125.t.sol -vv + */ +contract AaveV3Avalanche_OnboardAUSD_20241125_Test is ProtocolV3TestBase { + AaveV3Avalanche_OnboardAUSD_20241125 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('avalanche'), 54627124); + proposal = new AaveV3Avalanche_OnboardAUSD_20241125(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest('AaveV3Avalanche_OnboardAUSD_20241125', AaveV3Avalanche.POOL, address(proposal)); + } + + function test_collectorHasAUSDFunds() public { + GovV3Helpers.executePayload(vm, address(proposal)); + (address aTokenAddress, , ) = AaveV3Avalanche + .AAVE_PROTOCOL_DATA_PROVIDER + .getReserveTokensAddresses(proposal.AUSD()); + assertGe(IERC20(aTokenAddress).balanceOf(address(AaveV3Avalanche.COLLECTOR)), 100 * 10 ** 6); + } + + function test_AUSDAdmin() public { + GovV3Helpers.executePayload(vm, address(proposal)); + (address aAUSD, , ) = AaveV3Avalanche.AAVE_PROTOCOL_DATA_PROVIDER.getReserveTokensAddresses( + proposal.AUSD() + ); + assertEq( + IEmissionManager(AaveV3Avalanche.EMISSION_MANAGER).getEmissionAdmin(proposal.AUSD()), + proposal.AUSD_ADMIN() + ); + assertEq( + IEmissionManager(AaveV3Avalanche.EMISSION_MANAGER).getEmissionAdmin(aAUSD), + proposal.AUSD_ADMIN() + ); + } +} diff --git a/src/20241125_AaveV3Avalanche_OnboardAUSD/OnboardAUSD.md b/src/20241125_AaveV3Avalanche_OnboardAUSD/OnboardAUSD.md new file mode 100644 index 000000000..c7884ea2c --- /dev/null +++ b/src/20241125_AaveV3Avalanche_OnboardAUSD/OnboardAUSD.md @@ -0,0 +1,59 @@ +--- +title: "Onboard AUSD" +author: "ACI" +discussions: "https://governance.aave.com/t/arfc-onboard-ausd-to-aave-v3-on-avalanche/19689" +snapshot: "https://snapshot.org/#/aave.eth/proposal/0x021b40c7042ce770c0ce1ee5ff63591c132a9f0f12e3a1cb92fa209299793dec" +--- + +## Simple Summary + +This proposal seeks to onboard AUSD, a secure digital dollar backed 1:1 by USD fiat, to Aave V3 on Avalanche. AUSD, issued by Agora, serves as a stable and liquid alternative to USDT and USDC. With a growing AUM and robust liquidity, AUSD will enhance Aave’s liquidity pool, offering users a reliable and efficient stablecoin option with strong institutional backing. + +## Motivation + +Agora offers AUSD, a digital dollar minted 1:1 with USD fiat. AUSD is designed to be a secure digital currency, utilizing one of the world’s largest custodian banks to safeguard assets. AUSD enables users to participate in trading, lending and payments. It is the most cost-efficient stablecoin to transact with due to its gas-optimized smart contract, making it ideal for traders and payments. + +Agora operates an open partnership model, allowing collaboration with a diverse range of customers who meet KYB (Know Your Business) requirements and operate in jurisdictions we can serve. This approach contrasts with single partnership models (eg. Exchange-Backed Stables), ensuring that AUSD can be widely adopted across different ecosystems, providing liquidity and stability without conflicts of interest. + +AUSD is currently available on Ethereum, Avalanche, Sui and Mantle, garnering $70+ million in TVL and $12+ million in daily DEX volume since contract deployment. The reserve assets are managed by VanEck ($100B+ asset manager) and custodied with one of the largest global banks, ensuring security and safety. AUSD’s unique value proposition also includes zero-fee minting and redemption facilities, making it an attractive asset for all ecosystem participants. + +By integrating AUSD into Aave, users will gain access to a stable, liquid asset that supports trading, lending, and other decentralized finance activities. This integration aligns with Aave’s mission to decentralize finance while offering secure and reliable stablecoin options. + +## Specification + +The table below illustrates the configured risk parameters for **AUSD** + +| Parameter | Value | +| ------------------------- | -----------------------------------------: | +| Isolation Mode | false | +| Borrowable | ENABLED | +| Collateral Enabled | false | +| Supply Cap (AUSD) | 19,000,000 | +| Borrow Cap (AUSD) | 17,400,000 | +| Debt Ceiling | USD 0 | +| LTV | 0 % | +| LT | 0 % | +| Liquidation Bonus | 0 % | +| Liquidation Protocol Fee | 0 % | +| Reserve Factor | 10 % | +| Base Variable Borrow Rate | 0 % | +| Variable Slope 1 | 5.5 % | +| Variable Slope 2 | 75 % | +| Uoptimal | 90 % | +| Flashloanable | ENABLED | +| Siloed Borrowing | DISABLED | +| Borrowable in Isolation | DISABLED | +| Oracle | 0x83f32c0882B12Ef16214c417efF11FD9e764bf34 | + +Additionaly [0xac140648435d03f784879cd789130F22Ef588Fcd](https://snowtrace.io/address/0xac140648435d03f784879cd789130F22Ef588Fcd) has been set as the emission admin for AUSD and the corresponding aToken. + +## References + +- Implementation: [AaveV3Avalanche](https://github.com/bgd-labs/aave-proposals-v3/blob/b368d236cc385cba56cee2009278e67145e10325/src/20241125_AaveV3Avalanche_OnboardAUSD/AaveV3Avalanche_OnboardAUSD_20241125.sol) +- Tests: [AaveV3Avalanche](https://github.com/bgd-labs/aave-proposals-v3/blob/b368d236cc385cba56cee2009278e67145e10325/src/20241125_AaveV3Avalanche_OnboardAUSD/AaveV3Avalanche_OnboardAUSD_20241125.t.sol) +- [Snapshot](https://snapshot.org/#/aave.eth/proposal/0x021b40c7042ce770c0ce1ee5ff63591c132a9f0f12e3a1cb92fa209299793dec) +- [Discussion](https://governance.aave.com/t/arfc-onboard-ausd-to-aave-v3-on-avalanche/19689) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241125_AaveV3Avalanche_OnboardAUSD/OnboardAUSD_20241125.s.sol b/src/20241125_AaveV3Avalanche_OnboardAUSD/OnboardAUSD_20241125.s.sol new file mode 100644 index 000000000..6818d1683 --- /dev/null +++ b/src/20241125_AaveV3Avalanche_OnboardAUSD/OnboardAUSD_20241125.s.sol @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript, AvalancheScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Avalanche_OnboardAUSD_20241125} from './AaveV3Avalanche_OnboardAUSD_20241125.sol'; + +/** + * @dev Deploy Avalanche + * deploy-command: make deploy-ledger contract=src/20241125_AaveV3Avalanche_OnboardAUSD/OnboardAUSD_20241125.s.sol:DeployAvalanche chain=avalanche + * verify-command: FOUNDRY_PROFILE=avalanche npx catapulta-verify -b broadcast/OnboardAUSD_20241125.s.sol/43114/run-latest.json + */ +contract DeployAvalanche is AvalancheScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Avalanche_OnboardAUSD_20241125).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/20241125_AaveV3Avalanche_OnboardAUSD/OnboardAUSD_20241125.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 actionsAvalanche = new IPayloadsControllerCore.ExecutionAction[](1); + actionsAvalanche[0] = GovV3Helpers.buildAction( + type(AaveV3Avalanche_OnboardAUSD_20241125).creationCode + ); + payloads[0] = GovV3Helpers.buildAvalanchePayload(vm, actionsAvalanche); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile(vm, 'src/20241125_AaveV3Avalanche_OnboardAUSD/OnboardAUSD.md') + ); + } +} diff --git a/src/20241125_AaveV3Avalanche_OnboardAUSD/config.ts b/src/20241125_AaveV3Avalanche_OnboardAUSD/config.ts new file mode 100644 index 000000000..0010ab5ae --- /dev/null +++ b/src/20241125_AaveV3Avalanche_OnboardAUSD/config.ts @@ -0,0 +1,48 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3Avalanche'], + title: 'Onboard AUSD', + shortName: 'OnboardAUSD', + date: '20241125', + author: 'ACI', + discussion: 'https://governance.aave.com/t/arfc-onboard-ausd-to-aave-v3-on-avalanche/19689', + snapshot: + 'https://snapshot.org/#/aave.eth/proposal/0x021b40c7042ce770c0ce1ee5ff63591c132a9f0f12e3a1cb92fa209299793dec', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Avalanche: { + configs: { + ASSET_LISTING: [ + { + assetSymbol: 'AUSD', + decimals: 6, + priceFeed: '0x83f32c0882B12Ef16214c417efF11FD9e764bf34', + ltv: '0', + liqThreshold: '0', + liqBonus: '0', + debtCeiling: '0', + liqProtocolFee: '0', + enabledToBorrow: 'ENABLED', + flashloanable: 'ENABLED', + borrowableInIsolation: 'DISABLED', + withSiloedBorrowing: 'DISABLED', + reserveFactor: '10', + supplyCap: '19000000', + borrowCap: '17400000', + rateStrategyParams: { + optimalUtilizationRate: '90', + baseVariableBorrowRate: '0', + variableRateSlope1: '5.5', + variableRateSlope2: '75', + }, + asset: '0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a', + admin: '0xac140648435d03f784879cd789130F22Ef588Fcd', + }, + ], + }, + cache: {blockNumber: 53616852}, + }, + }, +}; diff --git a/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125.sol b/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125.sol new file mode 100644 index 000000000..b1f28317e --- /dev/null +++ b/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumAssets, AaveV3EthereumEModes} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV3PayloadEthereum} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereum.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title Enable sUSDe/USDT Liquid + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-enable-susde-usdt-liquid-e-mode-on-core-instance/19939 + */ +contract AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125 is AaveV3PayloadEthereum { + function assetsEModeUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.AssetEModeUpdate[] memory) + { + IAaveV3ConfigEngine.AssetEModeUpdate[] + memory assetEModeUpdates = new IAaveV3ConfigEngine.AssetEModeUpdate[](1); + + assetEModeUpdates[0] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3EthereumAssets.USDT_UNDERLYING, + eModeCategory: AaveV3EthereumEModes.SUSDE_STABLECOINS, + borrowable: EngineFlags.ENABLED, + collateral: EngineFlags.DISABLED + }); + + return assetEModeUpdates; + } +} diff --git a/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125.t.sol b/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125.t.sol new file mode 100644 index 000000000..3c9880cf2 --- /dev/null +++ b/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125.t.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Ethereum} from 'aave-address-book/AaveV3Ethereum.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125} from './AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125.sol'; + +/** + * @dev Test for AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125.t.sol -vv + */ +contract AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125_Test is ProtocolV3TestBase { + AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21271611); + proposal = new AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125', + AaveV3Ethereum.POOL, + address(proposal) + ); + } +} diff --git a/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/EnableSUSDeUSDTLiquid.md b/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/EnableSUSDeUSDTLiquid.md new file mode 100644 index 000000000..1fb7375e6 --- /dev/null +++ b/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/EnableSUSDeUSDTLiquid.md @@ -0,0 +1,31 @@ +--- +title: "Enable sUSDe/USDT Liquid E-Mode on Core Instance" +author: "Aave Chan Initiative" +discussions: "https://governance.aave.com/t/arfc-enable-susde-usdt-liquid-e-mode-on-core-instance/19939" +snapshot: "Direct-to-AIP" +--- + +## Simple Summary + +This proposal aims to enable sUSDe/USDT liquid E-Mode for the Core Instance. By implementing this change, we seek to enhance capital efficiency for borrowers using sUSDe as collateral, specifically for borrowing USDT. This is a Direct to AIP Proposal. + +## Motivation + +sUSDe has demonstrated significant usage as collateral for borrowing stablecoins and to increase borrowing options we now look to enable E-Mode for USDT borrows against sUSDe. + +By implementing this proposal, we aim to optimize the use of sUSDe within the Aave ecosystem, attracting more liquidity and providing more options for both borrowers and lenders. + +## Specification + +USDT on the Core instance will be added to the sUSDe stablecoin E-Mode + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/573248b67bdb04edb811598f463edce077d03a4b/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/573248b67bdb04edb811598f463edce077d03a4b/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125.t.sol) +- Snapshot: Direct-to-AIP +- [Discussion](https://governance.aave.com/t/arfc-enable-susde-usdt-liquid-e-mode-on-core-instance/19939) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/EnableSUSDeUSDTLiquid_20241125.s.sol b/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/EnableSUSDeUSDTLiquid_20241125.s.sol new file mode 100644 index 000000000..03c35fb57 --- /dev/null +++ b/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/EnableSUSDeUSDTLiquid_20241125.s.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125} from './AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/EnableSUSDeUSDTLiquid_20241125.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/EnableSUSDeUSDTLiquid_20241125.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_EnableSUSDeUSDTLiquid_20241125).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/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/EnableSUSDeUSDTLiquid_20241125.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_EnableSUSDeUSDTLiquid_20241125).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/EnableSUSDeUSDTLiquid.md' + ) + ); + } +} diff --git a/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/config.ts b/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/config.ts new file mode 100644 index 000000000..904276f82 --- /dev/null +++ b/src/20241125_AaveV3Ethereum_EnableSUSDeUSDTLiquid/config.ts @@ -0,0 +1,29 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + author: 'Aave Chan Initiative', + pools: ['AaveV3Ethereum'], + title: 'Enable sUSDe/USDT Liquid', + shortName: 'EnableSUSDeUSDTLiquid', + date: '20241125', + discussion: + 'https://governance.aave.com/t/arfc-enable-susde-usdt-liquid-e-mode-on-core-instance/19939', + snapshot: 'Direct-to-AIP', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Ethereum: { + configs: { + EMODES_ASSETS: [ + { + asset: 'USDT', + eModeCategory: 'AaveV3EthereumEModes.SUSDE_STABLECOINS', + collateral: 'DISABLED', + borrowable: 'ENABLED', + }, + ], + }, + cache: {blockNumber: 21266484}, + }, + }, +}; diff --git a/src/20241127_Multi_FluidAlignment/AaveV3Arbitrum_FluidAlignment_20241127.sol b/src/20241127_Multi_FluidAlignment/AaveV3Arbitrum_FluidAlignment_20241127.sol new file mode 100644 index 000000000..b5bcde2f6 --- /dev/null +++ b/src/20241127_Multi_FluidAlignment/AaveV3Arbitrum_FluidAlignment_20241127.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Arbitrum} from 'aave-address-book/AaveV3Arbitrum.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +/** + * @title Fluid Alignment + * @author ACI + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-fluid-alignment-with-inst-purchase/19921 + */ +contract AaveV3Arbitrum_FluidAlignment_20241127 is IProposalGenericExecutor { + address public constant NEW_FLASH_BORROWER = 0x352423e2fA5D5c99343d371C9e3bC56C87723Cc7; + + function execute() external { + AaveV3Arbitrum.ACL_MANAGER.addFlashBorrower(NEW_FLASH_BORROWER); + } +} diff --git a/src/20241127_Multi_FluidAlignment/AaveV3Arbitrum_FluidAlignment_20241127.t.sol b/src/20241127_Multi_FluidAlignment/AaveV3Arbitrum_FluidAlignment_20241127.t.sol new file mode 100644 index 000000000..873d04ed5 --- /dev/null +++ b/src/20241127_Multi_FluidAlignment/AaveV3Arbitrum_FluidAlignment_20241127.t.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3Arbitrum} from 'aave-address-book/AaveV3Arbitrum.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Arbitrum_FluidAlignment_20241127} from './AaveV3Arbitrum_FluidAlignment_20241127.sol'; + +/** + * @dev Test for AaveV3Arbitrum_FluidAlignment_20241127 + * command: FOUNDRY_PROFILE=arbitrum forge test --match-path=src/20241127_Multi_FluidAlignment/AaveV3Arbitrum_FluidAlignment_20241127.t.sol -vv + */ +contract AaveV3Arbitrum_FluidAlignment_20241127_Test is ProtocolV3TestBase { + AaveV3Arbitrum_FluidAlignment_20241127 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('arbitrum'), 278916313); + proposal = new AaveV3Arbitrum_FluidAlignment_20241127(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest('AaveV3Arbitrum_FluidAlignment_20241127', AaveV3Arbitrum.POOL, address(proposal)); + } + + function test_isFlashBorrower() external { + GovV3Helpers.executePayload(vm, address(proposal)); + bool isFlashBorrower = AaveV3Arbitrum.ACL_MANAGER.isFlashBorrower( + proposal.NEW_FLASH_BORROWER() + ); + assertEq(isFlashBorrower, true); + } +} diff --git a/src/20241127_Multi_FluidAlignment/AaveV3Base_FluidAlignment_20241127.sol b/src/20241127_Multi_FluidAlignment/AaveV3Base_FluidAlignment_20241127.sol new file mode 100644 index 000000000..fd80ded8a --- /dev/null +++ b/src/20241127_Multi_FluidAlignment/AaveV3Base_FluidAlignment_20241127.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Base} from 'aave-address-book/AaveV3Base.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +/** + * @title Fluid Alignment + * @author ACI + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-fluid-alignment-with-inst-purchase/19921 + */ +contract AaveV3Base_FluidAlignment_20241127 is IProposalGenericExecutor { + address public constant NEW_FLASH_BORROWER = 0x352423e2fA5D5c99343d371C9e3bC56C87723Cc7; + + function execute() external { + AaveV3Base.ACL_MANAGER.addFlashBorrower(NEW_FLASH_BORROWER); + } +} diff --git a/src/20241127_Multi_FluidAlignment/AaveV3Base_FluidAlignment_20241127.t.sol b/src/20241127_Multi_FluidAlignment/AaveV3Base_FluidAlignment_20241127.t.sol new file mode 100644 index 000000000..fdaaef9e7 --- /dev/null +++ b/src/20241127_Multi_FluidAlignment/AaveV3Base_FluidAlignment_20241127.t.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3Base} from 'aave-address-book/AaveV3Base.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Base_FluidAlignment_20241127} from './AaveV3Base_FluidAlignment_20241127.sol'; + +/** + * @dev Test for AaveV3Base_FluidAlignment_20241127 + * command: FOUNDRY_PROFILE=base forge test --match-path=src/20241127_Multi_FluidAlignment/AaveV3Base_FluidAlignment_20241127.t.sol -vv + */ +contract AaveV3Base_FluidAlignment_20241127_Test is ProtocolV3TestBase { + AaveV3Base_FluidAlignment_20241127 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('base'), 22969399); + proposal = new AaveV3Base_FluidAlignment_20241127(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest('AaveV3Base_FluidAlignment_20241127', AaveV3Base.POOL, address(proposal)); + } + + function test_isFlashBorrower() external { + GovV3Helpers.executePayload(vm, address(proposal)); + bool isFlashBorrower = AaveV3Base.ACL_MANAGER.isFlashBorrower(proposal.NEW_FLASH_BORROWER()); + assertEq(isFlashBorrower, true); + } +} diff --git a/src/20241127_Multi_FluidAlignment/AaveV3EthereumLido_FluidAlignment_20241127.sol b/src/20241127_Multi_FluidAlignment/AaveV3EthereumLido_FluidAlignment_20241127.sol new file mode 100644 index 000000000..1a0189b06 --- /dev/null +++ b/src/20241127_Multi_FluidAlignment/AaveV3EthereumLido_FluidAlignment_20241127.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumLido} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +/** + * @title Fluid Alignment + * @author ACI + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-fluid-alignment-with-inst-purchase/19921 + */ +contract AaveV3EthereumLido_FluidAlignment_20241127 is IProposalGenericExecutor { + address public constant NEW_FLASH_BORROWER = 0x352423e2fA5D5c99343d371C9e3bC56C87723Cc7; + + function execute() external { + AaveV3EthereumLido.ACL_MANAGER.addFlashBorrower(NEW_FLASH_BORROWER); + } +} diff --git a/src/20241127_Multi_FluidAlignment/AaveV3EthereumLido_FluidAlignment_20241127.t.sol b/src/20241127_Multi_FluidAlignment/AaveV3EthereumLido_FluidAlignment_20241127.t.sol new file mode 100644 index 000000000..a8e294583 --- /dev/null +++ b/src/20241127_Multi_FluidAlignment/AaveV3EthereumLido_FluidAlignment_20241127.t.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3EthereumLido} from 'aave-address-book/AaveV3EthereumLido.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3EthereumLido_FluidAlignment_20241127} from './AaveV3EthereumLido_FluidAlignment_20241127.sol'; + +/** + * @dev Test for AaveV3EthereumLido_FluidAlignment_20241127 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241127_Multi_FluidAlignment/AaveV3EthereumLido_FluidAlignment_20241127.t.sol -vv + */ +contract AaveV3EthereumLido_FluidAlignment_20241127_Test is ProtocolV3TestBase { + AaveV3EthereumLido_FluidAlignment_20241127 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21280540); + proposal = new AaveV3EthereumLido_FluidAlignment_20241127(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3EthereumLido_FluidAlignment_20241127', + AaveV3EthereumLido.POOL, + address(proposal) + ); + } + + function test_isFlashBorrower() external { + GovV3Helpers.executePayload(vm, address(proposal)); + bool isFlashBorrower = AaveV3EthereumLido.ACL_MANAGER.isFlashBorrower( + proposal.NEW_FLASH_BORROWER() + ); + assertEq(isFlashBorrower, true); + } +} diff --git a/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_20241127.sol b/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_20241127.sol new file mode 100644 index 000000000..22162c0b9 --- /dev/null +++ b/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_20241127.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Ethereum} from 'aave-address-book/AaveV3Ethereum.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +/** + * @title Fluid Alignment + * @author ACI + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-fluid-alignment-with-inst-purchase/19921 + */ +contract AaveV3Ethereum_FluidAlignment_20241127 is IProposalGenericExecutor { + address public constant NEW_FLASH_BORROWER = 0x352423e2fA5D5c99343d371C9e3bC56C87723Cc7; + + function execute() external { + AaveV3Ethereum.ACL_MANAGER.addFlashBorrower(NEW_FLASH_BORROWER); + } +} diff --git a/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_20241127.t.sol b/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_20241127.t.sol new file mode 100644 index 000000000..117e0ad2c --- /dev/null +++ b/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_20241127.t.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3Ethereum} from 'aave-address-book/AaveV3Ethereum.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Ethereum_FluidAlignment_20241127} from './AaveV3Ethereum_FluidAlignment_20241127.sol'; + +/** + * @dev Test for AaveV3Ethereum_FluidAlignment_20241127 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_20241127.t.sol -vv + */ +contract AaveV3Ethereum_FluidAlignment_20241127_Test is ProtocolV3TestBase { + AaveV3Ethereum_FluidAlignment_20241127 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21280537); + proposal = new AaveV3Ethereum_FluidAlignment_20241127(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest('AaveV3Ethereum_FluidAlignment_20241127', AaveV3Ethereum.POOL, address(proposal)); + } + + function test_isFlashBorrower() external { + GovV3Helpers.executePayload(vm, address(proposal)); + bool isFlashBorrower = AaveV3Ethereum.ACL_MANAGER.isFlashBorrower( + proposal.NEW_FLASH_BORROWER() + ); + assertEq(isFlashBorrower, true); + } +} diff --git a/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127.sol b/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127.sol new file mode 100644 index 000000000..c02e31153 --- /dev/null +++ b/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +/** + * @title Fluid Alignment + * @author ACI + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-fluid-alignment-with-inst-purchase/19921 + */ +contract AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127 is IProposalGenericExecutor { + address public constant INST_TOKEN = 0x6f40d4A6237C257fff2dB00FA0510DeEECd303eb; + + address public constant INSTADAPP_TREASURY = 0x28849D2b63fA8D361e5fc15cB8aBB13019884d09; + + uint256 public constant INST_AMOUNT = 1_145_000 ether; // 1.145M + + uint256 public constant GHO_AMOUNT = 4_000_000 ether; // 4M + + function execute() external { + // Pull INST to collector + IERC20(INST_TOKEN).transferFrom( + INSTADAPP_TREASURY, + address(AaveV3Ethereum.COLLECTOR), + INST_AMOUNT + ); + + // Send GHO to Instadapp Treasury + AaveV3Ethereum.COLLECTOR.transfer( + AaveV3EthereumAssets.GHO_UNDERLYING, + INSTADAPP_TREASURY, + GHO_AMOUNT + ); + } +} diff --git a/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127.t.sol b/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127.t.sol new file mode 100644 index 000000000..3dcb1afa4 --- /dev/null +++ b/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127.t.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127} from './AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; + +/** + * @dev Test for AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127.t.sol -vv + */ +contract AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127_Test is ProtocolV3TestBase { + AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21280537); + proposal = new AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127(); + vm.startPrank(proposal.INSTADAPP_TREASURY()); + IERC20(proposal.INST_TOKEN()).approve(AaveV3Ethereum.ACL_ADMIN, proposal.INST_AMOUNT()); + vm.stopPrank(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127', + AaveV3Ethereum.POOL, + address(proposal) + ); + } + + function test_hasReceivedInst() external { + GovV3Helpers.executePayload(vm, address(proposal)); + uint256 balance = IERC20(proposal.INST_TOKEN()).balanceOf(address(AaveV3Ethereum.COLLECTOR)); + assertEq(balance, proposal.INST_AMOUNT()); + } + + function test_hasSentGho() external { + uint256 balanceBefore = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + GovV3Helpers.executePayload(vm, address(proposal)); + uint256 balanceAfter = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + + assertGt(balanceBefore, balanceAfter); + assertEq(balanceBefore - balanceAfter, proposal.GHO_AMOUNT()); + } +} diff --git a/src/20241127_Multi_FluidAlignment/FluidAlignment.md b/src/20241127_Multi_FluidAlignment/FluidAlignment.md new file mode 100644 index 000000000..8cdd45934 --- /dev/null +++ b/src/20241127_Multi_FluidAlignment/FluidAlignment.md @@ -0,0 +1,46 @@ +--- +title: "Fluid Alignment" +author: "ACI" +discussions: "https://governance.aave.com/t/arfc-fluid-alignment-with-inst-purchase/19921" +--- + +## Simple Summary + +This ARFC proposes a strategic partnership between Aave DAO and Instadapp through a $4M investment in $INST tokens at a 350M FDV, aiming to strengthen collaboration and alignment between both protocols. + +## Motivation + +Instadapp has been a long-standing partner in the Aave ecosystem, providing valuable infrastructure and user interfaces. Their upcoming tokenomics reform and rebranding present an opportunity for deeper strategic alignment. + +The partnership would benefit both protocols by: + +- Strengthening the relationship between two major DeFi protocols +- Supporting GHO adoption through Fluid integration +- Ensuring priority support for Aave protocol integrations +- Creating mutual value through governance participation + +## Specification + +The proposal includes the following key components: + +Aave DAO will become a launch partner for Instadapp’s new tokenomics and rebranding. The DAO and service providers will implement a strict standard of non-hostility policy regarding Instadapp products and team members in public communications. The DAO will also provision of support and promotion for Instadapp products that leverage the Aave protocol including GHO and Fluid integrations. This will involve priority and tailored support for Instadapp team integrations including the provision of free flashloans to the Instadapp protocol. + +To further alignemnt between the two protocols, we propose a purchase of $4M worth of $INST tokens using GHO (approximately 1% of total supply at 350M FDV) + +With these tokens Aave DAO will allocate up to 1/3 of acquired INST tokens to support GHO pairs on Fluid via Merit. The rest of the tokens will be set to a one-year vesting period for with delegation to Aave Protocol Embassy for active participation in Fluid governance. + +Considering the time sensitive nature of the transaction, this proposal can proceed in a direct-to-AIP vote that will allow for the following: + +- Allocation of $4m GHO from the treasury for purchase of $INST tokens. +- AIP to whitelist InstaDapp to flash loans + +## References + +- Implementation: [AaveV3Ethereum Tokens Transfers](https://github.com/bgd-labs/aave-proposals-v3/blob/09d8dedb7b8d9e81420b018b971106da4bdd34ce/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127.sol), [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/09d8dedb7b8d9e81420b018b971106da4bdd34ce/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_20241127.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/09d8dedb7b8d9e81420b018b971106da4bdd34ce/src/20241127_Multi_FluidAlignment/AaveV3EthereumLido_FluidAlignment_20241127.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/09d8dedb7b8d9e81420b018b971106da4bdd34ce/src/20241127_Multi_FluidAlignment/AaveV3Arbitrum_FluidAlignment_20241127.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/09d8dedb7b8d9e81420b018b971106da4bdd34ce/src/20241127_Multi_FluidAlignment/AaveV3Base_FluidAlignment_20241127.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/09d8dedb7b8d9e81420b018b971106da4bdd34ce/src/20241127_Multi_FluidAlignment/AaveV3Ethereum_FluidAlignment_20241127.t.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/09d8dedb7b8d9e81420b018b971106da4bdd34ce/src/20241127_Multi_FluidAlignment/AaveV3EthereumLido_FluidAlignment_20241127.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/09d8dedb7b8d9e81420b018b971106da4bdd34ce/src/20241127_Multi_FluidAlignment/AaveV3Arbitrum_FluidAlignment_20241127.t.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/09d8dedb7b8d9e81420b018b971106da4bdd34ce/src/20241127_Multi_FluidAlignment/AaveV3Base_FluidAlignment_20241127.t.sol) +- Snapshot: Direct-to-AIP +- [Discussion](https://governance.aave.com/t/arfc-fluid-alignment-with-inst-purchase/19921) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241127_Multi_FluidAlignment/FluidAlignment_20241127.s.sol b/src/20241127_Multi_FluidAlignment/FluidAlignment_20241127.s.sol new file mode 100644 index 000000000..cb2dbb57e --- /dev/null +++ b/src/20241127_Multi_FluidAlignment/FluidAlignment_20241127.s.sol @@ -0,0 +1,133 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript, ArbitrumScript, BaseScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Ethereum_FluidAlignment_20241127} from './AaveV3Ethereum_FluidAlignment_20241127.sol'; +import {AaveV3EthereumLido_FluidAlignment_20241127} from './AaveV3EthereumLido_FluidAlignment_20241127.sol'; +import {AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127} from './AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127.sol'; +import {AaveV3Arbitrum_FluidAlignment_20241127} from './AaveV3Arbitrum_FluidAlignment_20241127.sol'; +import {AaveV3Base_FluidAlignment_20241127} from './AaveV3Base_FluidAlignment_20241127.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241127_Multi_FluidAlignment/FluidAlignment_20241127.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/FluidAlignment_20241127.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_FluidAlignment_20241127).creationCode + ); + address payload1 = GovV3Helpers.deployDeterministic( + type(AaveV3EthereumLido_FluidAlignment_20241127).creationCode + ); + address payload2 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](2); + actions[0] = GovV3Helpers.buildAction(payload0); + actions[1] = GovV3Helpers.buildAction(payload1); + actions[2] = GovV3Helpers.buildAction(payload2); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Arbitrum + * deploy-command: make deploy-ledger contract=src/20241127_Multi_FluidAlignment/FluidAlignment_20241127.s.sol:DeployArbitrum chain=arbitrum + * verify-command: FOUNDRY_PROFILE=arbitrum npx catapulta-verify -b broadcast/FluidAlignment_20241127.s.sol/42161/run-latest.json + */ +contract DeployArbitrum is ArbitrumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Arbitrum_FluidAlignment_20241127).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Base + * deploy-command: make deploy-ledger contract=src/20241127_Multi_FluidAlignment/FluidAlignment_20241127.s.sol:DeployBase chain=base + * verify-command: FOUNDRY_PROFILE=base npx catapulta-verify -b broadcast/FluidAlignment_20241127.s.sol/8453/run-latest.json + */ +contract DeployBase is BaseScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Base_FluidAlignment_20241127).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/20241127_Multi_FluidAlignment/FluidAlignment_20241127.s.sol:CreateProposal chain=mainnet + */ +contract CreateProposal is EthereumScript { + function run() external { + // create payloads + PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](3); + + // compose actions for validation + IPayloadsControllerCore.ExecutionAction[] + memory actionsEthereum = new IPayloadsControllerCore.ExecutionAction[](3); + actionsEthereum[0] = GovV3Helpers.buildAction( + type(AaveV3Ethereum_FluidAlignment_20241127).creationCode + ); + actionsEthereum[1] = GovV3Helpers.buildAction( + type(AaveV3EthereumLido_FluidAlignment_20241127).creationCode + ); + actionsEthereum[2] = GovV3Helpers.buildAction( + type(AaveV3Ethereum_FluidAlignment_TokenTransfers_20241127).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsArbitrum = new IPayloadsControllerCore.ExecutionAction[](1); + actionsArbitrum[0] = GovV3Helpers.buildAction( + type(AaveV3Arbitrum_FluidAlignment_20241127).creationCode + ); + payloads[1] = GovV3Helpers.buildArbitrumPayload(vm, actionsArbitrum); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsBase = new IPayloadsControllerCore.ExecutionAction[](1); + actionsBase[0] = GovV3Helpers.buildAction( + type(AaveV3Base_FluidAlignment_20241127).creationCode + ); + payloads[2] = GovV3Helpers.buildBasePayload(vm, actionsBase); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile(vm, 'src/20241127_Multi_FluidAlignment/FluidAlignment.md') + ); + } +} diff --git a/src/20241127_Multi_FluidAlignment/config.ts b/src/20241127_Multi_FluidAlignment/config.ts new file mode 100644 index 000000000..e27bd118a --- /dev/null +++ b/src/20241127_Multi_FluidAlignment/config.ts @@ -0,0 +1,31 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3Ethereum', 'AaveV3EthereumLido', 'AaveV3Arbitrum', 'AaveV3Base'], + title: 'Fluid Alignment', + shortName: 'FluidAlignment', + date: '20241127', + author: 'ACI', + discussion: 'https://governance.aave.com/t/arfc-fluid-alignment-with-inst-purchase/19921', + snapshot: '', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Ethereum: { + configs: {FLASH_BORROWER: {address: '0x352423e2fA5D5c99343d371C9e3bC56C87723Cc7'}}, + cache: {blockNumber: 21280537}, + }, + AaveV3EthereumLido: { + configs: {FLASH_BORROWER: {address: '0x352423e2fA5D5c99343d371C9e3bC56C87723Cc7'}}, + cache: {blockNumber: 21280540}, + }, + AaveV3Arbitrum: { + configs: {FLASH_BORROWER: {address: '0x352423e2fA5D5c99343d371C9e3bC56C87723Cc7'}}, + cache: {blockNumber: 278916313}, + }, + AaveV3Base: { + configs: {FLASH_BORROWER: {address: '0x352423e2fA5D5c99343d371C9e3bC56C87723Cc7'}}, + cache: {blockNumber: 22969399}, + }, + }, +}; diff --git a/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV2Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV2Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol new file mode 100644 index 000000000..c81a9625d --- /dev/null +++ b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV2Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV2EthereumAssets} from 'aave-address-book/AaveV2Ethereum.sol'; +import {AaveV2PayloadEthereum} from 'aave-helpers/src/v2-config-engine/AaveV2PayloadEthereum.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV2ConfigEngine} from 'aave-helpers/src/v2-config-engine/IAaveV2ConfigEngine.sol'; +import {IV2RateStrategyFactory} from 'aave-helpers/src/v2-config-engine/IV2RateStrategyFactory.sol'; +/** + * @title Increase Borrow Slope1 to all Stablecoins across all Aave Instances + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-increase-borrow-slope1-to-all-stablecoins-across-all-aave-instances/19979 + */ +contract AaveV2Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 is + AaveV2PayloadEthereum +{ + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV2ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV2ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV2ConfigEngine.RateStrategyUpdate[](3); + rateStrategies[0] = IAaveV2ConfigEngine.RateStrategyUpdate({ + asset: AaveV2EthereumAssets.USDT_UNDERLYING, + params: IV2RateStrategyFactory.RateStrategyParams({ + optimalUtilizationRate: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: _bpsToRay(12_50), + variableRateSlope2: EngineFlags.KEEP_CURRENT, + stableRateSlope1: EngineFlags.KEEP_CURRENT, + stableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); + rateStrategies[1] = IAaveV2ConfigEngine.RateStrategyUpdate({ + asset: AaveV2EthereumAssets.DAI_UNDERLYING, + params: IV2RateStrategyFactory.RateStrategyParams({ + optimalUtilizationRate: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: _bpsToRay(12_50), + variableRateSlope2: EngineFlags.KEEP_CURRENT, + stableRateSlope1: EngineFlags.KEEP_CURRENT, + stableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); + rateStrategies[2] = IAaveV2ConfigEngine.RateStrategyUpdate({ + asset: AaveV2EthereumAssets.USDC_UNDERLYING, + params: IV2RateStrategyFactory.RateStrategyParams({ + optimalUtilizationRate: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: _bpsToRay(12_50), + variableRateSlope2: EngineFlags.KEEP_CURRENT, + stableRateSlope1: EngineFlags.KEEP_CURRENT, + stableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); + + return rateStrategies; + } +} diff --git a/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV2Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV2Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol new file mode 100644 index 000000000..f0312ff03 --- /dev/null +++ b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV2Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV2Ethereum} from 'aave-address-book/AaveV2Ethereum.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV2TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV2TestBase.sol'; +import {AaveV2Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201} from './AaveV2Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol'; + +/** + * @dev Test for AaveV2Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV2Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol -vv + */ +contract AaveV2Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_Test is + ProtocolV2TestBase +{ + AaveV2Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 + internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21346502); + proposal = new AaveV2Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV2Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201', + AaveV2Ethereum.POOL, + address(proposal) + ); + } +} diff --git a/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Arbitrum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Arbitrum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol new file mode 100644 index 000000000..92d0b8a4f --- /dev/null +++ b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Arbitrum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol'; +import {AaveV3PayloadArbitrum} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadArbitrum.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title Increase Borrow Slope1 to all Stablecoins across all Aave Instances + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-increase-borrow-slope1-to-all-stablecoins-across-all-aave-instances/19979 + */ +contract AaveV3Arbitrum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 is + AaveV3PayloadArbitrum +{ + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV3ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](7); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3ArbitrumAssets.DAI_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 40_00 + }) + }); + rateStrategies[1] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3ArbitrumAssets.USDC_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 13_50, + variableRateSlope2: 40_00 + }) + }); + rateStrategies[2] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3ArbitrumAssets.USDT_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 40_00 + }) + }); + rateStrategies[3] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3ArbitrumAssets.LUSD_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 50_00 + }) + }); + rateStrategies[4] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3ArbitrumAssets.USDCn_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 40_00 + }) + }); + rateStrategies[5] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3ArbitrumAssets.FRAX_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 40_00 + }) + }); + rateStrategies[6] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3ArbitrumAssets.GHO_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 40_00 + }) + }); + + return rateStrategies; + } +} diff --git a/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Arbitrum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Arbitrum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol new file mode 100644 index 000000000..30d767208 --- /dev/null +++ b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Arbitrum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Arbitrum} from 'aave-address-book/AaveV3Arbitrum.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Arbitrum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201} from './AaveV3Arbitrum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol'; + +/** + * @dev Test for AaveV3Arbitrum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 + * command: FOUNDRY_PROFILE=arbitrum forge test --match-path=src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Arbitrum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol -vv + */ +contract AaveV3Arbitrum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_Test is + ProtocolV3TestBase +{ + AaveV3Arbitrum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 + internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('arbitrum'), 282086445); + proposal = new AaveV3Arbitrum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Arbitrum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201', + AaveV3Arbitrum.POOL, + address(proposal) + ); + } +} diff --git a/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Avalanche_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Avalanche_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol new file mode 100644 index 000000000..53c2a800a --- /dev/null +++ b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Avalanche_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3AvalancheAssets} from 'aave-address-book/AaveV3Avalanche.sol'; +import {AaveV3PayloadAvalanche} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadAvalanche.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title Increase Borrow Slope1 to all Stablecoins across all Aave Instances + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-increase-borrow-slope1-to-all-stablecoins-across-all-aave-instances/19979 + */ +contract AaveV3Avalanche_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 is + AaveV3PayloadAvalanche +{ + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV3ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](4); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3AvalancheAssets.DAIe_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 40_00 + }) + }); + rateStrategies[1] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3AvalancheAssets.USDC_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 40_00 + }) + }); + rateStrategies[2] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3AvalancheAssets.USDt_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 40_00 + }) + }); + rateStrategies[3] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3AvalancheAssets.FRAX_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 40_00 + }) + }); + + return rateStrategies; + } +} diff --git a/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Avalanche_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Avalanche_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol new file mode 100644 index 000000000..6a7a40f3e --- /dev/null +++ b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Avalanche_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Avalanche} from 'aave-address-book/AaveV3Avalanche.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Avalanche_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201} from './AaveV3Avalanche_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol'; + +/** + * @dev Test for AaveV3Avalanche_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 + * command: FOUNDRY_PROFILE=avalanche forge test --match-path=src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Avalanche_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol -vv + */ +contract AaveV3Avalanche_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_Test is + ProtocolV3TestBase +{ + AaveV3Avalanche_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 + internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('avalanche'), 54018606); + proposal = new AaveV3Avalanche_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Avalanche_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201', + AaveV3Avalanche.POOL, + address(proposal) + ); + } +} diff --git a/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3BNB_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3BNB_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol new file mode 100644 index 000000000..5d0c3a2f3 --- /dev/null +++ b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3BNB_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3BNBAssets} from 'aave-address-book/AaveV3BNB.sol'; +import {AaveV3PayloadBNB} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadBNB.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title Increase Borrow Slope1 to all Stablecoins across all Aave Instances + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-increase-borrow-slope1-to-all-stablecoins-across-all-aave-instances/19979 + */ +contract AaveV3BNB_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 is + AaveV3PayloadBNB +{ + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV3ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](3); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3BNBAssets.USDC_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 40_00 + }) + }); + rateStrategies[1] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3BNBAssets.USDT_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 40_00 + }) + }); + rateStrategies[2] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3BNBAssets.FDUSD_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 40_00 + }) + }); + + return rateStrategies; + } +} diff --git a/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3BNB_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3BNB_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol new file mode 100644 index 000000000..9551c337e --- /dev/null +++ b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3BNB_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3BNB} from 'aave-address-book/AaveV3BNB.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3BNB_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201} from './AaveV3BNB_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol'; + +/** + * @dev Test for AaveV3BNB_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 + * command: FOUNDRY_PROFILE=bnb forge test --match-path=src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3BNB_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol -vv + */ +contract AaveV3BNB_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_Test is + ProtocolV3TestBase +{ + AaveV3BNB_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('bnb'), 44648014); + proposal = new AaveV3BNB_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3BNB_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201', + AaveV3BNB.POOL, + address(proposal) + ); + } +} diff --git a/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Base_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Base_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol new file mode 100644 index 000000000..e15b3fde9 --- /dev/null +++ b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Base_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3BaseAssets} from 'aave-address-book/AaveV3Base.sol'; +import {AaveV3PayloadBase} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadBase.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title Increase Borrow Slope1 to all Stablecoins across all Aave Instances + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-increase-borrow-slope1-to-all-stablecoins-across-all-aave-instances/19979 + */ +contract AaveV3Base_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 is + AaveV3PayloadBase +{ + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV3ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](2); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3BaseAssets.USDbC_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 13_50, + variableRateSlope2: 40_00 + }) + }); + rateStrategies[1] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3BaseAssets.USDC_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 40_00 + }) + }); + + return rateStrategies; + } +} diff --git a/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Base_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Base_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol new file mode 100644 index 000000000..6d31259aa --- /dev/null +++ b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Base_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Base} from 'aave-address-book/AaveV3Base.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Base_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201} from './AaveV3Base_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol'; + +/** + * @dev Test for AaveV3Base_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 + * command: FOUNDRY_PROFILE=base forge test --match-path=src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Base_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol -vv + */ +contract AaveV3Base_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_Test is + ProtocolV3TestBase +{ + AaveV3Base_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('base'), 23367782); + proposal = new AaveV3Base_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Base_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201', + AaveV3Base.POOL, + address(proposal) + ); + } +} diff --git a/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3EthereumEtherFi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3EthereumEtherFi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol new file mode 100644 index 000000000..f6b67014e --- /dev/null +++ b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3EthereumEtherFi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumEtherFiAssets} from 'aave-address-book/AaveV3EthereumEtherFi.sol'; +import {AaveV3PayloadEthereumEtherFi} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereumEtherFi.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title Increase Borrow Slope1 to all Stablecoins across all Aave Instances + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-increase-borrow-slope1-to-all-stablecoins-across-all-aave-instances/19979 + */ +contract AaveV3EthereumEtherFi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 is + AaveV3PayloadEthereumEtherFi +{ + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV3ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](3); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumEtherFiAssets.USDC_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 40_00 + }) + }); + + rateStrategies[1] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumEtherFiAssets.PYUSD_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 40_00 + }) + }); + + rateStrategies[2] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumEtherFiAssets.FRAX_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 40_00 + }) + }); + + return rateStrategies; + } +} diff --git a/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3EthereumEtherFi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3EthereumEtherFi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol new file mode 100644 index 000000000..f7fdc137a --- /dev/null +++ b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3EthereumEtherFi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumEtherFi} from 'aave-address-book/AaveV3EthereumEtherFi.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3EthereumEtherFi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201} from './AaveV3EthereumEtherFi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol'; + +/** + * @dev Test for AaveV3EthereumEtherFi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3EthereumEtherFi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol -vv + */ +contract AaveV3EthereumEtherFi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_Test is + ProtocolV3TestBase +{ + AaveV3EthereumEtherFi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 + internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21346502); + proposal = new AaveV3EthereumEtherFi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3EthereumEtherFi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201', + AaveV3EthereumEtherFi.POOL, + address(proposal) + ); + } +} diff --git a/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3EthereumLido_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3EthereumLido_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol new file mode 100644 index 000000000..6fa8c8022 --- /dev/null +++ b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3EthereumLido_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumLidoAssets} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {AaveV3PayloadEthereumLido} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereumLido.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title Increase Borrow Slope1 to all Stablecoins across all Aave Instances + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-increase-borrow-slope1-to-all-stablecoins-across-all-aave-instances/19979 + */ +contract AaveV3EthereumLido_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 is + AaveV3PayloadEthereumLido +{ + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV3ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](1); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumLidoAssets.USDC_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 35_00 + }) + }); + + return rateStrategies; + } +} diff --git a/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3EthereumLido_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3EthereumLido_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol new file mode 100644 index 000000000..65acf5041 --- /dev/null +++ b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3EthereumLido_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumLido} from 'aave-address-book/AaveV3EthereumLido.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3EthereumLido_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201} from './AaveV3EthereumLido_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol'; + +/** + * @dev Test for AaveV3EthereumLido_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3EthereumLido_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol -vv + */ +contract AaveV3EthereumLido_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_Test is + ProtocolV3TestBase +{ + AaveV3EthereumLido_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 + internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21346502); + proposal = new AaveV3EthereumLido_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3EthereumLido_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201', + AaveV3EthereumLido.POOL, + address(proposal) + ); + } +} diff --git a/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol new file mode 100644 index 000000000..291c63fa5 --- /dev/null +++ b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV3PayloadEthereum} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereum.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title Increase Borrow Slope1 to all Stablecoins across all Aave Instances + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-increase-borrow-slope1-to-all-stablecoins-across-all-aave-instances/19979 + */ +contract AaveV3Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 is + AaveV3PayloadEthereum +{ + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV3ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](8); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumAssets.USDC_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 35_00 + }) + }); + rateStrategies[1] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumAssets.DAI_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 35_00 + }) + }); + rateStrategies[2] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumAssets.USDT_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 35_00 + }) + }); + rateStrategies[3] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumAssets.LUSD_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 50_00 + }) + }); + rateStrategies[4] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumAssets.FRAX_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 40_00 + }) + }); + rateStrategies[5] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumAssets.crvUSD_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 50_00 + }) + }); + rateStrategies[6] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumAssets.PYUSD_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 50_00 + }) + }); + rateStrategies[7] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumAssets.USDe_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 50_00 + }) + }); + + return rateStrategies; + } +} diff --git a/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol new file mode 100644 index 000000000..c6c3ac9ea --- /dev/null +++ b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Ethereum} from 'aave-address-book/AaveV3Ethereum.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201} from './AaveV3Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol'; + +/** + * @dev Test for AaveV3Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol -vv + */ +contract AaveV3Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_Test is + ProtocolV3TestBase +{ + AaveV3Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 + internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21346502); + proposal = new AaveV3Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201', + AaveV3Ethereum.POOL, + address(proposal) + ); + } +} diff --git a/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Gnosis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Gnosis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol new file mode 100644 index 000000000..829d403b2 --- /dev/null +++ b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Gnosis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3GnosisAssets} from 'aave-address-book/AaveV3Gnosis.sol'; +import {AaveV3PayloadGnosis} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadGnosis.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title Increase Borrow Slope1 to all Stablecoins across all Aave Instances + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-increase-borrow-slope1-to-all-stablecoins-across-all-aave-instances/19979 + */ +contract AaveV3Gnosis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 is + AaveV3PayloadGnosis +{ + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV3ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](4); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3GnosisAssets.USDC_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 40_00 + }) + }); + rateStrategies[1] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3GnosisAssets.WXDAI_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 40_00 + }) + }); + rateStrategies[2] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3GnosisAssets.EURe_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 50_00 + }) + }); + rateStrategies[3] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3GnosisAssets.USDCe_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 13_50, + variableRateSlope2: 40_00 + }) + }); + + return rateStrategies; + } +} diff --git a/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Gnosis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Gnosis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol new file mode 100644 index 000000000..f14fb5a47 --- /dev/null +++ b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Gnosis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Gnosis} from 'aave-address-book/AaveV3Gnosis.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Gnosis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201} from './AaveV3Gnosis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol'; + +/** + * @dev Test for AaveV3Gnosis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 + * command: FOUNDRY_PROFILE=gnosis forge test --match-path=src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Gnosis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol -vv + */ +contract AaveV3Gnosis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_Test is + ProtocolV3TestBase +{ + AaveV3Gnosis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 + internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('gnosis'), 37394270); + proposal = new AaveV3Gnosis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Gnosis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201', + AaveV3Gnosis.POOL, + address(proposal) + ); + } +} diff --git a/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Metis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Metis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol new file mode 100644 index 000000000..882e23dea --- /dev/null +++ b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Metis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3MetisAssets} from 'aave-address-book/AaveV3Metis.sol'; +import {AaveV3PayloadMetis} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadMetis.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title Increase Borrow Slope1 to all Stablecoins across all Aave Instances + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-increase-borrow-slope1-to-all-stablecoins-across-all-aave-instances/19979 + */ +contract AaveV3Metis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 is + AaveV3PayloadMetis +{ + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV3ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](3); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3MetisAssets.mDAI_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 50_00 + }) + }); + rateStrategies[1] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3MetisAssets.mUSDC_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 40_00 + }) + }); + rateStrategies[2] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3MetisAssets.mUSDT_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 40_00 + }) + }); + + return rateStrategies; + } +} diff --git a/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Metis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Metis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol new file mode 100644 index 000000000..bcc9107d9 --- /dev/null +++ b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Metis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Metis} from 'aave-address-book/AaveV3Metis.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Metis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201} from './AaveV3Metis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol'; + +/** + * @dev Test for AaveV3Metis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 + * command: FOUNDRY_PROFILE=metis forge test --match-path=src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Metis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol -vv + */ +contract AaveV3Metis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_Test is + ProtocolV3TestBase +{ + AaveV3Metis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('metis'), 19121761); + proposal = new AaveV3Metis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Metis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201', + AaveV3Metis.POOL, + address(proposal) + ); + } +} diff --git a/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Optimism_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Optimism_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol new file mode 100644 index 000000000..b7e92ec43 --- /dev/null +++ b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Optimism_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol @@ -0,0 +1,82 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3OptimismAssets} from 'aave-address-book/AaveV3Optimism.sol'; +import {AaveV3PayloadOptimism} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadOptimism.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title Increase Borrow Slope1 to all Stablecoins across all Aave Instances + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-increase-borrow-slope1-to-all-stablecoins-across-all-aave-instances/19979 + */ +contract AaveV3Optimism_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 is + AaveV3PayloadOptimism +{ + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV3ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](6); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3OptimismAssets.DAI_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 40_00 + }) + }); + rateStrategies[1] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3OptimismAssets.USDC_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 13_50, + variableRateSlope2: 40_00 + }) + }); + rateStrategies[2] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3OptimismAssets.USDT_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 40_00 + }) + }); + rateStrategies[3] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3OptimismAssets.sUSD_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 50_00 + }) + }); + rateStrategies[4] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3OptimismAssets.LUSD_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 50_00 + }) + }); + rateStrategies[5] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3OptimismAssets.USDCn_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 40_00 + }) + }); + + return rateStrategies; + } +} diff --git a/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Optimism_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Optimism_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol new file mode 100644 index 000000000..2cfde6202 --- /dev/null +++ b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Optimism_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Optimism} from 'aave-address-book/AaveV3Optimism.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Optimism_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201} from './AaveV3Optimism_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol'; + +/** + * @dev Test for AaveV3Optimism_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 + * command: FOUNDRY_PROFILE=optimism forge test --match-path=src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Optimism_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol -vv + */ +contract AaveV3Optimism_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_Test is + ProtocolV3TestBase +{ + AaveV3Optimism_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 + internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('optimism'), 128963066); + proposal = new AaveV3Optimism_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Optimism_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201', + AaveV3Optimism.POOL, + address(proposal) + ); + } +} diff --git a/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Polygon_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Polygon_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol new file mode 100644 index 000000000..ffe2b3d4a --- /dev/null +++ b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Polygon_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3PolygonAssets} from 'aave-address-book/AaveV3Polygon.sol'; +import {AaveV3PayloadPolygon} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadPolygon.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title Increase Borrow Slope1 to all Stablecoins across all Aave Instances + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-increase-borrow-slope1-to-all-stablecoins-across-all-aave-instances/19979 + */ +contract AaveV3Polygon_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 is + AaveV3PayloadPolygon +{ + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV3ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](5); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3PolygonAssets.DAI_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 40_00 + }) + }); + rateStrategies[1] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3PolygonAssets.USDC_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 13_50, + variableRateSlope2: 40_00 + }) + }); + rateStrategies[2] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3PolygonAssets.USDT_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 40_00 + }) + }); + rateStrategies[3] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3PolygonAssets.EURS_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 50_00 + }) + }); + rateStrategies[4] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3PolygonAssets.USDCn_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 40_00 + }) + }); + + return rateStrategies; + } +} diff --git a/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Polygon_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Polygon_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol new file mode 100644 index 000000000..a9a7ec179 --- /dev/null +++ b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Polygon_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Polygon} from 'aave-address-book/AaveV3Polygon.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Polygon_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201} from './AaveV3Polygon_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol'; + +/** + * @dev Test for AaveV3Polygon_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 + * command: FOUNDRY_PROFILE=polygon forge test --match-path=src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Polygon_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol -vv + */ +contract AaveV3Polygon_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_Test is + ProtocolV3TestBase +{ + AaveV3Polygon_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 + internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('polygon'), 65170205); + proposal = new AaveV3Polygon_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Polygon_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201', + AaveV3Polygon.POOL, + address(proposal) + ); + } +} diff --git a/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Scroll_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Scroll_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol new file mode 100644 index 000000000..926b43b71 --- /dev/null +++ b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Scroll_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3ScrollAssets} from 'aave-address-book/AaveV3Scroll.sol'; +import {AaveV3PayloadScroll} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadScroll.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title Increase Borrow Slope1 to all Stablecoins across all Aave Instances + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-increase-borrow-slope1-to-all-stablecoins-across-all-aave-instances/19979 + */ +contract AaveV3Scroll_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 is + AaveV3PayloadScroll +{ + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV3ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](1); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3ScrollAssets.USDC_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 40_00 + }) + }); + + return rateStrategies; + } +} diff --git a/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Scroll_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Scroll_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol new file mode 100644 index 000000000..3838f60b4 --- /dev/null +++ b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Scroll_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Scroll} from 'aave-address-book/AaveV3Scroll.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Scroll_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201} from './AaveV3Scroll_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol'; + +/** + * @dev Test for AaveV3Scroll_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 + * command: FOUNDRY_PROFILE=scroll forge test --match-path=src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Scroll_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol -vv + */ +contract AaveV3Scroll_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_Test is + ProtocolV3TestBase +{ + AaveV3Scroll_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 + internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('scroll'), 11705779); + proposal = new AaveV3Scroll_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Scroll_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201', + AaveV3Scroll.POOL, + address(proposal) + ); + } +} diff --git a/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances.md b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances.md new file mode 100644 index 000000000..086bddd2b --- /dev/null +++ b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances.md @@ -0,0 +1,86 @@ +--- +title: "Increase Borrow Slope1 to all Stablecoins across all Aave Instances" +author: "Aave Chan Initiative" +discussions: "https://governance.aave.com/t/arfc-increase-borrow-slope1-to-all-stablecoins-across-all-aave-instances/19979" +--- + +## Simple Summary + +This proposal recommends increasing the **borrow slope1** parameter for stablecoins across all Aave V3 Instances and Aave V2 on mainnet to **12.5%**. This adjustment aims to align interest rate models with the updated **Stable Debt Reserve (SDR)** strategy, promoting sustainability, better risk management, and optimal utilization of the protocol’s resources. + +## Motivation + +The current market environment presents a unique opportunity to optimize Aave’s interest rate parameters. With the introduction of sUSDe as E-Mode collateral and general market sentiment leading to higher desire for borrowing, we are seeing significantly higher utilisation in the stablecoin market. This adjustment to the borrow slope1 will better align Aave’s interest rates with prevailing market conditions, potentially leading to: + +- Increased protocol revenue through better rate optimization +- Enhanced capital efficiency by maintaining competitive lending rates at lower volatility. + +Additionally, this change will ensure appropriate risk compensation for stablecoin lenders. + +## Specification + +| **Market** | **Asset** | **Current Slope1** | **Recommended Slope1** | **Current Slope2** | **Recommended Slope2** | +| ------------------- | --------- | ------------------ | ---------------------- | ------------------ | ---------------------- | +| Ethereum V2 | USDC | 5.5% | 12.5% | 60% | - | +| Ethereum V2 | USDT | 5.5% | 12.5% | 100% | - | +| Ethereum V2 | DAI | 5.5% | 12.5% | 75% | - | +| Ethereum V3 Core | USDC | 5.5% | 12.5% | 75% | 35% | +| Ethereum V3 Core | USDT | 5.5% | 12.5% | 75% | 35% | +| Ethereum V3 Core | USDe | 9.0% | 12.5% | 75% | 50% | +| Ethereum V3 Core | FRAX | 5.5% | 12.5% | 75% | 40% | +| Ethereum V3 Core | DAI | 5.5% | 12.5% | 75% | 35% | +| Ethereum V3 Core | LUSD | 5.5% | 12.5% | 87% | 50% | +| Ethereum V3 Core | PYUSD | 5.5% | 12.5% | 80% | 50% | +| Ethereum V3 Core | crvUSD | 5.5% | 12.5% | 80% | 50% | +| Ethereum V3 Prime | USDC | 5.5% | 12.5% | 60% | 35% | +| Ethereum V3 EtherFi | USDC | 6.5% | 12.5% | 60% | 40% | +| Ethereum V3 EtherFi | PYUSD | 5.5% | 12.5% | 80% | 40% | +| Ethereum V3 EtherFi | FRAX | 5.5% | 12.5% | 80% | 40% | +| Avalanche V3 | USDC | 5.5% | 12.5% | 60% | 40% | +| Avalanche V3 | USDT | 5.5% | 12.5% | 75% | 40% | +| Avalanche V3 | DAI | 5.5% | 12.5% | 75% | 40% | +| Avalanche V3 | FRAX | 5.5% | 12.5% | 75% | 40% | +| Polygon V3 | USDC | 5.5% | 12.5% | 60% | 40% | +| Polygon V3 | USDC.e | 10.0% | 13.5% | 80% | 40% | +| Polygon V3 | USDT | 5.5% | 12.5% | 75% | 40% | +| Polygon V3 | DAI | 5.5% | 12.5% | 75% | 40% | +| Polygon V3 | EURS | 5.5% | 12.5% | 75% | 50% | +| Optimism V3 | USDC | 5.5% | 12.5% | 60% | 40% | +| Optimism V3 | USDT | 5.5% | 12.5% | 75% | 40% | +| Optimism V3 | DAI | 5.5% | 12.5% | 75% | 40% | +| Optimism V3 | sUSD | 5.5% | 12.5% | 75% | 50% | +| Optimism V3 | LUSD | 5.5% | 12.5% | 87% | 50% | +| Optimism V3 | USDC.e | 6.5% | 13.5% | 80% | 40% | +| Arbitrum V3 | USDC | 5.5% | 12.5% | 60% | 40% | +| Arbitrum V3 | USDC.e | 6.5% | 13.5% | 80% | 40% | +| Arbitrum V3 | USDT | 5.5% | 12.5% | 75% | 40% | +| Arbitrum V3 | DAI | 5.5% | 12.5% | 75% | 40% | +| Arbitrum V3 | LUSD | 5.5% | 12.5% | 87% | 50% | +| Arbitrum V3 | FRAX | 5.5% | 12.5% | 75% | 40% | +| Arbitrum V3 | GHO | 12% | 12.5% | 65% | 40% | +| Base V3 | USDC | 5.5% | 12.5% | 60% | 40% | +| Base V3 | USDbC | 10.0% | 13.5% | 80% | 40% | +| Metis V3 | m.USDC | 6.0% | 12.5% | 60% | 40% | +| Metis V3 | m.USDT | 6.0% | 12.5% | 75% | 40% | +| Metis V3 | m.DAI | 7.0% | 12.5% | 75% | 50% | +| BNB Chain V3 | USDT | 5.5% | 12.5% | 75% | 40% | +| BNB Chain V3 | USDC | 5.5% | 12.5% | 60% | 40% | +| BNB Chain V3 | FDUSD | 5.5% | 12.5% | 75% | 40% | +| Scroll V3 | USDC | 5.5% | 12.5% | 60% | 40% | +| Gnosis V3 | WXDAI | 5.5% | 12.5% | 75% | 40% | +| Gnosis V3 | USDC | 5.5% | 12.5% | 75% | 40% | +| Gnosis V3 | EURe | 5.5% | 12.5% | 75% | 50% | +| Gnosis V3 | USDC.e | 9% | 13.5% | 75% | 40% | +| ZKSync V3 | USDC | 5.5% | 12.5% | 60% | 40% | +| ZKSync V3 | USDT | 5.5% | 12.5% | 60% | 40% | + +## References + +- Implementation: [AaveV2Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/b7dac56b973d2c43b6d535b15881abb118d08e49/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV2Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol), [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/b7dac56b973d2c43b6d535b15881abb118d08e49/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/b7dac56b973d2c43b6d535b15881abb118d08e49/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3EthereumLido_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol), [AaveV3EthereumEtherFi](https://github.com/bgd-labs/aave-proposals-v3/blob/b7dac56b973d2c43b6d535b15881abb118d08e49/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3EthereumEtherFi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/b7dac56b973d2c43b6d535b15881abb118d08e49/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Polygon_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol), [AaveV3Avalanche](https://github.com/bgd-labs/aave-proposals-v3/blob/b7dac56b973d2c43b6d535b15881abb118d08e49/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Avalanche_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/b7dac56b973d2c43b6d535b15881abb118d08e49/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Optimism_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/b7dac56b973d2c43b6d535b15881abb118d08e49/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Arbitrum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol), [AaveV3Metis](https://github.com/bgd-labs/aave-proposals-v3/blob/b7dac56b973d2c43b6d535b15881abb118d08e49/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Metis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/b7dac56b973d2c43b6d535b15881abb118d08e49/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Base_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol), [AaveV3Gnosis](https://github.com/bgd-labs/aave-proposals-v3/blob/b7dac56b973d2c43b6d535b15881abb118d08e49/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Gnosis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol), [AaveV3Scroll](https://github.com/bgd-labs/aave-proposals-v3/blob/b7dac56b973d2c43b6d535b15881abb118d08e49/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Scroll_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol), [AaveV3BNB](https://github.com/bgd-labs/aave-proposals-v3/blob/b7dac56b973d2c43b6d535b15881abb118d08e49/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3BNB_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol), [AaveV3ZkSync](https://github.com/bgd-labs/aave-proposals-v3/blob/b7dac56b973d2c43b6d535b15881abb118d08e49/zksync/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3ZkSync_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol) +- Tests: [AaveV2Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/b7dac56b973d2c43b6d535b15881abb118d08e49/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV2Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol), [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/b7dac56b973d2c43b6d535b15881abb118d08e49/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/b7dac56b973d2c43b6d535b15881abb118d08e49/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3EthereumLido_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol), [AaveV3EthereumEtherFi](https://github.com/bgd-labs/aave-proposals-v3/blob/b7dac56b973d2c43b6d535b15881abb118d08e49/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3EthereumEtherFi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol), [AaveV3Polygon](https://github.com/bgd-labs/aave-proposals-v3/blob/b7dac56b973d2c43b6d535b15881abb118d08e49/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Polygon_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol), [AaveV3Avalanche](https://github.com/bgd-labs/aave-proposals-v3/blob/b7dac56b973d2c43b6d535b15881abb118d08e49/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Avalanche_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol), [AaveV3Optimism](https://github.com/bgd-labs/aave-proposals-v3/blob/b7dac56b973d2c43b6d535b15881abb118d08e49/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Optimism_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol), [AaveV3Arbitrum](https://github.com/bgd-labs/aave-proposals-v3/blob/b7dac56b973d2c43b6d535b15881abb118d08e49/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Arbitrum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol), [AaveV3Metis](https://github.com/bgd-labs/aave-proposals-v3/blob/b7dac56b973d2c43b6d535b15881abb118d08e49/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Metis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol), [AaveV3Base](https://github.com/bgd-labs/aave-proposals-v3/blob/b7dac56b973d2c43b6d535b15881abb118d08e49/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Base_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol), [AaveV3Gnosis](https://github.com/bgd-labs/aave-proposals-v3/blob/b7dac56b973d2c43b6d535b15881abb118d08e49/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Gnosis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol), [AaveV3Scroll](https://github.com/bgd-labs/aave-proposals-v3/blob/b7dac56b973d2c43b6d535b15881abb118d08e49/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3Scroll_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol), [AaveV3BNB](https://github.com/bgd-labs/aave-proposals-v3/blob/b7dac56b973d2c43b6d535b15881abb118d08e49/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3BNB_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol), [AaveV3ZkSync](https://github.com/bgd-labs/aave-proposals-v3/blob/b7dac56b973d2c43b6d535b15881abb118d08e49/zksync/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3ZkSync_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol) +- Snapshot: Direct-to-AIP +- [Discussion](https://governance.aave.com/t/arfc-increase-borrow-slope1-to-all-stablecoins-across-all-aave-instances/19979) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.s.sol b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.s.sol new file mode 100644 index 000000000..9cb90812e --- /dev/null +++ b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.s.sol @@ -0,0 +1,391 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {GovernanceV3ZkSync} from 'aave-address-book/GovernanceV3ZkSync.sol'; + +import {EthereumScript, PolygonScript, AvalancheScript, OptimismScript, ArbitrumScript, MetisScript, BaseScript, GnosisScript, ScrollScript, BNBScript, ChainIds} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV2Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201} from './AaveV2Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol'; +import {AaveV3Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201} from './AaveV3Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol'; +import {AaveV3EthereumLido_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201} from './AaveV3EthereumLido_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol'; +import {AaveV3EthereumEtherFi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201} from './AaveV3EthereumEtherFi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol'; +import {AaveV3Polygon_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201} from './AaveV3Polygon_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol'; +import {AaveV3Avalanche_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201} from './AaveV3Avalanche_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol'; +import {AaveV3Optimism_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201} from './AaveV3Optimism_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol'; +import {AaveV3Arbitrum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201} from './AaveV3Arbitrum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol'; +import {AaveV3Metis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201} from './AaveV3Metis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol'; +import {AaveV3Base_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201} from './AaveV3Base_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol'; +import {AaveV3Gnosis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201} from './AaveV3Gnosis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol'; +import {AaveV3Scroll_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201} from './AaveV3Scroll_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol'; +import {AaveV3BNB_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201} from './AaveV3BNB_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV2Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201) + .creationCode + ); + address payload1 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201) + .creationCode + ); + address payload2 = GovV3Helpers.deployDeterministic( + type(AaveV3EthereumLido_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201) + .creationCode + ); + address payload3 = GovV3Helpers.deployDeterministic( + type( + AaveV3EthereumEtherFi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 + ).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](4); + actions[0] = GovV3Helpers.buildAction(payload0); + actions[1] = GovV3Helpers.buildAction(payload1); + actions[2] = GovV3Helpers.buildAction(payload2); + actions[3] = GovV3Helpers.buildAction(payload3); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Polygon + * deploy-command: make deploy-ledger contract=src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.s.sol:DeployPolygon chain=polygon + * verify-command: FOUNDRY_PROFILE=polygon npx catapulta-verify -b broadcast/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.s.sol/137/run-latest.json + */ +contract DeployPolygon is PolygonScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Polygon_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201) + .creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Avalanche + * deploy-command: make deploy-ledger contract=src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.s.sol:DeployAvalanche chain=avalanche + * verify-command: FOUNDRY_PROFILE=avalanche npx catapulta-verify -b broadcast/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.s.sol/43114/run-latest.json + */ +contract DeployAvalanche is AvalancheScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Avalanche_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201) + .creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Optimism + * deploy-command: make deploy-ledger contract=src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.s.sol:DeployOptimism chain=optimism + * verify-command: FOUNDRY_PROFILE=optimism npx catapulta-verify -b broadcast/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.s.sol/10/run-latest.json + */ +contract DeployOptimism is OptimismScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Optimism_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201) + .creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Arbitrum + * deploy-command: make deploy-ledger contract=src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.s.sol:DeployArbitrum chain=arbitrum + * verify-command: FOUNDRY_PROFILE=arbitrum npx catapulta-verify -b broadcast/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.s.sol/42161/run-latest.json + */ +contract DeployArbitrum is ArbitrumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Arbitrum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201) + .creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Metis + * deploy-command: make deploy-ledger contract=src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.s.sol:DeployMetis chain=metis + * verify-command: FOUNDRY_PROFILE=metis npx catapulta-verify -b broadcast/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.s.sol/1088/run-latest.json + */ +contract DeployMetis is MetisScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Metis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201) + .creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Base + * deploy-command: make deploy-ledger contract=src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.s.sol:DeployBase chain=base + * verify-command: FOUNDRY_PROFILE=base npx catapulta-verify -b broadcast/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.s.sol/8453/run-latest.json + */ +contract DeployBase is BaseScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Base_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201) + .creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Gnosis + * deploy-command: make deploy-ledger contract=src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.s.sol:DeployGnosis chain=gnosis + * verify-command: FOUNDRY_PROFILE=gnosis npx catapulta-verify -b broadcast/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.s.sol/100/run-latest.json + */ +contract DeployGnosis is GnosisScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Gnosis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201) + .creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy Scroll + * deploy-command: make deploy-ledger contract=src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.s.sol:DeployScroll chain=scroll + * verify-command: FOUNDRY_PROFILE=scroll npx catapulta-verify -b broadcast/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.s.sol/534352/run-latest.json + */ +contract DeployScroll is ScrollScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Scroll_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201) + .creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Deploy BNB + * deploy-command: make deploy-ledger contract=src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.s.sol:DeployBNB chain=bnb + * verify-command: FOUNDRY_PROFILE=bnb npx catapulta-verify -b broadcast/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.s.sol/56/run-latest.json + */ +contract DeployBNB is BNBScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3BNB_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201) + .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/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.s.sol:CreateProposal chain=mainnet + */ +contract CreateProposal is EthereumScript { + function run() external { + // create payloads + PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](11); + + // compose actions for validation + IPayloadsControllerCore.ExecutionAction[] + memory actionsEthereum = new IPayloadsControllerCore.ExecutionAction[](4); + actionsEthereum[0] = GovV3Helpers.buildAction( + type(AaveV2Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201) + .creationCode + ); + actionsEthereum[1] = GovV3Helpers.buildAction( + type(AaveV3Ethereum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201) + .creationCode + ); + actionsEthereum[2] = GovV3Helpers.buildAction( + type(AaveV3EthereumLido_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201) + .creationCode + ); + actionsEthereum[3] = GovV3Helpers.buildAction( + type( + AaveV3EthereumEtherFi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 + ).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsPolygon = new IPayloadsControllerCore.ExecutionAction[](1); + actionsPolygon[0] = GovV3Helpers.buildAction( + type(AaveV3Polygon_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201) + .creationCode + ); + payloads[1] = GovV3Helpers.buildPolygonPayload(vm, actionsPolygon); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsAvalanche = new IPayloadsControllerCore.ExecutionAction[](1); + actionsAvalanche[0] = GovV3Helpers.buildAction( + type(AaveV3Avalanche_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201) + .creationCode + ); + payloads[2] = GovV3Helpers.buildAvalanchePayload(vm, actionsAvalanche); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsOptimism = new IPayloadsControllerCore.ExecutionAction[](1); + actionsOptimism[0] = GovV3Helpers.buildAction( + type(AaveV3Optimism_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201) + .creationCode + ); + payloads[3] = GovV3Helpers.buildOptimismPayload(vm, actionsOptimism); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsArbitrum = new IPayloadsControllerCore.ExecutionAction[](1); + actionsArbitrum[0] = GovV3Helpers.buildAction( + type(AaveV3Arbitrum_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201) + .creationCode + ); + payloads[4] = GovV3Helpers.buildArbitrumPayload(vm, actionsArbitrum); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsMetis = new IPayloadsControllerCore.ExecutionAction[](1); + actionsMetis[0] = GovV3Helpers.buildAction( + type(AaveV3Metis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201) + .creationCode + ); + payloads[5] = GovV3Helpers.buildMetisPayload(vm, actionsMetis); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsBase = new IPayloadsControllerCore.ExecutionAction[](1); + actionsBase[0] = GovV3Helpers.buildAction( + type(AaveV3Base_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201) + .creationCode + ); + payloads[6] = GovV3Helpers.buildBasePayload(vm, actionsBase); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsGnosis = new IPayloadsControllerCore.ExecutionAction[](1); + actionsGnosis[0] = GovV3Helpers.buildAction( + type(AaveV3Gnosis_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201) + .creationCode + ); + payloads[7] = GovV3Helpers.buildGnosisPayload(vm, actionsGnosis); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsScroll = new IPayloadsControllerCore.ExecutionAction[](1); + actionsScroll[0] = GovV3Helpers.buildAction( + type(AaveV3Scroll_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201) + .creationCode + ); + payloads[8] = GovV3Helpers.buildScrollPayload(vm, actionsScroll); + + IPayloadsControllerCore.ExecutionAction[] + memory actionsBNB = new IPayloadsControllerCore.ExecutionAction[](1); + actionsBNB[0] = GovV3Helpers.buildAction( + type(AaveV3BNB_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201) + .creationCode + ); + payloads[9] = GovV3Helpers.buildBNBPayload(vm, actionsBNB); + + payloads[10] = PayloadsControllerUtils.Payload({ + chain: ChainIds.ZKSYNC, + accessLevel: PayloadsControllerUtils.AccessControl.Level_1, + payloadsController: address(GovernanceV3ZkSync.PAYLOADS_CONTROLLER), + payloadId: 9 + }); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances.md' + ) + ); + } +} diff --git a/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/config.ts b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/config.ts new file mode 100644 index 000000000..bd44f9ca7 --- /dev/null +++ b/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/config.ts @@ -0,0 +1,607 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + configFile: + 'src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/config.ts', + update: true, + force: true, + author: 'Aave Chan Initiative', + pools: [ + 'AaveV2Ethereum', + 'AaveV3Ethereum', + 'AaveV3EthereumLido', + 'AaveV3EthereumEtherFi', + 'AaveV3Polygon', + 'AaveV3Avalanche', + 'AaveV3Optimism', + 'AaveV3Arbitrum', + 'AaveV3Metis', + 'AaveV3Base', + 'AaveV3Gnosis', + 'AaveV3Scroll', + 'AaveV3BNB', + 'AaveV3ZkSync', + ], + title: 'Increase Borrow Slope1 to all Stablecoins across all Aave Instances', + shortName: 'IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances', + date: '20241201', + discussion: + 'https://governance.aave.com/t/arfc-increase-borrow-slope1-to-all-stablecoins-across-all-aave-instances/19979', + snapshot: 'Direct-to-AIP', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV2Ethereum: { + configs: { + RATE_UPDATE_V2: [ + { + asset: 'USDT', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '', + stableRateSlope1: '', + stableRateSlope2: '', + }, + }, + { + asset: 'DAI', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '', + stableRateSlope1: '', + stableRateSlope2: '', + }, + }, + { + asset: 'USDC', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '', + stableRateSlope1: '', + stableRateSlope2: '', + }, + }, + ], + }, + cache: {blockNumber: 21346502}, + }, + AaveV3Ethereum: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'USDC', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '35', + }, + }, + { + asset: 'DAI', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '35', + }, + }, + { + asset: 'USDT', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '35', + }, + }, + { + asset: 'LUSD', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '50', + }, + }, + { + asset: 'FRAX', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '40', + }, + }, + { + asset: 'crvUSD', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '50', + }, + }, + { + asset: 'PYUSD', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '50', + }, + }, + { + asset: 'USDe', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '50', + }, + }, + ], + }, + cache: {blockNumber: 21346502}, + }, + AaveV3EthereumLido: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'USDC', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '35', + }, + }, + ], + }, + cache: {blockNumber: 21346502}, + }, + AaveV3EthereumEtherFi: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'USDC', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '40', + }, + }, + { + asset: 'PYUSD', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '40', + }, + }, + { + asset: 'FRAX', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '40', + }, + }, + ], + }, + cache: {blockNumber: 21346502}, + }, + AaveV3Polygon: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'DAI', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '40', + }, + }, + { + asset: 'USDC', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '13.5', + variableRateSlope2: '40', + }, + }, + { + asset: 'USDT', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '40', + }, + }, + { + asset: 'EURS', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '50', + }, + }, + { + asset: 'USDCn', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '40', + }, + }, + ], + }, + cache: {blockNumber: 65170205}, + }, + AaveV3Avalanche: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'DAIe', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '40', + }, + }, + { + asset: 'USDC', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '40', + }, + }, + { + asset: 'USDt', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '40', + }, + }, + { + asset: 'FRAX', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '40', + }, + }, + ], + }, + cache: {blockNumber: 54018606}, + }, + AaveV3Optimism: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'DAI', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '40', + }, + }, + { + asset: 'USDC', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '13.5', + variableRateSlope2: '40', + }, + }, + { + asset: 'USDT', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '40', + }, + }, + { + asset: 'sUSD', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '50', + }, + }, + { + asset: 'LUSD', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '50', + }, + }, + { + asset: 'USDCn', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '40', + }, + }, + ], + }, + cache: {blockNumber: 128963066}, + }, + AaveV3Arbitrum: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'DAI', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '40', + }, + }, + { + asset: 'USDC', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '13.5', + variableRateSlope2: '40', + }, + }, + { + asset: 'USDT', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '40', + }, + }, + { + asset: 'LUSD', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '50', + }, + }, + { + asset: 'USDCn', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '40', + }, + }, + { + asset: 'FRAX', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '40', + }, + }, + { + asset: 'GHO', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '40', + }, + }, + ], + }, + cache: {blockNumber: 282086445}, + }, + AaveV3Metis: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'mDAI', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '50', + }, + }, + { + asset: 'mUSDC', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '40', + }, + }, + { + asset: 'mUSDT', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '40', + }, + }, + ], + }, + cache: {blockNumber: 19121761}, + }, + AaveV3Base: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'USDbC', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '13.5', + variableRateSlope2: '40', + }, + }, + { + asset: 'USDC', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '40', + }, + }, + ], + }, + cache: {blockNumber: 23367782}, + }, + AaveV3Gnosis: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'USDC', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '40', + }, + }, + { + asset: 'WXDAI', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '40', + }, + }, + { + asset: 'EURe', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '50', + }, + }, + { + asset: 'USDCe', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '13.5', + variableRateSlope2: '40', + }, + }, + ], + }, + cache: {blockNumber: 37394270}, + }, + AaveV3Scroll: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'USDC', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '40', + }, + }, + ], + }, + cache: {blockNumber: 11705779}, + }, + AaveV3BNB: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'USDC', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '40', + }, + }, + { + asset: 'USDT', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '40', + }, + }, + { + asset: 'FDUSD', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '40', + }, + }, + ], + }, + cache: {blockNumber: 44648014}, + }, + AaveV3ZkSync: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'USDC', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '40', + }, + }, + { + asset: 'USDT', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '12.5', + variableRateSlope2: '40', + }, + }, + ], + }, + cache: {blockNumber: 50675012}, + }, + }, +}; diff --git a/src/20241203_AaveV3Scroll_OnboardSCRToAaveV3Scroll/AaveV3Scroll_OnboardSCRToAaveV3Scroll_20241203.sol b/src/20241203_AaveV3Scroll_OnboardSCRToAaveV3Scroll/AaveV3Scroll_OnboardSCRToAaveV3Scroll_20241203.sol new file mode 100644 index 000000000..cc82e9d92 --- /dev/null +++ b/src/20241203_AaveV3Scroll_OnboardSCRToAaveV3Scroll/AaveV3Scroll_OnboardSCRToAaveV3Scroll_20241203.sol @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Scroll} from 'aave-address-book/AaveV3Scroll.sol'; +import {AaveV3PayloadScroll} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadScroll.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol'; +import {IEmissionManager} from 'aave-v3-origin/contracts/rewards/interfaces/IEmissionManager.sol'; +/** + * @title Onboard SCR to Aave V3 Scroll + * @author ACI + * - Snapshot: https://snapshot.org/#/aave.eth/proposal/0xef7dfa4e96e5f6a7337648d2dd3882f7b10e969c9564c118a34ce99eccec9383 + * - Discussion: https://governance.aave.com/t/arfc-onboard-scr-to-aave-v3-scroll-instance/19688 + */ +contract AaveV3Scroll_OnboardSCRToAaveV3Scroll_20241203 is AaveV3PayloadScroll { + using SafeERC20 for IERC20; + + address public constant SCR = 0xd29687c813D741E2F938F4aC377128810E217b1b; + uint256 public constant SCR_SEED_AMOUNT = 100 * 1e18; + address public constant SCR_ADMIN = 0xac140648435d03f784879cd789130F22Ef588Fcd; + + function _postExecute() internal override { + IERC20(SCR).forceApprove(address(AaveV3Scroll.POOL), SCR_SEED_AMOUNT); + AaveV3Scroll.POOL.supply(SCR, SCR_SEED_AMOUNT, address(AaveV3Scroll.COLLECTOR), 0); + + (address aSCR, , ) = AaveV3Scroll.AAVE_PROTOCOL_DATA_PROVIDER.getReserveTokensAddresses(SCR); + IEmissionManager(AaveV3Scroll.EMISSION_MANAGER).setEmissionAdmin(SCR, SCR_ADMIN); + IEmissionManager(AaveV3Scroll.EMISSION_MANAGER).setEmissionAdmin(aSCR, SCR_ADMIN); + } + + function newListings() public pure override returns (IAaveV3ConfigEngine.Listing[] memory) { + IAaveV3ConfigEngine.Listing[] memory listings = new IAaveV3ConfigEngine.Listing[](1); + + listings[0] = IAaveV3ConfigEngine.Listing({ + asset: SCR, + assetSymbol: 'SCR', + priceFeed: 0x26f6F7C468EE309115d19Aa2055db5A74F8cE7A5, + enabledToBorrow: EngineFlags.ENABLED, + borrowableInIsolation: EngineFlags.DISABLED, + withSiloedBorrowing: EngineFlags.DISABLED, + flashloanable: EngineFlags.ENABLED, + ltv: 0, + liqThreshold: 0, + liqBonus: 0, + reserveFactor: 20_00, + supplyCap: 360_000, + borrowCap: 180_000, + debtCeiling: 0, + liqProtocolFee: 0, + rateStrategyParams: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: 45_00, + baseVariableBorrowRate: 0, + variableRateSlope1: 7_00, + variableRateSlope2: 300_00 + }) + }); + + return listings; + } +} diff --git a/src/20241203_AaveV3Scroll_OnboardSCRToAaveV3Scroll/AaveV3Scroll_OnboardSCRToAaveV3Scroll_20241203.t.sol b/src/20241203_AaveV3Scroll_OnboardSCRToAaveV3Scroll/AaveV3Scroll_OnboardSCRToAaveV3Scroll_20241203.t.sol new file mode 100644 index 000000000..32c9af025 --- /dev/null +++ b/src/20241203_AaveV3Scroll_OnboardSCRToAaveV3Scroll/AaveV3Scroll_OnboardSCRToAaveV3Scroll_20241203.t.sol @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3Scroll} from 'aave-address-book/AaveV3Scroll.sol'; +import {GovernanceV3Scroll} from 'aave-address-book/GovernanceV3Scroll.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {IEmissionManager} from 'aave-v3-origin/contracts/rewards/interfaces/IEmissionManager.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Scroll_OnboardSCRToAaveV3Scroll_20241203} from './AaveV3Scroll_OnboardSCRToAaveV3Scroll_20241203.sol'; + +/** + * @dev Test for AaveV3Scroll_OnboardSCRToAaveV3Scroll_20241203 + * command: FOUNDRY_PROFILE=scroll forge test --match-path=src/20241203_AaveV3Scroll_OnboardSCRToAaveV3Scroll/AaveV3Scroll_OnboardSCRToAaveV3Scroll_20241203.t.sol -vv + */ +contract AaveV3Scroll_OnboardSCRToAaveV3Scroll_20241203_Test is ProtocolV3TestBase { + AaveV3Scroll_OnboardSCRToAaveV3Scroll_20241203 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('scroll'), 11609572); + proposal = new AaveV3Scroll_OnboardSCRToAaveV3Scroll_20241203(); + + // Simulate SEED funds + address SCR_WHALE = 0x212499E4E77484E565E1965Ea220D30B1c469233; + vm.startPrank(SCR_WHALE); + IERC20(proposal.SCR()).transfer(GovernanceV3Scroll.EXECUTOR_LVL_1, proposal.SCR_SEED_AMOUNT()); + vm.stopPrank(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Scroll_OnboardSCRToAaveV3Scroll_20241203', + AaveV3Scroll.POOL, + address(proposal) + ); + } + + function test_collectorHasSCRFunds() public { + GovV3Helpers.executePayload(vm, address(proposal)); + (address aTokenAddress, , ) = AaveV3Scroll + .AAVE_PROTOCOL_DATA_PROVIDER + .getReserveTokensAddresses(proposal.SCR()); + assertGe(IERC20(aTokenAddress).balanceOf(address(AaveV3Scroll.COLLECTOR)), 100 * 10 ** 18); + } + + function test_SCRAdmin() public { + GovV3Helpers.executePayload(vm, address(proposal)); + (address aSCR, , ) = AaveV3Scroll.AAVE_PROTOCOL_DATA_PROVIDER.getReserveTokensAddresses( + proposal.SCR() + ); + assertEq( + IEmissionManager(AaveV3Scroll.EMISSION_MANAGER).getEmissionAdmin(proposal.SCR()), + proposal.SCR_ADMIN() + ); + assertEq( + IEmissionManager(AaveV3Scroll.EMISSION_MANAGER).getEmissionAdmin(aSCR), + proposal.SCR_ADMIN() + ); + } +} diff --git a/src/20241203_AaveV3Scroll_OnboardSCRToAaveV3Scroll/OnboardSCRToAaveV3Scroll.md b/src/20241203_AaveV3Scroll_OnboardSCRToAaveV3Scroll/OnboardSCRToAaveV3Scroll.md new file mode 100644 index 000000000..956c1289e --- /dev/null +++ b/src/20241203_AaveV3Scroll_OnboardSCRToAaveV3Scroll/OnboardSCRToAaveV3Scroll.md @@ -0,0 +1,71 @@ +--- +title: "Onboard SCR to Aave V3 Scroll" +author: "ACI" +discussions: "https://governance.aave.com/t/arfc-onboard-scr-to-aave-v3-scroll-instance/19688" +snapshot: "https://snapshot.org/#/aave.eth/proposal/0xef7dfa4e96e5f6a7337648d2dd3882f7b10e969c9564c118a34ce99eccec9383" +--- + +## Simple Summary + +The current ARFC aims to onboard SCR, the native token of Scroll, on the Aave V3 Scroll Instance. This onboarding will allow Aave users to supply and borrow SCR, thereby enhancing the utility and liquidity of the Scroll token within the DeFi ecosystem and more specifically, within the Aave ecosystem. + +## Motivation + +Scroll is an Ethereum Layer 2 chain which already has an Aave instance deployment and SCR is the governance token for the Scroll L2. By onboarding SCR to Aave V3, we aim to create new opportunities for Aave users to engage with this emerging staking ecosystem, while expanding SCR’s liquidity. + +**Benefits of listing this token:** + +Provide opportunities for Aave users to borrow against their SCR to unlock liquidity, or alternatively to borrow SCR against other collateral allowing them to participate in Scroll governance. + +**Market Impact:** + +We see no significant market impact from onboarding SCR except for providing new opportunities to Aave users which may cause users to switch from borrowing other tokens against their collateral. Overall we see onboarding SCR as net good for Aave users as it expands opportunities for them to engage in a new L2 ecosystem. + +**Chain to be deployed/listed:** + +Scroll. + +**Proof of Liquidity (POL) and Deposit Commitments:** + +POL and Deposit Commitments will be discussed at the ARFC stage. + +As disclosed by Marc Zeller, founder of ACI, the ACI Multisig has received 510K SCR on behalf of Aave DAO. Those funds will be coordinated with Karpatkey and Tokenlogic to define best usage of this airdrop. + +## Specification + +The table below illustrates the configured risk parameters for **SCR** + +| Parameter | Value | +| ------------------------- | -----------------------------------------: | +| Isolation Mode | false | +| Borrowable | ENABLED | +| Collateral Enabled | true | +| Supply Cap (SCR) | 360,000 | +| Borrow Cap (SCR) | 180,000 | +| Debt Ceiling | USD 0 | +| LTV | 0 % | +| LT | 0 % | +| Liquidation Bonus | 0 % | +| Liquidation Protocol Fee | 0 % | +| Reserve Factor | 20 % | +| Base Variable Borrow Rate | 0 % | +| Variable Slope 1 | 7 % | +| Variable Slope 2 | 300 % | +| Uoptimal | 45 % | +| Flashloanable | ENABLED | +| Siloed Borrowing | DISABLED | +| Borrowable in Isolation | DISABLED | +| Oracle | 0x26f6F7C468EE309115d19Aa2055db5A74F8cE7A5 | + +Additionaly [0xac140648435d03f784879cd789130F22Ef588Fcd](https://scrollscan.com/address/0xac140648435d03f784879cd789130F22Ef588Fcd) has been set as the emission admin for SCR and the corresponding aToken. + +## References + +- Implementation: [AaveV3Scroll](https://github.com/bgd-labs/aave-proposals-v3/blob/954b89856136225da3f868e651cc9462b58c76cb/src/20241203_AaveV3Scroll_OnboardSCRToAaveV3Scroll/AaveV3Scroll_OnboardSCRToAaveV3Scroll_20241203.sol) +- Tests: [AaveV3Scroll](https://github.com/bgd-labs/aave-proposals-v3/blob/954b89856136225da3f868e651cc9462b58c76cb/src/20241203_AaveV3Scroll_OnboardSCRToAaveV3Scroll/AaveV3Scroll_OnboardSCRToAaveV3Scroll_20241203.t.sol) +- [Snapshot](https://snapshot.org/#/aave.eth/proposal/0xef7dfa4e96e5f6a7337648d2dd3882f7b10e969c9564c118a34ce99eccec9383) +- [Discussion](https://governance.aave.com/t/arfc-onboard-scr-to-aave-v3-scroll-instance/19688) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241203_AaveV3Scroll_OnboardSCRToAaveV3Scroll/OnboardSCRToAaveV3Scroll_20241203.s.sol b/src/20241203_AaveV3Scroll_OnboardSCRToAaveV3Scroll/OnboardSCRToAaveV3Scroll_20241203.s.sol new file mode 100644 index 000000000..9c29184db --- /dev/null +++ b/src/20241203_AaveV3Scroll_OnboardSCRToAaveV3Scroll/OnboardSCRToAaveV3Scroll_20241203.s.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3Scroll} from 'aave-address-book/AaveV3Scroll.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript, ScrollScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Scroll_OnboardSCRToAaveV3Scroll_20241203} from './AaveV3Scroll_OnboardSCRToAaveV3Scroll_20241203.sol'; + +/** + * @dev Deploy Scroll + * deploy-command: make deploy-ledger contract=src/20241203_AaveV3Scroll_OnboardSCRToAaveV3Scroll/OnboardSCRToAaveV3Scroll_20241203.s.sol:DeployScroll chain=scroll + * verify-command: FOUNDRY_PROFILE=scroll npx catapulta-verify -b broadcast/OnboardSCRToAaveV3Scroll_20241203.s.sol/534352/run-latest.json + */ +contract DeployScroll is ScrollScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Scroll_OnboardSCRToAaveV3Scroll_20241203).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/20241203_AaveV3Scroll_OnboardSCRToAaveV3Scroll/OnboardSCRToAaveV3Scroll_20241203.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_OnboardSCRToAaveV3Scroll_20241203).creationCode + ); + payloads[0] = GovV3Helpers.buildScrollPayload(vm, actionsScroll); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241203_AaveV3Scroll_OnboardSCRToAaveV3Scroll/OnboardSCRToAaveV3Scroll.md' + ) + ); + } +} diff --git a/src/20241203_AaveV3Scroll_OnboardSCRToAaveV3Scroll/config.ts b/src/20241203_AaveV3Scroll_OnboardSCRToAaveV3Scroll/config.ts new file mode 100644 index 000000000..8ade19731 --- /dev/null +++ b/src/20241203_AaveV3Scroll_OnboardSCRToAaveV3Scroll/config.ts @@ -0,0 +1,48 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3Scroll'], + title: 'Onboard SCR to Aave V3 Scroll', + shortName: 'OnboardSCRToAaveV3Scroll', + date: '20241203', + author: 'ACI', + discussion: 'https://governance.aave.com/t/arfc-onboard-scr-to-aave-v3-scroll-instance/19688', + snapshot: + 'https://snapshot.org/#/aave.eth/proposal/0xef7dfa4e96e5f6a7337648d2dd3882f7b10e969c9564c118a34ce99eccec9383', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Scroll: { + configs: { + ASSET_LISTING: [ + { + assetSymbol: 'SCR', + decimals: 18, + priceFeed: '0x26f6F7C468EE309115d19Aa2055db5A74F8cE7A5', + ltv: '0', + liqThreshold: '0', + liqBonus: '0', + debtCeiling: '0', + liqProtocolFee: '0', + enabledToBorrow: 'ENABLED', + flashloanable: 'ENABLED', + borrowableInIsolation: 'DISABLED', + withSiloedBorrowing: 'DISABLED', + reserveFactor: '20', + supplyCap: '360000', + borrowCap: '180000', + rateStrategyParams: { + optimalUtilizationRate: '45', + baseVariableBorrowRate: '0', + variableRateSlope1: '7', + variableRateSlope2: '300', + }, + asset: '0xd29687c813D741E2F938F4aC377128810E217b1b', + admin: '0xac140648435d03f784879cd789130F22Ef588Fcd', + }, + ], + }, + cache: {blockNumber: 11609572}, + }, + }, +}; diff --git a/src/20241203_Multi_WstETHReserveUpdate/AaveV3EthereumLido_WstETHReserveUpdate_20241203.sol b/src/20241203_Multi_WstETHReserveUpdate/AaveV3EthereumLido_WstETHReserveUpdate_20241203.sol new file mode 100644 index 000000000..b5a2d55cb --- /dev/null +++ b/src/20241203_Multi_WstETHReserveUpdate/AaveV3EthereumLido_WstETHReserveUpdate_20241203.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumLidoAssets} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {AaveV3PayloadEthereumLido} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereumLido.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title wstETH Reserve Update + * @author ACI + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-prime-core-instance-wsteth-reserve-update/19973 + */ +contract AaveV3EthereumLido_WstETHReserveUpdate_20241203 is AaveV3PayloadEthereumLido { + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV3ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](1); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumLidoAssets.wstETH_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: 90_00, + baseVariableBorrowRate: 0, + variableRateSlope1: 1_75, + variableRateSlope2: 85_00 + }) + }); + + return rateStrategies; + } +} diff --git a/src/20241203_Multi_WstETHReserveUpdate/AaveV3EthereumLido_WstETHReserveUpdate_20241203.t.sol b/src/20241203_Multi_WstETHReserveUpdate/AaveV3EthereumLido_WstETHReserveUpdate_20241203.t.sol new file mode 100644 index 000000000..1a4f50983 --- /dev/null +++ b/src/20241203_Multi_WstETHReserveUpdate/AaveV3EthereumLido_WstETHReserveUpdate_20241203.t.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumLido} from 'aave-address-book/AaveV3EthereumLido.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3EthereumLido_WstETHReserveUpdate_20241203} from './AaveV3EthereumLido_WstETHReserveUpdate_20241203.sol'; + +/** + * @dev Test for AaveV3EthereumLido_WstETHReserveUpdate_20241203 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241203_Multi_WstETHReserveUpdate/AaveV3EthereumLido_WstETHReserveUpdate_20241203.t.sol -vv + */ +contract AaveV3EthereumLido_WstETHReserveUpdate_20241203_Test is ProtocolV3TestBase { + AaveV3EthereumLido_WstETHReserveUpdate_20241203 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21322524); + proposal = new AaveV3EthereumLido_WstETHReserveUpdate_20241203(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3EthereumLido_WstETHReserveUpdate_20241203', + AaveV3EthereumLido.POOL, + address(proposal) + ); + } +} diff --git a/src/20241203_Multi_WstETHReserveUpdate/AaveV3Ethereum_WstETHReserveUpdate_20241203.sol b/src/20241203_Multi_WstETHReserveUpdate/AaveV3Ethereum_WstETHReserveUpdate_20241203.sol new file mode 100644 index 000000000..bb0494603 --- /dev/null +++ b/src/20241203_Multi_WstETHReserveUpdate/AaveV3Ethereum_WstETHReserveUpdate_20241203.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV3PayloadEthereum} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereum.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title wstETH Reserve Update + * @author ACI + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-prime-core-instance-wsteth-reserve-update/19973 + */ +contract AaveV3Ethereum_WstETHReserveUpdate_20241203 is AaveV3PayloadEthereum { + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV3ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](1); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumAssets.wstETH_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: 80_00, + baseVariableBorrowRate: 0, + variableRateSlope1: 1_75, + variableRateSlope2: 85_00 + }) + }); + + return rateStrategies; + } +} diff --git a/src/20241203_Multi_WstETHReserveUpdate/AaveV3Ethereum_WstETHReserveUpdate_20241203.t.sol b/src/20241203_Multi_WstETHReserveUpdate/AaveV3Ethereum_WstETHReserveUpdate_20241203.t.sol new file mode 100644 index 000000000..6c2de8f31 --- /dev/null +++ b/src/20241203_Multi_WstETHReserveUpdate/AaveV3Ethereum_WstETHReserveUpdate_20241203.t.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Ethereum} from 'aave-address-book/AaveV3Ethereum.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Ethereum_WstETHReserveUpdate_20241203} from './AaveV3Ethereum_WstETHReserveUpdate_20241203.sol'; + +/** + * @dev Test for AaveV3Ethereum_WstETHReserveUpdate_20241203 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241203_Multi_WstETHReserveUpdate/AaveV3Ethereum_WstETHReserveUpdate_20241203.t.sol -vv + */ +contract AaveV3Ethereum_WstETHReserveUpdate_20241203_Test is ProtocolV3TestBase { + AaveV3Ethereum_WstETHReserveUpdate_20241203 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21322520); + proposal = new AaveV3Ethereum_WstETHReserveUpdate_20241203(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_WstETHReserveUpdate_20241203', + AaveV3Ethereum.POOL, + address(proposal) + ); + } +} diff --git a/src/20241203_Multi_WstETHReserveUpdate/WstETHReserveUpdate.md b/src/20241203_Multi_WstETHReserveUpdate/WstETHReserveUpdate.md new file mode 100644 index 000000000..572a72ff3 --- /dev/null +++ b/src/20241203_Multi_WstETHReserveUpdate/WstETHReserveUpdate.md @@ -0,0 +1,59 @@ +--- +title: "wstETH Reserve Update" +author: "ACI" +discussions: "https://governance.aave.com/t/arfc-prime-core-instance-wsteth-reserve-update/19973" +snapshot: Direct-to-AIP +--- + +## Simple Summary + +The publication using the Direct-to-AIP process, proposes increasing the capital efficiency of the wstETH Reserve on both Prime and Core instances of Aave v3. This is a Direct to AIP proposal. + +## Motivation + +### Prime Instance + +The addition of ezETH has resulted in over $620M in direct deposits and approximately $520M in wstETH debt. With yield from EIGEN decreasing and Renzo’s Season 3 rewards nearing expiration, this publication proposes amending the wstETH Reserve parameters to enhance capital efficiency and support user retention. + +We have engaged with several builders and investors with significant capital deployed on the Prime instance. Currently, leveraged ezETH/wstETH users are primarily sustained by Renzo’s Season 3 rewards, which are set to expire soon. While an additional $100M of USDS is expected in the coming days, this alone will not be sufficient to retain existing users. + +### Core Instance + +Based on strong demand for wstETH following the rsETH onboarding, this proposal, when implemented, will make a larger portion of wstETH liquidity available. + +Discussions with the Kelp team and various investors indicate significant demand wstETH deb by rsETH holders. To accelerate Aave’s growth, the Uoptimal on the wstETH Reserve is be adjusted higher to make available a greater portion of the wstETH liquidity. + +## Specification + +### Prime Instance + +**wstETH Reserve** + +| Parameter | Current Value | Proposed Value | +| --------- | ------------- | -------------- | +| Uoptimal | 80.00% | 90.00% | +| Base | 0.00% | 0.00% | +| Slope1 | 2.25% | 1.75% | +| Slope2 | 85.00% | 85.00% | + +### Core Instance + +**wstETH Reserve** + +| Parameter | Current Value | Proposed Value | +| --------- | ------------- | -------------- | +| Uoptimal | 45.00% | 80.00% | +| Base | 0.00% | 0.00% | +| Slope1 | 2.00% | 1.75% | +| Slope2 | 85.00% | 85.00% | + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/b8f760271a3e490729bd63b21964778e90288478/src/20241203_Multi_WstETHReserveUpdate/AaveV3Ethereum_WstETHReserveUpdate_20241203.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/b8f760271a3e490729bd63b21964778e90288478/src/20241203_Multi_WstETHReserveUpdate/AaveV3EthereumLido_WstETHReserveUpdate_20241203.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/b8f760271a3e490729bd63b21964778e90288478/src/20241203_Multi_WstETHReserveUpdate/AaveV3Ethereum_WstETHReserveUpdate_20241203.t.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/b8f760271a3e490729bd63b21964778e90288478/src/20241203_Multi_WstETHReserveUpdate/AaveV3EthereumLido_WstETHReserveUpdate_20241203.t.sol) +- Snapshot: Direct-to-AIP +- [Discussion](https://governance.aave.com/t/arfc-prime-core-instance-wsteth-reserve-update/19973) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241203_Multi_WstETHReserveUpdate/WstETHReserveUpdate_20241203.s.sol b/src/20241203_Multi_WstETHReserveUpdate/WstETHReserveUpdate_20241203.s.sol new file mode 100644 index 000000000..7ee7e3bc4 --- /dev/null +++ b/src/20241203_Multi_WstETHReserveUpdate/WstETHReserveUpdate_20241203.s.sol @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Ethereum_WstETHReserveUpdate_20241203} from './AaveV3Ethereum_WstETHReserveUpdate_20241203.sol'; +import {AaveV3EthereumLido_WstETHReserveUpdate_20241203} from './AaveV3EthereumLido_WstETHReserveUpdate_20241203.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241203_Multi_WstETHReserveUpdate/WstETHReserveUpdate_20241203.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/WstETHReserveUpdate_20241203.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_WstETHReserveUpdate_20241203).creationCode + ); + address payload1 = GovV3Helpers.deployDeterministic( + type(AaveV3EthereumLido_WstETHReserveUpdate_20241203).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](2); + actions[0] = GovV3Helpers.buildAction(payload0); + actions[1] = GovV3Helpers.buildAction(payload1); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Create Proposal + * command: make deploy-ledger contract=src/20241203_Multi_WstETHReserveUpdate/WstETHReserveUpdate_20241203.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[](2); + actionsEthereum[0] = GovV3Helpers.buildAction( + type(AaveV3Ethereum_WstETHReserveUpdate_20241203).creationCode + ); + actionsEthereum[1] = GovV3Helpers.buildAction( + type(AaveV3EthereumLido_WstETHReserveUpdate_20241203).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile(vm, 'src/20241203_Multi_WstETHReserveUpdate/WstETHReserveUpdate.md') + ); + } +} diff --git a/src/20241203_Multi_WstETHReserveUpdate/config.ts b/src/20241203_Multi_WstETHReserveUpdate/config.ts new file mode 100644 index 000000000..b3101e140 --- /dev/null +++ b/src/20241203_Multi_WstETHReserveUpdate/config.ts @@ -0,0 +1,48 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3Ethereum', 'AaveV3EthereumLido'], + title: 'wstETH Reserve Update', + shortName: 'WstETHReserveUpdate', + date: '20241203', + author: 'ACI', + discussion: + 'https://governance.aave.com/t/arfc-prime-core-instance-wsteth-reserve-update/19973', + snapshot: '', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Ethereum: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'wstETH', + params: { + optimalUtilizationRate: '80', + baseVariableBorrowRate: '0', + variableRateSlope1: '1.75', + variableRateSlope2: '85', + }, + }, + ], + }, + cache: {blockNumber: 21322520}, + }, + AaveV3EthereumLido: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'wstETH', + params: { + optimalUtilizationRate: '90', + baseVariableBorrowRate: '0', + variableRateSlope1: '1.75', + variableRateSlope2: '85', + }, + }, + ], + }, + cache: {blockNumber: 21322524}, + }, + }, +}; diff --git a/src/20241205_AaveV3EthereumLido_OnboardRsETHToLidoInstance/AaveV3EthereumLido_OnboardRsETHToLidoInstance_20241205.sol b/src/20241205_AaveV3EthereumLido_OnboardRsETHToLidoInstance/AaveV3EthereumLido_OnboardRsETHToLidoInstance_20241205.sol new file mode 100644 index 000000000..d3196ded2 --- /dev/null +++ b/src/20241205_AaveV3EthereumLido_OnboardRsETHToLidoInstance/AaveV3EthereumLido_OnboardRsETHToLidoInstance_20241205.sol @@ -0,0 +1,112 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumLido, AaveV3EthereumLidoAssets, AaveV3EthereumLidoEModes} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {AaveV3PayloadEthereumLido} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereumLido.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol'; +import {IEmissionManager} from 'aave-v3-origin/contracts/rewards/interfaces/IEmissionManager.sol'; +/** + * @title Onboard rsETH to Lido Instance + * @author ACI + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-add-rseth-to-aave-v3-ethereum/17696/18 + */ +contract AaveV3EthereumLido_OnboardRsETHToLidoInstance_20241205 is AaveV3PayloadEthereumLido { + using SafeERC20 for IERC20; + + address public constant rsETH = 0xA1290d69c65A6Fe4DF752f95823fae25cB99e5A7; + uint256 public constant rsETH_SEED_AMOUNT = 0.03 * 1e18; + address public constant rsETH_ADMIN = 0xac140648435d03f784879cd789130F22Ef588Fcd; + + function _postExecute() internal override { + IERC20(rsETH).forceApprove(address(AaveV3EthereumLido.POOL), rsETH_SEED_AMOUNT); + AaveV3EthereumLido.POOL.supply( + rsETH, + rsETH_SEED_AMOUNT, + address(AaveV3EthereumLido.COLLECTOR), + 0 + ); + + (address arsETH, , ) = AaveV3EthereumLido.AAVE_PROTOCOL_DATA_PROVIDER.getReserveTokensAddresses( + rsETH + ); + IEmissionManager(AaveV3EthereumLido.EMISSION_MANAGER).setEmissionAdmin(rsETH, rsETH_ADMIN); + IEmissionManager(AaveV3EthereumLido.EMISSION_MANAGER).setEmissionAdmin(arsETH, rsETH_ADMIN); + } + + function eModeCategoriesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.EModeCategoryUpdate[] memory) + { + IAaveV3ConfigEngine.EModeCategoryUpdate[] + memory eModeUpdates = new IAaveV3ConfigEngine.EModeCategoryUpdate[](1); + + eModeUpdates[0] = IAaveV3ConfigEngine.EModeCategoryUpdate({ + eModeCategory: 5, + ltv: 92_50, + liqThreshold: 94_50, + liqBonus: 1_00, + label: 'rsETH LST main' + }); + + return eModeUpdates; + } + function assetsEModeUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.AssetEModeUpdate[] memory) + { + IAaveV3ConfigEngine.AssetEModeUpdate[] + memory assetEModeUpdates = new IAaveV3ConfigEngine.AssetEModeUpdate[](2); + + assetEModeUpdates[0] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: AaveV3EthereumLidoAssets.wstETH_UNDERLYING, + eModeCategory: 5, + borrowable: EngineFlags.ENABLED, + collateral: EngineFlags.DISABLED + }); + assetEModeUpdates[1] = IAaveV3ConfigEngine.AssetEModeUpdate({ + asset: rsETH, + eModeCategory: 5, + borrowable: EngineFlags.DISABLED, + collateral: EngineFlags.ENABLED + }); + + return assetEModeUpdates; + } + function newListings() public pure override returns (IAaveV3ConfigEngine.Listing[] memory) { + IAaveV3ConfigEngine.Listing[] memory listings = new IAaveV3ConfigEngine.Listing[](1); + + listings[0] = IAaveV3ConfigEngine.Listing({ + asset: rsETH, + assetSymbol: 'rsETH', + priceFeed: 0x47F52B2e43D0386cF161e001835b03Ad49889e3b, + enabledToBorrow: EngineFlags.DISABLED, + borrowableInIsolation: EngineFlags.DISABLED, + withSiloedBorrowing: EngineFlags.DISABLED, + flashloanable: EngineFlags.ENABLED, + ltv: 5, + liqThreshold: 10, + liqBonus: 7_50, + reserveFactor: 15, + supplyCap: 10_000, + borrowCap: 1, + debtCeiling: 0, + liqProtocolFee: 10_00, + rateStrategyParams: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: 1_00, + baseVariableBorrowRate: 0, + variableRateSlope1: 10_00, + variableRateSlope2: 100_00 + }) + }); + + return listings; + } +} diff --git a/src/20241205_AaveV3EthereumLido_OnboardRsETHToLidoInstance/AaveV3EthereumLido_OnboardRsETHToLidoInstance_20241205.t.sol b/src/20241205_AaveV3EthereumLido_OnboardRsETHToLidoInstance/AaveV3EthereumLido_OnboardRsETHToLidoInstance_20241205.t.sol new file mode 100644 index 000000000..44c64b415 --- /dev/null +++ b/src/20241205_AaveV3EthereumLido_OnboardRsETHToLidoInstance/AaveV3EthereumLido_OnboardRsETHToLidoInstance_20241205.t.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; +import {AaveV3EthereumLido} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {IEmissionManager} from 'aave-v3-origin/contracts/rewards/interfaces/IEmissionManager.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3EthereumLido_OnboardRsETHToLidoInstance_20241205} from './AaveV3EthereumLido_OnboardRsETHToLidoInstance_20241205.sol'; + +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; + +/** + * @dev Test for AaveV3EthereumLido_OnboardRsETHToLidoInstance_20241205 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241205_AaveV3EthereumLido_OnboardRsETHToLidoInstance/AaveV3EthereumLido_OnboardRsETHToLidoInstance_20241205.t.sol -vv + */ +contract AaveV3EthereumLido_OnboardRsETHToLidoInstance_20241205_Test is ProtocolV3TestBase { + AaveV3EthereumLido_OnboardRsETHToLidoInstance_20241205 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21365501); + + proposal = new AaveV3EthereumLido_OnboardRsETHToLidoInstance_20241205(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3EthereumLido_OnboardRsETHToLidoInstance_20241205', + AaveV3EthereumLido.POOL, + address(proposal) + ); + } + + function test_collectorHasrsETHFunds() public { + GovV3Helpers.executePayload(vm, address(proposal)); + (address aTokenAddress, , ) = AaveV3EthereumLido + .AAVE_PROTOCOL_DATA_PROVIDER + .getReserveTokensAddresses(proposal.rsETH()); + assertGe( + IERC20(aTokenAddress).balanceOf(address(AaveV3EthereumLido.COLLECTOR)), + 0.03 * 10 ** 18 + ); + } + + function test_rsETHAdmin() public { + GovV3Helpers.executePayload(vm, address(proposal)); + (address arsETH, , ) = AaveV3EthereumLido.AAVE_PROTOCOL_DATA_PROVIDER.getReserveTokensAddresses( + proposal.rsETH() + ); + assertEq( + IEmissionManager(AaveV3EthereumLido.EMISSION_MANAGER).getEmissionAdmin(proposal.rsETH()), + proposal.rsETH_ADMIN() + ); + assertEq( + IEmissionManager(AaveV3EthereumLido.EMISSION_MANAGER).getEmissionAdmin(arsETH), + proposal.rsETH_ADMIN() + ); + } +} diff --git a/src/20241205_AaveV3EthereumLido_OnboardRsETHToLidoInstance/OnboardRsETHToLidoInstance.md b/src/20241205_AaveV3EthereumLido_OnboardRsETHToLidoInstance/OnboardRsETHToLidoInstance.md new file mode 100644 index 000000000..1503a5dfd --- /dev/null +++ b/src/20241205_AaveV3EthereumLido_OnboardRsETHToLidoInstance/OnboardRsETHToLidoInstance.md @@ -0,0 +1,66 @@ +--- +title: "Onboard rsETH to Lido Instance" +author: "ACI" +discussions: "https://governance.aave.com/t/arfc-add-rseth-to-aave-v3-ethereum/17696/18" +snapshot: Direct-to-AIP +--- + +## Simple Summary + +The current ARFC Addendum seeks to onboard rsETH to Lido Instance. This integration aligns with the recent support for rsETH in Aave Mainnet Instance, as outlined in the ARFC proposal and the AIP that is live. + +This will be a Direct to Direct AIP Proposal so we can align with the final AIP and onboarding of rsETH in Mainnet Instance. + +## Motivation + +With rsETH set to become a reality on Aave v3 Ethereum, integrating it into the Lido Instance offers deeper liquidity, higher composability, and more strategic borrowing opportunities for users. Given the synergy between wstETH and rsETH as liquid staking derivatives (LSDs), enabling eMode will maximize capital efficiency for borrowers while maintaining a conservative risk approach. + +## Specification + +The table below illustrates the configured risk parameters for **rsETH** + +| Parameter | Value | +| ------------------------- | -----------------------------------------: | +| Isolation Mode | false | +| Borrowable | DISABLED | +| Collateral Enabled | true | +| Supply Cap (rsETH) | 10,000 | +| Borrow Cap (rsETH) | 1 | +| Debt Ceiling | USD 0 | +| LTV | 0.05 % | +| LT | 0.1 % | +| Liquidation Bonus | 7.5 % | +| Liquidation Protocol Fee | 10 % | +| Reserve Factor | 15 % | +| Base Variable Borrow Rate | 0 % | +| Variable Slope 1 | 10 % | +| Variable Slope 2 | 100 % | +| Uoptimal | 1 % | +| Flashloanable | ENABLED | +| Siloed Borrowing | DISABLED | +| Borrowable in Isolation | DISABLED | +| Oracle | 0x47F52B2e43D0386cF161e001835b03Ad49889e3b | + +Additionaly [0xac140648435d03f784879cd789130F22Ef588Fcd](https://etherscan.io/address/0xac140648435d03f784879cd789130F22Ef588Fcd) has been set as the emission admin for rsETH and the corresponding aToken. + +### E-mode Specification + +| **Parameter** | Value | **Value** | +| --------------------- | ------ | --------- | +| Asset | rsETH | wstETH | +| Collateral | Yes | No | +| Borrowable | No | Yes | +| Max LTV | 92.50% | - | +| Liquidation Threshold | 94.50% | - | +| Liquidation Bonus | 1.00% | - | + +## References + +- Implementation: [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/7c0c1d5c758400b7fecdf079aa669448d0165579/src/20241205_AaveV3EthereumLido_OnboardRsETHToLidoInstance/AaveV3EthereumLido_OnboardRsETHToLidoInstance_20241205.sol) +- Tests: [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/7c0c1d5c758400b7fecdf079aa669448d0165579/src/20241205_AaveV3EthereumLido_OnboardRsETHToLidoInstance/AaveV3EthereumLido_OnboardRsETHToLidoInstance_20241205.t.sol) +- Snapshot: Direct-to-AIP +- [Discussion](https://governance.aave.com/t/arfc-add-rseth-to-aave-v3-ethereum/17696/18) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241205_AaveV3EthereumLido_OnboardRsETHToLidoInstance/OnboardRsETHToLidoInstance_20241205.s.sol b/src/20241205_AaveV3EthereumLido_OnboardRsETHToLidoInstance/OnboardRsETHToLidoInstance_20241205.s.sol new file mode 100644 index 000000000..97f66ca03 --- /dev/null +++ b/src/20241205_AaveV3EthereumLido_OnboardRsETHToLidoInstance/OnboardRsETHToLidoInstance_20241205.s.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3EthereumLido_OnboardRsETHToLidoInstance_20241205} from './AaveV3EthereumLido_OnboardRsETHToLidoInstance_20241205.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241205_AaveV3EthereumLido_OnboardRsETHToLidoInstance/OnboardRsETHToLidoInstance_20241205.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/OnboardRsETHToLidoInstance_20241205.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3EthereumLido_OnboardRsETHToLidoInstance_20241205).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/20241205_AaveV3EthereumLido_OnboardRsETHToLidoInstance/OnboardRsETHToLidoInstance_20241205.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(AaveV3EthereumLido_OnboardRsETHToLidoInstance_20241205).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241205_AaveV3EthereumLido_OnboardRsETHToLidoInstance/OnboardRsETHToLidoInstance.md' + ) + ); + } +} diff --git a/src/20241205_AaveV3EthereumLido_OnboardRsETHToLidoInstance/config.ts b/src/20241205_AaveV3EthereumLido_OnboardRsETHToLidoInstance/config.ts new file mode 100644 index 000000000..4fa60bd49 --- /dev/null +++ b/src/20241205_AaveV3EthereumLido_OnboardRsETHToLidoInstance/config.ts @@ -0,0 +1,70 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3EthereumLido'], + title: 'Onboard rsETH to Lido Instance', + shortName: 'OnboardRsETHToLidoInstance', + date: '20241205', + author: 'ACI', + discussion: 'https://governance.aave.com/t/arfc-add-rseth-to-aave-v3-ethereum/17696/18', + snapshot: '', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3EthereumLido: { + configs: { + EMODES_UPDATES: [ + { + eModeCategory: 5, + ltv: '92.5', + liqThreshold: '94.5', + liqBonus: '1', + label: 'rsETH LST main', + }, + ], + EMODES_ASSETS: [ + { + asset: 'wstETH', + eModeCategory: 'AaveV3EthereumLidoEModes.ETH_CORRELATED', + collateral: 'DISABLED', + borrowable: 'ENABLED', + }, + { + asset: 'ezETH', + eModeCategory: 'AaveV3EthereumLidoEModes.ETH_CORRELATED', + collateral: 'ENABLED', + borrowable: 'DISABLED', + }, + ], + ASSET_LISTING: [ + { + assetSymbol: 'rsETH', + decimals: 18, + priceFeed: '0x47F52B2e43D0386cF161e001835b03Ad49889e3b', + ltv: '0.05', + liqThreshold: '0.1', + liqBonus: '7.5', + debtCeiling: '0', + liqProtocolFee: '10', + enabledToBorrow: 'DISABLED', + flashloanable: 'ENABLED', + borrowableInIsolation: 'DISABLED', + withSiloedBorrowing: 'DISABLED', + reserveFactor: '15', + supplyCap: '10000', + borrowCap: '1', + rateStrategyParams: { + optimalUtilizationRate: '1', + baseVariableBorrowRate: '0', + variableRateSlope1: '10', + variableRateSlope2: '100', + }, + asset: '0xA1290d69c65A6Fe4DF752f95823fae25cB99e5A7', + admin: '0xac140648435d03f784879cd789130F22Ef588Fcd', + }, + ], + }, + cache: {blockNumber: 21335607}, + }, + }, +}; diff --git a/src/20241209_AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV/AaveLiquidityCommitteeFundingPhaseV.md b/src/20241209_AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV/AaveLiquidityCommitteeFundingPhaseV.md new file mode 100644 index 000000000..d1e4436ee --- /dev/null +++ b/src/20241209_AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV/AaveLiquidityCommitteeFundingPhaseV.md @@ -0,0 +1,53 @@ +--- +title: "Aave Liquidity Committee Funding Phase V" +author: "karpatkey_TokenLogic" +discussions: "https://governance.aave.com/t/arfc-aave-liquidity-committee-funding-phase-v/20043" +snapshot: "https://snapshot.box/#/s:aave.eth/proposal/0xe6740e5aec256ccf1dfbf538591f6b1631927f8d950b17067fe6912b74158332" +--- + +## Summary + +This publication presents the Aave Liquidity Committee (ALC) Phase V request. + +## Motivation + +Phase V focuses on reinforcing GHO’s peg stability and enhancing liquidity to enable seamless large swaps with minimal price impact. +It also involves GHO's growth by expanding GHO to new networks, such as Base and Avalanche. +New integrations aim to drive adoption by partnering with protocols such as Synthetix on Arbitrum, Fluid, and Gearbox on Mainnet. Additionally, innovative liquidity incentives, like Royco Quests, will further enhance user engagement and ecosystem participation. These initiatives are designed to boost GHO’s utility, broaden its ecosystem reach, and ensure stability across chains, all while being guided by clear and measurable performance metrics. + +Some high-level GHO performance metrics Phase V aims to achieve: + +| Description | Ethereum Value | Arbitrum Value | Avalanche Value | Base Value | +| ------------------------------------------ | :--------------------------: | :--------------------------: | :--------------------------: | :--------------------------: | +| TVL DEX Liquidity Pools | 50M | 20M | 20M | 20M | +| TVL Utility Liquidity Pools (Excl. stkGHO) | 15M | 7.5M | 7.5M | 7.5M | +| DEX Liquidity Composition | < 50% GHO (< 33% for 3pools) | < 50% GHO (< 33% for 3pools) | < 50% GHO (< 33% for 3pools) | < 50% GHO (< 33% for 3pools) | +| Swap Price Impact $5M Swap (GHO to USDC) | < 0.10% | < 0.25% | < 0.25% | < 0.25% | +| Annualised Peg Volatility | < 5.00% | < 5.00% | < 5.00% | < 5.00% | +| Price level for >90% time | $0.995 | $0.995 | $0.995 | $0.995 | + +## Specification + +Deposit 2.5M GHO into the Prime Instance on Ethereum. + +Swap the following assets to GHO and transfer to the Collector. + +| Ethereum | +| :--------------: | +| aEthUSDT (1.25M) | +| aEthUSDC (1.25M) | + +Create an Allowance allowing the ALC to withdraw GHO from the Prime instance for a total of 2,000,000 GHO. + +ALC Ethereum SAFE: `0xA1c93D2687f7014Aaf588c764E3Ce80aF016229b` + +## References + +- Implementation: [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/412c18f5a13b11b34244e949b8f37a5aa6e75940/src/20241209_AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV/AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV_20241209.sol) +- Tests: [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/412c18f5a13b11b34244e949b8f37a5aa6e75940/src/20241209_AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV/AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV_20241209.t.sol) +- [Snapshot](https://snapshot.box/#/s:aave.eth/proposal/0xe6740e5aec256ccf1dfbf538591f6b1631927f8d950b17067fe6912b74158332) +- [Discussion](https://governance.aave.com/t/arfc-aave-liquidity-committee-funding-phase-v/20043) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241209_AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV/AaveLiquidityCommitteeFundingPhaseV_20241209.s.sol b/src/20241209_AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV/AaveLiquidityCommitteeFundingPhaseV_20241209.s.sol new file mode 100644 index 000000000..32329abe0 --- /dev/null +++ b/src/20241209_AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV/AaveLiquidityCommitteeFundingPhaseV_20241209.s.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV_20241209} from './AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV_20241209.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241209_AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV/AaveLiquidityCommitteeFundingPhaseV_20241209.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/AaveLiquidityCommitteeFundingPhaseV_20241209.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV_20241209).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/20241209_AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV/AaveLiquidityCommitteeFundingPhaseV_20241209.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(AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV_20241209).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241209_AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV/AaveLiquidityCommitteeFundingPhaseV.md' + ) + ); + } +} diff --git a/src/20241209_AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV/AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV_20241209.sol b/src/20241209_AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV/AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV_20241209.sol new file mode 100644 index 000000000..7d523c090 --- /dev/null +++ b/src/20241209_AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV/AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV_20241209.sol @@ -0,0 +1,113 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; + +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol'; +import {CollectorUtils, ICollector} from 'aave-helpers/src/CollectorUtils.sol'; +import {AaveSwapper} from 'aave-helpers/src/swaps/AaveSwapper.sol'; +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {AaveV3EthereumLido} from 'aave-address-book/AaveV3EthereumLido.sol'; + +/** + * @title Aave Liquidity Committee Funding Phase V + * @author karpatkey_TokenLogic + * - Snapshot: https://snapshot.box/#/s:aave.eth/proposal/0xe6740e5aec256ccf1dfbf538591f6b1631927f8d950b17067fe6912b74158332 + * - Discussion: https://governance.aave.com/t/arfc-aave-liquidity-committee-funding-phase-v/20043 + */ +contract AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV_20241209 is + IProposalGenericExecutor +{ + using SafeERC20 for IERC20; + using CollectorUtils for ICollector; + + uint256 public constant DEPOSIT_AMOUNT = 2_500_000e18; + uint256 public constant A_ETH_USDT_WITHDRAW_AMOUNT = 1_250_000e6; + uint256 public constant A_ETH_USDC_WITHDRAW_AMOUNT = 1_250_000e6; + + // https://etherscan.io/address/0x060373D064d0168931dE2AB8DDA7410923d06E88 + address public constant MILKMAN = 0x060373D064d0168931dE2AB8DDA7410923d06E88; + // https://etherscan.io/address/0xe80a1C615F75AFF7Ed8F08c9F21f9d00982D666c + address public constant PRICE_CHECKER = 0xe80a1C615F75AFF7Ed8F08c9F21f9d00982D666c; + // https://etherscan.io/address/0x3f12643D3f6f874d39C2a4c9f2Cd6f2DbAC877FC + address public constant GHO_USD_FEED = 0x3f12643D3f6f874d39C2a4c9f2Cd6f2DbAC877FC; + + address public constant ALC_SAFE = 0xA1c93D2687f7014Aaf588c764E3Ce80aF016229b; + uint256 public constant ALC_ALLOWANCE = 2_000_000e18; + + function execute() external override { + // deposit gho + AaveV3EthereumLido.COLLECTOR.depositToV3( + CollectorUtils.IOInput({ + pool: address(AaveV3EthereumLido.POOL), + underlying: AaveV3EthereumAssets.GHO_UNDERLYING, + amount: DEPOSIT_AMOUNT + }) + ); + + // alc allowance + (address aTokenAddress, , ) = AaveV3EthereumLido + .AAVE_PROTOCOL_DATA_PROVIDER + .getReserveTokensAddresses(AaveV3EthereumAssets.GHO_UNDERLYING); + uint256 initialAlcAllowance = IERC20(aTokenAddress).allowance( + address(AaveV3EthereumLido.COLLECTOR), + ALC_SAFE + ); + if (initialAlcAllowance > 0) { + // clear initial allowance + AaveV3EthereumLido.COLLECTOR.approve(aTokenAddress, ALC_SAFE, 0); + } + AaveV3EthereumLido.COLLECTOR.approve( + aTokenAddress, + ALC_SAFE, + initialAlcAllowance + ALC_ALLOWANCE + ); + + // swap + // usdt + AaveV3Ethereum.COLLECTOR.withdrawFromV3( + CollectorUtils.IOInput({ + pool: address(AaveV3Ethereum.POOL), + underlying: AaveV3EthereumAssets.USDT_UNDERLYING, + amount: A_ETH_USDT_WITHDRAW_AMOUNT + }), + MiscEthereum.AAVE_SWAPPER + ); + + AaveSwapper(MiscEthereum.AAVE_SWAPPER).swap( + MILKMAN, + PRICE_CHECKER, + AaveV3EthereumAssets.USDT_UNDERLYING, + AaveV3EthereumAssets.GHO_UNDERLYING, + AaveV3EthereumAssets.USDT_ORACLE, + GHO_USD_FEED, + address(AaveV3EthereumLido.COLLECTOR), + IERC20(AaveV3EthereumAssets.USDT_UNDERLYING).balanceOf(MiscEthereum.AAVE_SWAPPER), + 100 + ); + + // usdc + AaveV3Ethereum.COLLECTOR.withdrawFromV3( + CollectorUtils.IOInput({ + pool: address(AaveV3Ethereum.POOL), + underlying: AaveV3EthereumAssets.USDC_UNDERLYING, + amount: A_ETH_USDC_WITHDRAW_AMOUNT + }), + MiscEthereum.AAVE_SWAPPER + ); + + AaveSwapper(MiscEthereum.AAVE_SWAPPER).swap( + MILKMAN, + PRICE_CHECKER, + AaveV3EthereumAssets.USDC_UNDERLYING, + AaveV3EthereumAssets.GHO_UNDERLYING, + AaveV3EthereumAssets.USDC_ORACLE, + GHO_USD_FEED, + address(AaveV3EthereumLido.COLLECTOR), + IERC20(AaveV3EthereumAssets.USDC_UNDERLYING).balanceOf(MiscEthereum.AAVE_SWAPPER), + 100 + ); + } +} diff --git a/src/20241209_AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV/AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV_20241209.t.sol b/src/20241209_AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV/AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV_20241209.t.sol new file mode 100644 index 000000000..cb4f86b25 --- /dev/null +++ b/src/20241209_AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV/AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV_20241209.t.sol @@ -0,0 +1,159 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV2EthereumAssets} from 'aave-address-book/AaveV2Ethereum.sol'; +import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {AaveV3EthereumLido, AaveV3EthereumLidoAssets} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV_20241209} from './AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV_20241209.sol'; + +/** + * @dev Test for AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV_20241209 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241209_AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV/AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV_20241209.t.sol -vv + */ +contract AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV_20241209_Test is + ProtocolV3TestBase +{ + event SwapRequested( + address milkman, + address indexed fromToken, + address indexed toToken, + address fromOracle, + address toOracle, + uint256 amount, + address indexed recipient, + uint256 slippage + ); + + AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV_20241209 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21415862); + proposal = new AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV_20241209(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV_20241209', + AaveV3EthereumLido.POOL, + address(proposal) + ); + } + + function test_aclAllowance() public { + (address aTokenAddress, , ) = AaveV3EthereumLido + .AAVE_PROTOCOL_DATA_PROVIDER + .getReserveTokensAddresses(AaveV3EthereumAssets.GHO_UNDERLYING); + uint256 alcAllowanceBefore = IERC20(aTokenAddress).allowance( + address(AaveV3EthereumLido.COLLECTOR), + proposal.ALC_SAFE() + ); + + executePayload(vm, address(proposal)); + + uint256 alcAllowanceAfter = IERC20(aTokenAddress).allowance( + address(AaveV3EthereumLido.COLLECTOR), + proposal.ALC_SAFE() + ); + + assertEq(alcAllowanceAfter, alcAllowanceBefore + proposal.ALC_ALLOWANCE()); + } + + function test_swap() public { + uint256 collectorAEthUsdtBalanceBefore = IERC20(AaveV3EthereumAssets.USDT_A_TOKEN).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + uint256 collectorAEthUsdcBalanceBefore = IERC20(AaveV3EthereumAssets.USDC_A_TOKEN).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + + vm.expectEmit(true, true, true, true, MiscEthereum.AAVE_SWAPPER); + emit SwapRequested( + proposal.MILKMAN(), + AaveV3EthereumAssets.USDT_UNDERLYING, + AaveV3EthereumAssets.GHO_UNDERLYING, + AaveV3EthereumAssets.USDT_ORACLE, + proposal.GHO_USD_FEED(), + proposal.A_ETH_USDT_WITHDRAW_AMOUNT(), + address(AaveV3EthereumLido.COLLECTOR), + 100 + ); + + vm.expectEmit(true, true, true, true, MiscEthereum.AAVE_SWAPPER); + emit SwapRequested( + proposal.MILKMAN(), + AaveV3EthereumAssets.USDC_UNDERLYING, + AaveV3EthereumAssets.GHO_UNDERLYING, + AaveV3EthereumAssets.USDC_ORACLE, + proposal.GHO_USD_FEED(), + proposal.A_ETH_USDC_WITHDRAW_AMOUNT(), + address(AaveV3EthereumLido.COLLECTOR), + 100 + ); + + executePayload(vm, address(proposal)); + + uint256 collectorAEthUsdtBalanceAfter = IERC20(AaveV3EthereumAssets.USDT_A_TOKEN).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + uint256 collectorAEthUsdcBalanceAfter = IERC20(AaveV3EthereumAssets.USDC_A_TOKEN).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + + assertApproxEqAbs( + collectorAEthUsdtBalanceBefore, + collectorAEthUsdtBalanceAfter + proposal.A_ETH_USDT_WITHDRAW_AMOUNT(), + 1e6 + ); + assertApproxEqAbs( + collectorAEthUsdcBalanceBefore, + collectorAEthUsdcBalanceAfter + proposal.A_ETH_USDC_WITHDRAW_AMOUNT(), + 1e6 + ); + + assertEq( + IERC20(AaveV3EthereumAssets.USDT_UNDERLYING).balanceOf( + 0x61De0d8d9D49Ec452dd325c1AB746BF113957c98 // milkmanInstance contract + ), + proposal.A_ETH_USDT_WITHDRAW_AMOUNT() + ); + assertEq( + IERC20(AaveV3EthereumAssets.USDC_UNDERLYING).balanceOf( + 0x778cD71c0bcc862A633Dd683e85A4a6536469738 // milkmanInstance contract + ), + proposal.A_ETH_USDC_WITHDRAW_AMOUNT() + ); + } + + function test_deposit() public { + (address aTokenAddress, , ) = AaveV3EthereumLido + .AAVE_PROTOCOL_DATA_PROVIDER + .getReserveTokensAddresses(AaveV3EthereumAssets.GHO_UNDERLYING); + + uint256 collectorGhoBalanceBefore = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf( + address(AaveV3EthereumLido.COLLECTOR) + ); + uint256 collectorAGhoBalanceBefore = IERC20(aTokenAddress).balanceOf( + address(AaveV3EthereumLido.COLLECTOR) + ); + + executePayload(vm, address(proposal)); + + uint256 collectorGhoBalanceAfter = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf( + address(AaveV3EthereumLido.COLLECTOR) + ); + uint256 collectorAGhoBalanceAfter = IERC20(aTokenAddress).balanceOf( + address(AaveV3EthereumLido.COLLECTOR) + ); + + assertEq(collectorGhoBalanceBefore - collectorGhoBalanceAfter, proposal.DEPOSIT_AMOUNT()); + assertEq(collectorAGhoBalanceAfter - collectorAGhoBalanceBefore, proposal.DEPOSIT_AMOUNT()); + } +} diff --git a/src/20241209_AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV/config.ts b/src/20241209_AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV/config.ts new file mode 100644 index 000000000..6a2206f6f --- /dev/null +++ b/src/20241209_AaveV3EthereumLido_AaveLiquidityCommitteeFundingPhaseV/config.ts @@ -0,0 +1,15 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3EthereumLido'], + title: 'Aave Liquidity Committee Funding Phase V', + shortName: 'AaveLiquidityCommitteeFundingPhaseV', + date: '20241209', + author: 'karpatkey_TokenLogic', + discussion: 'https://governance.aave.com/t/arfc-aave-liquidity-committee-funding-phase-v/20043', + snapshot: + 'https://snapshot.box/#/s:aave.eth/proposal/0xe6740e5aec256ccf1dfbf538591f6b1631927f8d950b17067fe6912b74158332', + votingNetwork: 'POLYGON', + }, + poolOptions: {AaveV3EthereumLido: {configs: {}, cache: {blockNumber: 21365006}}}, +}; diff --git a/src/20241210_AaveV3Ethereum_OrbitProgramRenewal/AaveV3EthereumLido_OrbitProgramRenewalData_20241210.sol b/src/20241210_AaveV3Ethereum_OrbitProgramRenewal/AaveV3EthereumLido_OrbitProgramRenewalData_20241210.sol new file mode 100644 index 000000000..c18a202dd --- /dev/null +++ b/src/20241210_AaveV3Ethereum_OrbitProgramRenewal/AaveV3EthereumLido_OrbitProgramRenewalData_20241210.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +library OrbitProgramRenewalData { + // stream information + uint256 public constant STREAM_DURATION = 80 days; + // budgets (total budget: 15,000 GHO) + uint256 public constant STREAM_AMOUNT = 13_333 ether; + uint256 public constant DIRECT_TRANSFER_AMOUNT = 1667 ether; + // stream receivers + address public constant EZREAL = 0x8659D0BB123Da6D16D9394C7838BA286c2207d0E; + address public constant ARETA = 0x8b37a5Af68D315cf5A64097D96621F64b5502a22; + address public constant STABLE_LABS = 0xECC2a9240268BC7a26386ecB49E1Befca2706AC9; + address public constant IGNAS_DEFI = 0x3DDC7d25c7a1dc381443e491Bbf1Caa8928A05B0; + + function getOrbitAddresses() internal pure returns (address[] memory) { + address[] memory streamAddresses = new address[](4); + streamAddresses[0] = EZREAL; + streamAddresses[1] = ARETA; + streamAddresses[2] = STABLE_LABS; + streamAddresses[3] = IGNAS_DEFI; + + return streamAddresses; + } +} diff --git a/src/20241210_AaveV3Ethereum_OrbitProgramRenewal/AaveV3EthereumLido_OrbitProgramRenewal_20241210.sol b/src/20241210_AaveV3Ethereum_OrbitProgramRenewal/AaveV3EthereumLido_OrbitProgramRenewal_20241210.sol new file mode 100644 index 000000000..13fe29a01 --- /dev/null +++ b/src/20241210_AaveV3Ethereum_OrbitProgramRenewal/AaveV3EthereumLido_OrbitProgramRenewal_20241210.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {AaveV3EthereumLido, AaveV3EthereumLidoAssets} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {CollectorUtils} from 'aave-helpers/src/CollectorUtils.sol'; +import {OrbitProgramRenewalData} from './AaveV3EthereumLido_OrbitProgramRenewalData_20241210.sol'; + +/** + * @title Orbit Program Renewal + * @author ACI + * - Snapshot: https://snapshot.box/#/s:aave.eth/proposal/0x60613deb2c662057cc8028b431df84fe6e763d38f48f70594a7cb7fd91a8cb93 + * - Discussion: https://governance.aave.com/t/arfc-orbit-program-renewal-q4-2024/20084 + */ +contract AaveV3EthereumLido_OrbitProgramRenewal_20241210 is IProposalGenericExecutor { + function execute() external { + address[] memory orbitAddresses = OrbitProgramRenewalData.getOrbitAddresses(); + + for (uint256 i = 0; i < orbitAddresses.length; i++) { + AaveV3EthereumLido.COLLECTOR.transfer( + AaveV3EthereumLidoAssets.GHO_A_TOKEN, + orbitAddresses[i], + OrbitProgramRenewalData.DIRECT_TRANSFER_AMOUNT + ); + CollectorUtils.stream( + AaveV3EthereumLido.COLLECTOR, + CollectorUtils.CreateStreamInput({ + underlying: AaveV3EthereumLidoAssets.GHO_A_TOKEN, + receiver: orbitAddresses[i], + amount: OrbitProgramRenewalData.STREAM_AMOUNT, + start: block.timestamp, + duration: OrbitProgramRenewalData.STREAM_DURATION + }) + ); + } + } +} diff --git a/src/20241210_AaveV3Ethereum_OrbitProgramRenewal/AaveV3EthereumLido_OrbitProgramRenewal_20241210.t.sol b/src/20241210_AaveV3Ethereum_OrbitProgramRenewal/AaveV3EthereumLido_OrbitProgramRenewal_20241210.t.sol new file mode 100644 index 000000000..109b1504f --- /dev/null +++ b/src/20241210_AaveV3Ethereum_OrbitProgramRenewal/AaveV3EthereumLido_OrbitProgramRenewal_20241210.t.sol @@ -0,0 +1,185 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumLido, AaveV3EthereumLidoAssets} from 'aave-address-book/AaveV3EthereumLido.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3EthereumLido_OrbitProgramRenewal_20241210} from './AaveV3EthereumLido_OrbitProgramRenewal_20241210.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {OrbitProgramRenewalData} from './AaveV3EthereumLido_OrbitProgramRenewalData_20241210.sol'; + +/** + * @dev Test for AaveV3EthereumLido_OrbitProgramRenewal_20241210 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241210_AaveV3EthereumLido_OrbitProgramRenewal/AaveV3EthereumLido_OrbitProgramRenewal_20241210.t.sol -vv + */ +contract AaveV3EthereumLido_OrbitProgramRenewal_20241210_Test is ProtocolV3TestBase { + AaveV3EthereumLido_OrbitProgramRenewal_20241210 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21415225); + proposal = new AaveV3EthereumLido_OrbitProgramRenewal_20241210(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3EthereumLido_OrbitProgramRenewal_20241210', + AaveV3EthereumLido.POOL, + address(proposal) + ); + } + + function test_wholeProcess() public { + // 0.001% tolerance due to stream computation inaccuracy + uint256 maxDeltaStreamBalance = 0.00001e18; // 0.001% + + uint256[] memory ghoBalancesBeforeUsers = new uint256[](4); + address[] memory ghoPaymentAddresses = OrbitProgramRenewalData.getOrbitAddresses(); + for (uint256 i = 0; i < ghoPaymentAddresses.length; i++) { + ghoBalancesBeforeUsers[i] = IERC20(AaveV3EthereumLidoAssets.GHO_A_TOKEN).balanceOf( + ghoPaymentAddresses[i] + ); + } + + uint256 nextStreamId = AaveV3EthereumLido.COLLECTOR.getNextStreamId(); + + vm.expectRevert(); + AaveV3EthereumLido.COLLECTOR.getStream(nextStreamId); + + executePayload(vm, address(proposal)); + + // Direct transfers + for (uint256 i = 0; i < ghoPaymentAddresses.length; i++) { + assertEq( + IERC20(AaveV3EthereumLidoAssets.GHO_A_TOKEN).balanceOf(ghoPaymentAddresses[i]), + ghoBalancesBeforeUsers[i] + OrbitProgramRenewalData.DIRECT_TRANSFER_AMOUNT, + 'GHO balance of Orbit recipient is not greater than before' + ); + } + + vm.warp(block.timestamp + 80 days); + + // Stream transfers + for (uint256 i = 0; i < ghoPaymentAddresses.length; i++) { + uint256 finalBalanceToWithdraw = AaveV3EthereumLido.COLLECTOR.balanceOf( + nextStreamId + i, + ghoPaymentAddresses[i] + ); + + assertApproxEqRel( + finalBalanceToWithdraw, + OrbitProgramRenewalData.STREAM_AMOUNT, + maxDeltaStreamBalance, + 'GHO Stream final balance is not correct' + ); + + vm.prank(ghoPaymentAddresses[i]); + AaveV3EthereumLido.COLLECTOR.withdrawFromStream(nextStreamId + i, finalBalanceToWithdraw); + assertApproxEqRel( + IERC20(AaveV3EthereumLidoAssets.GHO_A_TOKEN).balanceOf(ghoPaymentAddresses[i]), + ghoBalancesBeforeUsers[i] + + OrbitProgramRenewalData.DIRECT_TRANSFER_AMOUNT + + OrbitProgramRenewalData.STREAM_AMOUNT, + maxDeltaStreamBalance, + 'GHO Stream final withdraw is not correct' + ); + } + } + + function test_directTransfer() public { + uint256[] memory ghoBalancesBeforeUsers = new uint256[](4); + address[] memory ghoPaymentAddresses = OrbitProgramRenewalData.getOrbitAddresses(); + for (uint256 i = 0; i < ghoPaymentAddresses.length; i++) { + ghoBalancesBeforeUsers[i] = IERC20(AaveV3EthereumLidoAssets.GHO_A_TOKEN).balanceOf( + ghoPaymentAddresses[i] + ); + } + + executePayload(vm, address(proposal)); + + for (uint256 i = 0; i < ghoPaymentAddresses.length; i++) { + assertEq( + IERC20(AaveV3EthereumLidoAssets.GHO_A_TOKEN).balanceOf(ghoPaymentAddresses[i]), + ghoBalancesBeforeUsers[i] + OrbitProgramRenewalData.DIRECT_TRANSFER_AMOUNT, + 'GHO balance of Orbit recipient is not greater than before' + ); + } + } + + function test_streamBalance() public { + address[] memory ghoPaymentAddresses = OrbitProgramRenewalData.getOrbitAddresses(); + + uint256 nextStreamId = AaveV3EthereumLido.COLLECTOR.getNextStreamId(); + + vm.expectRevert(); + AaveV3EthereumLido.COLLECTOR.getStream(nextStreamId); + + executePayload(vm, address(proposal)); + + vm.warp(block.timestamp + 1 days); + + for (uint256 i = 0; i < ghoPaymentAddresses.length; i++) { + uint256 ghoBalanceBefore = IERC20(AaveV3EthereumLidoAssets.GHO_A_TOKEN).balanceOf( + ghoPaymentAddresses[i] + ); + + vm.prank(ghoPaymentAddresses[i]); + AaveV3EthereumLido.COLLECTOR.withdrawFromStream(nextStreamId + i, 1); + + uint256 ghoBalanceAfter = IERC20(AaveV3EthereumLidoAssets.GHO_A_TOKEN).balanceOf( + ghoPaymentAddresses[i] + ); + + assertEq(ghoBalanceAfter, ghoBalanceBefore + 1); + } + } + + function test_streamEndBalance() public { + // 0.001% tolerance due to stream computation inaccuracy + uint256 maxDeltaStreamBalance = 0.00001e18; // 0.001% + + address[] memory ghoPaymentAddresses = OrbitProgramRenewalData.getOrbitAddresses(); + + uint256 nextStreamId = AaveV3EthereumLido.COLLECTOR.getNextStreamId(); + + vm.expectRevert(); + AaveV3EthereumLido.COLLECTOR.getStream(nextStreamId); + + executePayload(vm, address(proposal)); + + vm.warp(block.timestamp + 80 days); + + for (uint256 i = 0; i < ghoPaymentAddresses.length; i++) { + uint256 finalBalanceToWithdraw = AaveV3EthereumLido.COLLECTOR.balanceOf( + nextStreamId + i, + ghoPaymentAddresses[i] + ); + + assertApproxEqRel( + finalBalanceToWithdraw, + OrbitProgramRenewalData.STREAM_AMOUNT, + maxDeltaStreamBalance + ); + + uint256 ghoBalanceBefore = IERC20(AaveV3EthereumLidoAssets.GHO_A_TOKEN).balanceOf( + ghoPaymentAddresses[i] + ); + + vm.prank(ghoPaymentAddresses[i]); + AaveV3EthereumLido.COLLECTOR.withdrawFromStream(nextStreamId + i, finalBalanceToWithdraw); + + uint256 ghoBalanceAfter = IERC20(AaveV3EthereumLidoAssets.GHO_A_TOKEN).balanceOf( + ghoPaymentAddresses[i] + ); + + assertApproxEqRel( + ghoBalanceAfter, + ghoBalanceBefore + OrbitProgramRenewalData.STREAM_AMOUNT, + maxDeltaStreamBalance + ); + } + } +} diff --git a/src/20241210_AaveV3Ethereum_OrbitProgramRenewal/OrbitProgramRenewal.md b/src/20241210_AaveV3Ethereum_OrbitProgramRenewal/OrbitProgramRenewal.md new file mode 100644 index 000000000..7644ec025 --- /dev/null +++ b/src/20241210_AaveV3Ethereum_OrbitProgramRenewal/OrbitProgramRenewal.md @@ -0,0 +1,46 @@ +--- +title: "Orbit Program Renewal - Q4 2024" +author: "ACI" +discussions: "https://governance.aave.com/t/arfc-orbit-program-renewal-q4-2024/20084" +snapshot: "https://snapshot.box/#/s:aave.eth/proposal/0x60613deb2c662057cc8028b431df84fe6e763d38f48f70594a7cb7fd91a8cb93" +--- + +## Simple Summary + +Proposing the renewal of the Orbit program for recognized delegates, compensating them with GHO, associated with their governance activity during Q4 2024 ( From 2024-08-31 to 2024-12-14). + +## Motivation + +Orbit recognizes the added value of the Delegates in the decentralization & diversity of the Aave DAO. This compensation allows them to focus on Aave and keep their contribution efforts to our governance. The ACI proposes the extension of Orbit for a new quarter, Q4 2024, from 2024-08-31 to 2024-12-14. + +## Specification + +- **Period Coverage:** Q4 2024 from August 31th 2024 to December 14th 2024 +- **Eligible Platforms:** + - EzR3al: [0x8659d0bb123da6d16d9394c7838ba286c2207d0e](https://etherscan.io/address/0x8659d0bb123da6d16d9394c7838ba286c2207d0e) + - areta: [0x8b37a5af68d315cf5a64097d96621f64b5502a22](https://etherscan.io/address/0x8b37a5af68d315cf5a64097d96621f64b5502a22) + - stablelabs: [0xecc2a9240268bc7a26386ecb49e1befca2706ac9](https://etherscan.io/address/0xecc2a9240268bc7a26386ecb49e1befca2706ac9) + - IgnasDefi: [0x3DDC7d25c7a1dc381443e491Bbf1Caa8928A05B0](https://etherscan.io/address/0x3DDC7d25c7a1dc381443e491Bbf1Caa8928A05B0) +- **Budget:** 60,000 GHO (aEthLidoGHO) + - 15k total budget per platform + - 1667 aGHO transfer ((15000/90)\*10) + - 13333 aGHO stream through 80 days +- **Relevant Links:** + - [ACI’s Orbit tracker](https://dapps.aavechan.com/orbit-tracker) + +**Additional considerations:** + +As a reminder, Service Providers will not be considered elegible to Orbit Program. + +A new vote rate will apply, starting next Orbit Renewal, where a minimum of 20k voting power and 85% vote ratio on all Snapshots and AIP will be considered in order to be elegible to Orbit Program. + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/3740774ff40cb11fda29f882b86197d902f7e16f/src/20241210_AaveV3Ethereum_OrbitProgramRenewal/AaveV3Ethereum_OrbitProgramRenewal_20241210.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/3740774ff40cb11fda29f882b86197d902f7e16f/src/20241210_AaveV3Ethereum_OrbitProgramRenewal/AaveV3Ethereum_OrbitProgramRenewal_20241210.t.sol) +- [Snapshot](https://snapshot.box/#/s:aave.eth/proposal/0x60613deb2c662057cc8028b431df84fe6e763d38f48f70594a7cb7fd91a8cb93) +- [Discussion](https://governance.aave.com/t/arfc-orbit-program-renewal-q4-2024/20084) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241210_AaveV3Ethereum_OrbitProgramRenewal/OrbitProgramRenewal_20241210.s.sol b/src/20241210_AaveV3Ethereum_OrbitProgramRenewal/OrbitProgramRenewal_20241210.s.sol new file mode 100644 index 000000000..6b6111607 --- /dev/null +++ b/src/20241210_AaveV3Ethereum_OrbitProgramRenewal/OrbitProgramRenewal_20241210.s.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3EthereumLido_OrbitProgramRenewal_20241210} from './AaveV3EthereumLido_OrbitProgramRenewal_20241210.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241210_AaveV3EthereumLido_OrbitProgramRenewal/OrbitProgramRenewal_20241210.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/OrbitProgramRenewal_20241210.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3EthereumLido_OrbitProgramRenewal_20241210).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/20241210_AaveV3EthereumLido_OrbitProgramRenewal/OrbitProgramRenewal_20241210.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(AaveV3EthereumLido_OrbitProgramRenewal_20241210).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241210_AaveV3EthereumLido_OrbitProgramRenewal/OrbitProgramRenewal.md' + ) + ); + } +} diff --git a/src/20241210_AaveV3Ethereum_OrbitProgramRenewal/config.ts b/src/20241210_AaveV3Ethereum_OrbitProgramRenewal/config.ts new file mode 100644 index 000000000..52e7ad6a4 --- /dev/null +++ b/src/20241210_AaveV3Ethereum_OrbitProgramRenewal/config.ts @@ -0,0 +1,15 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3EthereumLido'], + title: 'Orbit Program Renewal', + shortName: 'OrbitProgramRenewal', + date: '20241210', + author: 'ACI', + discussion: 'https://governance.aave.com/t/arfc-orbit-program-renewal-q4-2024/20084', + snapshot: + 'https://snapshot.box/#/s:aave.eth/proposal/0x60613deb2c662057cc8028b431df84fe6e763d38f48f70594a7cb7fd91a8cb93', + votingNetwork: 'POLYGON', + }, + poolOptions: {AaveV3EthereumLido: {configs: {OTHERS: {}}, cache: {blockNumber: 21371374}}}, +}; diff --git a/src/20241212_AaveV3Ethereum_ADILineaPathActivation/ADILineaPathActivation.md b/src/20241212_AaveV3Ethereum_ADILineaPathActivation/ADILineaPathActivation.md new file mode 100644 index 000000000..8f637b2c3 --- /dev/null +++ b/src/20241212_AaveV3Ethereum_ADILineaPathActivation/ADILineaPathActivation.md @@ -0,0 +1,59 @@ +--- +title: "a.DI Linea path activation" +author: "BGD Labs @bgdlabs" +discussions: https://governance.aave.com/t/technical-maintenance-proposals/15274/56 +snapshot: Direct-to-AIP +--- + +## Simple Summary + +Proposal to register the necessary Liena adapters on a.DI, a technical pre-requirement for an activation vote of Aave v3 Linea. + +## Motivation + +In order to be able to pass messages from Ethereum to Linea via a.DI (Aave Delivery Infrastructure), it is necessary to at least have one valid adapter Ethereum → Linea smart contract enabled in the system. + +The first case of message passing Ethereum → Linea is the activation proposal for an Aave v3 Linea pool and consequently, to be able to execute on the Linea side the payload, the Aave governance should approve in advance the a.DI adapter smart contract. + +This procedure mirrors the requirements on previous networks like Scroll or ZkSync. + +## Specification + +The proposal payload simply registers a pre-deployed Linea adapter (with the necessary configurations to communicate with the Linea a.DI) on the Ethereum a.DI instance. + +This is done by calling the enableBridgeAdapters() function on the Ethereum Cross-chain Controller smart contract. + +| Network | Linea Adapter | +| -------- | ------------------------------------------------------------------------------------------------------------------------ | +| Ethereum | [0x8097555ffDa4176C93FEf92dF473b9763e467686](https://etherscan.io/address/0x8097555ffDa4176C93FEf92dF473b9763e467686) | +| Linea | [0xB3332d31ECFC3ef3BF6Cda79833D11d1A53f5cE6](https://lineascan.build/address/0xB3332d31ECFC3ef3BF6Cda79833D11d1A53f5cE6) | + +The new a.DI deployments on Linea network are as follows: + +| Contract | Address | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------ | +| CrossChainController | [0x0D3f821e9741C8a8Bcac231162320251Db0cdf52](https://lineascan.build/address/0x0D3f821e9741C8a8Bcac231162320251Db0cdf52) | +| Granular Guardian | [0xc1cd6faF6e9138b4e6C21d438f9ebF2bd6F6cA16](https://lineascan.build/address/0xc1cd6faF6e9138b4e6C21d438f9ebF2bd6F6cA16) | + +The new Aave Governance deployments on Linea network are as follows: + +| Contract | Address | +| ------------------- | ------------------------------------------------------------------------------------------------------------------------ | +| PayloadsController | [0x3BcE23a1363728091bc57A58a226CF2940C2e074](https://lineascan.build/address/0x3BcE23a1363728091bc57A58a226CF2940C2e074) | +| Executor Lvl 1 | [0x8c2d95FE7aeB57b86961F3abB296A54f0ADb7F88](https://lineascan.build/address/0x8c2d95FE7aeB57b86961F3abB296A54f0ADb7F88) | +| Governance Guardian | [0x056E4C4E80D1D14a637ccbD0412CDAAEc5B51F4E](https://lineascan.build/address/0x056E4C4E80D1D14a637ccbD0412CDAAEc5B51F4E) | +| BGD Labs Guardian | [0xfD3a6E65e470a7D7D730FFD5D36a9354E8F9F4Ea](https://lineascan.build/address/0xfD3a6E65e470a7D7D730FFD5D36a9354E8F9F4Ea) | + +## References + +- Adapter Implementation: [Linea Bridge Adapter](https://github.com/bgd-labs/aave-delivery-infrastructure/blob/239475f03956173abb5e09df31ed748f996c5944/src/contracts/adapters/linea/LineaAdapter.sol) +- Payload Implementation: [Payload](https://github.com/bgd-labs/adi-deploy/blob/e75bde29ab3824fd7533d111651c8c108010723b/scripts/payloads/adapters/ethereum/Ethereum_Activate_Lina_Bridge_Adapter_Payload.s.sol) +- Adapter Tests: [Linea Bridge Adapter tests](https://github.com/bgd-labs/aave-delivery-infrastructure/blob/239475f03956173abb5e09df31ed748f996c5944/tests/adapters/LineaAdapter.t.sol) +- Payload Tests: [tests](https://github.com/bgd-labs/adi-deploy/blob/e75bde29ab3824fd7533d111651c8c108010723b/tests/payloads/ethereum/AddLineaPathTest.t.sol) +- Diffs: [a.DI diffs](https://github.com/bgd-labs/adi-deploy/commit/bf1b830150ec38138d6ffb39d287bc889054c65f#diff-7918ccb77189a37fc1206fa85d2b01945dc79e5f5224c8850018da970c556756) +- Snapshot: Direct-to-AIP +- [Discussion](https://governance.aave.com/t/technical-maintenance-proposals/15274/56) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241212_AaveV3Ethereum_ADILineaPathActivation/ADILineaPathActivation_20241212.s.sol b/src/20241212_AaveV3Ethereum_ADILineaPathActivation/ADILineaPathActivation_20241212.s.sol new file mode 100644 index 000000000..5468178fd --- /dev/null +++ b/src/20241212_AaveV3Ethereum_ADILineaPathActivation/ADILineaPathActivation_20241212.s.sol @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; + +address constant PAYLOAD = address(0x3C2A076cD5ECbed55D8Fc0A341c14Fc808bA7fF7); + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241212_AaveV3Ethereum_ADILineaPathActivation/ADILineaPathActivation_20241212.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/ADILineaPathActivation_20241212.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(PAYLOAD); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Create Proposal + * command: make deploy-ledger contract=src/20241212_AaveV3Ethereum_ADILineaPathActivation/ADILineaPathActivation_20241212.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(PAYLOAD); + + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241212_AaveV3Ethereum_ADILineaPathActivation/ADILineaPathActivation.md' + ) + ); + } +} diff --git a/src/20241212_AaveV3Ethereum_ADILineaPathActivation/config.ts b/src/20241212_AaveV3Ethereum_ADILineaPathActivation/config.ts new file mode 100644 index 000000000..7a4b1b0ae --- /dev/null +++ b/src/20241212_AaveV3Ethereum_ADILineaPathActivation/config.ts @@ -0,0 +1,14 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + author: 'BGD Labs @bgdlabs', + pools: ['AaveV3Ethereum'], + title: 'a.DI Linea path activation', + shortName: 'ADILineaPathActivation', + date: '20241212', + discussion: '', + snapshot: '', + votingNetwork: 'POLYGON', + }, + poolOptions: {AaveV3Ethereum: {configs: {OTHERS: {}}, cache: {blockNumber: 21386353}}}, +}; diff --git a/src/20241213_AaveV3Ethereum_TokenLogicFinancialServiceProvider/AaveV3Ethereum_TokenLogicFinancialServiceProvider_20241213.sol b/src/20241213_AaveV3Ethereum_TokenLogicFinancialServiceProvider/AaveV3Ethereum_TokenLogicFinancialServiceProvider_20241213.sol new file mode 100644 index 000000000..f07dfb039 --- /dev/null +++ b/src/20241213_AaveV3Ethereum_TokenLogicFinancialServiceProvider/AaveV3Ethereum_TokenLogicFinancialServiceProvider_20241213.sol @@ -0,0 +1,93 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {CollectorUtils, ICollector} from 'aave-helpers/src/CollectorUtils.sol'; +import {AaveSwapper} from 'aave-helpers/src/swaps/AaveSwapper.sol'; +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV3EthereumLido, AaveV3EthereumLidoAssets} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; +import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol'; + +/** + * @title TokenLogic Financial Service Provider + * @author TokenLogic + * - Snapshot: https://snapshot.box/#/s:aave.eth/proposal/0xd1fdca5d69b03ed57848180d62a812ab1a1ff72f85d671c417b5ff8fb2bd0a7c + * - Discussion: https://governance.aave.com/t/arfc-tokenlogic-financial-services-provider/20182 + */ +contract AaveV3Ethereum_TokenLogicFinancialServiceProvider_20241213 is IProposalGenericExecutor { + using SafeERC20 for IERC20; + using CollectorUtils for ICollector; + + uint256 public constant GHO_DEPOSIT_AMOUNT = 750_000e18; + uint256 public constant A_ETH_USDC_WITHDRAW_AMOUNT = 750_000e6; + + // https://etherscan.io/address/0x060373D064d0168931dE2AB8DDA7410923d06E88 + address public constant MILKMAN = 0x060373D064d0168931dE2AB8DDA7410923d06E88; + // https://etherscan.io/address/0xe80a1C615F75AFF7Ed8F08c9F21f9d00982D666c + address public constant PRICE_CHECKER = 0xe80a1C615F75AFF7Ed8F08c9F21f9d00982D666c; + // https://etherscan.io/address/0x3f12643D3f6f874d39C2a4c9f2Cd6f2DbAC877FC + address public constant GHO_USD_FEED = 0x3f12643D3f6f874d39C2a4c9f2Cd6f2DbAC877FC; + + uint256 public constant TOKENLOGIC_STREAM_AMOUNT = 1_000_000e18; + address public constant TOKENLOGIC_SAFE = 0x3e4A9f478C0c13A15137Fc81e9d8269F127b4B40; + uint256 public constant STREAM_DURATION = 365 days; + uint256 public constant STREAM_START_TIME = 1734225865; // Sun Dec 15 2024 01:24:25 GMT+0000 + uint256 public constant ACTUAL_STREAM_AMOUNT = + (TOKENLOGIC_STREAM_AMOUNT / STREAM_DURATION) * STREAM_DURATION; + + function execute() external override { + // deposit gho + AaveV3EthereumLido.COLLECTOR.depositToV3( + CollectorUtils.IOInput({ + pool: address(AaveV3EthereumLido.POOL), + underlying: AaveV3EthereumAssets.GHO_UNDERLYING, + amount: GHO_DEPOSIT_AMOUNT + }) + ); + + // withdraw usdc + AaveV3Ethereum.COLLECTOR.withdrawFromV3( + CollectorUtils.IOInput({ + pool: address(AaveV3Ethereum.POOL), + underlying: AaveV3EthereumAssets.USDC_UNDERLYING, + amount: A_ETH_USDC_WITHDRAW_AMOUNT + }), + MiscEthereum.AAVE_SWAPPER + ); + + AaveSwapper(MiscEthereum.AAVE_SWAPPER).swap( + MILKMAN, + PRICE_CHECKER, + AaveV3EthereumAssets.USDC_UNDERLYING, + AaveV3EthereumAssets.GHO_UNDERLYING, + AaveV3EthereumAssets.USDC_ORACLE, + GHO_USD_FEED, + address(AaveV3EthereumLido.COLLECTOR), + IERC20(AaveV3EthereumAssets.USDC_UNDERLYING).balanceOf(MiscEthereum.AAVE_SWAPPER), + 100 + ); + + uint256 backDatedAmount = (ACTUAL_STREAM_AMOUNT * (block.timestamp - STREAM_START_TIME)) / + STREAM_DURATION; + + // transfer backend amount + AaveV3Ethereum.COLLECTOR.transfer( + AaveV3EthereumLidoAssets.GHO_A_TOKEN, + TOKENLOGIC_SAFE, + backDatedAmount + ); + + // stream + AaveV3Ethereum.COLLECTOR.stream( + CollectorUtils.CreateStreamInput({ + underlying: AaveV3EthereumLidoAssets.GHO_A_TOKEN, + receiver: TOKENLOGIC_SAFE, + amount: ACTUAL_STREAM_AMOUNT - backDatedAmount, + start: block.timestamp, + duration: STREAM_DURATION + STREAM_START_TIME - block.timestamp + }) + ); + } +} diff --git a/src/20241213_AaveV3Ethereum_TokenLogicFinancialServiceProvider/AaveV3Ethereum_TokenLogicFinancialServiceProvider_20241213.t.sol b/src/20241213_AaveV3Ethereum_TokenLogicFinancialServiceProvider/AaveV3Ethereum_TokenLogicFinancialServiceProvider_20241213.t.sol new file mode 100644 index 000000000..e77d6d023 --- /dev/null +++ b/src/20241213_AaveV3Ethereum_TokenLogicFinancialServiceProvider/AaveV3Ethereum_TokenLogicFinancialServiceProvider_20241213.t.sol @@ -0,0 +1,177 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV3EthereumLido, AaveV3EthereumLidoAssets} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; +import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Ethereum_TokenLogicFinancialServiceProvider_20241213} from './AaveV3Ethereum_TokenLogicFinancialServiceProvider_20241213.sol'; + +/** + * @dev Test for AaveV3Ethereum_TokenLogicFinancialServiceProvider_20241213 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241213_AaveV3Ethereum_TokenLogicFinancialServiceProvider/AaveV3Ethereum_TokenLogicFinancialServiceProvider_20241213.t.sol -vv + */ +contract AaveV3Ethereum_TokenLogicFinancialServiceProvider_20241213_Test is ProtocolV3TestBase { + event SwapRequested( + address milkman, + address indexed fromToken, + address indexed toToken, + address fromOracle, + address toOracle, + uint256 amount, + address indexed recipient, + uint256 slippage + ); + + AaveV3Ethereum_TokenLogicFinancialServiceProvider_20241213 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21414994); + proposal = new AaveV3Ethereum_TokenLogicFinancialServiceProvider_20241213(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_TokenLogicFinancialServiceProvider_20241213', + AaveV3Ethereum.POOL, + address(proposal) + ); + } + + function test_deposit() public { + uint256 collectorGhoBalanceBefore = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf( + address(AaveV3EthereumLido.COLLECTOR) + ); + uint256 collectorAEthLidoGhoBalanceBefore = IERC20(AaveV3EthereumLidoAssets.GHO_A_TOKEN) + .balanceOf(address(AaveV3EthereumLido.COLLECTOR)); + + executePayload(vm, address(proposal)); + + uint256 collectorGhoBalanceAfter = IERC20(AaveV3EthereumAssets.GHO_UNDERLYING).balanceOf( + address(AaveV3EthereumLido.COLLECTOR) + ); + uint256 collectorAEthLidoGhoBalanceAfter = IERC20(AaveV3EthereumLidoAssets.GHO_A_TOKEN) + .balanceOf(address(AaveV3EthereumLido.COLLECTOR)); + + uint256 backDatedAmount = (proposal.ACTUAL_STREAM_AMOUNT() * + (block.timestamp - proposal.STREAM_START_TIME())) / proposal.STREAM_DURATION(); + + assertEq(collectorGhoBalanceBefore - collectorGhoBalanceAfter, proposal.GHO_DEPOSIT_AMOUNT()); + assertEq( + collectorAEthLidoGhoBalanceAfter - collectorAEthLidoGhoBalanceBefore, + proposal.GHO_DEPOSIT_AMOUNT() - backDatedAmount + ); + } + + function test_swap() public { + uint256 collectorAEthUsdcBalanceBefore = IERC20(AaveV3EthereumAssets.USDC_A_TOKEN).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + + vm.expectEmit(true, true, true, true, MiscEthereum.AAVE_SWAPPER); + emit SwapRequested( + proposal.MILKMAN(), + AaveV3EthereumAssets.USDC_UNDERLYING, + AaveV3EthereumAssets.GHO_UNDERLYING, + AaveV3EthereumAssets.USDC_ORACLE, + proposal.GHO_USD_FEED(), + proposal.A_ETH_USDC_WITHDRAW_AMOUNT(), + address(AaveV3EthereumLido.COLLECTOR), + 100 + ); + + executePayload(vm, address(proposal)); + + uint256 collectorAEthUsdcBalanceAfter = IERC20(AaveV3EthereumAssets.USDC_A_TOKEN).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + + assertApproxEqAbs( + collectorAEthUsdcBalanceBefore, + collectorAEthUsdcBalanceAfter + proposal.A_ETH_USDC_WITHDRAW_AMOUNT(), + 1e6 + ); + + assertEq( + IERC20(AaveV3EthereumAssets.USDC_UNDERLYING).balanceOf( + 0x61De0d8d9D49Ec452dd325c1AB746BF113957c98 // milkmanInstance contract + ), + proposal.A_ETH_USDC_WITHDRAW_AMOUNT() + ); + } + + function test_stream() public { + uint256 backDatedAmount = (proposal.ACTUAL_STREAM_AMOUNT() * + (block.timestamp - proposal.STREAM_START_TIME())) / proposal.STREAM_DURATION(); + + uint256 nextCollectorStreamID = AaveV3Ethereum.COLLECTOR.getNextStreamId(); + + executePayload(vm, address(proposal)); + + ( + address sender, + address recipient, + uint256 deposit, + address tokenAddress, + uint256 startTime, + uint256 stopTime, + uint256 remainingBalance, + + ) = AaveV3Ethereum.COLLECTOR.getStream(nextCollectorStreamID); + + assertEq(sender, address(AaveV3Ethereum.COLLECTOR)); + assertEq(recipient, proposal.TOKENLOGIC_SAFE()); + assertEq(deposit, proposal.ACTUAL_STREAM_AMOUNT() - backDatedAmount); + assertEq(tokenAddress, AaveV3EthereumLidoAssets.GHO_A_TOKEN); + assertEq(startTime, block.timestamp); + assertEq(stopTime, proposal.STREAM_START_TIME() + proposal.STREAM_DURATION()); + assertEq(remainingBalance, proposal.ACTUAL_STREAM_AMOUNT() - backDatedAmount); + + // Can withdraw during stream + vm.warp(block.timestamp + 35 days); + + uint256 collectorGhoBalanceBefore = IERC20(AaveV3EthereumLidoAssets.GHO_A_TOKEN).balanceOf( + address(AaveV3Ethereum.COLLECTOR) + ); + uint256 receiverGhoBalanceBefore = IERC20(AaveV3EthereumLidoAssets.GHO_A_TOKEN).balanceOf( + proposal.TOKENLOGIC_SAFE() + ); + + vm.startPrank(proposal.TOKENLOGIC_SAFE()); + AaveV3Ethereum.COLLECTOR.withdrawFromStream( + nextCollectorStreamID, + proposal.ACTUAL_STREAM_AMOUNT() / 12 + ); + vm.stopPrank(); + + assertGt( + IERC20(AaveV3EthereumLidoAssets.GHO_A_TOKEN).balanceOf(proposal.TOKENLOGIC_SAFE()), + receiverGhoBalanceBefore + ); + + assertLt( + IERC20(AaveV3EthereumLidoAssets.GHO_A_TOKEN).balanceOf(address(AaveV3Ethereum.COLLECTOR)), + collectorGhoBalanceBefore + ); + + // Can withdraw post stream all remaining funds + vm.warp(block.timestamp + proposal.STREAM_DURATION()); + + (, , , , , , uint256 remaining, ) = AaveV3Ethereum.COLLECTOR.getStream(nextCollectorStreamID); + + vm.startPrank(proposal.TOKENLOGIC_SAFE()); + AaveV3Ethereum.COLLECTOR.withdrawFromStream(nextCollectorStreamID, remaining); + vm.stopPrank(); + + assertEq( + IERC20(AaveV3EthereumLidoAssets.GHO_A_TOKEN).balanceOf(proposal.TOKENLOGIC_SAFE()), + receiverGhoBalanceBefore + proposal.ACTUAL_STREAM_AMOUNT() - backDatedAmount + ); + } +} diff --git a/src/20241213_AaveV3Ethereum_TokenLogicFinancialServiceProvider/TokenLogicFinancialServiceProvider.md b/src/20241213_AaveV3Ethereum_TokenLogicFinancialServiceProvider/TokenLogicFinancialServiceProvider.md new file mode 100644 index 000000000..16e80553c --- /dev/null +++ b/src/20241213_AaveV3Ethereum_TokenLogicFinancialServiceProvider/TokenLogicFinancialServiceProvider.md @@ -0,0 +1,111 @@ +--- +title: "Funding Proposal: TokenLogic Financial Service Provider" +author: "TokenLogic" +discussions: https://governance.aave.com/t/arfc-tokenlogic-financial-services-provider/20182 +snapshot: https://snapshot.box/#/s:aave.eth/proposal/0xd1fdca5d69b03ed57848180d62a812ab1a1ff72f85d671c417b5ff8fb2bd0a7c +--- + +## Simple Summary + +TokenLogic proposes to renew its engagement with the Aave DAO for one year, starting on December 15, 2024, upon the conclusion of the current stream. + +TokenLogic is to provide the following services to the DAO. + +- Treasury and Runway Management; +- Analytics and Performance Metrics; +- GHO's growth across DeFi and CeFi; and, +- Support Aave protocol parameter optimizations. + +## Motivation + +### Treasury and Runway Management + +**Asset Management & Financial Security** + +A central area of focus for the Finance Services Provider is to ensure that the DAO’s expenses and strategic initiatives are funded efficiently and without delay. Through the Steward role, or the standard governance process when required, TokenLogic will prioritize maintaining the DAO’s financial stability by ensuring a runway that exceeds six months of its burn rate while optimizing capital efficiency. + +Key components of this objective include: + +- Bridging Aave funds across networks; +- Allocating assets for capital efficiency, integrating yield bearing assets to the treasury; +- Migrating funds from Aave v2 to Aave v3, and between Aave v3 markets; +- Swapping assets to align expenses with holdings. + +### Analytics and Performance Metrics + +TokenLogic is establishing itself as the definitive hub for all Aave Protocol and GHO-related data via the [Aave Portal](https://aave.tokenlogic.xyz/). This initiative will be continuously developed and expanded throughout the year, providing access to key metrics on protocol performance, health, GHO dynamics, and market analysis. + +Transparency, analytics, and reporting are at the core of this effort, ensuring a clear understanding of the protocol’s financial status and overall performance. The Aave Portal will serve as an important tool for informed decision-making and in-depth analysis of the Aave ecosystem. + +To further engage and educate the community, this initiative will be complemented by detailed threads/articles released throughout the mandate, promoting awareness and understanding of the platform’s developments. + +### GHO Adoption + +**Oversight** + +The year 2025 will mark the second year of GHO, solidifying its strength and utility within the ecosystem. This milestone year is set to be a pivotal period of expansion for GHO, as it continues to expand to other networks and remains a cornerstone of the protocol’s revenue model. + +As GHO Stewards, TokenLogic will oversee critical configurations, including the Borrow Rate, GSM Caps and Fees, ensuring optimal functionality and sustainability. In our role as Treasury Managers, we will strategically manage GHO swaps to maintain a robust and stable peg, reinforcing GHO’s position as a key asset within the Aave ecosystem. + +**Liquidity** + +We will continue to spearhead the operations of the Aave Liquidity Committee (ALC), with a primary focus on managing liquidity and driving integrations across diverse protocols. + +Our key responsibilities include: + +- Strategically adjusting liquidity incentives to ensure robust market depth; +- Designing and implementing direct liquidity incentive programs; +- Leading initiatives to enhance GHO’s utility and adoption; +- Optimizing the deployment of the DAO’s strategic voting assets; +- Supporting future GHO facilitator programs, and Protocol-Owned Liquidity (POL) initiatives; +- Facilitating GHO integration into centralized exchanges, fund management platforms, and the broader DeFi ecosystem; and, +- Support teams seeking to attain a line of credit within the upcoming Emergence instance. + +**Parameter Configuration** + +TokenLogic will continue to provide detailed insights into GHO's performance and provide parameter recommendations that prioritise price stability whilst balancing the DAO's growth ambitions. + +Strategic focus will be placed on managing the borrow rate and peg relationship to maintain the resilience of the peg by retaining funds within the GSMs, whilst promoting the ongoing use of GHO within evolving market dynamics. + +The Aave Portal will provide insights into the impact of the parameter adjustments to curate an environment that promotes sustainable growth, adoption and aligns with Aave's broader financial goals. + +The TokenLogic team will collaborate closely with other service providers to create balanced, effective solutions that benefit the protocol as a whole. + +### Aave Protocol + +The evolution of the Aave protocol, including updates to Aave V4, the deployment of Umbrella, and the launch of new Aave markets, will bring transformative changes to the protocol’s operations. Our proposal focuses on providing the financial planning and management essential for navigating these developments and ensuring smooth integration within the broader ecosystem. + +In addition, we will support the adaptation of Aave’s tokenomics to meet the requirements of Umbrella and the introduction of new staking pools. Through proactive collaboration, strategic guidance, and consultation, we are committed to ensuring these updates are implemented seamlessly and positioned for long-term success. + +## Terms + +- 12-month engagement, December 15th 2024 to December 15th 2025; +- $1M, streamed linearly throughout the engagement; +- $1,000,000 is to be withdrawn in aEthLidoGHO (Aave V3 Lido GHO) + +## Specification + +To support funding the streams, the following is to be performed: + +- 0.75M GHO from the Collector deposited into the Lido Prime instance; +- 0.75M aEthUSDC withdrawn from Aave V3 Mainnet and swapped for GHO; and, +- GHO from above swap is to be sent to Collector (Treasury). + +Create the following stream allowing TokenLogic to withdraw aEthLidoGHO from the Prime instance. + +- Recipient: TokenLogic +- Stream: 1M aEthLidoGHO over 365 days +- Address: `0x3e4A9f478C0c13A15137Fc81e9d8269F127b4B40` + +The stream shall commence the next block from when the previous stream finishes. + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/8894f1b6ebc87f5e81d8e7cc196e7c43ea5855dc/src/20241213_AaveV3Ethereum_TokenLogicFinancialServiceProvider/AaveV3Ethereum_TokenLogicFinancialServiceProvider_20241213.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/8894f1b6ebc87f5e81d8e7cc196e7c43ea5855dc/src/20241213_AaveV3Ethereum_TokenLogicFinancialServiceProvider/AaveV3Ethereum_TokenLogicFinancialServiceProvider_20241213.t.sol) + [Snapshot](https://snapshot.box/#/s:aave.eth/proposal/0xd1fdca5d69b03ed57848180d62a812ab1a1ff72f85d671c417b5ff8fb2bd0a7c) +- [Discussion](https://governance.aave.com/t/arfc-tokenlogic-financial-services-provider/20182) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241213_AaveV3Ethereum_TokenLogicFinancialServiceProvider/TokenLogicFinancialServiceProvider_20241213.s.sol b/src/20241213_AaveV3Ethereum_TokenLogicFinancialServiceProvider/TokenLogicFinancialServiceProvider_20241213.s.sol new file mode 100644 index 000000000..c9d324adf --- /dev/null +++ b/src/20241213_AaveV3Ethereum_TokenLogicFinancialServiceProvider/TokenLogicFinancialServiceProvider_20241213.s.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Ethereum_TokenLogicFinancialServiceProvider_20241213} from './AaveV3Ethereum_TokenLogicFinancialServiceProvider_20241213.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241213_AaveV3Ethereum_TokenLogicFinancialServiceProvider/TokenLogicFinancialServiceProvider_20241213.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/TokenLogicFinancialServiceProvider_20241213.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_TokenLogicFinancialServiceProvider_20241213).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/20241213_AaveV3Ethereum_TokenLogicFinancialServiceProvider/TokenLogicFinancialServiceProvider_20241213.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_TokenLogicFinancialServiceProvider_20241213).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241213_AaveV3Ethereum_TokenLogicFinancialServiceProvider/TokenLogicFinancialServiceProvider.md' + ) + ); + } +} diff --git a/src/20241213_AaveV3Ethereum_TokenLogicFinancialServiceProvider/config.ts b/src/20241213_AaveV3Ethereum_TokenLogicFinancialServiceProvider/config.ts new file mode 100644 index 000000000..4b7dabb8b --- /dev/null +++ b/src/20241213_AaveV3Ethereum_TokenLogicFinancialServiceProvider/config.ts @@ -0,0 +1,15 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3Ethereum'], + title: 'TokenLogic Financial Service Provider', + shortName: 'TokenLogicFinancialServiceProvider', + date: '20241213', + author: 'TokenLogic', + discussion: 'https://governance.aave.com/t/arfc-tokenlogic-financial-services-provider/20182', + snapshot: + 'https://snapshot.box/#/s:aave.eth/proposal/0xd1fdca5d69b03ed57848180d62a812ab1a1ff72f85d671c417b5ff8fb2bd0a7c', + votingNetwork: 'POLYGON', + }, + poolOptions: {AaveV3Ethereum: {configs: {}, cache: {blockNumber: 21395370}}}, +}; diff --git a/src/20241223_AaveV3Ethereum_WeETHRiskParameterAdjustment/AaveV3Ethereum_WeETHRiskParameterAdjustment_20241223.sol b/src/20241223_AaveV3Ethereum_WeETHRiskParameterAdjustment/AaveV3Ethereum_WeETHRiskParameterAdjustment_20241223.sol new file mode 100644 index 000000000..af48f46f3 --- /dev/null +++ b/src/20241223_AaveV3Ethereum_WeETHRiskParameterAdjustment/AaveV3Ethereum_WeETHRiskParameterAdjustment_20241223.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV3PayloadEthereum} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereum.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title weETH Risk Parameter Adjustment + * @author ChaosLabs + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-weeth-risk-parameter-adjustment/20167 + */ +contract AaveV3Ethereum_WeETHRiskParameterAdjustment_20241223 is AaveV3PayloadEthereum { + function collateralsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.CollateralUpdate[] memory) + { + IAaveV3ConfigEngine.CollateralUpdate[] + memory collateralUpdate = new IAaveV3ConfigEngine.CollateralUpdate[](1); + + collateralUpdate[0] = IAaveV3ConfigEngine.CollateralUpdate({ + asset: AaveV3EthereumAssets.weETH_UNDERLYING, + ltv: 77_50, + liqThreshold: 80_00, + liqBonus: 7_00, + debtCeiling: EngineFlags.KEEP_CURRENT, + liqProtocolFee: EngineFlags.KEEP_CURRENT + }); + + return collateralUpdate; + } +} diff --git a/src/20241223_AaveV3Ethereum_WeETHRiskParameterAdjustment/AaveV3Ethereum_WeETHRiskParameterAdjustment_20241223.t.sol b/src/20241223_AaveV3Ethereum_WeETHRiskParameterAdjustment/AaveV3Ethereum_WeETHRiskParameterAdjustment_20241223.t.sol new file mode 100644 index 000000000..a8e175475 --- /dev/null +++ b/src/20241223_AaveV3Ethereum_WeETHRiskParameterAdjustment/AaveV3Ethereum_WeETHRiskParameterAdjustment_20241223.t.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Ethereum} from 'aave-address-book/AaveV3Ethereum.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Ethereum_WeETHRiskParameterAdjustment_20241223} from './AaveV3Ethereum_WeETHRiskParameterAdjustment_20241223.sol'; + +/** + * @dev Test for AaveV3Ethereum_WeETHRiskParameterAdjustment_20241223 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241223_AaveV3Ethereum_WeETHRiskParameterAdjustment/AaveV3Ethereum_WeETHRiskParameterAdjustment_20241223.t.sol -vv + */ +contract AaveV3Ethereum_WeETHRiskParameterAdjustment_20241223_Test is ProtocolV3TestBase { + AaveV3Ethereum_WeETHRiskParameterAdjustment_20241223 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21465762); + proposal = new AaveV3Ethereum_WeETHRiskParameterAdjustment_20241223(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_WeETHRiskParameterAdjustment_20241223', + AaveV3Ethereum.POOL, + address(proposal) + ); + } +} diff --git a/src/20241223_AaveV3Ethereum_WeETHRiskParameterAdjustment/WeETHRiskParameterAdjustment.md b/src/20241223_AaveV3Ethereum_WeETHRiskParameterAdjustment/WeETHRiskParameterAdjustment.md new file mode 100644 index 000000000..4fcd350eb --- /dev/null +++ b/src/20241223_AaveV3Ethereum_WeETHRiskParameterAdjustment/WeETHRiskParameterAdjustment.md @@ -0,0 +1,38 @@ +--- +title: "weETH Risk Parameter Adjustment" +author: "ChaosLabs" +discussions: "https://governance.aave.com/t/arfc-weeth-risk-parameter-adjustment/20167" +--- + +## Simple Summary + +A proposal to adjust weETH’s LTV, LT, and LB on the Ethereum Core instance. + +## Motivation + +weETH’s collateral parameters are currently set to 72.5%, 75%, and 7.5% for LTV, LT, and LB, respectively, on Ethereum — Core. Following observations of user behavior and on-chain liquidity, we are able to recommend adjusting these parameters to make the asset more efficient as collateral. The vast majority of debt against weETH is WETH, making these positions low-risk due to weETH’s utilization of the ETH/USD oracle augmented with its exchange rate. + +Additionally, as displayed above, 96% of borrowing is done in E-Mode, relying on different collateral values. + +weETH has remained highly liquid against USDT, the top uncorrelated debt asset on Ethereum, indicating that liquidations of uncorrelated positions could be efficiently liquidated. + +Our simulations, which take into account on-chain liquidity and user behavior and distribution, indicate that the protocol can increase LTV and LT for weETH, along with decreasing its LB. We recommend maintaining the 2.5 percentage point buffer between LTV and LT. + +When reducing LB, it is also critical to note that the asset has not experienced significant depegs from its exchange rate value relative to ETH; its average discount over the last three months was just 5.6 bps. Large discounts can reduce the effective LB and prevent liquidations from being processed. + +## Specification + +| Asset | Network | Instance | Current LTV | Recommended LTV | Current LT | Recommended LT | Current LB | Recommended LB | +| ----- | -------- | -------- | ----------- | --------------- | ---------- | -------------- | ---------- | -------------- | +| weETH | Ethereum | Core | 72.5% | 77.5% | 75% | 80% | 7.5% | 7% | + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/18db65171fa37d4e0de8bcb7c3477cfde4f4ba36/src/20241223_AaveV3Ethereum_WeETHRiskParameterAdjustment/AaveV3Ethereum_WeETHRiskParameterAdjustment_20241223.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/18db65171fa37d4e0de8bcb7c3477cfde4f4ba36/src/20241223_AaveV3Ethereum_WeETHRiskParameterAdjustment/AaveV3Ethereum_WeETHRiskParameterAdjustment_20241223.t.sol) +- Snapshot: Direct-to-AIP +- [Discussion](https://governance.aave.com/t/arfc-weeth-risk-parameter-adjustment/20167) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241223_AaveV3Ethereum_WeETHRiskParameterAdjustment/WeETHRiskParameterAdjustment_20241223.s.sol b/src/20241223_AaveV3Ethereum_WeETHRiskParameterAdjustment/WeETHRiskParameterAdjustment_20241223.s.sol new file mode 100644 index 000000000..798d0f34a --- /dev/null +++ b/src/20241223_AaveV3Ethereum_WeETHRiskParameterAdjustment/WeETHRiskParameterAdjustment_20241223.s.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Ethereum_WeETHRiskParameterAdjustment_20241223} from './AaveV3Ethereum_WeETHRiskParameterAdjustment_20241223.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241223_AaveV3Ethereum_WeETHRiskParameterAdjustment/WeETHRiskParameterAdjustment_20241223.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/WeETHRiskParameterAdjustment_20241223.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_WeETHRiskParameterAdjustment_20241223).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/20241223_AaveV3Ethereum_WeETHRiskParameterAdjustment/WeETHRiskParameterAdjustment_20241223.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_WeETHRiskParameterAdjustment_20241223).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241223_AaveV3Ethereum_WeETHRiskParameterAdjustment/WeETHRiskParameterAdjustment.md' + ) + ); + } +} diff --git a/src/20241223_AaveV3Ethereum_WeETHRiskParameterAdjustment/config.ts b/src/20241223_AaveV3Ethereum_WeETHRiskParameterAdjustment/config.ts new file mode 100644 index 000000000..54b0c471a --- /dev/null +++ b/src/20241223_AaveV3Ethereum_WeETHRiskParameterAdjustment/config.ts @@ -0,0 +1,30 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + author: 'ChaosLabs', + pools: ['AaveV3Ethereum'], + title: 'weETH Risk Parameter Adjustment', + shortName: 'WeETHRiskParameterAdjustment', + date: '20241223', + discussion: 'https://governance.aave.com/t/arfc-weeth-risk-parameter-adjustment/20167', + snapshot: 'Direct-to-AIP', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Ethereum: { + configs: { + COLLATERALS_UPDATE: [ + { + asset: 'weETH', + ltv: '77.5', + liqThreshold: '80', + liqBonus: '7', + debtCeiling: '', + liqProtocolFee: '', + }, + ], + }, + cache: {blockNumber: 21465762}, + }, + }, +}; diff --git a/src/20241223_Multi_USDSInterestRateCurveUpdate/AaveV3EthereumLido_USDSInterestRateCurveUpdate_20241223.sol b/src/20241223_Multi_USDSInterestRateCurveUpdate/AaveV3EthereumLido_USDSInterestRateCurveUpdate_20241223.sol new file mode 100644 index 000000000..1c02dcb61 --- /dev/null +++ b/src/20241223_Multi_USDSInterestRateCurveUpdate/AaveV3EthereumLido_USDSInterestRateCurveUpdate_20241223.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumLidoAssets} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {AaveV3PayloadEthereumLido} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereumLido.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title USDS Interest Rate Curve Update + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-usds-interest-rate-curve-update/20243 + */ +contract AaveV3EthereumLido_USDSInterestRateCurveUpdate_20241223 is AaveV3PayloadEthereumLido { + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV3ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](1); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumLidoAssets.USDS_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 11_75, + variableRateSlope2: 35_00 + }) + }); + + return rateStrategies; + } +} diff --git a/src/20241223_Multi_USDSInterestRateCurveUpdate/AaveV3EthereumLido_USDSInterestRateCurveUpdate_20241223.t.sol b/src/20241223_Multi_USDSInterestRateCurveUpdate/AaveV3EthereumLido_USDSInterestRateCurveUpdate_20241223.t.sol new file mode 100644 index 000000000..85f281c3e --- /dev/null +++ b/src/20241223_Multi_USDSInterestRateCurveUpdate/AaveV3EthereumLido_USDSInterestRateCurveUpdate_20241223.t.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumLido} from 'aave-address-book/AaveV3EthereumLido.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3EthereumLido_USDSInterestRateCurveUpdate_20241223} from './AaveV3EthereumLido_USDSInterestRateCurveUpdate_20241223.sol'; + +/** + * @dev Test for AaveV3EthereumLido_USDSInterestRateCurveUpdate_20241223 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241223_Multi_USDSInterestRateCurveUpdate/AaveV3EthereumLido_USDSInterestRateCurveUpdate_20241223.t.sol -vv + */ +contract AaveV3EthereumLido_USDSInterestRateCurveUpdate_20241223_Test is ProtocolV3TestBase { + AaveV3EthereumLido_USDSInterestRateCurveUpdate_20241223 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21464361); + proposal = new AaveV3EthereumLido_USDSInterestRateCurveUpdate_20241223(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3EthereumLido_USDSInterestRateCurveUpdate_20241223', + AaveV3EthereumLido.POOL, + address(proposal) + ); + } +} diff --git a/src/20241223_Multi_USDSInterestRateCurveUpdate/AaveV3Ethereum_USDSInterestRateCurveUpdate_20241223.sol b/src/20241223_Multi_USDSInterestRateCurveUpdate/AaveV3Ethereum_USDSInterestRateCurveUpdate_20241223.sol new file mode 100644 index 000000000..d945d2a9f --- /dev/null +++ b/src/20241223_Multi_USDSInterestRateCurveUpdate/AaveV3Ethereum_USDSInterestRateCurveUpdate_20241223.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {AaveV3PayloadEthereum} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadEthereum.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title USDS Interest Rate Curve Update + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-usds-interest-rate-curve-update/20243 + */ +contract AaveV3Ethereum_USDSInterestRateCurveUpdate_20241223 is AaveV3PayloadEthereum { + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV3ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](1); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumAssets.USDS_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: 11_75, + variableRateSlope1: EngineFlags.KEEP_CURRENT, + variableRateSlope2: 35_00 + }) + }); + + return rateStrategies; + } +} diff --git a/src/20241223_Multi_USDSInterestRateCurveUpdate/AaveV3Ethereum_USDSInterestRateCurveUpdate_20241223.t.sol b/src/20241223_Multi_USDSInterestRateCurveUpdate/AaveV3Ethereum_USDSInterestRateCurveUpdate_20241223.t.sol new file mode 100644 index 000000000..4eeeb3618 --- /dev/null +++ b/src/20241223_Multi_USDSInterestRateCurveUpdate/AaveV3Ethereum_USDSInterestRateCurveUpdate_20241223.t.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Ethereum} from 'aave-address-book/AaveV3Ethereum.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {AaveV3Ethereum_USDSInterestRateCurveUpdate_20241223} from './AaveV3Ethereum_USDSInterestRateCurveUpdate_20241223.sol'; + +/** + * @dev Test for AaveV3Ethereum_USDSInterestRateCurveUpdate_20241223 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20241223_Multi_USDSInterestRateCurveUpdate/AaveV3Ethereum_USDSInterestRateCurveUpdate_20241223.t.sol -vv + */ +contract AaveV3Ethereum_USDSInterestRateCurveUpdate_20241223_Test is ProtocolV3TestBase { + AaveV3Ethereum_USDSInterestRateCurveUpdate_20241223 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 21464361); + proposal = new AaveV3Ethereum_USDSInterestRateCurveUpdate_20241223(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3Ethereum_USDSInterestRateCurveUpdate_20241223', + AaveV3Ethereum.POOL, + address(proposal) + ); + } +} diff --git a/src/20241223_Multi_USDSInterestRateCurveUpdate/USDSInterestRateCurveUpdate.md b/src/20241223_Multi_USDSInterestRateCurveUpdate/USDSInterestRateCurveUpdate.md new file mode 100644 index 000000000..5928b61bd --- /dev/null +++ b/src/20241223_Multi_USDSInterestRateCurveUpdate/USDSInterestRateCurveUpdate.md @@ -0,0 +1,35 @@ +--- +title: "USDS Interest Rate Curve Update" +author: "ChaosLabs" +discussions: "https://governance.aave.com/t/arfc-usds-interest-rate-curve-update/20243" +--- + +## Simple Summary + +Following our previous stablecoin IR recommendation, Chaos Labs recommends adjustments to USDS’s interest rate curves on the Prime and Core deployments. + +## Motivation + +As noted in our previous stablecoin IR [recommendation](https://www.notion.so/USDS-IR-Update-15e57ab37ebf80bdb091e3d65ca16bff?pvs=21), we did not provide updates to USDS’s interest rate curves because there was a concurrent [AIP](https://vote.onaave.com/proposal/?proposalId=209&ipfsHash=0x1a9acbab30d3c9c381e899fb79433cf8bdb996bddb514b195baa32a085a84809) that proposed adjusting its IR curves. This AIP has since passed and been implemented, allowing us to recommend further adjustments. + +We have observed frequent spikes above UOptimal for USDS on the Core instance, with rates briefly exceeding 100% in December. Rates on the Prime deployment have been more stable as a result of limited sUSDe growth in this deployment. As shown below, the spikes in the Core instance have continued after the passage of the AIP and the associated IR change. + +The frequent spikes have coincided with a decrease in borrows, as a result of large market outflows. To optimally price the asset, and to set USDS in line with other stablecoins, we recommend increasing the target borrow rate at UOptimal, which will also reduce the time spent above UOptimal. Specifically, we recommend targeting 12.5% at UOptimal and a Slope2 of 35% for both USDS markets, noting that this is aligned with the target rate for all other major stablecoin markets. + +## Specification + +| Chain | Market | **Asset** | Current Base Rate | **Current Slope1** | **Current Slope2** | Recommended Base Rate | **Recommended Slope1** | **Recommended Slope2** | +| -------- | ------ | --------- | ----------------- | ------------------ | ------------------ | --------------------- | ---------------------- | ---------------------- | +| Ethereum | Core | USDS | 9.25% | 0.75% | 75% | 11.75% | - | 35% | +| Ethereum | Prime | USDS | 0.75% | 9.25% | 75% | - | 11.75% | 35% | + +## References + +- Implementation: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/e4948e240d625cf70b0e2d44b1de1d5b2b5e9cc0/src/20241223_Multi_USDSInterestRateCurveUpdate/AaveV3Ethereum_USDSInterestRateCurveUpdate_20241223.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/e4948e240d625cf70b0e2d44b1de1d5b2b5e9cc0/src/20241223_Multi_USDSInterestRateCurveUpdate/AaveV3EthereumLido_USDSInterestRateCurveUpdate_20241223.sol) +- Tests: [AaveV3Ethereum](https://github.com/bgd-labs/aave-proposals-v3/blob/e4948e240d625cf70b0e2d44b1de1d5b2b5e9cc0/src/20241223_Multi_USDSInterestRateCurveUpdate/AaveV3Ethereum_USDSInterestRateCurveUpdate_20241223.t.sol), [AaveV3EthereumLido](https://github.com/bgd-labs/aave-proposals-v3/blob/e4948e240d625cf70b0e2d44b1de1d5b2b5e9cc0/src/20241223_Multi_USDSInterestRateCurveUpdate/AaveV3EthereumLido_USDSInterestRateCurveUpdate_20241223.t.sol) +- Snapshot: Direct-to-AIP +- [Discussion](https://governance.aave.com/t/arfc-usds-interest-rate-curve-update/20243) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). diff --git a/src/20241223_Multi_USDSInterestRateCurveUpdate/USDSInterestRateCurveUpdate_20241223.s.sol b/src/20241223_Multi_USDSInterestRateCurveUpdate/USDSInterestRateCurveUpdate_20241223.s.sol new file mode 100644 index 000000000..38ec5f3d0 --- /dev/null +++ b/src/20241223_Multi_USDSInterestRateCurveUpdate/USDSInterestRateCurveUpdate_20241223.s.sol @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3Ethereum_USDSInterestRateCurveUpdate_20241223} from './AaveV3Ethereum_USDSInterestRateCurveUpdate_20241223.sol'; +import {AaveV3EthereumLido_USDSInterestRateCurveUpdate_20241223} from './AaveV3EthereumLido_USDSInterestRateCurveUpdate_20241223.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20241223_Multi_USDSInterestRateCurveUpdate/USDSInterestRateCurveUpdate_20241223.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/USDSInterestRateCurveUpdate_20241223.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV3Ethereum_USDSInterestRateCurveUpdate_20241223).creationCode + ); + address payload1 = GovV3Helpers.deployDeterministic( + type(AaveV3EthereumLido_USDSInterestRateCurveUpdate_20241223).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](2); + actions[0] = GovV3Helpers.buildAction(payload0); + actions[1] = GovV3Helpers.buildAction(payload1); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Create Proposal + * command: make deploy-ledger contract=src/20241223_Multi_USDSInterestRateCurveUpdate/USDSInterestRateCurveUpdate_20241223.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[](2); + actionsEthereum[0] = GovV3Helpers.buildAction( + type(AaveV3Ethereum_USDSInterestRateCurveUpdate_20241223).creationCode + ); + actionsEthereum[1] = GovV3Helpers.buildAction( + type(AaveV3EthereumLido_USDSInterestRateCurveUpdate_20241223).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile( + vm, + 'src/20241223_Multi_USDSInterestRateCurveUpdate/USDSInterestRateCurveUpdate.md' + ) + ); + } +} diff --git a/src/20241223_Multi_USDSInterestRateCurveUpdate/config.ts b/src/20241223_Multi_USDSInterestRateCurveUpdate/config.ts new file mode 100644 index 000000000..703a1acc3 --- /dev/null +++ b/src/20241223_Multi_USDSInterestRateCurveUpdate/config.ts @@ -0,0 +1,48 @@ +import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + configFile: 'tmp.ts', + author: 'Aave Chan Initiative', + pools: ['AaveV3Ethereum', 'AaveV3EthereumLido'], + title: 'USDS Interest Rate Curve Update', + shortName: 'USDSInterestRateCurveUpdate', + date: '20241223', + discussion: 'https://governance.aave.com/t/arfc-usds-interest-rate-curve-update/20243', + snapshot: 'Direct-to-AIP', + votingNetwork: 'POLYGON', + }, + poolOptions: { + AaveV3Ethereum: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'USDS', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '11.75', + variableRateSlope1: '', + variableRateSlope2: '35', + }, + }, + ], + }, + cache: {blockNumber: 21464361}, + }, + AaveV3EthereumLido: { + configs: { + RATE_UPDATE_V3: [ + { + asset: 'USDS', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '', + variableRateSlope1: '11.75', + variableRateSlope2: '35', + }, + }, + ], + }, + cache: {blockNumber: 21464361}, + }, + }, +}; diff --git a/src/interfaces/ILegacyProxyAdmin.sol b/src/interfaces/ILegacyProxyAdmin.sol new file mode 100644 index 000000000..927876afd --- /dev/null +++ b/src/interfaces/ILegacyProxyAdmin.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.10; + +import {ITransparentUpgradeableProxy} from 'solidity-utils/contracts/transparent-proxy/TransparentUpgradeableProxy.sol'; + +interface ILegacyProxyAdmin { + function changeProxyAdmin(ITransparentUpgradeableProxy proxy, address newAdmin) external; + + function upgrade(ITransparentUpgradeableProxy proxy, address implementation) external; + + function upgradeAndCall( + ITransparentUpgradeableProxy proxy, + address implementation, + bytes memory data + ) external; +} diff --git a/src/interfaces/ccip/IEVM2EVMOffRamp.sol b/src/interfaces/ccip/IEVM2EVMOffRamp.sol index b900be64b..7f8b84385 100644 --- a/src/interfaces/ccip/IEVM2EVMOffRamp.sol +++ b/src/interfaces/ccip/IEVM2EVMOffRamp.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.0; import {IInternal} from 'src/interfaces/ccip/IInternal.sol'; -interface IEVM2EVMOffRamp { +interface IEVM2EVMOffRamp_1_2 { /// @notice Execute a single message. /// @param message The message that will be executed. /// @param offchainTokenData Token transfer data to be passed to TokenPool. @@ -17,3 +17,18 @@ interface IEVM2EVMOffRamp { bytes[] memory offchainTokenData ) external; } + +interface IEVM2EVMOffRamp_1_5 { + /// @notice Execute a single message. + /// @param message The message that will be executed. + /// @param offchainTokenData Token transfer data to be passed to TokenPool. + /// @dev We make this external and callable by the contract itself, in order to try/catch + /// its execution and enforce atomicity among successful message processing and token transfer. + /// @dev We use ERC-165 to check for the ccipReceive interface to permit sending tokens to contracts + /// (for example smart contract wallets) without an associated message. + function executeSingleMessage( + IInternal.EVM2EVMMessage calldata message, + bytes[] calldata offchainTokenData, + uint32[] memory tokenGasOverrides + ) external; +} diff --git a/src/interfaces/ccip/IEVM2EVMOnRamp.sol b/src/interfaces/ccip/IEVM2EVMOnRamp.sol new file mode 100644 index 000000000..20efb0cfd --- /dev/null +++ b/src/interfaces/ccip/IEVM2EVMOnRamp.sol @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import {IInternal} from './IInternal.sol'; + +interface IEVM2EVMOnRamp { + struct TokenTransferFeeConfig { + uint32 minFeeUSDCents; // ──────────╮ Minimum fee to charge per token transfer, multiples of 0.01 USD + uint32 maxFeeUSDCents; // │ Maximum fee to charge per token transfer, multiples of 0.01 USD + uint16 deciBps; // │ Basis points charged on token transfers, multiples of 0.1bps, or 1e-5 + uint32 destGasOverhead; // │ Gas charged to execute the token transfer on the destination chain + // │ Extra data availability bytes that are returned from the source pool and sent + uint32 destBytesOverhead; // │ to the destination pool. Must be >= Pool.CCIP_LOCK_OR_BURN_V1_RET_BYTES + bool aggregateRateLimitEnabled; // │ Whether this transfer token is to be included in Aggregate Rate Limiting + bool isEnabled; // ─────────────────╯ Whether this token has custom transfer fees + } + + struct DynamicConfig { + address router; // ──────────────────────────╮ Router address + uint16 maxNumberOfTokensPerMsg; // │ Maximum number of distinct ERC20 token transferred per message + uint32 destGasOverhead; // │ Gas charged on top of the gasLimit to cover destination chain costs + uint16 destGasPerPayloadByte; // │ Destination chain gas charged for passing each byte of `data` payload to receiver + uint32 destDataAvailabilityOverheadGas; // ──╯ Extra data availability gas charged on top of the message, e.g. for OCR + uint16 destGasPerDataAvailabilityByte; // ───╮ Amount of gas to charge per byte of message data that needs availability + uint16 destDataAvailabilityMultiplierBps; // │ Multiplier for data availability gas, multiples of bps, or 0.0001 + address priceRegistry; // │ Price registry address + uint32 maxDataBytes; // │ Maximum payload data size in bytes + uint32 maxPerMsgGasLimit; // ────────────────╯ Maximum gas limit for messages targeting EVMs + // │ + // The following three properties are defaults, they can be overridden by setting the TokenTransferFeeConfig for a token + uint16 defaultTokenFeeUSDCents; // ──────────╮ Default token fee charged per token transfer + uint32 defaultTokenDestGasOverhead; // │ Default gas charged to execute the token transfer on the destination chain + bool enforceOutOfOrder; // ──────────────────╯ Whether to enforce the allowOutOfOrderExecution extraArg value to be true. + } + + /// @notice Gets the next sequence number to be used in the onRamp + /// @return the next sequence number to be used + function getExpectedNextSequenceNumber() external view returns (uint64); + + /// @notice Get the next nonce for a given sender + /// @param sender The sender to get the nonce for + /// @return nonce The next nonce for the sender + function getSenderNonce(address sender) external view returns (uint64 nonce); + + /// @notice Adds and removed token pools. + /// @param removes The tokens and pools to be removed + /// @param adds The tokens and pools to be added. + function applyPoolUpdates( + IInternal.PoolUpdate[] memory removes, + IInternal.PoolUpdate[] memory adds + ) external; + + /// @notice Get the pool for a specific token + /// @param destChainSelector The destination chain selector + /// @param sourceToken The source chain token to get the pool for + /// @return pool Token pool + function getPoolBySourceToken( + uint64 destChainSelector, + address sourceToken + ) external view returns (address); + + /// @notice Gets the transfer fee config for a given token. + function getTokenTransferFeeConfig( + address token + ) external view returns (TokenTransferFeeConfig memory tokenTransferFeeConfig); + + /// @notice Returns the dynamic onRamp config. + /// @return dynamicConfig the configuration. + function getDynamicConfig() external view returns (DynamicConfig memory dynamicConfig); +} diff --git a/src/interfaces/ccip/IInternal.sol b/src/interfaces/ccip/IInternal.sol index fa8c78f6d..062ee93da 100644 --- a/src/interfaces/ccip/IInternal.sol +++ b/src/interfaces/ccip/IInternal.sol @@ -5,6 +5,11 @@ pragma solidity ^0.8.0; import {IClient} from 'src/interfaces/ccip/IClient.sol'; interface IInternal { + struct PoolUpdate { + address token; // The IERC20 token address + address pool; // The token pool address + } + /// @notice The cross chain message that gets committed to EVM chains. /// @dev RMN depends on this struct, if changing, please notify the RMN maintainers. struct EVM2EVMMessage { diff --git a/src/interfaces/ccip/IProxyPool.sol b/src/interfaces/ccip/IProxyPool.sol new file mode 100644 index 000000000..4810b9e9d --- /dev/null +++ b/src/interfaces/ccip/IProxyPool.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {ITypeAndVersion} from './ITypeAndVersion.sol'; +import {IRateLimiter} from './IRateLimiter.sol'; + +interface IProxyPool is ITypeAndVersion { + struct ChainUpdate { + uint64 remoteChainSelector; + bool allowed; + bytes remotePoolAddress; + bytes remoteTokenAddress; + IRateLimiter.Config inboundRateLimiterConfig; + IRateLimiter.Config outboundRateLimiterConfig; + } + + function owner() external view returns (address); + function transferOwnership(address newOwner) external; + function acceptOwnership() external; + function getRouter() external view returns (address); + function setRouter(address router) external; + function applyChainUpdates(ChainUpdate[] memory updates) external; + function isSupportedChain(uint64 chainSelector) external view returns (bool); + function getPreviousPool() external view returns (address); + function getCurrentInboundRateLimiterState( + uint64 chainSelector + ) external view returns (IRateLimiter.TokenBucket memory); + function getCurrentOutboundRateLimiterState( + uint64 chainSelector + ) external view returns (IRateLimiter.TokenBucket memory); + function getRemotePool(uint64 remoteChainSelector) external view returns (bytes memory); + function getRemoteToken(uint64 remoteChainSelector) external view returns (bytes memory); +} diff --git a/src/interfaces/ccip/IRateLimiter.sol b/src/interfaces/ccip/IRateLimiter.sol new file mode 100644 index 000000000..d4cb9ffa4 --- /dev/null +++ b/src/interfaces/ccip/IRateLimiter.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +interface IRateLimiter { + struct TokenBucket { + uint128 tokens; // ──────╮ Current number of tokens that are in the bucket. + uint32 lastUpdated; // │ Timestamp in seconds of the last token refill, good for 100+ years. + bool isEnabled; // ──────╯ Indication whether the rate limiting is enabled or not + uint128 capacity; // ────╮ Maximum number of tokens that can be in the bucket. + uint128 rate; // ────────╯ Number of tokens per second that the bucket is refilled. + } + + struct Config { + bool isEnabled; // Indication whether the rate limiting should be enabled + uint128 capacity; // ────╮ Specifies the capacity of the rate limiter + uint128 rate; // ───────╯ Specifies the rate of the rate limiter + } +} diff --git a/src/interfaces/ccip/IRouter.sol b/src/interfaces/ccip/IRouter.sol index 4e524b42f..89c9275b2 100644 --- a/src/interfaces/ccip/IRouter.sol +++ b/src/interfaces/ccip/IRouter.sol @@ -5,23 +5,38 @@ pragma solidity ^0.8.0; import {IClient} from 'src/interfaces/ccip/IClient.sol'; interface IRouter { - /// @notice Request a message to be sent to the destination chain - /// @param destinationChainSelector The destination chain ID - /// @param message The cross-chain CCIP message including data and/or tokens - /// @return messageId The message ID - /// @dev Note if msg.value is larger than the required fee (from getFee) we accept - /// the overpayment with no refund. - /// @dev Reverts with appropriate reason upon invalid message. + error UnsupportedDestinationChain(uint64 destChainSelector); + error InsufficientFeeTokenAmount(); + error InvalidMsgValue(); + + struct OnRamp { + uint64 destChainSelector; + address onRamp; + } + struct OffRamp { + uint64 sourceChainSelector; + address offRamp; + } + + function owner() external view returns (address); + function getWrappedNative() external view returns (address); + function getOffRamps() external view returns (OffRamp[] memory); + function getOnRamp(uint64 destChainSelector) external view returns (address onRampAddress); + function isOffRamp( + uint64 sourceChainSelector, + address offRamp + ) external view returns (bool isOffRamp); + function applyRampUpdates( + OnRamp[] calldata onRampUpdates, + OffRamp[] calldata offRampRemoves, + OffRamp[] calldata offRampAdds + ) external; + function isChainSupported(uint64 chainSelector) external view returns (bool supported); + function getSupportedTokens(uint64 chainSelector) external view returns (address[] memory tokens); function ccipSend( uint64 destinationChainSelector, IClient.EVM2AnyMessage memory message ) external payable returns (bytes32); - - /// @param destinationChainSelector The destination chainSelector - /// @param message The cross-chain CCIP message including data and/or tokens - /// @return fee returns execution fee for the message - /// delivery to destination chain, denominated in the feeToken specified in the message. - /// @dev Reverts with appropriate reason upon invalid message. function getFee( uint64 destinationChainSelector, IClient.EVM2AnyMessage memory message diff --git a/src/interfaces/ccip/ITokenAdminRegistry.sol b/src/interfaces/ccip/ITokenAdminRegistry.sol new file mode 100644 index 000000000..05667ccba --- /dev/null +++ b/src/interfaces/ccip/ITokenAdminRegistry.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {ITypeAndVersion} from './ITypeAndVersion.sol'; +interface ITokenAdminRegistry is ITypeAndVersion { + function owner() external view returns (address); + function acceptAdminRole(address from) external; + function proposeAdministrator(address localToken, address administrator) external; + function transferAdminRole(address localToken, address newAdministrator) external; + function isAdministrator(address localToken, address administrator) external view returns (bool); + function getPool(address token) external view returns (address); + function setPool(address source, address pool) external; +} diff --git a/src/interfaces/ccip/ITypeAndVersion.sol b/src/interfaces/ccip/ITypeAndVersion.sol new file mode 100644 index 000000000..135f6d0ae --- /dev/null +++ b/src/interfaces/ccip/ITypeAndVersion.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface ITypeAndVersion { + function typeAndVersion() external pure returns (string memory); +} diff --git a/src/interfaces/ccip/IUpgradeableBurnMintTokenPool.sol b/src/interfaces/ccip/IUpgradeableBurnMintTokenPool.sol new file mode 100644 index 000000000..09c322ccc --- /dev/null +++ b/src/interfaces/ccip/IUpgradeableBurnMintTokenPool.sol @@ -0,0 +1,93 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IRateLimiter} from './IRateLimiter.sol'; + +interface IUpgradeableBurnMintTokenPool { + error AggregateValueMaxCapacityExceeded(uint256 capacity, uint256 requested); + error AggregateValueRateLimitReached(uint256 minWaitInSeconds, uint256 available); + error AllowListNotEnabled(); + error BadARMSignal(); + error BucketOverfilled(); + error CallerIsNotARampOnRouter(address caller); + error ChainAlreadyExists(uint64 chainSelector); + error ChainNotAllowed(uint64 remoteChainSelector); + error DisabledNonZeroRateLimit(IRateLimiter.Config config); + error InvalidRatelimitRate(IRateLimiter.Config rateLimiterConfig); + error NonExistentChain(uint64 remoteChainSelector); + error RateLimitMustBeDisabled(); + error SenderNotAllowed(address sender); + error TokenMaxCapacityExceeded(uint256 capacity, uint256 requested, address tokenAddress); + error TokenRateLimitReached(uint256 minWaitInSeconds, uint256 available, address tokenAddress); + error Unauthorized(address caller); + error ZeroAddressNotAllowed(); + + event AllowListAdd(address sender); + event AllowListRemove(address sender); + event Burned(address indexed sender, uint256 amount); + event ChainAdded( + uint64 remoteChainSelector, + IRateLimiter.Config outboundRateLimiterConfig, + IRateLimiter.Config inboundRateLimiterConfig + ); + event ChainConfigured( + uint64 remoteChainSelector, + IRateLimiter.Config outboundRateLimiterConfig, + IRateLimiter.Config inboundRateLimiterConfig + ); + event ChainRemoved(uint64 remoteChainSelector); + event ConfigChanged(IRateLimiter.Config config); + event Initialized(uint8 version); + event Locked(address indexed sender, uint256 amount); + event Minted(address indexed sender, address indexed recipient, uint256 amount); + event OwnershipTransferRequested(address indexed from, address indexed to); + event OwnershipTransferred(address indexed from, address indexed to); + event Released(address indexed sender, address indexed recipient, uint256 amount); + event RouterUpdated(address oldRouter, address newRouter); + event TokensConsumed(uint256 tokens); + + function acceptOwnership() external; + function applyAllowListUpdates(address[] memory removes, address[] memory adds) external; + function getAllowList() external view returns (address[] memory); + function getAllowListEnabled() external view returns (bool); + function getArmProxy() external view returns (address armProxy); + function getCurrentInboundRateLimiterState( + uint64 remoteChainSelector + ) external view returns (IRateLimiter.TokenBucket memory); + function getCurrentOutboundRateLimiterState( + uint64 remoteChainSelector + ) external view returns (IRateLimiter.TokenBucket memory); + function getProxyPool() external view returns (address proxyPool); + function getRateLimitAdmin() external view returns (address); + function getRouter() external view returns (address router); + function getSupportedChains() external view returns (uint64[] memory); + function getToken() external view returns (address token); + function initialize(address owner, address[] memory allowlist, address router) external; + function isSupportedChain(uint64 remoteChainSelector) external view returns (bool); + function lockOrBurn( + address originalSender, + bytes memory, + uint256 amount, + uint64 remoteChainSelector, + bytes memory + ) external returns (bytes memory); + function owner() external view returns (address); + function releaseOrMint( + bytes memory, + address receiver, + uint256 amount, + uint64 remoteChainSelector, + bytes memory + ) external; + function setChainRateLimiterConfig( + uint64 remoteChainSelector, + IRateLimiter.Config memory outboundConfig, + IRateLimiter.Config memory inboundConfig + ) external; + function setProxyPool(address proxyPool) external; + function setRateLimitAdmin(address rateLimitAdmin) external; + function setRouter(address newRouter) external; + function supportsInterface(bytes4 interfaceId) external pure returns (bool); + function transferOwnership(address to) external; + function typeAndVersion() external view returns (string memory); +} diff --git a/src/interfaces/ccip/IUpgradeableLockReleaseTokenPool.sol b/src/interfaces/ccip/IUpgradeableLockReleaseTokenPool.sol index 02252f92c..bdc364e79 100644 --- a/src/interfaces/ccip/IUpgradeableLockReleaseTokenPool.sol +++ b/src/interfaces/ccip/IUpgradeableLockReleaseTokenPool.sol @@ -1,40 +1,117 @@ // SPDX-License-Identifier: MIT - pragma solidity ^0.8.0; -import {IClient} from 'src/interfaces/ccip/IClient.sol'; +import {IRateLimiter} from './IRateLimiter.sol'; interface IUpgradeableLockReleaseTokenPool { + error AggregateValueMaxCapacityExceeded(uint256 capacity, uint256 requested); + error AggregateValueRateLimitReached(uint256 minWaitInSeconds, uint256 available); + error AllowListNotEnabled(); + error BadARMSignal(); error BridgeLimitExceeded(uint256 bridgeLimit); + error BucketOverfilled(); + error CallerIsNotARampOnRouter(address caller); + error ChainAlreadyExists(uint64 chainSelector); + error ChainNotAllowed(uint64 remoteChainSelector); + error DisabledNonZeroRateLimit(IRateLimiter.Config config); + error InsufficientLiquidity(); + error InvalidRatelimitRate(IRateLimiter.Config rateLimiterConfig); + error LiquidityNotAccepted(); + error NonExistentChain(uint64 remoteChainSelector); + error NotEnoughBridgedAmount(); + error RateLimitMustBeDisabled(); + error SenderNotAllowed(address sender); + error TokenMaxCapacityExceeded(uint256 capacity, uint256 requested, address tokenAddress); + error TokenRateLimitReached(uint256 minWaitInSeconds, uint256 available, address tokenAddress); + error Unauthorized(address caller); + error ZeroAddressNotAllowed(); - /// @dev Initializer - /// @dev The address passed as `owner` must accept ownership after initialization. - /// @dev The `allowlist` is only effective if pool is set to access-controlled mode - /// @param owner The address of the owner - /// @param allowlist A set of addresses allowed to trigger lockOrBurn as original senders - /// @param router The address of the router - function initialize(address owner, address[] memory allowlist, address router) external; + event AllowListAdd(address sender); + event AllowListRemove(address sender); + event BridgeLimitAdminUpdated(address indexed oldAdmin, address indexed newAdmin); + event BridgeLimitUpdated(uint256 oldBridgeLimit, uint256 newBridgeLimit); + event Burned(address indexed sender, uint256 amount); + event ChainAdded( + uint64 remoteChainSelector, + IRateLimiter.Config outboundRateLimiterConfig, + IRateLimiter.Config inboundRateLimiterConfig + ); + event ChainConfigured( + uint64 remoteChainSelector, + IRateLimiter.Config outboundRateLimiterConfig, + IRateLimiter.Config inboundRateLimiterConfig + ); + event ChainRemoved(uint64 remoteChainSelector); + event ConfigChanged(IRateLimiter.Config config); + event Initialized(uint8 version); + event LiquidityAdded(address indexed provider, uint256 indexed amount); + event LiquidityRemoved(address indexed provider, uint256 indexed amount); + event Locked(address indexed sender, uint256 amount); + event Minted(address indexed sender, address indexed recipient, uint256 amount); + event OwnershipTransferRequested(address indexed from, address indexed to); + event OwnershipTransferred(address indexed from, address indexed to); + event Released(address indexed sender, address indexed recipient, uint256 amount); + event RouterUpdated(address oldRouter, address newRouter); + event TokensConsumed(uint256 tokens); - /// @dev Ownable + function acceptOwnership() external; + function applyAllowListUpdates(address[] memory removes, address[] memory adds) external; + function canAcceptLiquidity() external view returns (bool); + function getAllowList() external view returns (address[] memory); + function getAllowListEnabled() external view returns (bool); + function getArmProxy() external view returns (address armProxy); + function getBridgeLimit() external view returns (uint256); + function getBridgeLimitAdmin() external view returns (address); + function getCurrentBridgedAmount() external view returns (uint256); + function getCurrentInboundRateLimiterState( + uint64 remoteChainSelector + ) external view returns (IRateLimiter.TokenBucket memory); + function getCurrentOutboundRateLimiterState( + uint64 remoteChainSelector + ) external view returns (IRateLimiter.TokenBucket memory); + function getLockReleaseInterfaceId() external pure returns (bytes4); + function getProxyPool() external view returns (address proxyPool); + function getRateLimitAdmin() external view returns (address); + function getRebalancer() external view returns (address); + function getRouter() external view returns (address router); + function getSupportedChains() external view returns (uint64[] memory); + function getToken() external view returns (address token); + function initialize( + address owner, + address[] memory allowlist, + address router, + uint256 bridgeLimit + ) external; + function isSupportedChain(uint64 remoteChainSelector) external view returns (bool); + function lockOrBurn( + address originalSender, + bytes memory, + uint256 amount, + uint64 remoteChainSelector, + bytes memory + ) external returns (bytes memory); function owner() external view returns (address); - - /// @notice Sets the bridge limit - /// @param limit The new limit - function setBridgeLimit(uint256 limit) external; - - /// @notice Sets the bridge limit admin address. - /// @dev Only callable by the owner. - /// @param bridgeLimitAdmin The new bridge limit admin address. + function provideLiquidity(uint256 amount) external; + function releaseOrMint( + bytes memory, + address receiver, + uint256 amount, + uint64 remoteChainSelector, + bytes memory + ) external; + function setBridgeLimit(uint256 newBridgeLimit) external; function setBridgeLimitAdmin(address bridgeLimitAdmin) external; - - /// @notice Sets the rate limiter admin address. - /// @dev Only callable by the owner. - /// @param rateLimitAdmin The new rate limiter admin address. + function setChainRateLimiterConfig( + uint64 remoteChainSelector, + IRateLimiter.Config memory outboundConfig, + IRateLimiter.Config memory inboundConfig + ) external; + function setProxyPool(address proxyPool) external; function setRateLimitAdmin(address rateLimitAdmin) external; - - /// @notice Gets the bridge limiter admin address. - function getBridgeLimitAdmin() external view returns (address); - - /// @notice Gets the rate limiter admin address. - function getRateLimitAdmin() external view returns (address); + function setRebalancer(address rebalancer) external; + function setRouter(address newRouter) external; + function supportsInterface(bytes4 interfaceId) external pure returns (bool); + function transferOwnership(address to) external; + function typeAndVersion() external view returns (string memory); + function withdrawLiquidity(uint256 amount) external; } diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 963c07af0..000000000 --- a/yarn.lock +++ /dev/null @@ -1,2810 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@adraffy/ens-normalize@1.10.0": - version "1.10.0" - resolved "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz" - integrity sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q== - -"@ampproject/remapping@^2.3.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" - integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - -"@assemblyscript/loader@^0.9.4": - version "0.9.4" - resolved "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.9.4.tgz" - integrity sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA== - -"@babel/code-frame@^7.0.0": - version "7.22.13" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz" - integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== - dependencies: - "@babel/highlight" "^7.22.13" - chalk "^2.4.2" - -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== - -"@babel/highlight@^7.22.13": - version "7.22.20" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz" - integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" - js-tokens "^4.0.0" - -"@bgd-labs/aave-address-book@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@bgd-labs/aave-address-book/-/aave-address-book-4.0.0.tgz#3084117c33102bc9de718d47d6a48a2aae698543" - integrity sha512-OCeLg2Q4vL45SVU/nkBETGheYnUbbj1LvCwNR3TeI7MboESIcspoXJbiQWOeyJA6f9Uzo6+k3pa/KtK329gMww== - -"@bgd-labs/aave-address-book@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@bgd-labs/aave-address-book/-/aave-address-book-3.0.0.tgz#a75cf2e217688e63728bec1b9c956b0134bc647c" - integrity sha512-ALT9T/aIZ7BztozWvGhjVKGAEfe6wLhop0z+0ZSwAdyHXrBfpXXDZa9siHNtOZfNojPVMPvkpgsiPnFmDD8OJQ== - -"@bgd-labs/aave-cli@0.16.4": - version "0.16.4" - resolved "https://registry.yarnpkg.com/@bgd-labs/aave-cli/-/aave-cli-0.16.4.tgz#be97caea0b74e96b46b12984f4e656269badef59" - integrity sha512-5AmfCXKXC0tjTn2ZZpodqSkqccammykwhP86+GEFT5N0zcqizqv/wHT9opb4ctZjLcxCvwXEKjdcdm7a6MApwA== - dependencies: - "@bgd-labs/aave-address-book" "^3.0.0" - "@bgd-labs/aave-v3-governance-cache" "^1.0.6" - "@bgd-labs/js-utils" "^1.4.2" - "@commander-js/extra-typings" "^11.1.0" - "@inquirer/prompts" "^3.3.2" - chalk "^4.1.2" - commander "^11.1.0" - deepmerge "^4.3.1" - dotenv "^16.4.1" - find-object-paths "^1.1.0" - gray-matter "^4.0.3" - ipfs-only-hash "^4.0.0" - json-bigint "^1.0.0" - object-hash "^3.0.0" - viem "^2.17.11" - zod "^3.23.8" - -"@bgd-labs/aave-v3-governance-cache@^1.0.6": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@bgd-labs/aave-v3-governance-cache/-/aave-v3-governance-cache-1.0.6.tgz#a56268e5e759b84d3691c8b23f23743170d04468" - integrity sha512-FpWMBxt18c8pk+10gvWtHBuXhb1uVYF63PgIs6CY4WMSEs/42KCmGYJSamCNYR9nEEX4PVqjPViu3zBoqZOgCQ== - -"@bgd-labs/js-utils@^1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@bgd-labs/js-utils/-/js-utils-1.4.2.tgz#dd6d954fdda153d76cbcabaeff9b7e8adcf528b1" - integrity sha512-hKiorNIyEApdH1w7laYQ+sGkrCGZTem9kD5Ud7YP/ZKtkoPx12FcTAp+P+JZ42BerPEqzGLZMDRJDB2ZGKeAJw== - dependencies: - "@supercharge/promise-pool" "^3.1.1" - bs58 "^5.0.0" - gray-matter "^4.0.3" - tsx "^4.7.1" - -"@commander-js/extra-typings@^11.1.0": - version "11.1.0" - 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.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/aix-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" - integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== - -"@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-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" - integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== - -"@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-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" - integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== - -"@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/android-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" - integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== - -"@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-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" - integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== - -"@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/darwin-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" - integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== - -"@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-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" - integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== - -"@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/freebsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" - integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== - -"@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-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" - integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== - -"@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-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" - integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== - -"@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-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" - integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== - -"@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-loong64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" - integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== - -"@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-mips64el@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" - integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== - -"@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-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" - integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== - -"@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-riscv64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" - integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== - -"@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-s390x@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" - integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== - -"@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/linux-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" - integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== - -"@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/netbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" - integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== - -"@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/openbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" - integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== - -"@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/sunos-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" - integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== - -"@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-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" - integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== - -"@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-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" - integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== - -"@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" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.9.tgz#b2da6219b603e3fa371a78f53f5361260d0c5585" - integrity sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ== - -"@esbuild/win32-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" - integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== - -"@inquirer/checkbox@^1.5.0": - version "1.5.0" - resolved "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-1.5.0.tgz" - integrity sha512-3cKJkW1vIZAs4NaS0reFsnpAjP0azffYII4I2R7PTI7ZTMg5Y1at4vzXccOH3762b2c2L4drBhpJpf9uiaGNxA== - dependencies: - "@inquirer/core" "^5.1.1" - "@inquirer/type" "^1.1.5" - ansi-escapes "^4.3.2" - chalk "^4.1.2" - figures "^3.2.0" - -"@inquirer/checkbox@^1.5.2": - version "1.5.2" - resolved "https://registry.yarnpkg.com/@inquirer/checkbox/-/checkbox-1.5.2.tgz#043ca370ebbc0b92691c2309bc12e8716ed701c4" - integrity sha512-CifrkgQjDkUkWexmgYYNyB5603HhTHI91vLFeQXh6qrTKiCMVASol01Rs1cv6LP/A2WccZSRlJKZhbaBIs/9ZA== - dependencies: - "@inquirer/core" "^6.0.0" - "@inquirer/type" "^1.1.6" - ansi-escapes "^4.3.2" - chalk "^4.1.2" - figures "^3.2.0" - -"@inquirer/confirm@^2.0.15": - version "2.0.15" - resolved "https://registry.npmjs.org/@inquirer/confirm/-/confirm-2.0.15.tgz" - integrity sha512-hj8Q/z7sQXsF0DSpLQZVDhWYGN6KLM/gNjjqGkpKwBzljbQofGjn0ueHADy4HUY+OqDHmXuwk/bY+tZyIuuB0w== - dependencies: - "@inquirer/core" "^5.1.1" - "@inquirer/type" "^1.1.5" - chalk "^4.1.2" - -"@inquirer/confirm@^2.0.17": - version "2.0.17" - resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-2.0.17.tgz#a45eb1b973c51c993a3c093a0114e960b1cf09a4" - integrity sha512-EqzhGryzmGpy2aJf6LxJVhndxYmFs+m8cxXzf8nejb1DE3sabf6mUgBcp4J0jAUEiAcYzqmkqRr7LPFh/WdnXA== - dependencies: - "@inquirer/core" "^6.0.0" - "@inquirer/type" "^1.1.6" - chalk "^4.1.2" - -"@inquirer/core@^5.1.1": - version "5.1.1" - resolved "https://registry.npmjs.org/@inquirer/core/-/core-5.1.1.tgz" - integrity sha512-IuJyZQUg75+L5AmopgnzxYrgcU6PJKL0hoIs332G1Gv55CnmZrhG6BzNOeZ5sOsTi1YCGOopw4rYICv74ejMFg== - dependencies: - "@inquirer/type" "^1.1.5" - "@types/mute-stream" "^0.0.4" - "@types/node" "^20.9.0" - "@types/wrap-ansi" "^3.0.0" - ansi-escapes "^4.3.2" - chalk "^4.1.2" - cli-spinners "^2.9.1" - cli-width "^4.1.0" - figures "^3.2.0" - mute-stream "^1.0.0" - run-async "^3.0.0" - signal-exit "^4.1.0" - strip-ansi "^6.0.1" - wrap-ansi "^6.2.0" - -"@inquirer/core@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-6.0.0.tgz#d44ccd8ae09a4879a78f09cca35bf1ab894b95f4" - integrity sha512-fKi63Khkisgda3ohnskNf5uZJj+zXOaBvOllHsOkdsXRA/ubQLJQrZchFFi57NKbZzkTunXiBMdvWOv71alonw== - dependencies: - "@inquirer/type" "^1.1.6" - "@types/mute-stream" "^0.0.4" - "@types/node" "^20.10.7" - "@types/wrap-ansi" "^3.0.0" - ansi-escapes "^4.3.2" - chalk "^4.1.2" - cli-spinners "^2.9.2" - cli-width "^4.1.0" - figures "^3.2.0" - mute-stream "^1.0.0" - run-async "^3.0.0" - signal-exit "^4.1.0" - strip-ansi "^6.0.1" - wrap-ansi "^6.2.0" - -"@inquirer/editor@^1.2.13": - version "1.2.13" - resolved "https://registry.npmjs.org/@inquirer/editor/-/editor-1.2.13.tgz" - integrity sha512-gBxjqt0B9GLN0j6M/tkEcmcIvB2fo9Cw0f5NRqDTkYyB9AaCzj7qvgG0onQ3GVPbMyMbbP4tWYxrBOaOdKpzNA== - dependencies: - "@inquirer/core" "^5.1.1" - "@inquirer/type" "^1.1.5" - chalk "^4.1.2" - external-editor "^3.1.0" - -"@inquirer/editor@^1.2.15": - version "1.2.15" - resolved "https://registry.yarnpkg.com/@inquirer/editor/-/editor-1.2.15.tgz#28de2dabbcf1e07a37149320093798e3f4856f91" - integrity sha512-gQ77Ls09x5vKLVNMH9q/7xvYPT6sIs5f7URksw+a2iJZ0j48tVS6crLqm2ugG33tgXHIwiEqkytY60Zyh5GkJQ== - dependencies: - "@inquirer/core" "^6.0.0" - "@inquirer/type" "^1.1.6" - chalk "^4.1.2" - external-editor "^3.1.0" - -"@inquirer/expand@^1.1.14": - version "1.1.14" - resolved "https://registry.npmjs.org/@inquirer/expand/-/expand-1.1.14.tgz" - integrity sha512-yS6fJ8jZYAsxdxuw2c8XTFMTvMR1NxZAw3LxDaFnqh7BZ++wTQ6rSp/2gGJhMacdZ85osb+tHxjVgx7F+ilv5g== - dependencies: - "@inquirer/core" "^5.1.1" - "@inquirer/type" "^1.1.5" - chalk "^4.1.2" - figures "^3.2.0" - -"@inquirer/expand@^1.1.16": - version "1.1.16" - resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-1.1.16.tgz#63dce81240e5f7b2b1d7942b3e3cae18f4f03d07" - integrity sha512-TGLU9egcuo+s7PxphKUCnJnpCIVY32/EwPCLLuu+gTvYiD8hZgx8Z2niNQD36sa6xcfpdLY6xXDBiL/+g1r2XQ== - dependencies: - "@inquirer/core" "^6.0.0" - "@inquirer/type" "^1.1.6" - chalk "^4.1.2" - figures "^3.2.0" - -"@inquirer/input@^1.2.14": - version "1.2.14" - resolved "https://registry.npmjs.org/@inquirer/input/-/input-1.2.14.tgz" - integrity sha512-tISLGpUKXixIQue7jypNEShrdzJoLvEvZOJ4QRsw5XTfrIYfoWFqAjMQLerGs9CzR86yAI89JR6snHmKwnNddw== - dependencies: - "@inquirer/core" "^5.1.1" - "@inquirer/type" "^1.1.5" - chalk "^4.1.2" - -"@inquirer/input@^1.2.16": - version "1.2.16" - resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-1.2.16.tgz#94d8765a47689e799fd55ed0361dedc8f554341b" - integrity sha512-Ou0LaSWvj1ni+egnyQ+NBtfM1885UwhRCMtsRt2bBO47DoC1dwtCa+ZUNgrxlnCHHF0IXsbQHYtIIjFGAavI4g== - dependencies: - "@inquirer/core" "^6.0.0" - "@inquirer/type" "^1.1.6" - chalk "^4.1.2" - -"@inquirer/password@^1.1.14": - version "1.1.14" - resolved "https://registry.npmjs.org/@inquirer/password/-/password-1.1.14.tgz" - integrity sha512-vL2BFxfMo8EvuGuZYlryiyAB3XsgtbxOcFs4H9WI9szAS/VZCAwdVqs8rqEeaAf/GV/eZOghIOYxvD91IsRWSg== - dependencies: - "@inquirer/input" "^1.2.14" - "@inquirer/type" "^1.1.5" - ansi-escapes "^4.3.2" - chalk "^4.1.2" - -"@inquirer/password@^1.1.16": - version "1.1.16" - resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-1.1.16.tgz#37ddebbe37c6e76f8ad27d1f726aacdd7c423558" - integrity sha512-aZYZVHLUXZ2gbBot+i+zOJrks1WaiI95lvZCn1sKfcw6MtSSlYC8uDX8sTzQvAsQ8epHoP84UNvAIT0KVGOGqw== - dependencies: - "@inquirer/core" "^6.0.0" - "@inquirer/type" "^1.1.6" - ansi-escapes "^4.3.2" - chalk "^4.1.2" - -"@inquirer/prompts@^3.3.0": - version "3.3.0" - resolved "https://registry.npmjs.org/@inquirer/prompts/-/prompts-3.3.0.tgz" - integrity sha512-BBCqdSnhNs+WziSIo4f/RNDu6HAj4R/Q5nMgJb5MNPFX8sJGCvj9BoALdmR0HTWXyDS7TO8euKj6W6vtqCQG7A== - dependencies: - "@inquirer/checkbox" "^1.5.0" - "@inquirer/confirm" "^2.0.15" - "@inquirer/core" "^5.1.1" - "@inquirer/editor" "^1.2.13" - "@inquirer/expand" "^1.1.14" - "@inquirer/input" "^1.2.14" - "@inquirer/password" "^1.1.14" - "@inquirer/rawlist" "^1.2.14" - "@inquirer/select" "^1.3.1" - -"@inquirer/prompts@^3.3.2": - version "3.3.2" - resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-3.3.2.tgz#0c3a44bbf7e560439590f2fcb769cd8392b0f555" - integrity sha512-k52mOMRvTUejrqyF1h8Z07chC+sbaoaUYzzr1KrJXyj7yaX7Nrh0a9vktv8TuocRwIJOQMaj5oZEmkspEcJFYQ== - dependencies: - "@inquirer/checkbox" "^1.5.2" - "@inquirer/confirm" "^2.0.17" - "@inquirer/core" "^6.0.0" - "@inquirer/editor" "^1.2.15" - "@inquirer/expand" "^1.1.16" - "@inquirer/input" "^1.2.16" - "@inquirer/password" "^1.1.16" - "@inquirer/rawlist" "^1.2.16" - "@inquirer/select" "^1.3.3" - -"@inquirer/rawlist@^1.2.14": - version "1.2.14" - resolved "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-1.2.14.tgz" - integrity sha512-xIYmDpYgfz2XGCKubSDLKEvadkIZAKbehHdWF082AyC2I4eHK44RUfXaoOAqnbqItZq4KHXS6jDJ78F2BmQvxg== - dependencies: - "@inquirer/core" "^5.1.1" - "@inquirer/type" "^1.1.5" - chalk "^4.1.2" - -"@inquirer/rawlist@^1.2.16": - version "1.2.16" - resolved "https://registry.yarnpkg.com/@inquirer/rawlist/-/rawlist-1.2.16.tgz#ac6cc0bb2a60d51dccdfe2c3ea624185f1fbd5bc" - integrity sha512-pZ6TRg2qMwZAOZAV6TvghCtkr53dGnK29GMNQ3vMZXSNguvGqtOVc4j/h1T8kqGJFagjyfBZhUPGwNS55O5qPQ== - dependencies: - "@inquirer/core" "^6.0.0" - "@inquirer/type" "^1.1.6" - chalk "^4.1.2" - -"@inquirer/select@^1.3.1": - version "1.3.1" - resolved "https://registry.npmjs.org/@inquirer/select/-/select-1.3.1.tgz" - integrity sha512-EgOPHv7XOHEqiBwBJTyiMg9r57ySyW4oyYCumGp+pGyOaXQaLb2kTnccWI6NFd9HSi5kDJhF7YjA+3RfMQJ2JQ== - dependencies: - "@inquirer/core" "^5.1.1" - "@inquirer/type" "^1.1.5" - ansi-escapes "^4.3.2" - chalk "^4.1.2" - figures "^3.2.0" - -"@inquirer/select@^1.3.3": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-1.3.3.tgz#7d832ee603c15b706148e47cda29cdf6634cd94b" - integrity sha512-RzlRISXWqIKEf83FDC9ZtJ3JvuK1l7aGpretf41BCWYrvla2wU8W8MTRNMiPrPJ+1SIqrRC1nZdZ60hD9hRXLg== - dependencies: - "@inquirer/core" "^6.0.0" - "@inquirer/type" "^1.1.6" - ansi-escapes "^4.3.2" - chalk "^4.1.2" - figures "^3.2.0" - -"@inquirer/testing@^2.1.13": - version "2.1.13" - resolved "https://registry.yarnpkg.com/@inquirer/testing/-/testing-2.1.13.tgz#e5f0bb263263e1537c5727415eb11e0194ab77f2" - integrity sha512-q0r3k9Gog9RJYkcsBzi4DLN9ZKApxLKddAbdRBTITOdmTiTqiTnFHgvWsXdSd+1xkRk5F/7rgiJgo0hW4xLaPQ== - dependencies: - "@inquirer/type" "^1.2.1" - "@types/mute-stream" "^0.0.4" - "@types/node" "^20.11.26" - ansi-escapes "^4.3.2" - mute-stream "^1.0.0" - strip-ansi "^6.0.1" - -"@inquirer/type@^1.1.5": - version "1.1.5" - resolved "https://registry.npmjs.org/@inquirer/type/-/type-1.1.5.tgz" - integrity sha512-wmwHvHozpPo4IZkkNtbYenem/0wnfI6hvOcGKmPEa0DwuaH5XUQzFqy6OpEpjEegZMhYIk8HDYITI16BPLtrRA== - -"@inquirer/type@^1.1.6": - version "1.1.6" - resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-1.1.6.tgz#f2656456e58fb93c7b73d5aad583b928c77b9206" - integrity sha512-OCKOpn0CrFDslR8s3who7hlr823zXTb1iShGCaaWgEJFfkIV0T9aLZV2QGnOuU78IrsPYLkr3oKx9dZwwCH3Rw== - -"@inquirer/type@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-1.2.1.tgz#fbc7ab3a2e5050d0c150642d5e8f5e88faa066b8" - integrity sha512-xwMfkPAxeo8Ji/IxfUSqzRi0/+F2GIqJmpc5/thelgMGsjNZcjDDRBO9TLXT1s/hdx/mK5QbVIvgoLIFgXhTMQ== - -"@jridgewell/gen-mapping@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" - integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== - dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" - integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== - -"@jridgewell/trace-mapping@^0.3.24": - version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@multiformats/base-x@^4.0.1": - version "4.0.1" - resolved "https://registry.npmjs.org/@multiformats/base-x/-/base-x-4.0.1.tgz" - integrity sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw== - -"@noble/curves@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.0.tgz#f05771ef64da724997f69ee1261b2417a49522d6" - integrity sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg== - dependencies: - "@noble/hashes" "1.4.0" - -"@noble/curves@^1.4.0", "@noble/curves@~1.4.0": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.2.tgz#40309198c76ed71bc6dbf7ba24e81ceb4d0d1fe9" - integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== - dependencies: - "@noble/hashes" "1.4.0" - -"@noble/hashes@1.4.0", "@noble/hashes@^1.4.0", "@noble/hashes@~1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" - integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== - -"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz" - integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== - -"@protobufjs/base64@^1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz" - integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== - -"@protobufjs/codegen@^2.0.4": - version "2.0.4" - resolved "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz" - integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== - -"@protobufjs/eventemitter@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz" - integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== - -"@protobufjs/fetch@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz" - integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== - dependencies: - "@protobufjs/aspromise" "^1.1.1" - "@protobufjs/inquire" "^1.1.0" - -"@protobufjs/float@^1.0.2": - version "1.0.2" - resolved "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz" - integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== - -"@protobufjs/inquire@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz" - integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== - -"@protobufjs/path@^1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz" - integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== - -"@protobufjs/pool@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz" - integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== - -"@protobufjs/utf8@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz" - integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== - -"@rollup/rollup-android-arm-eabi@4.9.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.0.tgz#0437b27edd7095d0b6d5db99d13af8157d7c58b0" - integrity sha512-+1ge/xmaJpm1KVBuIH38Z94zj9fBD+hp+/5WLaHgyY8XLq1ibxk/zj6dTXaqM2cAbYKq8jYlhHd6k05If1W5xA== - -"@rollup/rollup-android-arm64@4.9.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.0.tgz#d4c14ef9e45d5c46b8d1f611ab8124a611d5be5b" - integrity sha512-im6hUEyQ7ZfoZdNvtwgEJvBWZYauC9KVKq1w58LG2Zfz6zMd8gRrbN+xCVoqA2hv/v6fm9lp5LFGJ3za8EQH3A== - -"@rollup/rollup-darwin-arm64@4.9.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.0.tgz#6f3fdf5712db6b5e3d8f62a86a09cd659dd871f9" - integrity sha512-u7aTMskN6Dmg1lCT0QJ+tINRt+ntUrvVkhbPfFz4bCwRZvjItx2nJtwJnJRlKMMaQCHRjrNqHRDYvE4mBm3DlQ== - -"@rollup/rollup-darwin-x64@4.9.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.0.tgz#626d7786fe7c10b2e8533ad981b4a791fd72b9d0" - integrity sha512-8FvEl3w2ExmpcOmX5RJD0yqXcVSOqAJJUJ29Lca29Ik+3zPS1yFimr2fr5JSZ4Z5gt8/d7WqycpgkX9nocijSw== - -"@rollup/rollup-linux-arm-gnueabihf@4.9.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.0.tgz#57ece7bb1b7659a3ea2ace580a63b8f92b3161f1" - integrity sha512-lHoKYaRwd4gge+IpqJHCY+8Vc3hhdJfU6ukFnnrJasEBUvVlydP8PuwndbWfGkdgSvZhHfSEw6urrlBj0TSSfg== - -"@rollup/rollup-linux-arm64-gnu@4.9.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.0.tgz#345b276b814a5377344adc5780c4dfb7cd0e8ba9" - integrity sha512-JbEPfhndYeWHfOSeh4DOFvNXrj7ls9S/2omijVsao+LBPTPayT1uKcK3dHW3MwDJ7KO11t9m2cVTqXnTKpeaiw== - -"@rollup/rollup-linux-arm64-musl@4.9.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.0.tgz#61cc6516e6e92e2205ea1d0ac30326379b0563c8" - integrity sha512-ahqcSXLlcV2XUBM3/f/C6cRoh7NxYA/W7Yzuv4bDU1YscTFw7ay4LmD7l6OS8EMhTNvcrWGkEettL1Bhjf+B+w== - -"@rollup/rollup-linux-riscv64-gnu@4.9.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.0.tgz#e9add70ddca7bd6f685ec447ae83eb3be552f211" - integrity sha512-uwvOYNtLw8gVtrExKhdFsYHA/kotURUmZYlinH2VcQxNCQJeJXnkmWgw2hI9Xgzhgu7J9QvWiq9TtTVwWMDa+w== - -"@rollup/rollup-linux-x64-gnu@4.9.0": - version "4.9.0" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.0.tgz" - integrity sha512-m6pkSwcZZD2LCFHZX/zW2aLIISyzWLU3hrLLzQKMI12+OLEzgruTovAxY5sCZJkipklaZqPy/2bEEBNjp+Y7xg== - -"@rollup/rollup-linux-x64-musl@4.9.0": - version "4.9.0" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.0.tgz" - integrity sha512-VFAC1RDRSbU3iOF98X42KaVicAfKf0m0OvIu8dbnqhTe26Kh6Ym9JrDulz7Hbk7/9zGc41JkV02g+p3BivOdAg== - -"@rollup/rollup-win32-arm64-msvc@4.9.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.0.tgz#bf2dbad350376e46cb77fab408bb398ad5f3648d" - integrity sha512-9jPgMvTKXARz4inw6jezMLA2ihDBvgIU9Ml01hjdVpOcMKyxFBJrn83KVQINnbeqDv0+HdO1c09hgZ8N0s820Q== - -"@rollup/rollup-win32-ia32-msvc@4.9.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.0.tgz#5c26b07f74f4054f3ecf202550100496ed2e73f3" - integrity sha512-WE4pT2kTXQN2bAv40Uog0AsV7/s9nT9HBWXAou8+++MBCnY51QS02KYtm6dQxxosKi1VIz/wZIrTQO5UP2EW+Q== - -"@rollup/rollup-win32-x64-msvc@4.9.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.0.tgz#4ea610e0c40a07a8afa2977cbf80507f41c2271c" - integrity sha512-aPP5Q5AqNGuT0tnuEkK/g4mnt3ZhheiXrDIiSVIHN9mcN21OyXDVbEMqmXPE7e2OplNLDkcvV+ZoGJa2ZImFgw== - -"@scure/base@~1.1.6": - version "1.1.7" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.7.tgz#fe973311a5c6267846aa131bc72e96c5d40d2b30" - integrity sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g== - -"@scure/bip32@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.4.0.tgz#4e1f1e196abedcef395b33b9674a042524e20d67" - integrity sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg== - dependencies: - "@noble/curves" "~1.4.0" - "@noble/hashes" "~1.4.0" - "@scure/base" "~1.1.6" - -"@scure/bip39@1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.3.0.tgz#0f258c16823ddd00739461ac31398b4e7d6a18c3" - integrity sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ== - dependencies: - "@noble/hashes" "~1.4.0" - "@scure/base" "~1.1.6" - -"@solidity-parser/parser@^0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.17.0.tgz#52a2fcc97ff609f72011014e4c5b485ec52243ef" - integrity sha512-Nko8R0/kUo391jsEHHxrGM07QFdnPGvlmox4rmH0kNiNAashItAilhy4Mv4pK5gQmW5f4sXAF58fwJbmlkGcVw== - -"@supercharge/promise-pool@^3.1.1": - 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" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" - integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== - -"@types/long@^4.0.1": - version "4.0.2" - resolved "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz" - integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== - -"@types/minimist@^1.2.0": - version "1.2.3" - resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.3.tgz" - integrity sha512-ZYFzrvyWUNhaPomn80dsMNgMeXxNWZBdkuG/hWlUvXvbdUH8ZERNBGXnU87McuGcWDsyzX2aChCv/SVN348k3A== - -"@types/mute-stream@^0.0.4": - version "0.0.4" - resolved "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz" - integrity sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow== - dependencies: - "@types/node" "*" - -"@types/node@*", "@types/node@>=13.7.0": - version "20.8.4" - resolved "https://registry.npmjs.org/@types/node/-/node-20.8.4.tgz" - integrity sha512-ZVPnqU58giiCjSxjVUESDtdPk4QR5WQhhINbc9UBrKLU68MX5BF6kbQzTrkwbolyr0X8ChBpXfavr5mZFKZQ5A== - dependencies: - undici-types "~5.25.1" - -"@types/node@^20.10.7", "@types/node@^20.11.10": - version "20.11.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.10.tgz#6c3de8974d65c362f82ee29db6b5adf4205462f9" - integrity sha512-rZEfe/hJSGYmdfX9tvcPMYeYPW2sNl50nsw4jZmRcaG0HIAb0WYEpsB05GOb53vjqpyE9GUhlDQ4jLSoB5q9kg== - dependencies: - undici-types "~5.26.4" - -"@types/node@^20.11.26": - version "20.11.30" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.30.tgz#9c33467fc23167a347e73834f788f4b9f399d66f" - integrity sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw== - dependencies: - undici-types "~5.26.4" - -"@types/node@^20.9.0": - version "20.9.0" - resolved "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz" - integrity sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw== - dependencies: - undici-types "~5.26.4" - -"@types/normalize-package-data@^2.4.0": - version "2.4.2" - resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.2.tgz" - integrity sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A== - -"@types/wrap-ansi@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz" - integrity sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g== - -"@vitest/expect@2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-2.0.4.tgz#d365c106c84f2a3aae96000e95be21956acc099c" - integrity sha512-39jr5EguIoanChvBqe34I8m1hJFI4+jxvdOpD7gslZrVQBKhh8H9eD7J/LJX4zakrw23W+dITQTDqdt43xVcJw== - dependencies: - "@vitest/spy" "2.0.4" - "@vitest/utils" "2.0.4" - chai "^5.1.1" - tinyrainbow "^1.2.0" - -"@vitest/pretty-format@2.0.4", "@vitest/pretty-format@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.0.4.tgz#9a3934932e7f8ddd836b38c34ddaeec91bd0f82e" - integrity sha512-RYZl31STbNGqf4l2eQM1nvKPXE0NhC6Eq0suTTePc4mtMQ1Fn8qZmjV4emZdEdG2NOWGKSCrHZjmTqDCDoeFBw== - dependencies: - tinyrainbow "^1.2.0" - -"@vitest/runner@2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-2.0.4.tgz#0b1edb8ab5f81a1c7dfd50090e5e7e971a117891" - integrity sha512-Gk+9Su/2H2zNfNdeJR124gZckd5st4YoSuhF1Rebi37qTXKnqYyFCd9KP4vl2cQHbtuVKjfEKrNJxHHCW8thbQ== - dependencies: - "@vitest/utils" "2.0.4" - pathe "^1.1.2" - -"@vitest/snapshot@2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-2.0.4.tgz#7d7dea9df17c5c13386f1a7a433b99dc0ffe3c14" - integrity sha512-or6Mzoz/pD7xTvuJMFYEtso1vJo1S5u6zBTinfl+7smGUhqybn6VjzCDMhmTyVOFWwkCMuNjmNNxnyXPgKDoPw== - dependencies: - "@vitest/pretty-format" "2.0.4" - magic-string "^0.30.10" - pathe "^1.1.2" - -"@vitest/spy@2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-2.0.4.tgz#19083386a741a158c2f142beffe43be68b1375cf" - integrity sha512-uTXU56TNoYrTohb+6CseP8IqNwlNdtPwEO0AWl+5j7NelS6x0xZZtP0bDWaLvOfUbaYwhhWp1guzXUxkC7mW7Q== - dependencies: - tinyspy "^3.0.0" - -"@vitest/utils@2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.0.4.tgz#2db1df35aaeb5caa932770a190df636a68d284d5" - integrity sha512-Zc75QuuoJhOBnlo99ZVUkJIuq4Oj0zAkrQ2VzCqNCx6wAwViHEh5Fnp4fiJTE9rA+sAoXRf00Z9xGgfEzV6fzQ== - dependencies: - "@vitest/pretty-format" "2.0.4" - estree-walker "^3.0.3" - loupe "^3.1.1" - tinyrainbow "^1.2.0" - -abitype@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.5.tgz#29d0daa3eea867ca90f7e4123144c1d1270774b6" - integrity sha512-YzDhti7cjlfaBhHutMaboYB21Ha3rXR9QTkNJFzYC4kC8YclaiwPBBBJY8ejFdu2wnJeZCVZSMlQJ7fi8S6hsw== - -ansi-escapes@^4.3.2: - version "4.3.2" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-escapes@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.0.0.tgz#00fc19f491bbb18e1d481b97868204f92109bfe7" - integrity sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw== - dependencies: - environment "^1.0.0" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^6.0.0, ansi-styles@^6.2.1: - version "6.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" - integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== - -assertion-error@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" - integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== - -base-x@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz" - integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -bignumber.js@^9.0.0: - version "9.1.2" - resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz" - integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== - -bl@^5.0.0: - version "5.1.0" - resolved "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz" - integrity sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ== - dependencies: - buffer "^6.0.3" - inherits "^2.0.4" - readable-stream "^3.4.0" - -blakejs@^1.1.0: - version "1.2.1" - resolved "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz" - integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== - -braces@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -bs58@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz" - integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== - dependencies: - base-x "^4.0.0" - -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -cac@^6.7.14: - version "6.7.14" - resolved "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz" - integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== - -camelcase-keys@^6.2.2: - version "6.2.2" - resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz" - integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== - dependencies: - camelcase "^5.3.1" - map-obj "^4.0.0" - quick-lru "^4.0.1" - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -catapulta-verify@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/catapulta-verify/-/catapulta-verify-1.1.1.tgz#46ac6c9ed50480ef982060147f4ff4a34609efd0" - integrity sha512-VZ9pQpno1bjjZ/+7d1AbPWkOhYcZdNSova5Y1L9jj8ftdimv3JrwDTg9i0fs4I8/A/sRXK7AUb1pmL3016Cykw== - -chai@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/chai/-/chai-5.1.1.tgz#f035d9792a22b481ead1c65908d14bb62ec1c82c" - integrity sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA== - dependencies: - assertion-error "^2.0.1" - check-error "^2.1.1" - deep-eql "^5.0.1" - loupe "^3.1.0" - pathval "^2.0.0" - -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" - integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -check-error@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" - integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== - -cids@^1.0.0, cids@^1.1.5, cids@^1.1.6: - version "1.1.9" - resolved "https://registry.npmjs.org/cids/-/cids-1.1.9.tgz" - integrity sha512-l11hWRfugIcbGuTZwAM5PwpjPPjyb6UZOGwlHSnOBV5o07XhQ4gNpBN67FbODvpjyHtd+0Xs6KNvUcGBiDRsdg== - dependencies: - multibase "^4.0.1" - multicodec "^3.0.1" - multihashes "^4.0.1" - uint8arrays "^3.0.0" - -cli-cursor@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-5.0.0.tgz#24a4831ecf5a6b01ddeb32fb71a4b2088b0dce38" - integrity sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw== - dependencies: - restore-cursor "^5.0.0" - -cli-spinners@^2.9.1: - version "2.9.1" - resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.1.tgz" - integrity sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ== - -cli-spinners@^2.9.2: - version "2.9.2" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" - integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== - -cli-truncate@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz" - integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== - dependencies: - slice-ansi "^5.0.0" - string-width "^7.0.0" - -cli-width@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz" - integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colorette@^2.0.20: - version "2.0.20" - resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - -commander@^11.1.0: - version "11.1.0" - resolved "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz" - integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== - -commander@^12.1.0, commander@~12.1.0: - version "12.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" - integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== - -cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -debug@^4.3.1: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^4.3.5, debug@~4.3.4: - version "4.3.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" - integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== - dependencies: - ms "2.1.2" - -decamelize-keys@^1.1.0: - version "1.1.1" - resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz" - integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.1.0, decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -deep-eql@^5.0.1: - version "5.0.2" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" - integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== - -deepmerge@^4.3.1: - version "4.3.1" - resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -dotenv@^16.4.1: - version "16.4.1" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.1.tgz#1d9931f1d3e5d2959350d1250efab299561f7f11" - integrity sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ== - -emoji-regex@^10.3.0: - version "10.3.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz" - integrity sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -environment@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1" - integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== - -err-code@^3.0.0, err-code@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz" - integrity sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -esbuild@^0.19.3: - version "0.19.9" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.19.9.tgz" - integrity sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg== - optionalDependencies: - "@esbuild/android-arm" "0.19.9" - "@esbuild/android-arm64" "0.19.9" - "@esbuild/android-x64" "0.19.9" - "@esbuild/darwin-arm64" "0.19.9" - "@esbuild/darwin-x64" "0.19.9" - "@esbuild/freebsd-arm64" "0.19.9" - "@esbuild/freebsd-x64" "0.19.9" - "@esbuild/linux-arm" "0.19.9" - "@esbuild/linux-arm64" "0.19.9" - "@esbuild/linux-ia32" "0.19.9" - "@esbuild/linux-loong64" "0.19.9" - "@esbuild/linux-mips64el" "0.19.9" - "@esbuild/linux-ppc64" "0.19.9" - "@esbuild/linux-riscv64" "0.19.9" - "@esbuild/linux-s390x" "0.19.9" - "@esbuild/linux-x64" "0.19.9" - "@esbuild/netbsd-x64" "0.19.9" - "@esbuild/openbsd-x64" "0.19.9" - "@esbuild/sunos-x64" "0.19.9" - "@esbuild/win32-arm64" "0.19.9" - "@esbuild/win32-ia32" "0.19.9" - "@esbuild/win32-x64" "0.19.9" - -esbuild@~0.19.10: - 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.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" - -esbuild@~0.21.5: - version "0.21.5" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" - integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== - optionalDependencies: - "@esbuild/aix-ppc64" "0.21.5" - "@esbuild/android-arm" "0.21.5" - "@esbuild/android-arm64" "0.21.5" - "@esbuild/android-x64" "0.21.5" - "@esbuild/darwin-arm64" "0.21.5" - "@esbuild/darwin-x64" "0.21.5" - "@esbuild/freebsd-arm64" "0.21.5" - "@esbuild/freebsd-x64" "0.21.5" - "@esbuild/linux-arm" "0.21.5" - "@esbuild/linux-arm64" "0.21.5" - "@esbuild/linux-ia32" "0.21.5" - "@esbuild/linux-loong64" "0.21.5" - "@esbuild/linux-mips64el" "0.21.5" - "@esbuild/linux-ppc64" "0.21.5" - "@esbuild/linux-riscv64" "0.21.5" - "@esbuild/linux-s390x" "0.21.5" - "@esbuild/linux-x64" "0.21.5" - "@esbuild/netbsd-x64" "0.21.5" - "@esbuild/openbsd-x64" "0.21.5" - "@esbuild/sunos-x64" "0.21.5" - "@esbuild/win32-arm64" "0.21.5" - "@esbuild/win32-ia32" "0.21.5" - "@esbuild/win32-x64" "0.21.5" - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -estree-walker@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" - integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== - dependencies: - "@types/estree" "^1.0.0" - -eventemitter3@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz" - integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== - -execa@^8.0.1, execa@~8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" - integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^8.0.1" - human-signals "^5.0.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^4.1.0" - strip-final-newline "^3.0.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== - dependencies: - is-extendable "^0.1.0" - -external-editor@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -figures@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -find-object-paths@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/find-object-paths/-/find-object-paths-1.1.0.tgz#2d2fe99f24c95e63af4b51377a1ba0510490376c" - integrity sha512-UJvfPQibLUOrXl76PJ49cYbXJPsU1lYX6Pw7mHVW+ahaGx6kVHiozNIQriDc/EOlSvkDa6L9GyTFXPYQsa6sGA== - -find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -get-east-asian-width@^1.0.0: - version "1.2.0" - resolved "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz" - integrity sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA== - -get-func-name@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz" - integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== - -get-stream@^8.0.1: - version "8.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz" - integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== - -get-tsconfig@^4.7.2: - version "4.7.2" - resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz" - integrity sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A== - dependencies: - resolve-pkg-maps "^1.0.0" - -get-tsconfig@^4.7.5: - version "4.7.6" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.6.tgz#118fd5b7b9bae234cc7705a00cd771d7eb65d62a" - integrity sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA== - dependencies: - resolve-pkg-maps "^1.0.0" - -gray-matter@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz" - integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== - dependencies: - js-yaml "^3.13.1" - kind-of "^6.0.2" - section-matter "^1.0.0" - strip-bom-string "^1.0.0" - -hamt-sharding@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/hamt-sharding/-/hamt-sharding-2.0.1.tgz" - integrity sha512-vnjrmdXG9dDs1m/H4iJ6z0JFI2NtgsW5keRkTcM85NGak69Mkf5PHUqBz+Xs0T4sg0ppvj9O5EGAJo40FTxmmA== - dependencies: - sparse-array "^1.3.1" - uint8arrays "^3.0.0" - -hard-rejection@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz" - integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/has/-/has-1.0.4.tgz" - integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -hosted-git-info@^4.0.1: - version "4.1.0" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz" - integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== - dependencies: - lru-cache "^6.0.0" - -human-signals@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz" - integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== - -husky@^8.0.3: - version "8.0.3" - resolved "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz" - integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== - -iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inherits@^2.0.3, inherits@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -interface-ipld-format@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/interface-ipld-format/-/interface-ipld-format-1.0.1.tgz" - integrity sha512-WV/ar+KQJVoQpqRDYdo7YPGYIUHJxCuOEhdvsRpzLqoOIVCqPKdMMYmsLL1nCRsF3yYNio+PAJbCKiv6drrEAg== - dependencies: - cids "^1.1.6" - multicodec "^3.0.1" - multihashes "^4.0.2" - -ipfs-only-hash@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/ipfs-only-hash/-/ipfs-only-hash-4.0.0.tgz" - integrity sha512-TE1DZCvfw8i3gcsTq3P4TFx3cKFJ3sluu/J3XINkJhIN9OwJgNMqKA+WnKx6ByCb1IoPXsTp1KM7tupElb6SyA== - dependencies: - ipfs-unixfs-importer "^7.0.1" - meow "^9.0.0" - -ipfs-unixfs-importer@^7.0.1: - version "7.0.3" - resolved "https://registry.npmjs.org/ipfs-unixfs-importer/-/ipfs-unixfs-importer-7.0.3.tgz" - integrity sha512-qeFOlD3AQtGzr90sr5Tq1Bi8pT5Nr2tSI8z310m7R4JDYgZc6J1PEZO3XZQ8l1kuGoqlAppBZuOYmPEqaHcVQQ== - dependencies: - bl "^5.0.0" - cids "^1.1.5" - err-code "^3.0.1" - hamt-sharding "^2.0.0" - ipfs-unixfs "^4.0.3" - ipld-dag-pb "^0.22.2" - it-all "^1.0.5" - it-batch "^1.0.8" - it-first "^1.0.6" - it-parallel-batch "^1.0.9" - merge-options "^3.0.4" - multihashing-async "^2.1.0" - rabin-wasm "^0.1.4" - uint8arrays "^2.1.2" - -ipfs-unixfs@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/ipfs-unixfs/-/ipfs-unixfs-4.0.3.tgz" - integrity sha512-hzJ3X4vlKT8FQ3Xc4M1szaFVjsc1ZydN+E4VQ91aXxfpjFn9G2wsMo1EFdAXNq/BUnN5dgqIOMP5zRYr3DTsAw== - dependencies: - err-code "^3.0.1" - protobufjs "^6.10.2" - -ipld-dag-pb@^0.22.2: - version "0.22.3" - resolved "https://registry.npmjs.org/ipld-dag-pb/-/ipld-dag-pb-0.22.3.tgz" - integrity sha512-dfG5C5OVAR4FEP7Al2CrHWvAyIM7UhAQrjnOYOIxXGQz5NlEj6wGX0XQf6Ru6or1na6upvV3NQfstapQG8X2rg== - dependencies: - cids "^1.0.0" - interface-ipld-format "^1.0.0" - multicodec "^3.0.1" - multihashing-async "^2.0.0" - protobufjs "^6.10.2" - stable "^0.1.8" - uint8arrays "^2.0.5" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-core-module@^2.13.0, is-core-module@^2.5.0: - version "2.13.0" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz" - integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== - dependencies: - has "^1.0.3" - -is-extendable@^0.1.0: - version "0.1.1" - resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-fullwidth-code-point@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz" - integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== - -is-fullwidth-code-point@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz" - integrity sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA== - dependencies: - get-east-asian-width "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" - integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== - -is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isows@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.4.tgz#810cd0d90cc4995c26395d2aa4cfa4037ebdf061" - integrity sha512-hEzjY+x9u9hPmBom9IIAqdJCwNLax+xrPb51vEPpERoFlIxgmZcHzsT5jKG06nvInKOBGvReAVz80Umed5CczQ== - -it-all@^1.0.5: - version "1.0.6" - resolved "https://registry.npmjs.org/it-all/-/it-all-1.0.6.tgz" - integrity sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A== - -it-batch@^1.0.8, it-batch@^1.0.9: - version "1.0.9" - resolved "https://registry.npmjs.org/it-batch/-/it-batch-1.0.9.tgz" - integrity sha512-7Q7HXewMhNFltTsAMdSz6luNhyhkhEtGGbYek/8Xb/GiqYMtwUmopE1ocPSiJKKp3rM4Dt045sNFoUu+KZGNyA== - -it-first@^1.0.6: - version "1.0.7" - resolved "https://registry.npmjs.org/it-first/-/it-first-1.0.7.tgz" - integrity sha512-nvJKZoBpZD/6Rtde6FXqwDqDZGF1sCADmr2Zoc0hZsIvnE449gRFnGctxDf09Bzc/FWnHXAdaHVIetY6lrE0/g== - -it-parallel-batch@^1.0.9: - version "1.0.11" - resolved "https://registry.npmjs.org/it-parallel-batch/-/it-parallel-batch-1.0.11.tgz" - integrity sha512-UWsWHv/kqBpMRmyZJzlmZeoAMA0F3SZr08FBdbhtbe+MtoEBgr/ZUAKrnenhXCBrsopy76QjRH2K/V8kNdupbQ== - dependencies: - it-batch "^1.0.9" - -js-sha3@^0.8.0: - version "0.8.0" - resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -json-bigint@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz" - integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== - dependencies: - bignumber.js "^9.0.0" - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: - version "6.0.3" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -lilconfig@~3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" - integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -lint-staged@^15.2.7: - version "15.2.7" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.2.7.tgz#97867e29ed632820c0fb90be06cd9ed384025649" - integrity sha512-+FdVbbCZ+yoh7E/RosSdqKJyUM2OEjTciH0TFNkawKgvFp1zbGlEC39RADg+xKBG1R4mhoH2j85myBQZ5wR+lw== - dependencies: - chalk "~5.3.0" - commander "~12.1.0" - debug "~4.3.4" - execa "~8.0.1" - lilconfig "~3.1.1" - listr2 "~8.2.1" - micromatch "~4.0.7" - pidtree "~0.6.0" - string-argv "~0.3.2" - yaml "~2.4.2" - -listr2@~8.2.1: - version "8.2.4" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.2.4.tgz#486b51cbdb41889108cb7e2c90eeb44519f5a77f" - integrity sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g== - dependencies: - cli-truncate "^4.0.0" - colorette "^2.0.20" - eventemitter3 "^5.0.1" - log-update "^6.1.0" - rfdc "^1.4.1" - wrap-ansi "^9.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -log-update@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.1.0.tgz#1a04ff38166f94647ae1af562f4bd6a15b1b7cd4" - integrity sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w== - dependencies: - ansi-escapes "^7.0.0" - cli-cursor "^5.0.0" - slice-ansi "^7.1.0" - strip-ansi "^7.1.0" - wrap-ansi "^9.0.0" - -long@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/long/-/long-4.0.0.tgz" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== - -loupe@^3.1.0, loupe@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.1.1.tgz#71d038d59007d890e3247c5db97c1ec5a92edc54" - integrity sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw== - dependencies: - get-func-name "^2.0.1" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -magic-string@^0.30.10: - version "0.30.11" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.11.tgz#301a6f93b3e8c2cb13ac1a7a673492c0dfd12954" - integrity sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - -map-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" - integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== - -map-obj@^4.0.0: - version "4.3.0" - resolved "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz" - integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== - -meow@^9.0.0: - version "9.0.0" - resolved "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz" - integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ== - dependencies: - "@types/minimist" "^1.2.0" - camelcase-keys "^6.2.2" - decamelize "^1.2.0" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "4.1.0" - normalize-package-data "^3.0.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.18.0" - yargs-parser "^20.2.3" - -merge-options@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz" - integrity sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ== - dependencies: - is-plain-obj "^2.1.0" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -micromatch@~4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" - integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - -mimic-function@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" - integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== - -min-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== - -minimist-options@4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz" - integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - kind-of "^6.0.3" - -minimist@^1.2.5: - version "1.2.8" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -multibase@^4.0.1: - version "4.0.6" - resolved "https://registry.npmjs.org/multibase/-/multibase-4.0.6.tgz" - integrity sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ== - dependencies: - "@multiformats/base-x" "^4.0.1" - -multicodec@^3.0.1: - version "3.2.1" - resolved "https://registry.npmjs.org/multicodec/-/multicodec-3.2.1.tgz" - integrity sha512-+expTPftro8VAW8kfvcuNNNBgb9gPeNYV9dn+z1kJRWF2vih+/S79f2RVeIwmrJBUJ6NT9IUPWnZDQvegEh5pw== - dependencies: - uint8arrays "^3.0.0" - varint "^6.0.0" - -multiformats@^9.4.2: - version "9.9.0" - resolved "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz" - integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== - -multihashes@^4.0.1, multihashes@^4.0.2: - version "4.0.3" - resolved "https://registry.npmjs.org/multihashes/-/multihashes-4.0.3.tgz" - integrity sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA== - dependencies: - multibase "^4.0.1" - uint8arrays "^3.0.0" - varint "^5.0.2" - -multihashing-async@^2.0.0, multihashing-async@^2.1.0: - version "2.1.4" - resolved "https://registry.npmjs.org/multihashing-async/-/multihashing-async-2.1.4.tgz" - integrity sha512-sB1MiQXPSBTNRVSJc2zM157PXgDtud2nMFUEIvBrsq5Wv96sUclMRK/ecjoP1T/W61UJBqt4tCTwMkUpt2Gbzg== - dependencies: - blakejs "^1.1.0" - err-code "^3.0.0" - js-sha3 "^0.8.0" - multihashes "^4.0.1" - murmurhash3js-revisited "^3.0.0" - uint8arrays "^3.0.0" - -murmurhash3js-revisited@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz" - integrity sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g== - -mute-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz" - integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== - -nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== - -node-fetch@^2.6.1: - version "2.7.0" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-package-data@^3.0.0: - version "3.0.3" - resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz" - integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== - dependencies: - hosted-git-info "^4.0.1" - is-core-module "^2.5.0" - semver "^7.3.4" - validate-npm-package-license "^3.0.1" - -npm-run-path@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz" - integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== - dependencies: - path-key "^4.0.0" - -object-hash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" - integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== - -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - -onetime@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-7.0.0.tgz#9f16c92d8c9ef5120e3acd9dd9957cceecc1ab60" - integrity sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ== - dependencies: - mimic-function "^5.0.0" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parse-json@^5.0.0: - version "5.2.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -pathe@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" - integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== - -pathval@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25" - integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pidtree@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" - integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== - -postcss@^8.4.32: - version "8.4.32" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz" - integrity sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -prettier-plugin-solidity@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.3.1.tgz#59944d3155b249f7f234dee29f433524b9a4abcf" - integrity sha512-MN4OP5I2gHAzHZG1wcuJl0FsLS3c4Cc5494bbg+6oQWBPuEamjwDvmGfFMZ6NFzsh3Efd9UUxeT7ImgjNH4ozA== - dependencies: - "@solidity-parser/parser" "^0.17.0" - semver "^7.5.4" - solidity-comments-extractor "^0.0.8" - -prettier@3.2.5: - version "3.2.5" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" - integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== - -protobufjs@^6.10.2: - version "6.11.4" - resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz" - integrity sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/long" "^4.0.1" - "@types/node" ">=13.7.0" - long "^4.0.0" - -quick-lru@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz" - integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== - -rabin-wasm@^0.1.4: - version "0.1.5" - resolved "https://registry.npmjs.org/rabin-wasm/-/rabin-wasm-0.1.5.tgz" - integrity sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA== - dependencies: - "@assemblyscript/loader" "^0.9.4" - bl "^5.0.0" - debug "^4.3.1" - minimist "^1.2.5" - node-fetch "^2.6.1" - readable-stream "^3.6.0" - -read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - -readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.2" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -redent@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz" - integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== - dependencies: - indent-string "^4.0.0" - strip-indent "^3.0.0" - -resolve-pkg-maps@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz" - integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== - -resolve@^1.10.0: - version "1.22.8" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -restore-cursor@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-5.1.0.tgz#0766d95699efacb14150993f55baf0953ea1ebe7" - integrity sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA== - dependencies: - onetime "^7.0.0" - signal-exit "^4.1.0" - -rfdc@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" - integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== - -rollup@^4.2.0: - version "4.9.0" - resolved "https://registry.npmjs.org/rollup/-/rollup-4.9.0.tgz" - integrity sha512-bUHW/9N21z64gw8s6tP4c88P382Bq/L5uZDowHlHx6s/QWpjJXivIAbEw6LZthgSvlEizZBfLC4OAvWe7aoF7A== - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.9.0" - "@rollup/rollup-android-arm64" "4.9.0" - "@rollup/rollup-darwin-arm64" "4.9.0" - "@rollup/rollup-darwin-x64" "4.9.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.9.0" - "@rollup/rollup-linux-arm64-gnu" "4.9.0" - "@rollup/rollup-linux-arm64-musl" "4.9.0" - "@rollup/rollup-linux-riscv64-gnu" "4.9.0" - "@rollup/rollup-linux-x64-gnu" "4.9.0" - "@rollup/rollup-linux-x64-musl" "4.9.0" - "@rollup/rollup-win32-arm64-msvc" "4.9.0" - "@rollup/rollup-win32-ia32-msvc" "4.9.0" - "@rollup/rollup-win32-x64-msvc" "4.9.0" - fsevents "~2.3.2" - -run-async@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz" - integrity sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q== - -safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -section-matter@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz" - integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== - dependencies: - extend-shallow "^2.0.1" - kind-of "^6.0.0" - -"semver@2 || 3 || 4 || 5": - version "5.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@^7.3.4: - version "7.5.4" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -semver@^7.5.4: - version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -siginfo@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz" - integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== - -signal-exit@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -slice-ansi@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz" - integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== - dependencies: - ansi-styles "^6.0.0" - is-fullwidth-code-point "^4.0.0" - -slice-ansi@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.0.tgz#cd6b4655e298a8d1bdeb04250a433094b347b9a9" - integrity sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg== - dependencies: - ansi-styles "^6.2.1" - is-fullwidth-code-point "^5.0.0" - -solidity-comments-extractor@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/solidity-comments-extractor/-/solidity-comments-extractor-0.0.8.tgz#f6e148ab0c49f30c1abcbecb8b8df01ed8e879f8" - integrity sha512-htM7Vn6LhHreR+EglVMd2s+sZhcXAirB1Zlyrv5zBuTxieCvjfnRpd7iZk75m/u6NOlEyQ94C6TWbBn2cY7w8g== - -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - -sparse-array@^1.3.1: - version "1.3.2" - resolved "https://registry.npmjs.org/sparse-array/-/sparse-array-1.3.2.tgz" - integrity sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg== - -spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.16" - resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz" - integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - -stackback@0.0.2: - version "0.0.2" - resolved "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz" - integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== - -std-env@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" - integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== - -string-argv@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" - integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== - -string-width@^4.1.0: - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/string-width/-/string-width-7.0.0.tgz" - integrity sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw== - dependencies: - emoji-regex "^10.3.0" - get-east-asian-width "^1.0.0" - strip-ansi "^7.1.0" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.1.0: - version "7.1.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-bom-string@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz" - integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== - -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - -strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== - dependencies: - min-indent "^1.0.0" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -tinybench@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.8.0.tgz#30e19ae3a27508ee18273ffed9ac7018949acd7b" - integrity sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw== - -tinypool@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.0.0.tgz#a68965218e04f4ad9de037d2a1cd63cda9afb238" - integrity sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ== - -tinyrainbow@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-1.2.0.tgz#5c57d2fc0fb3d1afd78465c33ca885d04f02abb5" - integrity sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ== - -tinyspy@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-3.0.0.tgz#cb61644f2713cd84dee184863f4642e06ddf0585" - integrity sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA== - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -trim-newlines@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz" - integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== - -tsx@^4.16.3: - version "4.16.3" - resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.16.3.tgz#56eb2f14f67b798e8bd8a907a9ceec57cba0e8b9" - integrity sha512-MP8AEUxVnboD2rCC6kDLxnpDBNWN9k3BSVU/0/nNxgm70bPBnfn+yCKcnOsIVPQwdkbKYoFOlKjjWZWJ2XCXUg== - dependencies: - esbuild "~0.21.5" - get-tsconfig "^4.7.5" - optionalDependencies: - fsevents "~2.3.3" - -tsx@^4.7.1: - version "4.7.1" - resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.7.1.tgz#27af6cbf4e1cdfcb9b5425b1c61bb7e668eb5e84" - integrity sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g== - dependencies: - esbuild "~0.19.10" - get-tsconfig "^4.7.2" - optionalDependencies: - fsevents "~2.3.3" - -type-fest@^0.18.0: - version "0.18.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz" - integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -uint8arrays@^2.0.5, uint8arrays@^2.1.2: - version "2.1.10" - resolved "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.10.tgz" - integrity sha512-Q9/hhJa2836nQfEJSZTmr+pg9+cDJS9XEAp7N2Vg5MzL3bK/mkMVfjscRGYruP9jNda6MAdf4QD/y78gSzkp6A== - dependencies: - multiformats "^9.4.2" - -uint8arrays@^3.0.0: - version "3.1.1" - resolved "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz" - integrity sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg== - dependencies: - multiformats "^9.4.2" - -undici-types@~5.25.1: - version "5.25.3" - resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz" - integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== - -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -util-deprecate@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -varint@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz" - integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== - -varint@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz" - integrity sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg== - -viem@^2.17.11: - version "2.18.0" - resolved "https://registry.yarnpkg.com/viem/-/viem-2.18.0.tgz#ea0d037f0db356e6d71f1251243825345d6dc08f" - integrity sha512-HA4Dj+PCNWvvZDThWcUPg0sjiS8uwGRaxs3CMBOASL/j0p2pD4nR9vY/y/pAiRr491hGCnrSCVCmb/qqA57wIw== - dependencies: - "@adraffy/ens-normalize" "1.10.0" - "@noble/curves" "1.4.0" - "@noble/hashes" "1.4.0" - "@scure/bip32" "1.4.0" - "@scure/bip39" "1.3.0" - abitype "1.0.5" - isows "1.0.4" - webauthn-p256 "0.0.5" - ws "8.17.1" - -viem@^2.18.6: - version "2.18.6" - resolved "https://registry.yarnpkg.com/viem/-/viem-2.18.6.tgz#527c54a032cdd4c1f1795fcb44072e8c3efd16c6" - integrity sha512-KughUodIEjzkC+KfQ4+259yRXYfo0VLkZQ7NVC3RGfCMMOiVWaOxHjmcaY0FnZzKX3pwrlMyTAZbwH9tVAN/Yw== - dependencies: - "@adraffy/ens-normalize" "1.10.0" - "@noble/curves" "1.4.0" - "@noble/hashes" "1.4.0" - "@scure/bip32" "1.4.0" - "@scure/bip39" "1.3.0" - abitype "1.0.5" - isows "1.0.4" - webauthn-p256 "0.0.5" - ws "8.17.1" - -vite-node@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-2.0.4.tgz#5600cc9f0d9c3ff9a64050c6858e7e1b62fb3fcd" - integrity sha512-ZpJVkxcakYtig5iakNeL7N3trufe3M6vGuzYAr4GsbCTwobDeyPJpE4cjDhhPluv8OvQCFzu2LWp6GkoKRITXA== - dependencies: - cac "^6.7.14" - debug "^4.3.5" - pathe "^1.1.2" - tinyrainbow "^1.2.0" - vite "^5.0.0" - -vite@^5.0.0: - version "5.0.8" - resolved "https://registry.npmjs.org/vite/-/vite-5.0.8.tgz" - integrity sha512-jYMALd8aeqR3yS9xlHd0OzQJndS9fH5ylVgWdB+pxTwxLKdO1pgC5Dlb398BUxpfaBxa4M9oT7j1g503Gaj5IQ== - dependencies: - esbuild "^0.19.3" - postcss "^8.4.32" - rollup "^4.2.0" - optionalDependencies: - fsevents "~2.3.3" - -vitest@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-2.0.4.tgz#ac6bfbaee53e502cee864b07a5b2edf1fcba793e" - integrity sha512-luNLDpfsnxw5QSW4bISPe6tkxVvv5wn2BBs/PuDRkhXZ319doZyLOBr1sjfB5yCEpTiU7xCAdViM8TNVGPwoog== - dependencies: - "@ampproject/remapping" "^2.3.0" - "@vitest/expect" "2.0.4" - "@vitest/pretty-format" "^2.0.4" - "@vitest/runner" "2.0.4" - "@vitest/snapshot" "2.0.4" - "@vitest/spy" "2.0.4" - "@vitest/utils" "2.0.4" - chai "^5.1.1" - debug "^4.3.5" - execa "^8.0.1" - magic-string "^0.30.10" - pathe "^1.1.2" - std-env "^3.7.0" - tinybench "^2.8.0" - tinypool "^1.0.0" - tinyrainbow "^1.2.0" - vite "^5.0.0" - vite-node "2.0.4" - why-is-node-running "^2.3.0" - -webauthn-p256@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/webauthn-p256/-/webauthn-p256-0.0.5.tgz#0baebd2ba8a414b21cc09c0d40f9dd0be96a06bd" - integrity sha512-drMGNWKdaixZNobeORVIqq7k5DsRC9FnG201K2QjeOoQLmtSDaSsVZdkg6n5jUALJKcAG++zBPJXmv6hy0nWFg== - dependencies: - "@noble/curves" "^1.4.0" - "@noble/hashes" "^1.4.0" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -why-is-node-running@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" - integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== - dependencies: - siginfo "^2.0.0" - stackback "0.0.2" - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^9.0.0: - version "9.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz" - integrity sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== - dependencies: - ansi-styles "^6.2.1" - string-width "^7.0.0" - strip-ansi "^7.1.0" - -ws@8.17.1: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" - integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@~2.4.2: - version "2.4.5" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.5.tgz#60630b206dd6d84df97003d33fc1ddf6296cca5e" - integrity sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg== - -yargs-parser@^20.2.3: - version "20.2.9" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -zod@^3.23.8: - version "3.23.8" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" - integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== diff --git a/zksync/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3ZkSync_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol b/zksync/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3ZkSync_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol new file mode 100644 index 000000000..da938a35a --- /dev/null +++ b/zksync/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3ZkSync_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3ZkSyncAssets} from 'aave-address-book/AaveV3ZkSync.sol'; +import {AaveV3PayloadZkSync} from 'aave-helpers/src/v3-config-engine/AaveV3PayloadZkSync.sol'; +import {EngineFlags} from 'aave-v3-origin/contracts/extensions/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-origin/contracts/extensions/v3-config-engine/IAaveV3ConfigEngine.sol'; +/** + * @title Increase Borrow Slope1 to all Stablecoins across all Aave Instances + * @author Aave Chan Initiative + * - Snapshot: Direct-to-AIP + * - Discussion: https://governance.aave.com/t/arfc-increase-borrow-slope1-to-all-stablecoins-across-all-aave-instances/19979 + */ +contract AaveV3ZkSync_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 is + AaveV3PayloadZkSync +{ + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV3ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](2); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3ZkSyncAssets.USDC_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 40_00 + }) + }); + rateStrategies[1] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3ZkSyncAssets.USDT_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, + variableRateSlope1: 12_50, + variableRateSlope2: 40_00 + }) + }); + + return rateStrategies; + } +} diff --git a/zksync/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3ZkSync_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol b/zksync/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3ZkSync_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol new file mode 100644 index 000000000..8940ccaa8 --- /dev/null +++ b/zksync/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3ZkSync_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3ZkSync} from 'aave-address-book/AaveV3ZkSync.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/zksync/src/ProtocolV3TestBase.sol'; +import {AaveV3ZkSync_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201} from './AaveV3ZkSync_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol'; + +/** + * @dev Test for AaveV3ZkSync_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 + * command: FOUNDRY_PROFILE=zksync forge test --zksync --match-path=zksync/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/AaveV3ZkSync_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.t.sol -vv + */ +contract AaveV3ZkSync_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201_Test is + ProtocolV3TestBase +{ + AaveV3ZkSync_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 + internal proposal; + + function setUp() public override { + vm.createSelectFork(vm.rpcUrl('zksync'), 50675012); + proposal = new AaveV3ZkSync_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201(); + + super.setUp(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest( + 'AaveV3ZkSync_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201', + AaveV3ZkSync.POOL, + address(proposal) + ); + } +} diff --git a/zksync/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.s.sol b/zksync/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.s.sol new file mode 100644 index 000000000..732c7728e --- /dev/null +++ b/zksync/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.s.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore} from 'aave-helpers/src/GovV3Helpers.sol'; +import {ZkSyncScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV3ZkSync_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201} from './AaveV3ZkSync_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.sol'; + +// @dev wrapper factory contract for deploying the payload +contract Deploy_AaveV3ZkSync_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201 { + address public immutable PAYLOAD; + + constructor() { + PAYLOAD = GovV3Helpers.deployDeterministicZkSync( + type(AaveV3ZkSync_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201) + .creationCode + ); + } +} + +/** + * @dev Deploy ZkSync + * deploy-command: make deploy-pk FOUNDRY_PROFILE=contract=zksync/src/20241201_Multi_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances/IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201.s.sol:DeployZkSync chain=zksync + */ +contract DeployZkSync is ZkSyncScript { + function run() external broadcast { + // deploy payloads + address payload0 = new Deploy_AaveV3ZkSync_IncreaseBorrowSlope1ToAllStablecoinsAcrossAllAaveInstances_20241201() + .PAYLOAD(); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +}