From 86ee5838d404461633dce0cff16fab93b5177c5a Mon Sep 17 00:00:00 2001 From: sakulstra Date: Thu, 18 Jan 2024 23:25:42 +0100 Subject: [PATCH] fix: remove governance v2 --- ...1926cd285ee1fba70b3acf461b0293ae08fb03.svg | 1 - ...40a59c8c432cbe6f37694bbe31a2d331363c7b.svg | 1 + ...7fef836e3858d0db22265c3110d7ca043a7657.svg | 1 + ...fb94ca8399a809f0604c48b7139249d813e785.svg | 1 - ...71932d0fcbd41e429b19c18a080afc59cc51fe.svg | 1 - ...8c34e80e24e6ccaf0f1681a4f94fdcba67eb2c.svg | 1 + ...e1814a06c37c32f0efd02a4fda97a8278b0714.svg | 1 - ...65736168100defb74c36ef37d1d25b6d8e6ab2.svg | 1 + ...987a4911a41c316461bd57acf38be5b6ae837b.svg | 1 - ...0013c26457182fd9217e67c8443bffe9a1b607.svg | 1 - ...d7d49925c7332e1ea4d2798e5c76818cd4496f.svg | 1 - ...6ff20939889da0d22c72400271f9f8e240b721.svg | 1 + ...8709042699525ed81e0dac3fda0c7777197541.svg | 1 + ...2f54d63a2494f0efb20965bcc816e1ac4e20dc.svg | 1 + ...a7f61d5d21127368cc0bea20bad5a01ea1b315.svg | 1 + ...0aedf1df6c1d7f2e113b0b9d519f23de386bd3.svg | 1 - ...0220443634a43f0f202f2f55e802420e34aaef.svg | 1 + ...baf463ca5ee6f64b55fc3341caa8cbcee3dfaa.svg | 1 - ...c8da050368b3e9a8420d21fa866a16cd9b256b.svg | 1 + ...4f19cf0e34dff3f9cc310e94fefbf076d4b4ee.svg | 1 - ...24b25803beaac85c9e1e00e50e08c212c3d6ee.svg | 1 + ...0a47386e954467cec43720ed9cf782b044323c.svg | 1 + ...20cf9450361f13f334b9c702978621478db3ef.svg | 1 + ...15a8c57745a62d63e11134fe8acf5059377542.svg | 1 - ...8564d8f84cae803b5ce093e3c16a2320d839a3.svg | 1 - ...980764f838d8ca4360a8d41134c2b88ecb7267.svg | 1 + ...915942068dba199ca11ffeb52b7307ca371150.svg | 1 - ...ed74de0afe7038dd7aeafec3706fca30b9c4cb.svg | 1 + ...533b46a606ea3ecf5d2c9d4131c8d9d3d7fcfe.svg | 1 - ...97dc9dd6b6e40ecb1ed1cd027e997e9d1a4cc0.svg | 1 - ...eb3e57d4e28d7fd4b450d05caf6b3d30d3fd64.svg | 1 + ...957fe4c310ba51f499314c131f0977304a09d1.svg | 1 - ...311be06517702c412391a895f26a4198836af6.svg | 1 + ...ca7fdf8c83324f67a2ee404d914301ae9aae49.svg | 1 + .gitmodules | 3 - ...stV2RatesUpdates_postTestV2RatesUpdates.md | 12 +- lib/governance-crosschain-bridges | 1 - remappings.txt | 1 - reports/postTestV2RatesUpdates.json | 715 ++++++++---------- reports/preTestV2RatesUpdates.json | 705 ++++++++--------- scripts/CrosschainForwarders.s.sol | 32 - src/AaveHelpers.sol | 6 - src/GovHelpers.sol | 579 -------------- src/GovV3Helpers.sol | 70 -- .../CrosschainForwarderArbitrum.sol | 110 --- .../CrosschainForwarderMetis.sol | 67 -- .../CrosschainForwarderOptimism.sol | 74 -- .../CrosschainForwarderPolygon.sol | 39 - src/crosschainforwarders/README.md | 59 -- src/crosschainforwarders/bridge-listing.png | Bin 116589 -> 0 bytes tests/GovV3Test.t.sol | 1 - .../ArbitrumCrossChainForwarderTest.t.sol | 151 ---- .../MetisCrossChainForwarderTest.t.sol | 79 -- .../OptimismCrossChainForwarderTest.t.sol | 81 -- .../PolygonCrossChainForwarderTest.t.sol | 86 --- .../AaveV2ConfigEngineTest.t.sol | 6 +- .../AaveV3ConfigEngineGauntletProposal.t.sol | 103 --- 57 files changed, 637 insertions(+), 2377 deletions(-) delete mode 100644 .assets/021926cd285ee1fba70b3acf461b0293ae08fb03.svg create mode 100644 .assets/0840a59c8c432cbe6f37694bbe31a2d331363c7b.svg create mode 100644 .assets/0d7fef836e3858d0db22265c3110d7ca043a7657.svg delete mode 100644 .assets/0efb94ca8399a809f0604c48b7139249d813e785.svg delete mode 100644 .assets/1571932d0fcbd41e429b19c18a080afc59cc51fe.svg create mode 100644 .assets/1a8c34e80e24e6ccaf0f1681a4f94fdcba67eb2c.svg delete mode 100644 .assets/1ee1814a06c37c32f0efd02a4fda97a8278b0714.svg create mode 100644 .assets/2765736168100defb74c36ef37d1d25b6d8e6ab2.svg delete mode 100644 .assets/2e987a4911a41c316461bd57acf38be5b6ae837b.svg delete mode 100644 .assets/330013c26457182fd9217e67c8443bffe9a1b607.svg delete mode 100644 .assets/42d7d49925c7332e1ea4d2798e5c76818cd4496f.svg create mode 100644 .assets/476ff20939889da0d22c72400271f9f8e240b721.svg create mode 100644 .assets/4e8709042699525ed81e0dac3fda0c7777197541.svg create mode 100644 .assets/512f54d63a2494f0efb20965bcc816e1ac4e20dc.svg create mode 100644 .assets/53a7f61d5d21127368cc0bea20bad5a01ea1b315.svg delete mode 100644 .assets/560aedf1df6c1d7f2e113b0b9d519f23de386bd3.svg create mode 100644 .assets/580220443634a43f0f202f2f55e802420e34aaef.svg delete mode 100644 .assets/5bbaf463ca5ee6f64b55fc3341caa8cbcee3dfaa.svg create mode 100644 .assets/5cc8da050368b3e9a8420d21fa866a16cd9b256b.svg delete mode 100644 .assets/704f19cf0e34dff3f9cc310e94fefbf076d4b4ee.svg create mode 100644 .assets/9024b25803beaac85c9e1e00e50e08c212c3d6ee.svg create mode 100644 .assets/b10a47386e954467cec43720ed9cf782b044323c.svg create mode 100644 .assets/bd20cf9450361f13f334b9c702978621478db3ef.svg delete mode 100644 .assets/c415a8c57745a62d63e11134fe8acf5059377542.svg delete mode 100644 .assets/c68564d8f84cae803b5ce093e3c16a2320d839a3.svg create mode 100644 .assets/ca980764f838d8ca4360a8d41134c2b88ecb7267.svg delete mode 100644 .assets/cb915942068dba199ca11ffeb52b7307ca371150.svg create mode 100644 .assets/cded74de0afe7038dd7aeafec3706fca30b9c4cb.svg delete mode 100644 .assets/d3533b46a606ea3ecf5d2c9d4131c8d9d3d7fcfe.svg delete mode 100644 .assets/d697dc9dd6b6e40ecb1ed1cd027e997e9d1a4cc0.svg create mode 100644 .assets/dbeb3e57d4e28d7fd4b450d05caf6b3d30d3fd64.svg delete mode 100644 .assets/e6957fe4c310ba51f499314c131f0977304a09d1.svg create mode 100644 .assets/ed311be06517702c412391a895f26a4198836af6.svg create mode 100644 .assets/faca7fdf8c83324f67a2ee404d914301ae9aae49.svg delete mode 160000 lib/governance-crosschain-bridges delete mode 100644 scripts/CrosschainForwarders.s.sol delete mode 100644 src/AaveHelpers.sol delete mode 100644 src/GovHelpers.sol delete mode 100644 src/crosschainforwarders/CrosschainForwarderArbitrum.sol delete mode 100644 src/crosschainforwarders/CrosschainForwarderMetis.sol delete mode 100644 src/crosschainforwarders/CrosschainForwarderOptimism.sol delete mode 100644 src/crosschainforwarders/CrosschainForwarderPolygon.sol delete mode 100644 src/crosschainforwarders/README.md delete mode 100644 src/crosschainforwarders/bridge-listing.png delete mode 100644 tests/crosschainforwarders/ArbitrumCrossChainForwarderTest.t.sol delete mode 100644 tests/crosschainforwarders/MetisCrossChainForwarderTest.t.sol delete mode 100644 tests/crosschainforwarders/OptimismCrossChainForwarderTest.t.sol delete mode 100644 tests/crosschainforwarders/PolygonCrossChainForwarderTest.t.sol delete mode 100644 tests/v3-config-engine/AaveV3ConfigEngineGauntletProposal.t.sol diff --git a/.assets/021926cd285ee1fba70b3acf461b0293ae08fb03.svg b/.assets/021926cd285ee1fba70b3acf461b0293ae08fb03.svg deleted file mode 100644 index bacea5dfe..000000000 --- a/.assets/021926cd285ee1fba70b3acf461b0293ae08fb03.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%200%400%Optimal 65%Optimal 65% \ No newline at end of file diff --git a/.assets/0840a59c8c432cbe6f37694bbe31a2d331363c7b.svg b/.assets/0840a59c8c432cbe6f37694bbe31a2d331363c7b.svg new file mode 100644 index 000000000..7e173c7fa --- /dev/null +++ b/.assets/0840a59c8c432cbe6f37694bbe31a2d331363c7b.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%50%100%Optimal 80%Optimal 80% \ No newline at end of file diff --git a/.assets/0d7fef836e3858d0db22265c3110d7ca043a7657.svg b/.assets/0d7fef836e3858d0db22265c3110d7ca043a7657.svg new file mode 100644 index 000000000..b7151ad28 --- /dev/null +++ b/.assets/0d7fef836e3858d0db22265c3110d7ca043a7657.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%200%400%Optimal 45%Optimal 45% \ No newline at end of file diff --git a/.assets/0efb94ca8399a809f0604c48b7139249d813e785.svg b/.assets/0efb94ca8399a809f0604c48b7139249d813e785.svg deleted file mode 100644 index 7924b8fef..000000000 --- a/.assets/0efb94ca8399a809f0604c48b7139249d813e785.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%50%100%Optimal 80%Optimal 80% \ No newline at end of file diff --git a/.assets/1571932d0fcbd41e429b19c18a080afc59cc51fe.svg b/.assets/1571932d0fcbd41e429b19c18a080afc59cc51fe.svg deleted file mode 100644 index 99fb7d999..000000000 --- a/.assets/1571932d0fcbd41e429b19c18a080afc59cc51fe.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%50%Optimal 90%Optimal 90% \ No newline at end of file diff --git a/.assets/1a8c34e80e24e6ccaf0f1681a4f94fdcba67eb2c.svg b/.assets/1a8c34e80e24e6ccaf0f1681a4f94fdcba67eb2c.svg new file mode 100644 index 000000000..2d38b2c7a --- /dev/null +++ b/.assets/1a8c34e80e24e6ccaf0f1681a4f94fdcba67eb2c.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%50%100%Optimal 80%Optimal 80% \ No newline at end of file diff --git a/.assets/1ee1814a06c37c32f0efd02a4fda97a8278b0714.svg b/.assets/1ee1814a06c37c32f0efd02a4fda97a8278b0714.svg deleted file mode 100644 index c61b9927f..000000000 --- a/.assets/1ee1814a06c37c32f0efd02a4fda97a8278b0714.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%50%Optimal 90%Optimal 90% \ No newline at end of file diff --git a/.assets/2765736168100defb74c36ef37d1d25b6d8e6ab2.svg b/.assets/2765736168100defb74c36ef37d1d25b6d8e6ab2.svg new file mode 100644 index 000000000..c55b74d8f --- /dev/null +++ b/.assets/2765736168100defb74c36ef37d1d25b6d8e6ab2.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%200%400%Optimal 80%Optimal 80% \ No newline at end of file diff --git a/.assets/2e987a4911a41c316461bd57acf38be5b6ae837b.svg b/.assets/2e987a4911a41c316461bd57acf38be5b6ae837b.svg deleted file mode 100644 index 889af50e1..000000000 --- a/.assets/2e987a4911a41c316461bd57acf38be5b6ae837b.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%50%100%Optimal 80%Optimal 80% \ No newline at end of file diff --git a/.assets/330013c26457182fd9217e67c8443bffe9a1b607.svg b/.assets/330013c26457182fd9217e67c8443bffe9a1b607.svg deleted file mode 100644 index b85dc1a6e..000000000 --- a/.assets/330013c26457182fd9217e67c8443bffe9a1b607.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%200%400%Optimal 80%Optimal 80% \ No newline at end of file diff --git a/.assets/42d7d49925c7332e1ea4d2798e5c76818cd4496f.svg b/.assets/42d7d49925c7332e1ea4d2798e5c76818cd4496f.svg deleted file mode 100644 index ac7c8a143..000000000 --- a/.assets/42d7d49925c7332e1ea4d2798e5c76818cd4496f.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%200%400%Optimal 45%Optimal 45% \ No newline at end of file diff --git a/.assets/476ff20939889da0d22c72400271f9f8e240b721.svg b/.assets/476ff20939889da0d22c72400271f9f8e240b721.svg new file mode 100644 index 000000000..24c44b2c6 --- /dev/null +++ b/.assets/476ff20939889da0d22c72400271f9f8e240b721.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%200%400%Optimal 80%Optimal 80% \ No newline at end of file diff --git a/.assets/4e8709042699525ed81e0dac3fda0c7777197541.svg b/.assets/4e8709042699525ed81e0dac3fda0c7777197541.svg new file mode 100644 index 000000000..6d1c68d7f --- /dev/null +++ b/.assets/4e8709042699525ed81e0dac3fda0c7777197541.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%200%400%Optimal 50%Optimal 50% \ No newline at end of file diff --git a/.assets/512f54d63a2494f0efb20965bcc816e1ac4e20dc.svg b/.assets/512f54d63a2494f0efb20965bcc816e1ac4e20dc.svg new file mode 100644 index 000000000..1871ec1b6 --- /dev/null +++ b/.assets/512f54d63a2494f0efb20965bcc816e1ac4e20dc.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%200%400%Optimal 65%Optimal 65% \ No newline at end of file diff --git a/.assets/53a7f61d5d21127368cc0bea20bad5a01ea1b315.svg b/.assets/53a7f61d5d21127368cc0bea20bad5a01ea1b315.svg new file mode 100644 index 000000000..46b2de123 --- /dev/null +++ b/.assets/53a7f61d5d21127368cc0bea20bad5a01ea1b315.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%200%400%Optimal 45%Optimal 45% \ No newline at end of file diff --git a/.assets/560aedf1df6c1d7f2e113b0b9d519f23de386bd3.svg b/.assets/560aedf1df6c1d7f2e113b0b9d519f23de386bd3.svg deleted file mode 100644 index 58214672d..000000000 --- a/.assets/560aedf1df6c1d7f2e113b0b9d519f23de386bd3.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%200%Optimal 50%Optimal 50% \ No newline at end of file diff --git a/.assets/580220443634a43f0f202f2f55e802420e34aaef.svg b/.assets/580220443634a43f0f202f2f55e802420e34aaef.svg new file mode 100644 index 000000000..b170a3203 --- /dev/null +++ b/.assets/580220443634a43f0f202f2f55e802420e34aaef.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%200%400%Optimal 1%Optimal 1% \ No newline at end of file diff --git a/.assets/5bbaf463ca5ee6f64b55fc3341caa8cbcee3dfaa.svg b/.assets/5bbaf463ca5ee6f64b55fc3341caa8cbcee3dfaa.svg deleted file mode 100644 index 9b3fea0bc..000000000 --- a/.assets/5bbaf463ca5ee6f64b55fc3341caa8cbcee3dfaa.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%50%100%Optimal 75%Optimal 75% \ No newline at end of file diff --git a/.assets/5cc8da050368b3e9a8420d21fa866a16cd9b256b.svg b/.assets/5cc8da050368b3e9a8420d21fa866a16cd9b256b.svg new file mode 100644 index 000000000..2d7e24cb3 --- /dev/null +++ b/.assets/5cc8da050368b3e9a8420d21fa866a16cd9b256b.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%100%Optimal 70%Optimal 70% \ No newline at end of file diff --git a/.assets/704f19cf0e34dff3f9cc310e94fefbf076d4b4ee.svg b/.assets/704f19cf0e34dff3f9cc310e94fefbf076d4b4ee.svg deleted file mode 100644 index 2b883e106..000000000 --- a/.assets/704f19cf0e34dff3f9cc310e94fefbf076d4b4ee.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%50%100%Optimal 80%Optimal 80% \ No newline at end of file diff --git a/.assets/9024b25803beaac85c9e1e00e50e08c212c3d6ee.svg b/.assets/9024b25803beaac85c9e1e00e50e08c212c3d6ee.svg new file mode 100644 index 000000000..f5bf393be --- /dev/null +++ b/.assets/9024b25803beaac85c9e1e00e50e08c212c3d6ee.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%200%400%Optimal 65%Optimal 65% \ No newline at end of file diff --git a/.assets/b10a47386e954467cec43720ed9cf782b044323c.svg b/.assets/b10a47386e954467cec43720ed9cf782b044323c.svg new file mode 100644 index 000000000..24422e56b --- /dev/null +++ b/.assets/b10a47386e954467cec43720ed9cf782b044323c.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%50%100%Optimal 1%Optimal 1% \ No newline at end of file diff --git a/.assets/bd20cf9450361f13f334b9c702978621478db3ef.svg b/.assets/bd20cf9450361f13f334b9c702978621478db3ef.svg new file mode 100644 index 000000000..4ae2e6a09 --- /dev/null +++ b/.assets/bd20cf9450361f13f334b9c702978621478db3ef.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%200%400%Optimal 80%Optimal 80% \ No newline at end of file diff --git a/.assets/c415a8c57745a62d63e11134fe8acf5059377542.svg b/.assets/c415a8c57745a62d63e11134fe8acf5059377542.svg deleted file mode 100644 index f479e4b44..000000000 --- a/.assets/c415a8c57745a62d63e11134fe8acf5059377542.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%50%100%Optimal 80%Optimal 80% \ No newline at end of file diff --git a/.assets/c68564d8f84cae803b5ce093e3c16a2320d839a3.svg b/.assets/c68564d8f84cae803b5ce093e3c16a2320d839a3.svg deleted file mode 100644 index 0bf7ca3fe..000000000 --- a/.assets/c68564d8f84cae803b5ce093e3c16a2320d839a3.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%50%100%Optimal 80%Optimal 80% \ No newline at end of file diff --git a/.assets/ca980764f838d8ca4360a8d41134c2b88ecb7267.svg b/.assets/ca980764f838d8ca4360a8d41134c2b88ecb7267.svg new file mode 100644 index 000000000..fd7fd2d7b --- /dev/null +++ b/.assets/ca980764f838d8ca4360a8d41134c2b88ecb7267.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%50%100%Optimal 80%Optimal 80% \ No newline at end of file diff --git a/.assets/cb915942068dba199ca11ffeb52b7307ca371150.svg b/.assets/cb915942068dba199ca11ffeb52b7307ca371150.svg deleted file mode 100644 index 2a07c91eb..000000000 --- a/.assets/cb915942068dba199ca11ffeb52b7307ca371150.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%200%Optimal 45%Optimal 45% \ No newline at end of file diff --git a/.assets/cded74de0afe7038dd7aeafec3706fca30b9c4cb.svg b/.assets/cded74de0afe7038dd7aeafec3706fca30b9c4cb.svg new file mode 100644 index 000000000..f0e64bfa0 --- /dev/null +++ b/.assets/cded74de0afe7038dd7aeafec3706fca30b9c4cb.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%200%400%Optimal 45%Optimal 45% \ No newline at end of file diff --git a/.assets/d3533b46a606ea3ecf5d2c9d4131c8d9d3d7fcfe.svg b/.assets/d3533b46a606ea3ecf5d2c9d4131c8d9d3d7fcfe.svg deleted file mode 100644 index 83b2a6954..000000000 --- a/.assets/d3533b46a606ea3ecf5d2c9d4131c8d9d3d7fcfe.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%100%200%Optimal 80%Optimal 80% \ No newline at end of file diff --git a/.assets/d697dc9dd6b6e40ecb1ed1cd027e997e9d1a4cc0.svg b/.assets/d697dc9dd6b6e40ecb1ed1cd027e997e9d1a4cc0.svg deleted file mode 100644 index 4dcfaf825..000000000 --- a/.assets/d697dc9dd6b6e40ecb1ed1cd027e997e9d1a4cc0.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%500%Optimal 80%Optimal 80% \ No newline at end of file diff --git a/.assets/dbeb3e57d4e28d7fd4b450d05caf6b3d30d3fd64.svg b/.assets/dbeb3e57d4e28d7fd4b450d05caf6b3d30d3fd64.svg new file mode 100644 index 000000000..82263d204 --- /dev/null +++ b/.assets/dbeb3e57d4e28d7fd4b450d05caf6b3d30d3fd64.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%50%Optimal 80%Optimal 80% \ No newline at end of file diff --git a/.assets/e6957fe4c310ba51f499314c131f0977304a09d1.svg b/.assets/e6957fe4c310ba51f499314c131f0977304a09d1.svg deleted file mode 100644 index da37df2f5..000000000 --- a/.assets/e6957fe4c310ba51f499314c131f0977304a09d1.svg +++ /dev/null @@ -1 +0,0 @@ - Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%50%Optimal 80%Optimal 80% \ No newline at end of file diff --git a/.assets/ed311be06517702c412391a895f26a4198836af6.svg b/.assets/ed311be06517702c412391a895f26a4198836af6.svg new file mode 100644 index 000000000..da360bbd0 --- /dev/null +++ b/.assets/ed311be06517702c412391a895f26a4198836af6.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%200%400%Optimal 45%Optimal 45% \ No newline at end of file diff --git a/.assets/faca7fdf8c83324f67a2ee404d914301ae9aae49.svg b/.assets/faca7fdf8c83324f67a2ee404d914301ae9aae49.svg new file mode 100644 index 000000000..209e35f30 --- /dev/null +++ b/.assets/faca7fdf8c83324f67a2ee404d914301ae9aae49.svg @@ -0,0 +1 @@ + Borrow APR, variableBorrow APR, stableUtilization Rate0%25%50%75%100%0%50%Optimal 90%Optimal 90% \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index 11a62babb..837cb4ae2 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,6 +7,3 @@ [submodule "lib/aave-address-book"] path = lib/aave-address-book url = https://github.com/bgd-labs/aave-address-book -[submodule "lib/governance-crosschain-bridges"] - path = lib/governance-crosschain-bridges - url = https://github.com/aave/governance-crosschain-bridges diff --git a/diffs/preTestV2RatesUpdates_postTestV2RatesUpdates.md b/diffs/preTestV2RatesUpdates_postTestV2RatesUpdates.md index be27e63b9..9893bd8fa 100644 --- a/diffs/preTestV2RatesUpdates_postTestV2RatesUpdates.md +++ b/diffs/preTestV2RatesUpdates_postTestV2RatesUpdates.md @@ -6,12 +6,12 @@ | description | value before | value after | | --- | --- | --- | -| interestRateStrategy | [0x8Cae0596bC1eD42dc3F04c4506cfe442b3E74e27](https://etherscan.io/address/0x8Cae0596bC1eD42dc3F04c4506cfe442b3E74e27) | [0xc76EF342898f1AE7E6C4632627Df683FAD8563DD](https://etherscan.io/address/0xc76EF342898f1AE7E6C4632627Df683FAD8563DD) | +| interestRateStrategy | [0xb72F23adE9b9980c2E731Ca504105fC860643619](https://etherscan.io/address/0xb72F23adE9b9980c2E731Ca504105fC860643619) | [0x7A297125a0Ea56cCC237Cb87b1Ab1F729353d4D2](https://etherscan.io/address/0x7A297125a0Ea56cCC237Cb87b1Ab1F729353d4D2) | | optimalUsageRatio | 90 % | 69 % | | maxExcessUsageRatio | 10 % | 31 % | -| variableRateSlope1 | 4 % | 42 % | +| variableRateSlope1 | 6 % | 42 % | | stableRateSlope1 | 2 % | 69 % | -| interestRate | ![before](/.assets/1ee1814a06c37c32f0efd02a4fda97a8278b0714.svg) | ![after](/.assets/ad67c5576b64e24c557a73a5bc9c67be904f53bb.svg) | +| interestRate | ![before](/.assets/faca7fdf8c83324f67a2ee404d914301ae9aae49.svg) | ![after](/.assets/ad67c5576b64e24c557a73a5bc9c67be904f53bb.svg) | ## Raw diff @@ -20,13 +20,13 @@ "reserves": { "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48": { "interestRateStrategy": { - "from": "0x8Cae0596bC1eD42dc3F04c4506cfe442b3E74e27", - "to": "0xc76EF342898f1AE7E6C4632627Df683FAD8563DD" + "from": "0xb72F23adE9b9980c2E731Ca504105fC860643619", + "to": "0x7A297125a0Ea56cCC237Cb87b1Ab1F729353d4D2" } } }, "strategies": { - "0xc76EF342898f1AE7E6C4632627Df683FAD8563DD": { + "0x7A297125a0Ea56cCC237Cb87b1Ab1F729353d4D2": { "from": null, "to": { "baseVariableBorrowRate": 0, diff --git a/lib/governance-crosschain-bridges b/lib/governance-crosschain-bridges deleted file mode 160000 index 57dd43969..000000000 --- a/lib/governance-crosschain-bridges +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 57dd43969a68eb076fdbeae2953b572534694986 diff --git a/remappings.txt b/remappings.txt index abcb66ce2..d564e7208 100644 --- a/remappings.txt +++ b/remappings.txt @@ -6,4 +6,3 @@ aave-v3-periphery/=lib/aave-address-book/lib/aave-v3-periphery/ ds-test/=lib/forge-std/lib/ds-test/src/ forge-std/=lib/forge-std/src/ solidity-utils/=lib/solidity-utils/src/ -governance-crosschain-bridges/=lib/governance-crosschain-bridges/ diff --git a/reports/postTestV2RatesUpdates.json b/reports/postTestV2RatesUpdates.json index 6d5c8377d..d43ced055 100644 --- a/reports/postTestV2RatesUpdates.json +++ b/reports/postTestV2RatesUpdates.json @@ -1,13 +1,13 @@ { "chainId": 1, "poolConfig": { - "lendingPoolCollateralManager": "0xbd4765210d4167CE2A5b87280D9E8Ee316D5EC7C", + "lendingPoolCollateralManager": "0x368e6441bB27159c6e8e6d3bbd9147BEcBA915E3", "oracle": "0xA50ba011c48153De246E5192C8f9258A2ba79Ca9", "pool": "0x7d2768dE32b0b80b7a3454c06BdAc94A69DDc7A9", "poolAddressesProvider": "0xB53C1a33016B2DC2fF3653530bfF1848a515c8c5", "poolConfigurator": "0x311Bb771e4F8952E6Da169b425E7e92d6Ac45756", - "poolConfiguratorImpl": "0x3a95Ee42f080ff7289C8B4a14EB483a8644d7521", - "poolImpl": "0xC6845a5C768BF8D7681249f8927877Efda425baf", + "poolConfiguratorImpl": "0x246ca67522dF5895cD6cf8807Ec161954ea1bA61", + "poolImpl": "0x085E34722e04567Df9E6d2c32e82fd74f3342e79", "protocolDataProvider": "0x057835Ad21a177dbdd3090bB1CAE03EaCF78Fc6d" }, "reserves": { @@ -17,22 +17,22 @@ "aTokenName": "Aave interest bearing TUSD", "aTokenSymbol": "aTUSD", "baseStableBorrowRate": 100000000000000000000000000, - "borrowingEnabled": true, + "borrowingEnabled": false, "decimals": 18, - "interestRateStrategy": "0x6bcE15B789e537f3abA3C60CB183F0E8737f05eC", + "interestRateStrategy": "0xb70e28437Aec70a8cfE5240F54c463cF849bE17C", "isActive": true, - "isFrozen": false, - "liquidationBonus": 10500, - "liquidationThreshold": 8250, - "ltv": 8000, + "isFrozen": true, + "liquidationBonus": 11000, + "liquidationThreshold": 6500, + "ltv": 0, "oracle": "0x3886BA987236181D98F2401c507Fb8BeA7871dF2", "oracleDecimals": 18, "oracleDescription": "TUSD / ETH", - "oracleLatestAnswer": 610682580000000, - "reserveFactor": 500, - "stableBorrowRateEnabled": true, + "oracleLatestAnswer": 401284370109943, + "reserveFactor": 9990, + "stableBorrowRateEnabled": false, "stableDebtToken": "0x7f38d60D94652072b2C44a18c0e14A481EC3C0dd", - "stableDebtTokenImpl": "0x95Ce83DF0B8A45072D0330Cf5A1e0c8CAA43D192", + "stableDebtTokenImpl": "0x00C15a6aaF1e48763B53A9dc8D2077551BA45Fee", "stableDebtTokenName": "Aave stable debt bearing TUSD", "stableDebtTokenSymbol": "stableDebtTUSD", "symbol": "TUSD", @@ -45,13 +45,13 @@ }, "0x03ab458634910AaD20eF5f1C8ee96F1D6ac54919": { "aToken": "0xc9BC48c72154ef3e5425641a3c747242112a46AF", - "aTokenImpl": "0xB97Fa7A950B19C8Fe7d9bcD06909D3e67F20f16a", + "aTokenImpl": "0x2CDE0f77CF5d54e9417480a8611AA2fEcD56BbD9", "aTokenName": "Aave interest bearing RAI", "aTokenSymbol": "aRAI", "baseStableBorrowRate": 0, "borrowingEnabled": true, "decimals": 18, - "interestRateStrategy": "0xA7d4df837926cD55036175AfeF38395d56A64c22", + "interestRateStrategy": "0xc83cDb49F234EC6666D7857B3EAa1302b109394C", "isActive": true, "isFrozen": true, "liquidationBonus": 0, @@ -60,8 +60,8 @@ "oracle": "0x4ad7B025127e89263242aB68F0f9c4E5C033B489", "oracleDecimals": 18, "oracleDescription": "RAI / ETH", - "oracleLatestAnswer": 1711020815907047, - "reserveFactor": 2000, + "oracleLatestAnswer": 1172820903069477, + "reserveFactor": 9900, "stableBorrowRateEnabled": false, "stableDebtToken": "0x9C72B8476C33AE214ee3e8C20F0bc28496a62032", "stableDebtTokenImpl": "0xf37E202E587c6f63FD70F35C24Eb7f818CC5d01A", @@ -83,15 +83,15 @@ "baseStableBorrowRate": 40000000000000000000000000, "borrowingEnabled": true, "decimals": 2, - "interestRateStrategy": "0x2893405d64a7Bc8Db02Fa617351a5399d59eCf8D", + "interestRateStrategy": "0x999F449fEAfaAd78CE5702A9ebc460633478D4a4", "isActive": true, "isFrozen": false, "liquidationBonus": 0, "liquidationThreshold": 0, "ltv": 0, "oracle": "0xEc6f4Cd64d28Ef32507e2dc399948aAe9Bbedd7e", - "oracleLatestAnswer": 610545521752085, - "reserveFactor": 1000, + "oracleLatestAnswer": 406781720021913, + "reserveFactor": 2000, "stableBorrowRateEnabled": false, "stableDebtToken": "0xf8aC64ec6Ff8E0028b37EB89772d21865321bCe0", "stableDebtTokenImpl": "0xEddC66EB4a0aD3be434cBb1c2E7d17cE805D7a28", @@ -113,20 +113,20 @@ "baseStableBorrowRate": 30000000000000000000000000, "borrowingEnabled": false, "decimals": 18, - "interestRateStrategy": "0xBdfC85b140edF1FeaFd6eD664027AA4C23b4A29F", + "interestRateStrategy": "0x2c206fa2127aB7f1CE3dc987daf683Ed5B9CF069", "isActive": true, "isFrozen": true, - "liquidationBonus": 10750, - "liquidationThreshold": 7000, - "ltv": 6500, + "liquidationBonus": 11000, + "liquidationThreshold": 5, + "ltv": 0, "oracle": "0x0d16d4528239e9ee52fa531af613AcdB23D88c94", "oracleDecimals": 18, "oracleDescription": "BAT / ETH", - "oracleLatestAnswer": 182276893023327, - "reserveFactor": 2000, - "stableBorrowRateEnabled": true, + "oracleLatestAnswer": 93749950000000, + "reserveFactor": 9900, + "stableBorrowRateEnabled": false, "stableDebtToken": "0x277f8676FAcf4dAA5a6EA38ba511B7F65AA02f9F", - "stableDebtTokenImpl": "0x917fd53da13EDCCE5c155a7dbC73E1e4DcCd4267", + "stableDebtTokenImpl": "0x49B6645a9aa05f1Be24893136100467276399470", "stableDebtTokenName": "Aave stable debt bearing BAT", "stableDebtTokenSymbol": "stableDebtBAT", "symbol": "BAT", @@ -145,20 +145,20 @@ "baseStableBorrowRate": 30000000000000000000000000, "borrowingEnabled": true, "decimals": 18, - "interestRateStrategy": "0x004fC239848D8A8d3304729b78ba81d73d83C99F", + "interestRateStrategy": "0x2c206fa2127aB7f1CE3dc987daf683Ed5B9CF069", "isActive": true, "isFrozen": true, - "liquidationBonus": 10750, - "liquidationThreshold": 7500, - "ltv": 6150, + "liquidationBonus": 11000, + "liquidationThreshold": 5, + "ltv": 0, "oracle": "0x82A44D92D6c329826dc557c5E1Be6ebeC5D5FeB9", "oracleDecimals": 18, "oracleDescription": "MANA / ETH", - "oracleLatestAnswer": 395309373203460, - "reserveFactor": 3500, - "stableBorrowRateEnabled": true, + "oracleLatestAnswer": 178015486813397, + "reserveFactor": 9900, + "stableBorrowRateEnabled": false, "stableDebtToken": "0xD86C74eA2224f4B8591560652b50035E4e5c0a3b", - "stableDebtTokenImpl": "0x441c5CD55E9e3267D02F7b1b4D245AA1C61891c3", + "stableDebtTokenImpl": "0xe0bf71fF662e8bbeb911ACEa765f4b8be052F59b", "stableDebtTokenName": "Aave stable debt bearing MANA", "stableDebtTokenSymbol": "stableDebtMANA", "symbol": "MANA", @@ -177,17 +177,17 @@ "baseStableBorrowRate": 0, "borrowingEnabled": true, "decimals": 18, - "interestRateStrategy": "0xfd71623D7F41360aefE200de4f17E20A29e1d58C", + "interestRateStrategy": "0x2c206fa2127aB7f1CE3dc987daf683Ed5B9CF069", "isActive": true, "isFrozen": true, - "liquidationBonus": 10750, - "liquidationThreshold": 6500, - "ltv": 5000, + "liquidationBonus": 11000, + "liquidationThreshold": 5, + "ltv": 0, "oracle": "0x7c5d4F8345e66f68099581Db340cd65B078C41f4", "oracleDecimals": 18, "oracleDescription": "YFI / ETH", - "oracleLatestAnswer": 5686591566150553000, - "reserveFactor": 2000, + "oracleLatestAnswer": 3047678145187916000, + "reserveFactor": 9900, "stableBorrowRateEnabled": false, "stableDebtToken": "0xca823F78C2Dd38993284bb42Ba9b14152082F7BD", "stableDebtTokenImpl": "0x802Bb38676B6E79C393a3E3EC73b8Af63578188a", @@ -209,17 +209,17 @@ "baseStableBorrowRate": 0, "borrowingEnabled": false, "decimals": 18, - "interestRateStrategy": "0xb2eD1eCE1c13455Ce9299d35D3B00358529f3Dc8", + "interestRateStrategy": "0x6855E5544Cd803BF24c9612b3F12C009116B0ee1", "isActive": true, - "isFrozen": false, + "isFrozen": true, "liquidationBonus": 10850, - "liquidationThreshold": 5000, - "ltv": 4000, + "liquidationThreshold": 5, + "ltv": 0, "oracle": "0x72AFAECF99C9d9C8215fF44C77B94B99C28741e8", "oracleDecimals": 18, "oracleDescription": "1INCH / ETH", - "oracleLatestAnswer": 349400000000000, - "reserveFactor": 2000, + "oracleLatestAnswer": 173342672736174, + "reserveFactor": 9900, "stableBorrowRateEnabled": false, "stableDebtToken": "0x1278d6ED804d59d2d18a5Aa5638DfD591A79aF0a", "stableDebtTokenImpl": "0x9C2114Bf70774C36E9b8d6c790c9C14FF0d6799E", @@ -241,17 +241,17 @@ "baseStableBorrowRate": 0, "borrowingEnabled": false, "decimals": 18, - "interestRateStrategy": "0x9440aEc0795D7485e58bCF26622c2f4A681A9671", + "interestRateStrategy": "0xA12D7bB07379ad6de4497B80088e28D4C00932D1", "isActive": true, - "isFrozen": false, - "liquidationBonus": 10750, - "liquidationThreshold": 7000, - "ltv": 6500, + "isFrozen": true, + "liquidationBonus": 11000, + "liquidationThreshold": 5, + "ltv": 0, "oracle": "0x029849bbc0b1d93b85a8b6190e979fd38F5760E2", "oracleDecimals": 18, "oracleDescription": "DPI / ETH", - "oracleLatestAnswer": 53042159775707955, - "reserveFactor": 2000, + "oracleLatestAnswer": 41364111962536074, + "reserveFactor": 9900, "stableBorrowRateEnabled": false, "stableDebtToken": "0xa3953F07f389d719F99FC378ebDb9276177d8A6e", "stableDebtTokenImpl": "0x0f2d35d52a65c4CC98e345C3B478E75f7E4B9c2a", @@ -273,20 +273,20 @@ "baseStableBorrowRate": 0, "borrowingEnabled": false, "decimals": 18, - "interestRateStrategy": "0x24ABFac8dd8f270D752837fDFe3B3C735361f4eE", + "interestRateStrategy": "0x87cCa171a2125efca9868F9Bc1FfD7B7c80dC5a3", "isActive": true, - "isFrozen": false, + "isFrozen": true, "liquidationBonus": 10900, - "liquidationThreshold": 7700, - "ltv": 6500, + "liquidationThreshold": 2000, + "ltv": 0, "oracle": "0xD6aA3D25116d8dA79Ea0246c4826EB951872e02e", "oracleDecimals": 18, "oracleDescription": "UNI / ETH", - "oracleLatestAnswer": 3993507224186989, - "reserveFactor": 2000, + "oracleLatestAnswer": 2616213076346605, + "reserveFactor": 9900, "stableBorrowRateEnabled": false, "stableDebtToken": "0xD939F7430dC8D5a427f156dE1012A56C18AcB6Aa", - "stableDebtTokenImpl": "0xe4759007A1E6014DD92EBB33A293e0dfE85A8Ffe", + "stableDebtTokenImpl": "0x54f514CA167e1fc19231dA9a48bB7AA6ffe4F10d", "stableDebtTokenName": "Aave stable debt bearing UNI", "stableDebtTokenSymbol": "stableDebtUNI", "symbol": "UNI", @@ -305,20 +305,20 @@ "baseStableBorrowRate": 30000000000000000000000000, "borrowingEnabled": true, "decimals": 8, - "interestRateStrategy": "0xf41E8F817e6C399d1AdE102059c454093b24f35B", + "interestRateStrategy": "0x32f3A6134590fc2d9440663d35a2F0a6265F04c4", "isActive": true, "isFrozen": false, "liquidationBonus": 10500, "liquidationThreshold": 8200, "ltv": 7200, - "oracle": "0xdeb288F737066589598e9214E782fa5A8eD689e8", + "oracle": "0xFD858c8bC5ac5e10f01018bC78471bb0DC392247", "oracleDecimals": 18, - "oracleDescription": "BTC / ETH", - "oracleLatestAnswer": 14363022524949910000, - "reserveFactor": 2000, - "stableBorrowRateEnabled": true, + "oracleDescription": "wBTC/BTC/ETH", + "oracleLatestAnswer": 16842786004805376363, + "reserveFactor": 3000, + "stableBorrowRateEnabled": false, "stableDebtToken": "0x51B039b9AFE64B78758f8Ef091211b5387eA717c", - "stableDebtTokenImpl": "0x6Ac108C4c3Fe7F4D367513F599Da1B9dF7c43433", + "stableDebtTokenImpl": "0x4f279f2046870F77cd9Ce63497f8A2D8689ef804", "stableDebtTokenName": "Aave stable debt bearing WBTC", "stableDebtTokenSymbol": "stableDebtWBTC", "symbol": "WBTC", @@ -337,20 +337,20 @@ "baseStableBorrowRate": 0, "borrowingEnabled": false, "decimals": 18, - "interestRateStrategy": "0x9B1e3C7483F0f21abFEaE3AeBC9b47b5f23f5bB0", + "interestRateStrategy": "0x2c206fa2127aB7f1CE3dc987daf683Ed5B9CF069", "isActive": true, "isFrozen": true, - "liquidationBonus": 10750, - "liquidationThreshold": 6000, - "ltv": 5500, + "liquidationBonus": 11000, + "liquidationThreshold": 5, + "ltv": 0, "oracle": "0x3147D7203354Dc06D9fd350c7a2437bcA92387a4", "oracleDecimals": 18, "oracleDescription": "REN / ETH", - "oracleLatestAnswer": 63713924764907, - "reserveFactor": 2000, - "stableBorrowRateEnabled": true, + "oracleLatestAnswer": 22610981899079, + "reserveFactor": 9900, + "stableBorrowRateEnabled": false, "stableDebtToken": "0x3356Ec1eFA75d9D150Da1EC7d944D9EDf73703B7", - "stableDebtTokenImpl": "0x7b3E7Aea49A5F5d2514B9317d4cF58f828Ac28C2", + "stableDebtTokenImpl": "0x6F4B277366e10F68003A0a65Ef8f118f3D60B67E", "stableDebtTokenName": "Aave stable debt bearing REN", "stableDebtTokenSymbol": "stableDebtREN", "symbol": "REN", @@ -369,7 +369,7 @@ "baseStableBorrowRate": 0, "borrowingEnabled": true, "decimals": 18, - "interestRateStrategy": "0x26D40544447F68a3De69005822195549934624B9", + "interestRateStrategy": "0xF1AafF9a4Da6Bf4Fb8fc18d39C8ffdafbAACce69", "isActive": true, "isFrozen": true, "liquidationBonus": 0, @@ -378,8 +378,8 @@ "oracle": "0x614715d2Af89E6EC99A233818275142cE88d1Cfd", "oracleDecimals": 18, "oracleDescription": "BUSD / ETH", - "oracleLatestAnswer": 607958172477733, - "reserveFactor": 1000, + "oracleLatestAnswer": 407750083706476, + "reserveFactor": 9990, "stableBorrowRateEnabled": false, "stableDebtToken": "0x4A7A63909A72D268b1D8a93a9395d098688e0e5C", "stableDebtTokenImpl": "0x8A36603a2a66182C9f1F81d22B7B95ff8DEeD432", @@ -401,17 +401,17 @@ "baseStableBorrowRate": 0, "borrowingEnabled": false, "decimals": 18, - "interestRateStrategy": "0x1dA981865AE7a0C838eFBF4C7DFecb5c7268E73A", + "interestRateStrategy": "0x2c206fa2127aB7f1CE3dc987daf683Ed5B9CF069", "isActive": true, "isFrozen": true, "liquidationBonus": 10850, - "liquidationThreshold": 4500, - "ltv": 3500, + "liquidationThreshold": 5, + "ltv": 0, "oracle": "0xC9CbF687f43176B302F03f5e58470b77D07c61c6", "oracleDecimals": 18, "oracleDescription": "CVX / ETH", - "oracleLatestAnswer": 3742055994347318, - "reserveFactor": 2000, + "oracleLatestAnswer": 1179368876420195, + "reserveFactor": 9900, "stableBorrowRateEnabled": false, "stableDebtToken": "0xB01Eb1cE1Da06179136D561766fc2d609C5F55Eb", "stableDebtTokenImpl": "0x10638C31Daeee246f0026f7174E1f30fB17010F5", @@ -435,18 +435,18 @@ "decimals": 18, "interestRateStrategy": "0xED6547b83276B076B771B88FcCbD68BDeDb3927f", "isActive": true, - "isFrozen": false, + "isFrozen": true, "liquidationBonus": 10700, - "liquidationThreshold": 8300, - "ltv": 7000, + "liquidationThreshold": 7400, + "ltv": 0, "oracle": "0xDC530D9457755926550b59e8ECcdaE7624181557", "oracleDecimals": 18, "oracleDescription": "LINK / ETH", - "oracleLatestAnswer": 4479000000000001, - "reserveFactor": 2000, - "stableBorrowRateEnabled": true, + "oracleLatestAnswer": 5916460000000000, + "reserveFactor": 3000, + "stableBorrowRateEnabled": false, "stableDebtToken": "0xFB4AEc4Cc858F2539EBd3D37f2a43eAe5b15b98a", - "stableDebtTokenImpl": "0xAdc313f17a3e2180f609a45d7B381a45E2e88a9F", + "stableDebtTokenImpl": "0x1B80694AF3D4e617c747423f992F532B8baE098b", "stableDebtTokenName": "Aave stable debt bearing LINK", "stableDebtTokenSymbol": "stableDebtLINK", "symbol": "LINK", @@ -465,7 +465,7 @@ "baseStableBorrowRate": 0, "borrowingEnabled": true, "decimals": 18, - "interestRateStrategy": "0x3082D0a473385Ed2cbd1f16087ab8b7BF79f0355", + "interestRateStrategy": "0x28fc7a5F0e7652B6f5E398F5E656A3eB36a1F3DE", "isActive": true, "isFrozen": false, "liquidationBonus": 0, @@ -474,8 +474,8 @@ "oracle": "0x8e0b7e6062272B5eF4524250bFFF8e5Bd3497757", "oracleDecimals": 18, "oracleDescription": "SUSD / ETH", - "oracleLatestAnswer": 617138770830382, - "reserveFactor": 2000, + "oracleLatestAnswer": 407512114531422, + "reserveFactor": 3000, "stableBorrowRateEnabled": false, "stableDebtToken": "0x30B0f7324feDF89d8eff397275F8983397eFe4af", "stableDebtTokenImpl": "0x49EfDDb938a77C78816eF9f9B7F811C16611FdFD", @@ -497,18 +497,18 @@ "baseStableBorrowRate": 100000000000000000000000000, "borrowingEnabled": true, "decimals": 18, - "interestRateStrategy": "0x545Ae1908B6F12e91E03B1DEC4F2e06D0570fE1b", + "interestRateStrategy": "0xab7f8ca781C736EB624A9E321cd043F8E6292C96", "isActive": true, "isFrozen": false, "liquidationBonus": 0, "liquidationThreshold": 0, "ltv": 0, "oracle": "0x60c0b047133f696334a2b7f68af0b49d2F3D4F72", - "oracleLatestAnswer": 612368042872701, - "reserveFactor": 1000, - "stableBorrowRateEnabled": true, + "oracleLatestAnswer": 409761449002697, + "reserveFactor": 2500, + "stableBorrowRateEnabled": false, "stableDebtToken": "0x39f010127274b2dBdB770B45e1de54d974974526", - "stableDebtTokenImpl": "0x595c33538215DC4B092F35Afc85d904631263f4F", + "stableDebtTokenImpl": "0x1363602E58e25929A15bE194a3D505Fd6F8BE751", "stableDebtTokenName": "Aave stable debt bearing LUSD", "stableDebtTokenSymbol": "stableDebtLUSD", "symbol": "LUSD", @@ -527,7 +527,7 @@ "baseStableBorrowRate": 100000000000000000000000000, "borrowingEnabled": true, "decimals": 18, - "interestRateStrategy": "0xfffE32106A68aA3eD39CcCE673B646423EEaB62a", + "interestRateStrategy": "0xab7f8ca781C736EB624A9E321cd043F8E6292C96", "isActive": true, "isFrozen": false, "liquidationBonus": 10400, @@ -536,11 +536,11 @@ "oracle": "0x773616E4d11A78F511299002da57A0a94577F1f4", "oracleDecimals": 18, "oracleDescription": "DAI / ETH", - "oracleLatestAnswer": 612859977965139, - "reserveFactor": 1000, - "stableBorrowRateEnabled": true, + "oracleLatestAnswer": 410105724359441, + "reserveFactor": 2500, + "stableBorrowRateEnabled": false, "stableDebtToken": "0x778A13D3eeb110A4f7bb6529F99c000119a08E92", - "stableDebtTokenImpl": "0xD23A44eB2db8AD0817c994D3533528C030279F7c", + "stableDebtTokenImpl": "0xb44Fe5fA7A8fcF508984bE58bA807A22343B4493", "stableDebtTokenName": "Aave stable debt bearing DAI", "stableDebtTokenSymbol": "stableDebtDAI", "symbol": "DAI", @@ -568,7 +568,7 @@ "oracle": "0x6Df09E975c830ECae5bd4eD9d90f3A95a4f88012", "oracleDecimals": 18, "oracleDescription": "AAVE / ETH", - "oracleLatestAnswer": 48505366244397695, + "oracleLatestAnswer": 39515306483330896, "reserveFactor": 0, "stableBorrowRateEnabled": false, "stableDebtToken": "0x079D6a3E844BcECf5720478A718Edb6575362C5f", @@ -591,7 +591,7 @@ "baseStableBorrowRate": 0, "borrowingEnabled": true, "decimals": 18, - "interestRateStrategy": "0xb0a73aC3B10980A598685d4631c83f5348F5D32c", + "interestRateStrategy": "0x28fc7a5F0e7652B6f5E398F5E656A3eB36a1F3DE", "isActive": true, "isFrozen": false, "liquidationBonus": 0, @@ -600,8 +600,8 @@ "oracle": "0x14d04Fff8D21bd62987a5cE9ce543d2F1edF5D3E", "oracleDecimals": 18, "oracleDescription": "FRAX / ETH", - "oracleLatestAnswer": 616977057978798, - "reserveFactor": 2000, + "oracleLatestAnswer": 409908731055814, + "reserveFactor": 3000, "stableBorrowRateEnabled": false, "stableDebtToken": "0x3916e3B6c84b161df1b2733dFfc9569a1dA710c2", "stableDebtTokenImpl": "0x7E3Ddfceef69bEC3A38Fc9AE8D7A8c46D7788C6b", @@ -623,17 +623,17 @@ "baseStableBorrowRate": 0, "borrowingEnabled": false, "decimals": 18, - "interestRateStrategy": "0xb49034Ada4BE5c6Bb3823A623C6250267110b06b", + "interestRateStrategy": "0x6855E5544Cd803BF24c9612b3F12C009116B0ee1", "isActive": true, "isFrozen": true, - "liquidationBonus": 10850, - "liquidationThreshold": 6500, - "ltv": 5000, + "liquidationBonus": 11000, + "liquidationThreshold": 5, + "ltv": 0, "oracle": "0xF05D9B6C08757EAcb1fbec18e36A1B7566a13DEB", "oracleDecimals": 18, "oracleDescription": "Calculated XSUSHI / ETH", - "oracleLatestAnswer": 1082567401549168, - "reserveFactor": 3500, + "oracleLatestAnswer": 565948785959684, + "reserveFactor": 9900, "stableBorrowRateEnabled": false, "stableDebtToken": "0x73Bfb81D7dbA75C904f430eA8BAe82DB0D41187B", "stableDebtTokenImpl": "0x0fF2eC6F80F83A54746DB9b9ac7F40ADBEfb3dB4", @@ -655,7 +655,7 @@ "baseStableBorrowRate": 0, "borrowingEnabled": true, "decimals": 18, - "interestRateStrategy": "0x404d396fc42e20d14585A1a10Cd64BDdC6C6574A", + "interestRateStrategy": "0x40a76E018dd4aFe1391F51f0C8c8E4eA70476e15", "isActive": true, "isFrozen": false, "liquidationBonus": 0, @@ -664,8 +664,8 @@ "oracle": "0x3a08ebBaB125224b7b6474384Ee39fBb247D2200", "oracleDecimals": 18, "oracleDescription": "PAX / ETH", - "oracleLatestAnswer": 616220194971251, - "reserveFactor": 1000, + "oracleLatestAnswer": 404325328035399, + "reserveFactor": 2000, "stableBorrowRateEnabled": false, "stableDebtToken": "0x2387119bc85A74e0BBcbe190d80676CB16F10D4F", "stableDebtTokenImpl": "0x9C3440F4aACA3312b632bE4A07C0f97B15c31c8b", @@ -687,16 +687,16 @@ "baseStableBorrowRate": 0, "borrowingEnabled": true, "decimals": 18, - "interestRateStrategy": "0xF0bA2a8c12A2354c075b363765EAe825619bd490", + "interestRateStrategy": "0x795dC59EA6472Dfa4298A454C6E8Dcb005643A13", "isActive": true, "isFrozen": true, - "liquidationBonus": 10650, - "liquidationThreshold": 7500, - "ltv": 6500, - "oracle": "0x7F0D2c2838c6AC24443d13e23d99490017bDe370", + "liquidationBonus": 11000, + "liquidationThreshold": 5, + "ltv": 0, + "oracle": "0xac3AF0f4A52C577Cc2C241dF51a01FDe3D06D93B", "oracleDecimals": 18, - "oracleDescription": "FEI / ETH", - "oracleLatestAnswer": 613596576602952, + "oracleDescription": "0.95/USD/ETH", + "oracleLatestAnswer": 386442634020817, "reserveFactor": 9900, "stableBorrowRateEnabled": false, "stableDebtToken": "0xd89cF9E8A858F8B4b31Faf793505e112d6c17449", @@ -719,20 +719,20 @@ "baseStableBorrowRate": 30000000000000000000000000, "borrowingEnabled": false, "decimals": 18, - "interestRateStrategy": "0xE3a3DE71B827cB73663A24cDB6243bA7F986cC3b", + "interestRateStrategy": "0x2c206fa2127aB7f1CE3dc987daf683Ed5B9CF069", "isActive": true, - "isFrozen": false, + "isFrozen": true, "liquidationBonus": 10750, - "liquidationThreshold": 6700, - "ltv": 6200, + "liquidationThreshold": 1800, + "ltv": 0, "oracle": "0x24551a8Fb2A7211A25a17B1481f043A8a8adC7f2", "oracleDecimals": 18, "oracleDescription": "MKR / ETH", - "oracleLatestAnswer": 480035982884287950, - "reserveFactor": 2000, - "stableBorrowRateEnabled": true, + "oracleLatestAnswer": 796683976379186900, + "reserveFactor": 9900, + "stableBorrowRateEnabled": false, "stableDebtToken": "0xC01C8E4b12a89456a9fD4e4e75B72546Bf53f0B5", - "stableDebtTokenImpl": "0x20f9027c5092739C58250CF456642E8e3D4dBEd5", + "stableDebtTokenImpl": "0xC4CFCE0b16199818Ad942a87902C9172ba005022", "stableDebtTokenName": "Aave stable debt bearing MKR", "stableDebtTokenSymbol": "stableDebtMKR", "symbol": "MKR", @@ -751,7 +751,7 @@ "baseStableBorrowRate": 90000000000000000000000000, "borrowingEnabled": true, "decimals": 6, - "interestRateStrategy": "0xc76EF342898f1AE7E6C4632627Df683FAD8563DD", + "interestRateStrategy": "0x7A297125a0Ea56cCC237Cb87b1Ab1F729353d4D2", "isActive": true, "isFrozen": false, "liquidationBonus": 10450, @@ -760,11 +760,11 @@ "oracle": "0x986b5E1e1755e3C2440e960477f25201B0a8bbD4", "oracleDecimals": 18, "oracleDescription": "USDC / ETH", - "oracleLatestAnswer": 611599789718562, - "reserveFactor": 1000, - "stableBorrowRateEnabled": true, + "oracleLatestAnswer": 407011754295958, + "reserveFactor": 2500, + "stableBorrowRateEnabled": false, "stableDebtToken": "0xE4922afAB0BbaDd8ab2a88E0C79d884Ad337fcA6", - "stableDebtTokenImpl": "0x3b2a77058a1Eb4403a90b94585FaB16Bc512E703", + "stableDebtTokenImpl": "0x8DFF7Fda82976452b6FB957F549944e7af7A3e6F", "stableDebtTokenName": "Aave stable debt bearing USDC", "stableDebtTokenSymbol": "stableDebtUSDC", "symbol": "USDC", @@ -783,17 +783,17 @@ "baseStableBorrowRate": 0, "borrowingEnabled": false, "decimals": 18, - "interestRateStrategy": "0xCc92073dDe8aE03bAA1812AC5cF22e69b5E76914", + "interestRateStrategy": "0xB2D822cAdb9040F3164829BC34e41a93cA3E01e5", "isActive": true, - "isFrozen": false, + "isFrozen": true, "liquidationBonus": 10750, - "liquidationThreshold": 6200, - "ltv": 4600, + "liquidationThreshold": 5, + "ltv": 0, "oracle": "0x79291A9d692Df95334B1a0B3B4AE6bC606782f8c", "oracleDecimals": 18, "oracleDescription": "SNX / ETH", - "oracleLatestAnswer": 1778640000000000, - "reserveFactor": 3500, + "oracleLatestAnswer": 1356003312337918, + "reserveFactor": 9900, "stableBorrowRateEnabled": false, "stableDebtToken": "0x8575c8ae70bDB71606A53AeA1c6789cB0fBF3166", "stableDebtTokenImpl": "0x42321d7f519E9Bf2163B7B1685D379BC07A59C38", @@ -823,10 +823,10 @@ "ltv": 8250, "oracle": "0x0000000000000000000000000000000000000000", "oracleLatestAnswer": 1000000000000000000, - "reserveFactor": 1500, - "stableBorrowRateEnabled": true, + "reserveFactor": 2500, + "stableBorrowRateEnabled": false, "stableDebtToken": "0x4e977830ba4bd783C0BB7F15d3e243f73FF57121", - "stableDebtTokenImpl": "0xA558EA1A875f8b576f0728d32C39f62158e49b92", + "stableDebtTokenImpl": "0xEd14b4E51B04d4d0211474a721F77C0817166c2f", "stableDebtTokenName": "Aave stable debt bearing WETH", "stableDebtTokenSymbol": "stableDebtWETH", "symbol": "WETH", @@ -845,15 +845,15 @@ "baseStableBorrowRate": 0, "borrowingEnabled": false, "decimals": 18, - "interestRateStrategy": "0xb2eD1eCE1c13455Ce9299d35D3B00358529f3Dc8", + "interestRateStrategy": "0x6855E5544Cd803BF24c9612b3F12C009116B0ee1", "isActive": true, - "isFrozen": false, + "isFrozen": true, "liquidationBonus": 10800, - "liquidationThreshold": 5700, - "ltv": 4700, + "liquidationThreshold": 2400, + "ltv": 0, "oracle": "0xd4641b75015E6536E8102D98479568D05D7123Db", - "oracleLatestAnswer": 9738201071945762, - "reserveFactor": 2000, + "oracleLatestAnswer": 8618752070239292, + "reserveFactor": 9900, "stableBorrowRateEnabled": false, "stableDebtToken": "0x34441FFD1948E49dC7a607882D0c38Efd0083815", "stableDebtTokenImpl": "0x5746b5b6650Dd8d9B1d9D1bbf5E7f23e9761183F", @@ -875,7 +875,7 @@ "baseStableBorrowRate": 0, "borrowingEnabled": true, "decimals": 9, - "interestRateStrategy": "0x84d1FaD9559b8AC1Fda17d073B8542c8Fb6986dd", + "interestRateStrategy": "0xB2D822cAdb9040F3164829BC34e41a93cA3E01e5", "isActive": true, "isFrozen": true, "liquidationBonus": 0, @@ -884,8 +884,8 @@ "oracle": "0x492575FDD11a0fCf2C6C719867890a7648d526eB", "oracleDecimals": 18, "oracleDescription": "AMPL / ETH", - "oracleLatestAnswer": 620918820133552, - "reserveFactor": 1000, + "oracleLatestAnswer": 450300119588682, + "reserveFactor": 9900, "stableBorrowRateEnabled": false, "stableDebtToken": "0x18152C9f77DAdc737006e9430dB913159645fa87", "stableDebtTokenImpl": "0x0e8f4fc4c261d454b13C74507Bce8C38AA990361", @@ -916,7 +916,7 @@ "oracle": "0x0606Be69451B1C9861Ac6b3626b99093b713E801", "oracleDecimals": 18, "oracleDescription": "FIL / ETH", - "oracleLatestAnswer": 4020977447693813, + "oracleLatestAnswer": 2287773603726078, "reserveFactor": 3500, "stableBorrowRateEnabled": false, "stableDebtToken": "0xcAad05C49E14075077915cB5C820EB3245aFb950", @@ -939,17 +939,17 @@ "baseStableBorrowRate": 30000000000000000000000000, "borrowingEnabled": false, "decimals": 18, - "interestRateStrategy": "0xE3a3DE71B827cB73663A24cDB6243bA7F986cC3b", + "interestRateStrategy": "0x35FE8C9924718f286463e659be35b4122eEe907F", "isActive": true, - "isFrozen": false, + "isFrozen": true, "liquidationBonus": 10800, - "liquidationThreshold": 5800, - "ltv": 5200, + "liquidationThreshold": 1800, + "ltv": 0, "oracle": "0x8a12Be339B0cD1829b91Adc01977caa5E9ac121e", "oracleDecimals": 18, "oracleDescription": "CRV / ETH", - "oracleLatestAnswer": 621505942576524, - "reserveFactor": 2000, + "oracleLatestAnswer": 209322011170661, + "reserveFactor": 9900, "stableBorrowRateEnabled": false, "stableDebtToken": "0x9288059a74f589C919c7Cf1Db433251CdFEB874B", "stableDebtTokenImpl": "0x288672D311Da6edC89765204A6d309701e7289d4", @@ -971,20 +971,20 @@ "baseStableBorrowRate": 30000000000000000000000000, "borrowingEnabled": false, "decimals": 18, - "interestRateStrategy": "0x1a4babC0e20d892167792AC79618273711afD3e7", + "interestRateStrategy": "0x2c206fa2127aB7f1CE3dc987daf683Ed5B9CF069", "isActive": true, "isFrozen": true, - "liquidationBonus": 10750, - "liquidationThreshold": 6500, - "ltv": 5500, + "liquidationBonus": 11000, + "liquidationThreshold": 1200, + "ltv": 0, "oracle": "0x2Da4983a622a8498bb1a21FaE9D8F6C664939962", "oracleDecimals": 18, "oracleDescription": "ZRX / ETH", - "oracleLatestAnswer": 161308174808789, - "reserveFactor": 2000, - "stableBorrowRateEnabled": true, + "oracleLatestAnswer": 128582334580025, + "reserveFactor": 9900, + "stableBorrowRateEnabled": false, "stableDebtToken": "0x071B4323a24E73A5afeEbe34118Cd21B8FAAF7C3", - "stableDebtTokenImpl": "0x42a87BF47B5eFD11fa9Ddd5321BF9Aa502233b74", + "stableDebtTokenImpl": "0xffaCA447191d8196C8Cf96E5912b732063DE4307", "stableDebtTokenName": "Aave stable debt bearing ZRX", "stableDebtTokenSymbol": "stableDebtZRX", "symbol": "ZRX", @@ -1003,20 +1003,20 @@ "baseStableBorrowRate": 0, "borrowingEnabled": true, "decimals": 18, - "interestRateStrategy": "0x4a4fb6B26e7F516594b7242240039EA8FAAc897a", + "interestRateStrategy": "0x2c206fa2127aB7f1CE3dc987daf683Ed5B9CF069", "isActive": true, "isFrozen": true, - "liquidationBonus": 10600, - "liquidationThreshold": 6700, - "ltv": 6000, + "liquidationBonus": 11000, + "liquidationThreshold": 5, + "ltv": 0, "oracle": "0x24D9aB51950F3d62E9144fdC2f3135DAA6Ce8D1B", "oracleDecimals": 18, "oracleDescription": "ENJ / ETH", - "oracleLatestAnswer": 292880000000000, - "reserveFactor": 2000, - "stableBorrowRateEnabled": true, + "oracleLatestAnswer": 118685890000000, + "reserveFactor": 9900, + "stableBorrowRateEnabled": false, "stableDebtToken": "0x943DcCA156b5312Aa24c1a08769D67FEce4ac14C", - "stableDebtTokenImpl": "0x8286288f3c454b51DfC70bd0d6918220428B0741", + "stableDebtTokenImpl": "0x0fB427f800C5E39E7d8029e19F515300d4bb22C2", "stableDebtTokenName": "Aave stable debt bearing ENJ", "stableDebtTokenSymbol": "stableDebtENJ", "symbol": "ENJ", @@ -1035,7 +1035,7 @@ "baseStableBorrowRate": 0, "borrowingEnabled": true, "decimals": 6, - "interestRateStrategy": "0x0dEDCaE8Eb22A2EFB597aBde1834173C47Cff186", + "interestRateStrategy": "0xc83cDb49F234EC6666D7857B3EAa1302b109394C", "isActive": true, "isFrozen": true, "liquidationBonus": 0, @@ -1044,8 +1044,8 @@ "oracle": "0xa20623070413d42a5C01Db2c8111640DD7A5A03a", "oracleDecimals": 18, "oracleDescription": "UST / ETH", - "oracleLatestAnswer": 16780133340039, - "reserveFactor": 2000, + "oracleLatestAnswer": 11773404322311, + "reserveFactor": 9900, "stableBorrowRateEnabled": false, "stableDebtToken": "0x7FDbfB0412700D94403c42cA3CAEeeA183F07B26", "stableDebtTokenImpl": "0x107ed1832647436a0D39F09e65f4aA920242C0BB", @@ -1073,10 +1073,10 @@ "liquidationBonus": 10700, "liquidationThreshold": 8300, "ltv": 7200, - "oracle": "0x86392dC19c0b719886221c78AB11eb8Cf5c52812", + "oracle": "0xADE6CBA6c45aa8E9d0337cAc3D2619eabc39D901", "oracleDecimals": 18, - "oracleDescription": "STETH / ETH", - "oracleLatestAnswer": 998251120000000000, + "oracleDescription": "stETH/ETH", + "oracleLatestAnswer": 1000000000000000000, "reserveFactor": 1000, "stableBorrowRateEnabled": false, "stableDebtToken": "0x66457616Dd8489dF5D0AFD8678F4A260088aAF55", @@ -1099,17 +1099,17 @@ "baseStableBorrowRate": 30000000000000000000000000, "borrowingEnabled": false, "decimals": 18, - "interestRateStrategy": "0x04c28D6fE897859153eA753f986cc249Bf064f71", + "interestRateStrategy": "0xb873ec463CAC50112B0e14d060fbc4192406279f", "isActive": true, "isFrozen": true, "liquidationBonus": 10800, - "liquidationThreshold": 7000, - "ltv": 6500, + "liquidationThreshold": 5, + "ltv": 0, "oracle": "0xC1438AA3823A6Ba0C159CfA8D98dF5A994bA120b", "oracleDecimals": 18, "oracleDescription": "BAL / ETH", - "oracleLatestAnswer": 4377483727566084, - "reserveFactor": 2000, + "oracleLatestAnswer": 1617911746672069, + "reserveFactor": 9900, "stableBorrowRateEnabled": false, "stableDebtToken": "0xe569d31590307d05DA3812964F1eDd551D665a0b", "stableDebtTokenImpl": "0x58571484BD57a87E359e46F82dFa9D13087b24a0", @@ -1125,13 +1125,13 @@ }, "0xdAC17F958D2ee523a2206206994597C13D831ec7": { "aToken": "0x3Ed3B47Dd13EC9a98b44e6204A523E766B225811", - "aTokenImpl": "0x3F06560cfB7af6E6B5102c358f679DE5150b3b4C", + "aTokenImpl": "0x9651F64Bd77550691EB2AeEb58188CB67F005902", "aTokenName": "Aave interest bearing USDT", "aTokenSymbol": "aUSDT", "baseStableBorrowRate": 100000000000000000000000000, "borrowingEnabled": true, "decimals": 6, - "interestRateStrategy": "0x33DeAc0861FD6a9235b86172AA939E79085c6f52", + "interestRateStrategy": "0xF02EC9CA513ca505f0F5347E7D784Fa6165F8a99", "isActive": true, "isFrozen": false, "liquidationBonus": 0, @@ -1140,11 +1140,11 @@ "oracle": "0xEe9F2375b4bdF6387aa8265dD4FB8F16512A1d46", "oracleDecimals": 18, "oracleDescription": "USDT / ETH", - "oracleLatestAnswer": 611767949789453, - "reserveFactor": 1000, - "stableBorrowRateEnabled": true, + "oracleLatestAnswer": 406945750062059, + "reserveFactor": 2500, + "stableBorrowRateEnabled": false, "stableDebtToken": "0xe91D55AB2240594855aBd11b3faAE801Fd4c4687", - "stableDebtTokenImpl": "0x9d4578c813D69745092a4F951753ed2B28056279", + "stableDebtTokenImpl": "0xC61262D6ad449AC09B4087f46391Dd9A26b5888B", "stableDebtTokenName": "Aave stable debt bearing USDT", "stableDebtTokenSymbol": "stableDebtUSDT", "symbol": "USDT", @@ -1163,20 +1163,20 @@ "baseStableBorrowRate": 30000000000000000000000000, "borrowingEnabled": true, "decimals": 18, - "interestRateStrategy": "0xFDBDa42D2aC1bfbbc10555eb255De8387b8977C4", + "interestRateStrategy": "0xeB65a3163Fd8900F4fE9a044e18966706b69A74D", "isActive": true, "isFrozen": true, "liquidationBonus": 11000, - "liquidationThreshold": 7000, - "ltv": 6000, + "liquidationThreshold": 5, + "ltv": 0, "oracle": "0x656c0544eF4C98A6a98491833A89204Abb045d6b", "oracleDecimals": 18, "oracleDescription": "KNC / ETH", - "oracleLatestAnswer": 522346316958437, - "reserveFactor": 2000, - "stableBorrowRateEnabled": true, + "oracleLatestAnswer": 250135580000000, + "reserveFactor": 9900, + "stableBorrowRateEnabled": false, "stableDebtToken": "0x9915dfb872778B2890a117DA1F35F335eb06B54f", - "stableDebtTokenImpl": "0xf818B175353F023E3EC1A098d040778b835897c7", + "stableDebtTokenImpl": "0x22a8FD718924ab2f9dd4D0326DD8ab99Ef21D0b3", "stableDebtTokenName": "Aave stable debt bearing KNC", "stableDebtTokenSymbol": "stableDebtKNC", "symbol": "KNC", @@ -1189,87 +1189,24 @@ } }, "strategies": { - "0x004fC239848D8A8d3304729b78ba81d73d83C99F": { - "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 550000000000000000000000000, - "optimalUsageRatio": 450000000000000000000000000, - "stableRateSlope1": 100000000000000000000000000, - "stableRateSlope2": 3000000000000000000000000000, - "variableRateSlope1": 70000000000000000000000000, - "variableRateSlope2": 3000000000000000000000000000 - }, - "0x04c28D6fE897859153eA753f986cc249Bf064f71": { - "baseVariableBorrowRate": 30000000000000000000000000, - "maxExcessUsageRatio": 200000000000000000000000000, - "optimalUsageRatio": 800000000000000000000000000, - "stableRateSlope1": 100000000000000000000000000, - "stableRateSlope2": 3000000000000000000000000000, - "variableRateSlope1": 140000000000000000000000000, - "variableRateSlope2": 1500000000000000000000000000 - }, - "0x0dEDCaE8Eb22A2EFB597aBde1834173C47Cff186": { + "0x28fc7a5F0e7652B6f5E398F5E656A3eB36a1F3DE": { "baseVariableBorrowRate": 0, "maxExcessUsageRatio": 200000000000000000000000000, "optimalUsageRatio": 800000000000000000000000000, - "stableRateSlope1": 20000000000000000000000000, - "stableRateSlope2": 750000000000000000000000000, - "variableRateSlope1": 40000000000000000000000000, - "variableRateSlope2": 750000000000000000000000000 - }, - "0x1a4babC0e20d892167792AC79618273711afD3e7": { - "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 550000000000000000000000000, - "optimalUsageRatio": 450000000000000000000000000, - "stableRateSlope1": 100000000000000000000000000, - "stableRateSlope2": 3000000000000000000000000000, - "variableRateSlope1": 70000000000000000000000000, - "variableRateSlope2": 3000000000000000000000000000 + "stableRateSlope1": 0, + "stableRateSlope2": 0, + "variableRateSlope1": 60000000000000000000000000, + "variableRateSlope2": 1000000000000000000000000000 }, - "0x1dA981865AE7a0C838eFBF4C7DFecb5c7268E73A": { - "baseVariableBorrowRate": 0, + "0x2c206fa2127aB7f1CE3dc987daf683Ed5B9CF069": { + "baseVariableBorrowRate": 200000000000000000000000000, "maxExcessUsageRatio": 550000000000000000000000000, "optimalUsageRatio": 450000000000000000000000000, "stableRateSlope1": 100000000000000000000000000, "stableRateSlope2": 3000000000000000000000000000, - "variableRateSlope1": 70000000000000000000000000, - "variableRateSlope2": 3000000000000000000000000000 - }, - "0x24ABFac8dd8f270D752837fDFe3B3C735361f4eE": { - "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 550000000000000000000000000, - "optimalUsageRatio": 450000000000000000000000000, - "stableRateSlope1": 120000000000000000000000000, - "stableRateSlope2": 3000000000000000000000000000, - "variableRateSlope1": 70000000000000000000000000, + "variableRateSlope1": 0, "variableRateSlope2": 3000000000000000000000000000 }, - "0x26D40544447F68a3De69005822195549934624B9": { - "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 200000000000000000000000000, - "optimalUsageRatio": 800000000000000000000000000, - "stableRateSlope1": 0, - "stableRateSlope2": 0, - "variableRateSlope1": 40000000000000000000000000, - "variableRateSlope2": 1000000000000000000000000000 - }, - "0x2893405d64a7Bc8Db02Fa617351a5399d59eCf8D": { - "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 200000000000000000000000000, - "optimalUsageRatio": 800000000000000000000000000, - "stableRateSlope1": 40000000000000000000000000, - "stableRateSlope2": 1000000000000000000000000000, - "variableRateSlope1": 40000000000000000000000000, - "variableRateSlope2": 1000000000000000000000000000 - }, - "0x3082D0a473385Ed2cbd1f16087ab8b7BF79f0355": { - "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 200000000000000000000000000, - "optimalUsageRatio": 800000000000000000000000000, - "stableRateSlope1": 0, - "stableRateSlope2": 0, - "variableRateSlope1": 40000000000000000000000000, - "variableRateSlope2": 1000000000000000000000000000 - }, "0x311C866D55456e465e314A3E9830276B438A73f0": { "baseVariableBorrowRate": 0, "maxExcessUsageRatio": 0, @@ -1279,121 +1216,94 @@ "variableRateSlope1": 0, "variableRateSlope2": 0 }, - "0x33DeAc0861FD6a9235b86172AA939E79085c6f52": { - "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 200000000000000000000000000, - "optimalUsageRatio": 800000000000000000000000000, - "stableRateSlope1": 20000000000000000000000000, - "stableRateSlope2": 750000000000000000000000000, - "variableRateSlope1": 40000000000000000000000000, - "variableRateSlope2": 750000000000000000000000000 - }, - "0x404d396fc42e20d14585A1a10Cd64BDdC6C6574A": { + "0x32f3A6134590fc2d9440663d35a2F0a6265F04c4": { "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 100000000000000000000000000, - "optimalUsageRatio": 900000000000000000000000000, - "stableRateSlope1": 0, - "stableRateSlope2": 0, + "maxExcessUsageRatio": 350000000000000000000000000, + "optimalUsageRatio": 650000000000000000000000000, + "stableRateSlope1": 100000000000000000000000000, + "stableRateSlope2": 3000000000000000000000000000, "variableRateSlope1": 40000000000000000000000000, - "variableRateSlope2": 600000000000000000000000000 + "variableRateSlope2": 3000000000000000000000000000 }, - "0x4a4fb6B26e7F516594b7242240039EA8FAAc897a": { - "baseVariableBorrowRate": 0, + "0x35FE8C9924718f286463e659be35b4122eEe907F": { + "baseVariableBorrowRate": 200000000000000000000000000, "maxExcessUsageRatio": 550000000000000000000000000, "optimalUsageRatio": 450000000000000000000000000, - "stableRateSlope1": 100000000000000000000000000, + "stableRateSlope1": 170000000000000000000000000, "stableRateSlope2": 3000000000000000000000000000, - "variableRateSlope1": 70000000000000000000000000, + "variableRateSlope1": 0, "variableRateSlope2": 3000000000000000000000000000 }, - "0x545Ae1908B6F12e91E03B1DEC4F2e06D0570fE1b": { + "0x40a76E018dd4aFe1391F51f0C8c8E4eA70476e15": { "baseVariableBorrowRate": 0, "maxExcessUsageRatio": 200000000000000000000000000, "optimalUsageRatio": 800000000000000000000000000, - "stableRateSlope1": 20000000000000000000000000, - "stableRateSlope2": 750000000000000000000000000, - "variableRateSlope1": 40000000000000000000000000, + "stableRateSlope1": 0, + "stableRateSlope2": 0, + "variableRateSlope1": 60000000000000000000000000, "variableRateSlope2": 750000000000000000000000000 }, - "0x6bcE15B789e537f3abA3C60CB183F0E8737f05eC": { + "0x6855E5544Cd803BF24c9612b3F12C009116B0ee1": { + "baseVariableBorrowRate": 200000000000000000000000000, + "maxExcessUsageRatio": 550000000000000000000000000, + "optimalUsageRatio": 450000000000000000000000000, + "stableRateSlope1": 0, + "stableRateSlope2": 0, + "variableRateSlope1": 0, + "variableRateSlope2": 3000000000000000000000000000 + }, + "0x795dC59EA6472Dfa4298A454C6E8Dcb005643A13": { "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 200000000000000000000000000, - "optimalUsageRatio": 800000000000000000000000000, + "maxExcessUsageRatio": 990000000000000000000000000, + "optimalUsageRatio": 10000000000000000000000000, "stableRateSlope1": 20000000000000000000000000, "stableRateSlope2": 1000000000000000000000000000, "variableRateSlope1": 40000000000000000000000000, "variableRateSlope2": 1000000000000000000000000000 }, - "0x84d1FaD9559b8AC1Fda17d073B8542c8Fb6986dd": { - "baseVariableBorrowRate": 10000000000000000000000000, - "maxExcessUsageRatio": 200000000000000000000000000, - "optimalUsageRatio": 800000000000000000000000000, - "stableRateSlope1": 0, - "stableRateSlope2": 0, - "variableRateSlope1": 20000000000000000000000000, - "variableRateSlope2": 7500000000000000000000000000 - }, - "0x8Cae0596bC1eD42dc3F04c4506cfe442b3E74e27": { + "0x7A297125a0Ea56cCC237Cb87b1Ab1F729353d4D2": { "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 100000000000000000000000000, - "optimalUsageRatio": 900000000000000000000000000, - "stableRateSlope1": 20000000000000000000000000, + "maxExcessUsageRatio": 310000000000000000000000000, + "optimalUsageRatio": 690000000000000000000000000, + "stableRateSlope1": 690000000000000000000000000, "stableRateSlope2": 600000000000000000000000000, - "variableRateSlope1": 40000000000000000000000000, + "variableRateSlope1": 420000000000000000000000000, "variableRateSlope2": 600000000000000000000000000 }, - "0x9440aEc0795D7485e58bCF26622c2f4A681A9671": { - "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 500000000000000000000000000, - "optimalUsageRatio": 500000000000000000000000000, - "stableRateSlope1": 0, - "stableRateSlope2": 0, - "variableRateSlope1": 70000000000000000000000000, - "variableRateSlope2": 3000000000000000000000000000 - }, - "0x9B1e3C7483F0f21abFEaE3AeBC9b47b5f23f5bB0": { - "baseVariableBorrowRate": 0, + "0x87cCa171a2125efca9868F9Bc1FfD7B7c80dC5a3": { + "baseVariableBorrowRate": 200000000000000000000000000, "maxExcessUsageRatio": 550000000000000000000000000, "optimalUsageRatio": 450000000000000000000000000, - "stableRateSlope1": 100000000000000000000000000, + "stableRateSlope1": 120000000000000000000000000, "stableRateSlope2": 3000000000000000000000000000, - "variableRateSlope1": 70000000000000000000000000, + "variableRateSlope1": 0, "variableRateSlope2": 3000000000000000000000000000 }, - "0xA7d4df837926cD55036175AfeF38395d56A64c22": { + "0x999F449fEAfaAd78CE5702A9ebc460633478D4a4": { "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 200000000000000000000000000, - "optimalUsageRatio": 800000000000000000000000000, - "stableRateSlope1": 20000000000000000000000000, - "stableRateSlope2": 750000000000000000000000000, - "variableRateSlope1": 40000000000000000000000000, - "variableRateSlope2": 750000000000000000000000000 + "maxExcessUsageRatio": 300000000000000000000000000, + "optimalUsageRatio": 700000000000000000000000000, + "stableRateSlope1": 40000000000000000000000000, + "stableRateSlope2": 1000000000000000000000000000, + "variableRateSlope1": 60000000000000000000000000, + "variableRateSlope2": 1500000000000000000000000000 }, - "0xBdfC85b140edF1FeaFd6eD664027AA4C23b4A29F": { - "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 550000000000000000000000000, - "optimalUsageRatio": 450000000000000000000000000, - "stableRateSlope1": 100000000000000000000000000, - "stableRateSlope2": 3000000000000000000000000000, - "variableRateSlope1": 70000000000000000000000000, + "0xA12D7bB07379ad6de4497B80088e28D4C00932D1": { + "baseVariableBorrowRate": 200000000000000000000000000, + "maxExcessUsageRatio": 500000000000000000000000000, + "optimalUsageRatio": 500000000000000000000000000, + "stableRateSlope1": 0, + "stableRateSlope2": 0, + "variableRateSlope1": 0, "variableRateSlope2": 3000000000000000000000000000 }, - "0xCc92073dDe8aE03bAA1812AC5cF22e69b5E76914": { - "baseVariableBorrowRate": 30000000000000000000000000, + "0xB2D822cAdb9040F3164829BC34e41a93cA3E01e5": { + "baseVariableBorrowRate": 200000000000000000000000000, "maxExcessUsageRatio": 200000000000000000000000000, "optimalUsageRatio": 800000000000000000000000000, "stableRateSlope1": 0, "stableRateSlope2": 0, - "variableRateSlope1": 120000000000000000000000000, - "variableRateSlope2": 1000000000000000000000000000 - }, - "0xE3a3DE71B827cB73663A24cDB6243bA7F986cC3b": { - "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 550000000000000000000000000, - "optimalUsageRatio": 450000000000000000000000000, - "stableRateSlope1": 100000000000000000000000000, - "stableRateSlope2": 3000000000000000000000000000, - "variableRateSlope1": 70000000000000000000000000, + "variableRateSlope1": 0, "variableRateSlope2": 3000000000000000000000000000 }, "0xED6547b83276B076B771B88FcCbD68BDeDb3927f": { @@ -1405,49 +1315,58 @@ "variableRateSlope1": 70000000000000000000000000, "variableRateSlope2": 3000000000000000000000000000 }, - "0xF0bA2a8c12A2354c075b363765EAe825619bd490": { + "0xF02EC9CA513ca505f0F5347E7D784Fa6165F8a99": { "baseVariableBorrowRate": 0, "maxExcessUsageRatio": 200000000000000000000000000, "optimalUsageRatio": 800000000000000000000000000, "stableRateSlope1": 20000000000000000000000000, "stableRateSlope2": 1000000000000000000000000000, - "variableRateSlope1": 40000000000000000000000000, + "variableRateSlope1": 60000000000000000000000000, "variableRateSlope2": 1000000000000000000000000000 }, - "0xFDBDa42D2aC1bfbbc10555eb255De8387b8977C4": { - "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 350000000000000000000000000, - "optimalUsageRatio": 650000000000000000000000000, - "stableRateSlope1": 100000000000000000000000000, + "0xF1AafF9a4Da6Bf4Fb8fc18d39C8ffdafbAACce69": { + "baseVariableBorrowRate": 1000000000000000000000000000, + "maxExcessUsageRatio": 990000000000000000000000000, + "optimalUsageRatio": 10000000000000000000000000, + "stableRateSlope1": 700000000000000000000000000, "stableRateSlope2": 3000000000000000000000000000, - "variableRateSlope1": 80000000000000000000000000, + "variableRateSlope1": 700000000000000000000000000, "variableRateSlope2": 3000000000000000000000000000 }, - "0xb0a73aC3B10980A598685d4631c83f5348F5D32c": { + "0xab7f8ca781C736EB624A9E321cd043F8E6292C96": { "baseVariableBorrowRate": 0, "maxExcessUsageRatio": 200000000000000000000000000, "optimalUsageRatio": 800000000000000000000000000, - "stableRateSlope1": 0, - "stableRateSlope2": 0, - "variableRateSlope1": 40000000000000000000000000, + "stableRateSlope1": 20000000000000000000000000, + "stableRateSlope2": 750000000000000000000000000, + "variableRateSlope1": 60000000000000000000000000, "variableRateSlope2": 750000000000000000000000000 }, - "0xb2eD1eCE1c13455Ce9299d35D3B00358529f3Dc8": { - "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 550000000000000000000000000, - "optimalUsageRatio": 450000000000000000000000000, - "stableRateSlope1": 0, - "stableRateSlope2": 0, - "variableRateSlope1": 70000000000000000000000000, + "0xb70e28437Aec70a8cfE5240F54c463cF849bE17C": { + "baseVariableBorrowRate": 1000000000000000000000000000, + "maxExcessUsageRatio": 990000000000000000000000000, + "optimalUsageRatio": 10000000000000000000000000, + "stableRateSlope1": 700000000000000000000000000, + "stableRateSlope2": 3000000000000000000000000000, + "variableRateSlope1": 700000000000000000000000000, "variableRateSlope2": 3000000000000000000000000000 }, - "0xb49034Ada4BE5c6Bb3823A623C6250267110b06b": { + "0xb72F23adE9b9980c2E731Ca504105fC860643619": { "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 550000000000000000000000000, - "optimalUsageRatio": 450000000000000000000000000, - "stableRateSlope1": 0, - "stableRateSlope2": 0, - "variableRateSlope1": 70000000000000000000000000, + "maxExcessUsageRatio": 100000000000000000000000000, + "optimalUsageRatio": 900000000000000000000000000, + "stableRateSlope1": 20000000000000000000000000, + "stableRateSlope2": 600000000000000000000000000, + "variableRateSlope1": 60000000000000000000000000, + "variableRateSlope2": 600000000000000000000000000 + }, + "0xb873ec463CAC50112B0e14d060fbc4192406279f": { + "baseVariableBorrowRate": 200000000000000000000000000, + "maxExcessUsageRatio": 200000000000000000000000000, + "optimalUsageRatio": 800000000000000000000000000, + "stableRateSlope1": 220000000000000000000000000, + "stableRateSlope2": 1500000000000000000000000000, + "variableRateSlope1": 0, "variableRateSlope2": 3000000000000000000000000000 }, "0xb8975328Aa52c00B9Ec1e11e518C4900f2e6C62a": { @@ -1459,14 +1378,14 @@ "variableRateSlope1": 38000000000000000000000000, "variableRateSlope2": 800000000000000000000000000 }, - "0xc76EF342898f1AE7E6C4632627Df683FAD8563DD": { - "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 310000000000000000000000000, - "optimalUsageRatio": 690000000000000000000000000, - "stableRateSlope1": 690000000000000000000000000, - "stableRateSlope2": 600000000000000000000000000, - "variableRateSlope1": 420000000000000000000000000, - "variableRateSlope2": 600000000000000000000000000 + "0xc83cDb49F234EC6666D7857B3EAa1302b109394C": { + "baseVariableBorrowRate": 200000000000000000000000000, + "maxExcessUsageRatio": 200000000000000000000000000, + "optimalUsageRatio": 800000000000000000000000000, + "stableRateSlope1": 20000000000000000000000000, + "stableRateSlope2": 750000000000000000000000000, + "variableRateSlope1": 0, + "variableRateSlope2": 3000000000000000000000000000 }, "0xd4cA26F2496195C4F886D464D8578368236bB747": { "baseVariableBorrowRate": 0, @@ -1477,22 +1396,13 @@ "variableRateSlope1": 0, "variableRateSlope2": 0 }, - "0xf41E8F817e6C399d1AdE102059c454093b24f35B": { - "baseVariableBorrowRate": 0, + "0xeB65a3163Fd8900F4fE9a044e18966706b69A74D": { + "baseVariableBorrowRate": 200000000000000000000000000, "maxExcessUsageRatio": 350000000000000000000000000, "optimalUsageRatio": 650000000000000000000000000, "stableRateSlope1": 100000000000000000000000000, "stableRateSlope2": 3000000000000000000000000000, - "variableRateSlope1": 80000000000000000000000000, - "variableRateSlope2": 3000000000000000000000000000 - }, - "0xfd71623D7F41360aefE200de4f17E20A29e1d58C": { - "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 550000000000000000000000000, - "optimalUsageRatio": 450000000000000000000000000, - "stableRateSlope1": 100000000000000000000000000, - "stableRateSlope2": 3000000000000000000000000000, - "variableRateSlope1": 70000000000000000000000000, + "variableRateSlope1": 0, "variableRateSlope2": 3000000000000000000000000000 }, "0xff04ed5f7a6C3a0F1e5Ea20617F8C6f513D5A77c": { @@ -1503,15 +1413,6 @@ "stableRateSlope2": 0, "variableRateSlope1": 80000000000000000000000000, "variableRateSlope2": 2000000000000000000000000000 - }, - "0xfffE32106A68aA3eD39CcCE673B646423EEaB62a": { - "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 200000000000000000000000000, - "optimalUsageRatio": 800000000000000000000000000, - "stableRateSlope1": 20000000000000000000000000, - "stableRateSlope2": 750000000000000000000000000, - "variableRateSlope1": 40000000000000000000000000, - "variableRateSlope2": 750000000000000000000000000 } } } \ No newline at end of file diff --git a/reports/preTestV2RatesUpdates.json b/reports/preTestV2RatesUpdates.json index 3f8b841ee..3a9215577 100644 --- a/reports/preTestV2RatesUpdates.json +++ b/reports/preTestV2RatesUpdates.json @@ -1,13 +1,13 @@ { "chainId": 1, "poolConfig": { - "lendingPoolCollateralManager": "0xbd4765210d4167CE2A5b87280D9E8Ee316D5EC7C", + "lendingPoolCollateralManager": "0x368e6441bB27159c6e8e6d3bbd9147BEcBA915E3", "oracle": "0xA50ba011c48153De246E5192C8f9258A2ba79Ca9", "pool": "0x7d2768dE32b0b80b7a3454c06BdAc94A69DDc7A9", "poolAddressesProvider": "0xB53C1a33016B2DC2fF3653530bfF1848a515c8c5", "poolConfigurator": "0x311Bb771e4F8952E6Da169b425E7e92d6Ac45756", - "poolConfiguratorImpl": "0x3a95Ee42f080ff7289C8B4a14EB483a8644d7521", - "poolImpl": "0xC6845a5C768BF8D7681249f8927877Efda425baf", + "poolConfiguratorImpl": "0x246ca67522dF5895cD6cf8807Ec161954ea1bA61", + "poolImpl": "0x085E34722e04567Df9E6d2c32e82fd74f3342e79", "protocolDataProvider": "0x057835Ad21a177dbdd3090bB1CAE03EaCF78Fc6d" }, "reserves": { @@ -17,22 +17,22 @@ "aTokenName": "Aave interest bearing TUSD", "aTokenSymbol": "aTUSD", "baseStableBorrowRate": 100000000000000000000000000, - "borrowingEnabled": true, + "borrowingEnabled": false, "decimals": 18, - "interestRateStrategy": "0x6bcE15B789e537f3abA3C60CB183F0E8737f05eC", + "interestRateStrategy": "0xb70e28437Aec70a8cfE5240F54c463cF849bE17C", "isActive": true, - "isFrozen": false, - "liquidationBonus": 10500, - "liquidationThreshold": 8250, - "ltv": 8000, + "isFrozen": true, + "liquidationBonus": 11000, + "liquidationThreshold": 6500, + "ltv": 0, "oracle": "0x3886BA987236181D98F2401c507Fb8BeA7871dF2", "oracleDecimals": 18, "oracleDescription": "TUSD / ETH", - "oracleLatestAnswer": 610682580000000, - "reserveFactor": 500, - "stableBorrowRateEnabled": true, + "oracleLatestAnswer": 401284370109943, + "reserveFactor": 9990, + "stableBorrowRateEnabled": false, "stableDebtToken": "0x7f38d60D94652072b2C44a18c0e14A481EC3C0dd", - "stableDebtTokenImpl": "0x95Ce83DF0B8A45072D0330Cf5A1e0c8CAA43D192", + "stableDebtTokenImpl": "0x00C15a6aaF1e48763B53A9dc8D2077551BA45Fee", "stableDebtTokenName": "Aave stable debt bearing TUSD", "stableDebtTokenSymbol": "stableDebtTUSD", "symbol": "TUSD", @@ -45,13 +45,13 @@ }, "0x03ab458634910AaD20eF5f1C8ee96F1D6ac54919": { "aToken": "0xc9BC48c72154ef3e5425641a3c747242112a46AF", - "aTokenImpl": "0xB97Fa7A950B19C8Fe7d9bcD06909D3e67F20f16a", + "aTokenImpl": "0x2CDE0f77CF5d54e9417480a8611AA2fEcD56BbD9", "aTokenName": "Aave interest bearing RAI", "aTokenSymbol": "aRAI", "baseStableBorrowRate": 0, "borrowingEnabled": true, "decimals": 18, - "interestRateStrategy": "0xA7d4df837926cD55036175AfeF38395d56A64c22", + "interestRateStrategy": "0xc83cDb49F234EC6666D7857B3EAa1302b109394C", "isActive": true, "isFrozen": true, "liquidationBonus": 0, @@ -60,8 +60,8 @@ "oracle": "0x4ad7B025127e89263242aB68F0f9c4E5C033B489", "oracleDecimals": 18, "oracleDescription": "RAI / ETH", - "oracleLatestAnswer": 1711020815907047, - "reserveFactor": 2000, + "oracleLatestAnswer": 1172820903069477, + "reserveFactor": 9900, "stableBorrowRateEnabled": false, "stableDebtToken": "0x9C72B8476C33AE214ee3e8C20F0bc28496a62032", "stableDebtTokenImpl": "0xf37E202E587c6f63FD70F35C24Eb7f818CC5d01A", @@ -83,15 +83,15 @@ "baseStableBorrowRate": 40000000000000000000000000, "borrowingEnabled": true, "decimals": 2, - "interestRateStrategy": "0x2893405d64a7Bc8Db02Fa617351a5399d59eCf8D", + "interestRateStrategy": "0x999F449fEAfaAd78CE5702A9ebc460633478D4a4", "isActive": true, "isFrozen": false, "liquidationBonus": 0, "liquidationThreshold": 0, "ltv": 0, "oracle": "0xEc6f4Cd64d28Ef32507e2dc399948aAe9Bbedd7e", - "oracleLatestAnswer": 610545521752085, - "reserveFactor": 1000, + "oracleLatestAnswer": 406781720021913, + "reserveFactor": 2000, "stableBorrowRateEnabled": false, "stableDebtToken": "0xf8aC64ec6Ff8E0028b37EB89772d21865321bCe0", "stableDebtTokenImpl": "0xEddC66EB4a0aD3be434cBb1c2E7d17cE805D7a28", @@ -113,20 +113,20 @@ "baseStableBorrowRate": 30000000000000000000000000, "borrowingEnabled": false, "decimals": 18, - "interestRateStrategy": "0xBdfC85b140edF1FeaFd6eD664027AA4C23b4A29F", + "interestRateStrategy": "0x2c206fa2127aB7f1CE3dc987daf683Ed5B9CF069", "isActive": true, "isFrozen": true, - "liquidationBonus": 10750, - "liquidationThreshold": 7000, - "ltv": 6500, + "liquidationBonus": 11000, + "liquidationThreshold": 5, + "ltv": 0, "oracle": "0x0d16d4528239e9ee52fa531af613AcdB23D88c94", "oracleDecimals": 18, "oracleDescription": "BAT / ETH", - "oracleLatestAnswer": 182276893023327, - "reserveFactor": 2000, - "stableBorrowRateEnabled": true, + "oracleLatestAnswer": 93749950000000, + "reserveFactor": 9900, + "stableBorrowRateEnabled": false, "stableDebtToken": "0x277f8676FAcf4dAA5a6EA38ba511B7F65AA02f9F", - "stableDebtTokenImpl": "0x917fd53da13EDCCE5c155a7dbC73E1e4DcCd4267", + "stableDebtTokenImpl": "0x49B6645a9aa05f1Be24893136100467276399470", "stableDebtTokenName": "Aave stable debt bearing BAT", "stableDebtTokenSymbol": "stableDebtBAT", "symbol": "BAT", @@ -145,20 +145,20 @@ "baseStableBorrowRate": 30000000000000000000000000, "borrowingEnabled": true, "decimals": 18, - "interestRateStrategy": "0x004fC239848D8A8d3304729b78ba81d73d83C99F", + "interestRateStrategy": "0x2c206fa2127aB7f1CE3dc987daf683Ed5B9CF069", "isActive": true, "isFrozen": true, - "liquidationBonus": 10750, - "liquidationThreshold": 7500, - "ltv": 6150, + "liquidationBonus": 11000, + "liquidationThreshold": 5, + "ltv": 0, "oracle": "0x82A44D92D6c329826dc557c5E1Be6ebeC5D5FeB9", "oracleDecimals": 18, "oracleDescription": "MANA / ETH", - "oracleLatestAnswer": 395309373203460, - "reserveFactor": 3500, - "stableBorrowRateEnabled": true, + "oracleLatestAnswer": 178015486813397, + "reserveFactor": 9900, + "stableBorrowRateEnabled": false, "stableDebtToken": "0xD86C74eA2224f4B8591560652b50035E4e5c0a3b", - "stableDebtTokenImpl": "0x441c5CD55E9e3267D02F7b1b4D245AA1C61891c3", + "stableDebtTokenImpl": "0xe0bf71fF662e8bbeb911ACEa765f4b8be052F59b", "stableDebtTokenName": "Aave stable debt bearing MANA", "stableDebtTokenSymbol": "stableDebtMANA", "symbol": "MANA", @@ -177,17 +177,17 @@ "baseStableBorrowRate": 0, "borrowingEnabled": true, "decimals": 18, - "interestRateStrategy": "0xfd71623D7F41360aefE200de4f17E20A29e1d58C", + "interestRateStrategy": "0x2c206fa2127aB7f1CE3dc987daf683Ed5B9CF069", "isActive": true, "isFrozen": true, - "liquidationBonus": 10750, - "liquidationThreshold": 6500, - "ltv": 5000, + "liquidationBonus": 11000, + "liquidationThreshold": 5, + "ltv": 0, "oracle": "0x7c5d4F8345e66f68099581Db340cd65B078C41f4", "oracleDecimals": 18, "oracleDescription": "YFI / ETH", - "oracleLatestAnswer": 5686591566150553000, - "reserveFactor": 2000, + "oracleLatestAnswer": 3047678145187916000, + "reserveFactor": 9900, "stableBorrowRateEnabled": false, "stableDebtToken": "0xca823F78C2Dd38993284bb42Ba9b14152082F7BD", "stableDebtTokenImpl": "0x802Bb38676B6E79C393a3E3EC73b8Af63578188a", @@ -209,17 +209,17 @@ "baseStableBorrowRate": 0, "borrowingEnabled": false, "decimals": 18, - "interestRateStrategy": "0xb2eD1eCE1c13455Ce9299d35D3B00358529f3Dc8", + "interestRateStrategy": "0x6855E5544Cd803BF24c9612b3F12C009116B0ee1", "isActive": true, - "isFrozen": false, + "isFrozen": true, "liquidationBonus": 10850, - "liquidationThreshold": 5000, - "ltv": 4000, + "liquidationThreshold": 5, + "ltv": 0, "oracle": "0x72AFAECF99C9d9C8215fF44C77B94B99C28741e8", "oracleDecimals": 18, "oracleDescription": "1INCH / ETH", - "oracleLatestAnswer": 349400000000000, - "reserveFactor": 2000, + "oracleLatestAnswer": 173342672736174, + "reserveFactor": 9900, "stableBorrowRateEnabled": false, "stableDebtToken": "0x1278d6ED804d59d2d18a5Aa5638DfD591A79aF0a", "stableDebtTokenImpl": "0x9C2114Bf70774C36E9b8d6c790c9C14FF0d6799E", @@ -241,17 +241,17 @@ "baseStableBorrowRate": 0, "borrowingEnabled": false, "decimals": 18, - "interestRateStrategy": "0x9440aEc0795D7485e58bCF26622c2f4A681A9671", + "interestRateStrategy": "0xA12D7bB07379ad6de4497B80088e28D4C00932D1", "isActive": true, - "isFrozen": false, - "liquidationBonus": 10750, - "liquidationThreshold": 7000, - "ltv": 6500, + "isFrozen": true, + "liquidationBonus": 11000, + "liquidationThreshold": 5, + "ltv": 0, "oracle": "0x029849bbc0b1d93b85a8b6190e979fd38F5760E2", "oracleDecimals": 18, "oracleDescription": "DPI / ETH", - "oracleLatestAnswer": 53042159775707955, - "reserveFactor": 2000, + "oracleLatestAnswer": 41364111962536074, + "reserveFactor": 9900, "stableBorrowRateEnabled": false, "stableDebtToken": "0xa3953F07f389d719F99FC378ebDb9276177d8A6e", "stableDebtTokenImpl": "0x0f2d35d52a65c4CC98e345C3B478E75f7E4B9c2a", @@ -273,20 +273,20 @@ "baseStableBorrowRate": 0, "borrowingEnabled": false, "decimals": 18, - "interestRateStrategy": "0x24ABFac8dd8f270D752837fDFe3B3C735361f4eE", + "interestRateStrategy": "0x87cCa171a2125efca9868F9Bc1FfD7B7c80dC5a3", "isActive": true, - "isFrozen": false, + "isFrozen": true, "liquidationBonus": 10900, - "liquidationThreshold": 7700, - "ltv": 6500, + "liquidationThreshold": 2000, + "ltv": 0, "oracle": "0xD6aA3D25116d8dA79Ea0246c4826EB951872e02e", "oracleDecimals": 18, "oracleDescription": "UNI / ETH", - "oracleLatestAnswer": 3993507224186989, - "reserveFactor": 2000, + "oracleLatestAnswer": 2616213076346605, + "reserveFactor": 9900, "stableBorrowRateEnabled": false, "stableDebtToken": "0xD939F7430dC8D5a427f156dE1012A56C18AcB6Aa", - "stableDebtTokenImpl": "0xe4759007A1E6014DD92EBB33A293e0dfE85A8Ffe", + "stableDebtTokenImpl": "0x54f514CA167e1fc19231dA9a48bB7AA6ffe4F10d", "stableDebtTokenName": "Aave stable debt bearing UNI", "stableDebtTokenSymbol": "stableDebtUNI", "symbol": "UNI", @@ -305,20 +305,20 @@ "baseStableBorrowRate": 30000000000000000000000000, "borrowingEnabled": true, "decimals": 8, - "interestRateStrategy": "0xf41E8F817e6C399d1AdE102059c454093b24f35B", + "interestRateStrategy": "0x32f3A6134590fc2d9440663d35a2F0a6265F04c4", "isActive": true, "isFrozen": false, "liquidationBonus": 10500, "liquidationThreshold": 8200, "ltv": 7200, - "oracle": "0xdeb288F737066589598e9214E782fa5A8eD689e8", + "oracle": "0xFD858c8bC5ac5e10f01018bC78471bb0DC392247", "oracleDecimals": 18, - "oracleDescription": "BTC / ETH", - "oracleLatestAnswer": 14363022524949910000, - "reserveFactor": 2000, - "stableBorrowRateEnabled": true, + "oracleDescription": "wBTC/BTC/ETH", + "oracleLatestAnswer": 16842786004805376363, + "reserveFactor": 3000, + "stableBorrowRateEnabled": false, "stableDebtToken": "0x51B039b9AFE64B78758f8Ef091211b5387eA717c", - "stableDebtTokenImpl": "0x6Ac108C4c3Fe7F4D367513F599Da1B9dF7c43433", + "stableDebtTokenImpl": "0x4f279f2046870F77cd9Ce63497f8A2D8689ef804", "stableDebtTokenName": "Aave stable debt bearing WBTC", "stableDebtTokenSymbol": "stableDebtWBTC", "symbol": "WBTC", @@ -337,20 +337,20 @@ "baseStableBorrowRate": 0, "borrowingEnabled": false, "decimals": 18, - "interestRateStrategy": "0x9B1e3C7483F0f21abFEaE3AeBC9b47b5f23f5bB0", + "interestRateStrategy": "0x2c206fa2127aB7f1CE3dc987daf683Ed5B9CF069", "isActive": true, "isFrozen": true, - "liquidationBonus": 10750, - "liquidationThreshold": 6000, - "ltv": 5500, + "liquidationBonus": 11000, + "liquidationThreshold": 5, + "ltv": 0, "oracle": "0x3147D7203354Dc06D9fd350c7a2437bcA92387a4", "oracleDecimals": 18, "oracleDescription": "REN / ETH", - "oracleLatestAnswer": 63713924764907, - "reserveFactor": 2000, - "stableBorrowRateEnabled": true, + "oracleLatestAnswer": 22610981899079, + "reserveFactor": 9900, + "stableBorrowRateEnabled": false, "stableDebtToken": "0x3356Ec1eFA75d9D150Da1EC7d944D9EDf73703B7", - "stableDebtTokenImpl": "0x7b3E7Aea49A5F5d2514B9317d4cF58f828Ac28C2", + "stableDebtTokenImpl": "0x6F4B277366e10F68003A0a65Ef8f118f3D60B67E", "stableDebtTokenName": "Aave stable debt bearing REN", "stableDebtTokenSymbol": "stableDebtREN", "symbol": "REN", @@ -369,7 +369,7 @@ "baseStableBorrowRate": 0, "borrowingEnabled": true, "decimals": 18, - "interestRateStrategy": "0x26D40544447F68a3De69005822195549934624B9", + "interestRateStrategy": "0xF1AafF9a4Da6Bf4Fb8fc18d39C8ffdafbAACce69", "isActive": true, "isFrozen": true, "liquidationBonus": 0, @@ -378,8 +378,8 @@ "oracle": "0x614715d2Af89E6EC99A233818275142cE88d1Cfd", "oracleDecimals": 18, "oracleDescription": "BUSD / ETH", - "oracleLatestAnswer": 607958172477733, - "reserveFactor": 1000, + "oracleLatestAnswer": 407750083706476, + "reserveFactor": 9990, "stableBorrowRateEnabled": false, "stableDebtToken": "0x4A7A63909A72D268b1D8a93a9395d098688e0e5C", "stableDebtTokenImpl": "0x8A36603a2a66182C9f1F81d22B7B95ff8DEeD432", @@ -401,17 +401,17 @@ "baseStableBorrowRate": 0, "borrowingEnabled": false, "decimals": 18, - "interestRateStrategy": "0x1dA981865AE7a0C838eFBF4C7DFecb5c7268E73A", + "interestRateStrategy": "0x2c206fa2127aB7f1CE3dc987daf683Ed5B9CF069", "isActive": true, "isFrozen": true, "liquidationBonus": 10850, - "liquidationThreshold": 4500, - "ltv": 3500, + "liquidationThreshold": 5, + "ltv": 0, "oracle": "0xC9CbF687f43176B302F03f5e58470b77D07c61c6", "oracleDecimals": 18, "oracleDescription": "CVX / ETH", - "oracleLatestAnswer": 3742055994347318, - "reserveFactor": 2000, + "oracleLatestAnswer": 1179368876420195, + "reserveFactor": 9900, "stableBorrowRateEnabled": false, "stableDebtToken": "0xB01Eb1cE1Da06179136D561766fc2d609C5F55Eb", "stableDebtTokenImpl": "0x10638C31Daeee246f0026f7174E1f30fB17010F5", @@ -435,18 +435,18 @@ "decimals": 18, "interestRateStrategy": "0xED6547b83276B076B771B88FcCbD68BDeDb3927f", "isActive": true, - "isFrozen": false, + "isFrozen": true, "liquidationBonus": 10700, - "liquidationThreshold": 8300, - "ltv": 7000, + "liquidationThreshold": 7400, + "ltv": 0, "oracle": "0xDC530D9457755926550b59e8ECcdaE7624181557", "oracleDecimals": 18, "oracleDescription": "LINK / ETH", - "oracleLatestAnswer": 4479000000000001, - "reserveFactor": 2000, - "stableBorrowRateEnabled": true, + "oracleLatestAnswer": 5916460000000000, + "reserveFactor": 3000, + "stableBorrowRateEnabled": false, "stableDebtToken": "0xFB4AEc4Cc858F2539EBd3D37f2a43eAe5b15b98a", - "stableDebtTokenImpl": "0xAdc313f17a3e2180f609a45d7B381a45E2e88a9F", + "stableDebtTokenImpl": "0x1B80694AF3D4e617c747423f992F532B8baE098b", "stableDebtTokenName": "Aave stable debt bearing LINK", "stableDebtTokenSymbol": "stableDebtLINK", "symbol": "LINK", @@ -465,7 +465,7 @@ "baseStableBorrowRate": 0, "borrowingEnabled": true, "decimals": 18, - "interestRateStrategy": "0x3082D0a473385Ed2cbd1f16087ab8b7BF79f0355", + "interestRateStrategy": "0x28fc7a5F0e7652B6f5E398F5E656A3eB36a1F3DE", "isActive": true, "isFrozen": false, "liquidationBonus": 0, @@ -474,8 +474,8 @@ "oracle": "0x8e0b7e6062272B5eF4524250bFFF8e5Bd3497757", "oracleDecimals": 18, "oracleDescription": "SUSD / ETH", - "oracleLatestAnswer": 617138770830382, - "reserveFactor": 2000, + "oracleLatestAnswer": 407512114531422, + "reserveFactor": 3000, "stableBorrowRateEnabled": false, "stableDebtToken": "0x30B0f7324feDF89d8eff397275F8983397eFe4af", "stableDebtTokenImpl": "0x49EfDDb938a77C78816eF9f9B7F811C16611FdFD", @@ -497,18 +497,18 @@ "baseStableBorrowRate": 100000000000000000000000000, "borrowingEnabled": true, "decimals": 18, - "interestRateStrategy": "0x545Ae1908B6F12e91E03B1DEC4F2e06D0570fE1b", + "interestRateStrategy": "0xab7f8ca781C736EB624A9E321cd043F8E6292C96", "isActive": true, "isFrozen": false, "liquidationBonus": 0, "liquidationThreshold": 0, "ltv": 0, "oracle": "0x60c0b047133f696334a2b7f68af0b49d2F3D4F72", - "oracleLatestAnswer": 612368042872701, - "reserveFactor": 1000, - "stableBorrowRateEnabled": true, + "oracleLatestAnswer": 409761449002697, + "reserveFactor": 2500, + "stableBorrowRateEnabled": false, "stableDebtToken": "0x39f010127274b2dBdB770B45e1de54d974974526", - "stableDebtTokenImpl": "0x595c33538215DC4B092F35Afc85d904631263f4F", + "stableDebtTokenImpl": "0x1363602E58e25929A15bE194a3D505Fd6F8BE751", "stableDebtTokenName": "Aave stable debt bearing LUSD", "stableDebtTokenSymbol": "stableDebtLUSD", "symbol": "LUSD", @@ -527,7 +527,7 @@ "baseStableBorrowRate": 100000000000000000000000000, "borrowingEnabled": true, "decimals": 18, - "interestRateStrategy": "0xfffE32106A68aA3eD39CcCE673B646423EEaB62a", + "interestRateStrategy": "0xab7f8ca781C736EB624A9E321cd043F8E6292C96", "isActive": true, "isFrozen": false, "liquidationBonus": 10400, @@ -536,11 +536,11 @@ "oracle": "0x773616E4d11A78F511299002da57A0a94577F1f4", "oracleDecimals": 18, "oracleDescription": "DAI / ETH", - "oracleLatestAnswer": 612859977965139, - "reserveFactor": 1000, - "stableBorrowRateEnabled": true, + "oracleLatestAnswer": 410105724359441, + "reserveFactor": 2500, + "stableBorrowRateEnabled": false, "stableDebtToken": "0x778A13D3eeb110A4f7bb6529F99c000119a08E92", - "stableDebtTokenImpl": "0xD23A44eB2db8AD0817c994D3533528C030279F7c", + "stableDebtTokenImpl": "0xb44Fe5fA7A8fcF508984bE58bA807A22343B4493", "stableDebtTokenName": "Aave stable debt bearing DAI", "stableDebtTokenSymbol": "stableDebtDAI", "symbol": "DAI", @@ -568,7 +568,7 @@ "oracle": "0x6Df09E975c830ECae5bd4eD9d90f3A95a4f88012", "oracleDecimals": 18, "oracleDescription": "AAVE / ETH", - "oracleLatestAnswer": 48505366244397695, + "oracleLatestAnswer": 39515306483330896, "reserveFactor": 0, "stableBorrowRateEnabled": false, "stableDebtToken": "0x079D6a3E844BcECf5720478A718Edb6575362C5f", @@ -591,7 +591,7 @@ "baseStableBorrowRate": 0, "borrowingEnabled": true, "decimals": 18, - "interestRateStrategy": "0xb0a73aC3B10980A598685d4631c83f5348F5D32c", + "interestRateStrategy": "0x28fc7a5F0e7652B6f5E398F5E656A3eB36a1F3DE", "isActive": true, "isFrozen": false, "liquidationBonus": 0, @@ -600,8 +600,8 @@ "oracle": "0x14d04Fff8D21bd62987a5cE9ce543d2F1edF5D3E", "oracleDecimals": 18, "oracleDescription": "FRAX / ETH", - "oracleLatestAnswer": 616977057978798, - "reserveFactor": 2000, + "oracleLatestAnswer": 409908731055814, + "reserveFactor": 3000, "stableBorrowRateEnabled": false, "stableDebtToken": "0x3916e3B6c84b161df1b2733dFfc9569a1dA710c2", "stableDebtTokenImpl": "0x7E3Ddfceef69bEC3A38Fc9AE8D7A8c46D7788C6b", @@ -623,17 +623,17 @@ "baseStableBorrowRate": 0, "borrowingEnabled": false, "decimals": 18, - "interestRateStrategy": "0xb49034Ada4BE5c6Bb3823A623C6250267110b06b", + "interestRateStrategy": "0x6855E5544Cd803BF24c9612b3F12C009116B0ee1", "isActive": true, "isFrozen": true, - "liquidationBonus": 10850, - "liquidationThreshold": 6500, - "ltv": 5000, + "liquidationBonus": 11000, + "liquidationThreshold": 5, + "ltv": 0, "oracle": "0xF05D9B6C08757EAcb1fbec18e36A1B7566a13DEB", "oracleDecimals": 18, "oracleDescription": "Calculated XSUSHI / ETH", - "oracleLatestAnswer": 1082567401549168, - "reserveFactor": 3500, + "oracleLatestAnswer": 565948785959684, + "reserveFactor": 9900, "stableBorrowRateEnabled": false, "stableDebtToken": "0x73Bfb81D7dbA75C904f430eA8BAe82DB0D41187B", "stableDebtTokenImpl": "0x0fF2eC6F80F83A54746DB9b9ac7F40ADBEfb3dB4", @@ -655,7 +655,7 @@ "baseStableBorrowRate": 0, "borrowingEnabled": true, "decimals": 18, - "interestRateStrategy": "0x404d396fc42e20d14585A1a10Cd64BDdC6C6574A", + "interestRateStrategy": "0x40a76E018dd4aFe1391F51f0C8c8E4eA70476e15", "isActive": true, "isFrozen": false, "liquidationBonus": 0, @@ -664,8 +664,8 @@ "oracle": "0x3a08ebBaB125224b7b6474384Ee39fBb247D2200", "oracleDecimals": 18, "oracleDescription": "PAX / ETH", - "oracleLatestAnswer": 616220194971251, - "reserveFactor": 1000, + "oracleLatestAnswer": 404325328035399, + "reserveFactor": 2000, "stableBorrowRateEnabled": false, "stableDebtToken": "0x2387119bc85A74e0BBcbe190d80676CB16F10D4F", "stableDebtTokenImpl": "0x9C3440F4aACA3312b632bE4A07C0f97B15c31c8b", @@ -687,16 +687,16 @@ "baseStableBorrowRate": 0, "borrowingEnabled": true, "decimals": 18, - "interestRateStrategy": "0xF0bA2a8c12A2354c075b363765EAe825619bd490", + "interestRateStrategy": "0x795dC59EA6472Dfa4298A454C6E8Dcb005643A13", "isActive": true, "isFrozen": true, - "liquidationBonus": 10650, - "liquidationThreshold": 7500, - "ltv": 6500, - "oracle": "0x7F0D2c2838c6AC24443d13e23d99490017bDe370", + "liquidationBonus": 11000, + "liquidationThreshold": 5, + "ltv": 0, + "oracle": "0xac3AF0f4A52C577Cc2C241dF51a01FDe3D06D93B", "oracleDecimals": 18, - "oracleDescription": "FEI / ETH", - "oracleLatestAnswer": 613596576602952, + "oracleDescription": "0.95/USD/ETH", + "oracleLatestAnswer": 386442634020817, "reserveFactor": 9900, "stableBorrowRateEnabled": false, "stableDebtToken": "0xd89cF9E8A858F8B4b31Faf793505e112d6c17449", @@ -719,20 +719,20 @@ "baseStableBorrowRate": 30000000000000000000000000, "borrowingEnabled": false, "decimals": 18, - "interestRateStrategy": "0xE3a3DE71B827cB73663A24cDB6243bA7F986cC3b", + "interestRateStrategy": "0x2c206fa2127aB7f1CE3dc987daf683Ed5B9CF069", "isActive": true, - "isFrozen": false, + "isFrozen": true, "liquidationBonus": 10750, - "liquidationThreshold": 6700, - "ltv": 6200, + "liquidationThreshold": 1800, + "ltv": 0, "oracle": "0x24551a8Fb2A7211A25a17B1481f043A8a8adC7f2", "oracleDecimals": 18, "oracleDescription": "MKR / ETH", - "oracleLatestAnswer": 480035982884287950, - "reserveFactor": 2000, - "stableBorrowRateEnabled": true, + "oracleLatestAnswer": 796683976379186900, + "reserveFactor": 9900, + "stableBorrowRateEnabled": false, "stableDebtToken": "0xC01C8E4b12a89456a9fD4e4e75B72546Bf53f0B5", - "stableDebtTokenImpl": "0x20f9027c5092739C58250CF456642E8e3D4dBEd5", + "stableDebtTokenImpl": "0xC4CFCE0b16199818Ad942a87902C9172ba005022", "stableDebtTokenName": "Aave stable debt bearing MKR", "stableDebtTokenSymbol": "stableDebtMKR", "symbol": "MKR", @@ -751,7 +751,7 @@ "baseStableBorrowRate": 90000000000000000000000000, "borrowingEnabled": true, "decimals": 6, - "interestRateStrategy": "0x8Cae0596bC1eD42dc3F04c4506cfe442b3E74e27", + "interestRateStrategy": "0xb72F23adE9b9980c2E731Ca504105fC860643619", "isActive": true, "isFrozen": false, "liquidationBonus": 10450, @@ -760,11 +760,11 @@ "oracle": "0x986b5E1e1755e3C2440e960477f25201B0a8bbD4", "oracleDecimals": 18, "oracleDescription": "USDC / ETH", - "oracleLatestAnswer": 611599789718562, - "reserveFactor": 1000, - "stableBorrowRateEnabled": true, + "oracleLatestAnswer": 407011754295958, + "reserveFactor": 2500, + "stableBorrowRateEnabled": false, "stableDebtToken": "0xE4922afAB0BbaDd8ab2a88E0C79d884Ad337fcA6", - "stableDebtTokenImpl": "0x3b2a77058a1Eb4403a90b94585FaB16Bc512E703", + "stableDebtTokenImpl": "0x8DFF7Fda82976452b6FB957F549944e7af7A3e6F", "stableDebtTokenName": "Aave stable debt bearing USDC", "stableDebtTokenSymbol": "stableDebtUSDC", "symbol": "USDC", @@ -783,17 +783,17 @@ "baseStableBorrowRate": 0, "borrowingEnabled": false, "decimals": 18, - "interestRateStrategy": "0xCc92073dDe8aE03bAA1812AC5cF22e69b5E76914", + "interestRateStrategy": "0xB2D822cAdb9040F3164829BC34e41a93cA3E01e5", "isActive": true, - "isFrozen": false, + "isFrozen": true, "liquidationBonus": 10750, - "liquidationThreshold": 6200, - "ltv": 4600, + "liquidationThreshold": 5, + "ltv": 0, "oracle": "0x79291A9d692Df95334B1a0B3B4AE6bC606782f8c", "oracleDecimals": 18, "oracleDescription": "SNX / ETH", - "oracleLatestAnswer": 1778640000000000, - "reserveFactor": 3500, + "oracleLatestAnswer": 1356003312337918, + "reserveFactor": 9900, "stableBorrowRateEnabled": false, "stableDebtToken": "0x8575c8ae70bDB71606A53AeA1c6789cB0fBF3166", "stableDebtTokenImpl": "0x42321d7f519E9Bf2163B7B1685D379BC07A59C38", @@ -823,10 +823,10 @@ "ltv": 8250, "oracle": "0x0000000000000000000000000000000000000000", "oracleLatestAnswer": 1000000000000000000, - "reserveFactor": 1500, - "stableBorrowRateEnabled": true, + "reserveFactor": 2500, + "stableBorrowRateEnabled": false, "stableDebtToken": "0x4e977830ba4bd783C0BB7F15d3e243f73FF57121", - "stableDebtTokenImpl": "0xA558EA1A875f8b576f0728d32C39f62158e49b92", + "stableDebtTokenImpl": "0xEd14b4E51B04d4d0211474a721F77C0817166c2f", "stableDebtTokenName": "Aave stable debt bearing WETH", "stableDebtTokenSymbol": "stableDebtWETH", "symbol": "WETH", @@ -845,15 +845,15 @@ "baseStableBorrowRate": 0, "borrowingEnabled": false, "decimals": 18, - "interestRateStrategy": "0xb2eD1eCE1c13455Ce9299d35D3B00358529f3Dc8", + "interestRateStrategy": "0x6855E5544Cd803BF24c9612b3F12C009116B0ee1", "isActive": true, - "isFrozen": false, + "isFrozen": true, "liquidationBonus": 10800, - "liquidationThreshold": 5700, - "ltv": 4700, + "liquidationThreshold": 2400, + "ltv": 0, "oracle": "0xd4641b75015E6536E8102D98479568D05D7123Db", - "oracleLatestAnswer": 9738201071945762, - "reserveFactor": 2000, + "oracleLatestAnswer": 8618752070239292, + "reserveFactor": 9900, "stableBorrowRateEnabled": false, "stableDebtToken": "0x34441FFD1948E49dC7a607882D0c38Efd0083815", "stableDebtTokenImpl": "0x5746b5b6650Dd8d9B1d9D1bbf5E7f23e9761183F", @@ -875,7 +875,7 @@ "baseStableBorrowRate": 0, "borrowingEnabled": true, "decimals": 9, - "interestRateStrategy": "0x84d1FaD9559b8AC1Fda17d073B8542c8Fb6986dd", + "interestRateStrategy": "0xB2D822cAdb9040F3164829BC34e41a93cA3E01e5", "isActive": true, "isFrozen": true, "liquidationBonus": 0, @@ -884,8 +884,8 @@ "oracle": "0x492575FDD11a0fCf2C6C719867890a7648d526eB", "oracleDecimals": 18, "oracleDescription": "AMPL / ETH", - "oracleLatestAnswer": 620918820133552, - "reserveFactor": 1000, + "oracleLatestAnswer": 450300119588682, + "reserveFactor": 9900, "stableBorrowRateEnabled": false, "stableDebtToken": "0x18152C9f77DAdc737006e9430dB913159645fa87", "stableDebtTokenImpl": "0x0e8f4fc4c261d454b13C74507Bce8C38AA990361", @@ -916,7 +916,7 @@ "oracle": "0x0606Be69451B1C9861Ac6b3626b99093b713E801", "oracleDecimals": 18, "oracleDescription": "FIL / ETH", - "oracleLatestAnswer": 4020977447693813, + "oracleLatestAnswer": 2287773603726078, "reserveFactor": 3500, "stableBorrowRateEnabled": false, "stableDebtToken": "0xcAad05C49E14075077915cB5C820EB3245aFb950", @@ -939,17 +939,17 @@ "baseStableBorrowRate": 30000000000000000000000000, "borrowingEnabled": false, "decimals": 18, - "interestRateStrategy": "0xE3a3DE71B827cB73663A24cDB6243bA7F986cC3b", + "interestRateStrategy": "0x35FE8C9924718f286463e659be35b4122eEe907F", "isActive": true, - "isFrozen": false, + "isFrozen": true, "liquidationBonus": 10800, - "liquidationThreshold": 5800, - "ltv": 5200, + "liquidationThreshold": 1800, + "ltv": 0, "oracle": "0x8a12Be339B0cD1829b91Adc01977caa5E9ac121e", "oracleDecimals": 18, "oracleDescription": "CRV / ETH", - "oracleLatestAnswer": 621505942576524, - "reserveFactor": 2000, + "oracleLatestAnswer": 209322011170661, + "reserveFactor": 9900, "stableBorrowRateEnabled": false, "stableDebtToken": "0x9288059a74f589C919c7Cf1Db433251CdFEB874B", "stableDebtTokenImpl": "0x288672D311Da6edC89765204A6d309701e7289d4", @@ -971,20 +971,20 @@ "baseStableBorrowRate": 30000000000000000000000000, "borrowingEnabled": false, "decimals": 18, - "interestRateStrategy": "0x1a4babC0e20d892167792AC79618273711afD3e7", + "interestRateStrategy": "0x2c206fa2127aB7f1CE3dc987daf683Ed5B9CF069", "isActive": true, "isFrozen": true, - "liquidationBonus": 10750, - "liquidationThreshold": 6500, - "ltv": 5500, + "liquidationBonus": 11000, + "liquidationThreshold": 1200, + "ltv": 0, "oracle": "0x2Da4983a622a8498bb1a21FaE9D8F6C664939962", "oracleDecimals": 18, "oracleDescription": "ZRX / ETH", - "oracleLatestAnswer": 161308174808789, - "reserveFactor": 2000, - "stableBorrowRateEnabled": true, + "oracleLatestAnswer": 128582334580025, + "reserveFactor": 9900, + "stableBorrowRateEnabled": false, "stableDebtToken": "0x071B4323a24E73A5afeEbe34118Cd21B8FAAF7C3", - "stableDebtTokenImpl": "0x42a87BF47B5eFD11fa9Ddd5321BF9Aa502233b74", + "stableDebtTokenImpl": "0xffaCA447191d8196C8Cf96E5912b732063DE4307", "stableDebtTokenName": "Aave stable debt bearing ZRX", "stableDebtTokenSymbol": "stableDebtZRX", "symbol": "ZRX", @@ -1003,20 +1003,20 @@ "baseStableBorrowRate": 0, "borrowingEnabled": true, "decimals": 18, - "interestRateStrategy": "0x4a4fb6B26e7F516594b7242240039EA8FAAc897a", + "interestRateStrategy": "0x2c206fa2127aB7f1CE3dc987daf683Ed5B9CF069", "isActive": true, "isFrozen": true, - "liquidationBonus": 10600, - "liquidationThreshold": 6700, - "ltv": 6000, + "liquidationBonus": 11000, + "liquidationThreshold": 5, + "ltv": 0, "oracle": "0x24D9aB51950F3d62E9144fdC2f3135DAA6Ce8D1B", "oracleDecimals": 18, "oracleDescription": "ENJ / ETH", - "oracleLatestAnswer": 292880000000000, - "reserveFactor": 2000, - "stableBorrowRateEnabled": true, + "oracleLatestAnswer": 118685890000000, + "reserveFactor": 9900, + "stableBorrowRateEnabled": false, "stableDebtToken": "0x943DcCA156b5312Aa24c1a08769D67FEce4ac14C", - "stableDebtTokenImpl": "0x8286288f3c454b51DfC70bd0d6918220428B0741", + "stableDebtTokenImpl": "0x0fB427f800C5E39E7d8029e19F515300d4bb22C2", "stableDebtTokenName": "Aave stable debt bearing ENJ", "stableDebtTokenSymbol": "stableDebtENJ", "symbol": "ENJ", @@ -1035,7 +1035,7 @@ "baseStableBorrowRate": 0, "borrowingEnabled": true, "decimals": 6, - "interestRateStrategy": "0x0dEDCaE8Eb22A2EFB597aBde1834173C47Cff186", + "interestRateStrategy": "0xc83cDb49F234EC6666D7857B3EAa1302b109394C", "isActive": true, "isFrozen": true, "liquidationBonus": 0, @@ -1044,8 +1044,8 @@ "oracle": "0xa20623070413d42a5C01Db2c8111640DD7A5A03a", "oracleDecimals": 18, "oracleDescription": "UST / ETH", - "oracleLatestAnswer": 16780133340039, - "reserveFactor": 2000, + "oracleLatestAnswer": 11773404322311, + "reserveFactor": 9900, "stableBorrowRateEnabled": false, "stableDebtToken": "0x7FDbfB0412700D94403c42cA3CAEeeA183F07B26", "stableDebtTokenImpl": "0x107ed1832647436a0D39F09e65f4aA920242C0BB", @@ -1073,10 +1073,10 @@ "liquidationBonus": 10700, "liquidationThreshold": 8300, "ltv": 7200, - "oracle": "0x86392dC19c0b719886221c78AB11eb8Cf5c52812", + "oracle": "0xADE6CBA6c45aa8E9d0337cAc3D2619eabc39D901", "oracleDecimals": 18, - "oracleDescription": "STETH / ETH", - "oracleLatestAnswer": 998251120000000000, + "oracleDescription": "stETH/ETH", + "oracleLatestAnswer": 1000000000000000000, "reserveFactor": 1000, "stableBorrowRateEnabled": false, "stableDebtToken": "0x66457616Dd8489dF5D0AFD8678F4A260088aAF55", @@ -1099,17 +1099,17 @@ "baseStableBorrowRate": 30000000000000000000000000, "borrowingEnabled": false, "decimals": 18, - "interestRateStrategy": "0x04c28D6fE897859153eA753f986cc249Bf064f71", + "interestRateStrategy": "0xb873ec463CAC50112B0e14d060fbc4192406279f", "isActive": true, "isFrozen": true, "liquidationBonus": 10800, - "liquidationThreshold": 7000, - "ltv": 6500, + "liquidationThreshold": 5, + "ltv": 0, "oracle": "0xC1438AA3823A6Ba0C159CfA8D98dF5A994bA120b", "oracleDecimals": 18, "oracleDescription": "BAL / ETH", - "oracleLatestAnswer": 4377483727566084, - "reserveFactor": 2000, + "oracleLatestAnswer": 1617911746672069, + "reserveFactor": 9900, "stableBorrowRateEnabled": false, "stableDebtToken": "0xe569d31590307d05DA3812964F1eDd551D665a0b", "stableDebtTokenImpl": "0x58571484BD57a87E359e46F82dFa9D13087b24a0", @@ -1125,13 +1125,13 @@ }, "0xdAC17F958D2ee523a2206206994597C13D831ec7": { "aToken": "0x3Ed3B47Dd13EC9a98b44e6204A523E766B225811", - "aTokenImpl": "0x3F06560cfB7af6E6B5102c358f679DE5150b3b4C", + "aTokenImpl": "0x9651F64Bd77550691EB2AeEb58188CB67F005902", "aTokenName": "Aave interest bearing USDT", "aTokenSymbol": "aUSDT", "baseStableBorrowRate": 100000000000000000000000000, "borrowingEnabled": true, "decimals": 6, - "interestRateStrategy": "0x33DeAc0861FD6a9235b86172AA939E79085c6f52", + "interestRateStrategy": "0xF02EC9CA513ca505f0F5347E7D784Fa6165F8a99", "isActive": true, "isFrozen": false, "liquidationBonus": 0, @@ -1140,11 +1140,11 @@ "oracle": "0xEe9F2375b4bdF6387aa8265dD4FB8F16512A1d46", "oracleDecimals": 18, "oracleDescription": "USDT / ETH", - "oracleLatestAnswer": 611767949789453, - "reserveFactor": 1000, - "stableBorrowRateEnabled": true, + "oracleLatestAnswer": 406945750062059, + "reserveFactor": 2500, + "stableBorrowRateEnabled": false, "stableDebtToken": "0xe91D55AB2240594855aBd11b3faAE801Fd4c4687", - "stableDebtTokenImpl": "0x9d4578c813D69745092a4F951753ed2B28056279", + "stableDebtTokenImpl": "0xC61262D6ad449AC09B4087f46391Dd9A26b5888B", "stableDebtTokenName": "Aave stable debt bearing USDT", "stableDebtTokenSymbol": "stableDebtUSDT", "symbol": "USDT", @@ -1163,20 +1163,20 @@ "baseStableBorrowRate": 30000000000000000000000000, "borrowingEnabled": true, "decimals": 18, - "interestRateStrategy": "0xFDBDa42D2aC1bfbbc10555eb255De8387b8977C4", + "interestRateStrategy": "0xeB65a3163Fd8900F4fE9a044e18966706b69A74D", "isActive": true, "isFrozen": true, "liquidationBonus": 11000, - "liquidationThreshold": 7000, - "ltv": 6000, + "liquidationThreshold": 5, + "ltv": 0, "oracle": "0x656c0544eF4C98A6a98491833A89204Abb045d6b", "oracleDecimals": 18, "oracleDescription": "KNC / ETH", - "oracleLatestAnswer": 522346316958437, - "reserveFactor": 2000, - "stableBorrowRateEnabled": true, + "oracleLatestAnswer": 250135580000000, + "reserveFactor": 9900, + "stableBorrowRateEnabled": false, "stableDebtToken": "0x9915dfb872778B2890a117DA1F35F335eb06B54f", - "stableDebtTokenImpl": "0xf818B175353F023E3EC1A098d040778b835897c7", + "stableDebtTokenImpl": "0x22a8FD718924ab2f9dd4D0326DD8ab99Ef21D0b3", "stableDebtTokenName": "Aave stable debt bearing KNC", "stableDebtTokenSymbol": "stableDebtKNC", "symbol": "KNC", @@ -1189,87 +1189,24 @@ } }, "strategies": { - "0x004fC239848D8A8d3304729b78ba81d73d83C99F": { - "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 550000000000000000000000000, - "optimalUsageRatio": 450000000000000000000000000, - "stableRateSlope1": 100000000000000000000000000, - "stableRateSlope2": 3000000000000000000000000000, - "variableRateSlope1": 70000000000000000000000000, - "variableRateSlope2": 3000000000000000000000000000 - }, - "0x04c28D6fE897859153eA753f986cc249Bf064f71": { - "baseVariableBorrowRate": 30000000000000000000000000, - "maxExcessUsageRatio": 200000000000000000000000000, - "optimalUsageRatio": 800000000000000000000000000, - "stableRateSlope1": 100000000000000000000000000, - "stableRateSlope2": 3000000000000000000000000000, - "variableRateSlope1": 140000000000000000000000000, - "variableRateSlope2": 1500000000000000000000000000 - }, - "0x0dEDCaE8Eb22A2EFB597aBde1834173C47Cff186": { + "0x28fc7a5F0e7652B6f5E398F5E656A3eB36a1F3DE": { "baseVariableBorrowRate": 0, "maxExcessUsageRatio": 200000000000000000000000000, "optimalUsageRatio": 800000000000000000000000000, - "stableRateSlope1": 20000000000000000000000000, - "stableRateSlope2": 750000000000000000000000000, - "variableRateSlope1": 40000000000000000000000000, - "variableRateSlope2": 750000000000000000000000000 - }, - "0x1a4babC0e20d892167792AC79618273711afD3e7": { - "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 550000000000000000000000000, - "optimalUsageRatio": 450000000000000000000000000, - "stableRateSlope1": 100000000000000000000000000, - "stableRateSlope2": 3000000000000000000000000000, - "variableRateSlope1": 70000000000000000000000000, - "variableRateSlope2": 3000000000000000000000000000 + "stableRateSlope1": 0, + "stableRateSlope2": 0, + "variableRateSlope1": 60000000000000000000000000, + "variableRateSlope2": 1000000000000000000000000000 }, - "0x1dA981865AE7a0C838eFBF4C7DFecb5c7268E73A": { - "baseVariableBorrowRate": 0, + "0x2c206fa2127aB7f1CE3dc987daf683Ed5B9CF069": { + "baseVariableBorrowRate": 200000000000000000000000000, "maxExcessUsageRatio": 550000000000000000000000000, "optimalUsageRatio": 450000000000000000000000000, "stableRateSlope1": 100000000000000000000000000, "stableRateSlope2": 3000000000000000000000000000, - "variableRateSlope1": 70000000000000000000000000, - "variableRateSlope2": 3000000000000000000000000000 - }, - "0x24ABFac8dd8f270D752837fDFe3B3C735361f4eE": { - "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 550000000000000000000000000, - "optimalUsageRatio": 450000000000000000000000000, - "stableRateSlope1": 120000000000000000000000000, - "stableRateSlope2": 3000000000000000000000000000, - "variableRateSlope1": 70000000000000000000000000, + "variableRateSlope1": 0, "variableRateSlope2": 3000000000000000000000000000 }, - "0x26D40544447F68a3De69005822195549934624B9": { - "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 200000000000000000000000000, - "optimalUsageRatio": 800000000000000000000000000, - "stableRateSlope1": 0, - "stableRateSlope2": 0, - "variableRateSlope1": 40000000000000000000000000, - "variableRateSlope2": 1000000000000000000000000000 - }, - "0x2893405d64a7Bc8Db02Fa617351a5399d59eCf8D": { - "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 200000000000000000000000000, - "optimalUsageRatio": 800000000000000000000000000, - "stableRateSlope1": 40000000000000000000000000, - "stableRateSlope2": 1000000000000000000000000000, - "variableRateSlope1": 40000000000000000000000000, - "variableRateSlope2": 1000000000000000000000000000 - }, - "0x3082D0a473385Ed2cbd1f16087ab8b7BF79f0355": { - "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 200000000000000000000000000, - "optimalUsageRatio": 800000000000000000000000000, - "stableRateSlope1": 0, - "stableRateSlope2": 0, - "variableRateSlope1": 40000000000000000000000000, - "variableRateSlope2": 1000000000000000000000000000 - }, "0x311C866D55456e465e314A3E9830276B438A73f0": { "baseVariableBorrowRate": 0, "maxExcessUsageRatio": 0, @@ -1279,121 +1216,85 @@ "variableRateSlope1": 0, "variableRateSlope2": 0 }, - "0x33DeAc0861FD6a9235b86172AA939E79085c6f52": { + "0x32f3A6134590fc2d9440663d35a2F0a6265F04c4": { "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 200000000000000000000000000, - "optimalUsageRatio": 800000000000000000000000000, - "stableRateSlope1": 20000000000000000000000000, - "stableRateSlope2": 750000000000000000000000000, - "variableRateSlope1": 40000000000000000000000000, - "variableRateSlope2": 750000000000000000000000000 - }, - "0x404d396fc42e20d14585A1a10Cd64BDdC6C6574A": { - "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 100000000000000000000000000, - "optimalUsageRatio": 900000000000000000000000000, - "stableRateSlope1": 0, - "stableRateSlope2": 0, + "maxExcessUsageRatio": 350000000000000000000000000, + "optimalUsageRatio": 650000000000000000000000000, + "stableRateSlope1": 100000000000000000000000000, + "stableRateSlope2": 3000000000000000000000000000, "variableRateSlope1": 40000000000000000000000000, - "variableRateSlope2": 600000000000000000000000000 + "variableRateSlope2": 3000000000000000000000000000 }, - "0x4a4fb6B26e7F516594b7242240039EA8FAAc897a": { - "baseVariableBorrowRate": 0, + "0x35FE8C9924718f286463e659be35b4122eEe907F": { + "baseVariableBorrowRate": 200000000000000000000000000, "maxExcessUsageRatio": 550000000000000000000000000, "optimalUsageRatio": 450000000000000000000000000, - "stableRateSlope1": 100000000000000000000000000, + "stableRateSlope1": 170000000000000000000000000, "stableRateSlope2": 3000000000000000000000000000, - "variableRateSlope1": 70000000000000000000000000, + "variableRateSlope1": 0, "variableRateSlope2": 3000000000000000000000000000 }, - "0x545Ae1908B6F12e91E03B1DEC4F2e06D0570fE1b": { + "0x40a76E018dd4aFe1391F51f0C8c8E4eA70476e15": { "baseVariableBorrowRate": 0, "maxExcessUsageRatio": 200000000000000000000000000, "optimalUsageRatio": 800000000000000000000000000, - "stableRateSlope1": 20000000000000000000000000, - "stableRateSlope2": 750000000000000000000000000, - "variableRateSlope1": 40000000000000000000000000, + "stableRateSlope1": 0, + "stableRateSlope2": 0, + "variableRateSlope1": 60000000000000000000000000, "variableRateSlope2": 750000000000000000000000000 }, - "0x6bcE15B789e537f3abA3C60CB183F0E8737f05eC": { - "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 200000000000000000000000000, - "optimalUsageRatio": 800000000000000000000000000, - "stableRateSlope1": 20000000000000000000000000, - "stableRateSlope2": 1000000000000000000000000000, - "variableRateSlope1": 40000000000000000000000000, - "variableRateSlope2": 1000000000000000000000000000 - }, - "0x84d1FaD9559b8AC1Fda17d073B8542c8Fb6986dd": { - "baseVariableBorrowRate": 10000000000000000000000000, - "maxExcessUsageRatio": 200000000000000000000000000, - "optimalUsageRatio": 800000000000000000000000000, + "0x6855E5544Cd803BF24c9612b3F12C009116B0ee1": { + "baseVariableBorrowRate": 200000000000000000000000000, + "maxExcessUsageRatio": 550000000000000000000000000, + "optimalUsageRatio": 450000000000000000000000000, "stableRateSlope1": 0, "stableRateSlope2": 0, - "variableRateSlope1": 20000000000000000000000000, - "variableRateSlope2": 7500000000000000000000000000 + "variableRateSlope1": 0, + "variableRateSlope2": 3000000000000000000000000000 }, - "0x8Cae0596bC1eD42dc3F04c4506cfe442b3E74e27": { + "0x795dC59EA6472Dfa4298A454C6E8Dcb005643A13": { "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 100000000000000000000000000, - "optimalUsageRatio": 900000000000000000000000000, + "maxExcessUsageRatio": 990000000000000000000000000, + "optimalUsageRatio": 10000000000000000000000000, "stableRateSlope1": 20000000000000000000000000, - "stableRateSlope2": 600000000000000000000000000, + "stableRateSlope2": 1000000000000000000000000000, "variableRateSlope1": 40000000000000000000000000, - "variableRateSlope2": 600000000000000000000000000 - }, - "0x9440aEc0795D7485e58bCF26622c2f4A681A9671": { - "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 500000000000000000000000000, - "optimalUsageRatio": 500000000000000000000000000, - "stableRateSlope1": 0, - "stableRateSlope2": 0, - "variableRateSlope1": 70000000000000000000000000, - "variableRateSlope2": 3000000000000000000000000000 + "variableRateSlope2": 1000000000000000000000000000 }, - "0x9B1e3C7483F0f21abFEaE3AeBC9b47b5f23f5bB0": { - "baseVariableBorrowRate": 0, + "0x87cCa171a2125efca9868F9Bc1FfD7B7c80dC5a3": { + "baseVariableBorrowRate": 200000000000000000000000000, "maxExcessUsageRatio": 550000000000000000000000000, "optimalUsageRatio": 450000000000000000000000000, - "stableRateSlope1": 100000000000000000000000000, + "stableRateSlope1": 120000000000000000000000000, "stableRateSlope2": 3000000000000000000000000000, - "variableRateSlope1": 70000000000000000000000000, + "variableRateSlope1": 0, "variableRateSlope2": 3000000000000000000000000000 }, - "0xA7d4df837926cD55036175AfeF38395d56A64c22": { + "0x999F449fEAfaAd78CE5702A9ebc460633478D4a4": { "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 200000000000000000000000000, - "optimalUsageRatio": 800000000000000000000000000, - "stableRateSlope1": 20000000000000000000000000, - "stableRateSlope2": 750000000000000000000000000, - "variableRateSlope1": 40000000000000000000000000, - "variableRateSlope2": 750000000000000000000000000 + "maxExcessUsageRatio": 300000000000000000000000000, + "optimalUsageRatio": 700000000000000000000000000, + "stableRateSlope1": 40000000000000000000000000, + "stableRateSlope2": 1000000000000000000000000000, + "variableRateSlope1": 60000000000000000000000000, + "variableRateSlope2": 1500000000000000000000000000 }, - "0xBdfC85b140edF1FeaFd6eD664027AA4C23b4A29F": { - "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 550000000000000000000000000, - "optimalUsageRatio": 450000000000000000000000000, - "stableRateSlope1": 100000000000000000000000000, - "stableRateSlope2": 3000000000000000000000000000, - "variableRateSlope1": 70000000000000000000000000, + "0xA12D7bB07379ad6de4497B80088e28D4C00932D1": { + "baseVariableBorrowRate": 200000000000000000000000000, + "maxExcessUsageRatio": 500000000000000000000000000, + "optimalUsageRatio": 500000000000000000000000000, + "stableRateSlope1": 0, + "stableRateSlope2": 0, + "variableRateSlope1": 0, "variableRateSlope2": 3000000000000000000000000000 }, - "0xCc92073dDe8aE03bAA1812AC5cF22e69b5E76914": { - "baseVariableBorrowRate": 30000000000000000000000000, + "0xB2D822cAdb9040F3164829BC34e41a93cA3E01e5": { + "baseVariableBorrowRate": 200000000000000000000000000, "maxExcessUsageRatio": 200000000000000000000000000, "optimalUsageRatio": 800000000000000000000000000, "stableRateSlope1": 0, "stableRateSlope2": 0, - "variableRateSlope1": 120000000000000000000000000, - "variableRateSlope2": 1000000000000000000000000000 - }, - "0xE3a3DE71B827cB73663A24cDB6243bA7F986cC3b": { - "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 550000000000000000000000000, - "optimalUsageRatio": 450000000000000000000000000, - "stableRateSlope1": 100000000000000000000000000, - "stableRateSlope2": 3000000000000000000000000000, - "variableRateSlope1": 70000000000000000000000000, + "variableRateSlope1": 0, "variableRateSlope2": 3000000000000000000000000000 }, "0xED6547b83276B076B771B88FcCbD68BDeDb3927f": { @@ -1405,49 +1306,58 @@ "variableRateSlope1": 70000000000000000000000000, "variableRateSlope2": 3000000000000000000000000000 }, - "0xF0bA2a8c12A2354c075b363765EAe825619bd490": { + "0xF02EC9CA513ca505f0F5347E7D784Fa6165F8a99": { "baseVariableBorrowRate": 0, "maxExcessUsageRatio": 200000000000000000000000000, "optimalUsageRatio": 800000000000000000000000000, "stableRateSlope1": 20000000000000000000000000, "stableRateSlope2": 1000000000000000000000000000, - "variableRateSlope1": 40000000000000000000000000, + "variableRateSlope1": 60000000000000000000000000, "variableRateSlope2": 1000000000000000000000000000 }, - "0xFDBDa42D2aC1bfbbc10555eb255De8387b8977C4": { - "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 350000000000000000000000000, - "optimalUsageRatio": 650000000000000000000000000, - "stableRateSlope1": 100000000000000000000000000, + "0xF1AafF9a4Da6Bf4Fb8fc18d39C8ffdafbAACce69": { + "baseVariableBorrowRate": 1000000000000000000000000000, + "maxExcessUsageRatio": 990000000000000000000000000, + "optimalUsageRatio": 10000000000000000000000000, + "stableRateSlope1": 700000000000000000000000000, "stableRateSlope2": 3000000000000000000000000000, - "variableRateSlope1": 80000000000000000000000000, + "variableRateSlope1": 700000000000000000000000000, "variableRateSlope2": 3000000000000000000000000000 }, - "0xb0a73aC3B10980A598685d4631c83f5348F5D32c": { + "0xab7f8ca781C736EB624A9E321cd043F8E6292C96": { "baseVariableBorrowRate": 0, "maxExcessUsageRatio": 200000000000000000000000000, "optimalUsageRatio": 800000000000000000000000000, - "stableRateSlope1": 0, - "stableRateSlope2": 0, - "variableRateSlope1": 40000000000000000000000000, + "stableRateSlope1": 20000000000000000000000000, + "stableRateSlope2": 750000000000000000000000000, + "variableRateSlope1": 60000000000000000000000000, "variableRateSlope2": 750000000000000000000000000 }, - "0xb2eD1eCE1c13455Ce9299d35D3B00358529f3Dc8": { - "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 550000000000000000000000000, - "optimalUsageRatio": 450000000000000000000000000, - "stableRateSlope1": 0, - "stableRateSlope2": 0, - "variableRateSlope1": 70000000000000000000000000, + "0xb70e28437Aec70a8cfE5240F54c463cF849bE17C": { + "baseVariableBorrowRate": 1000000000000000000000000000, + "maxExcessUsageRatio": 990000000000000000000000000, + "optimalUsageRatio": 10000000000000000000000000, + "stableRateSlope1": 700000000000000000000000000, + "stableRateSlope2": 3000000000000000000000000000, + "variableRateSlope1": 700000000000000000000000000, "variableRateSlope2": 3000000000000000000000000000 }, - "0xb49034Ada4BE5c6Bb3823A623C6250267110b06b": { + "0xb72F23adE9b9980c2E731Ca504105fC860643619": { "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 550000000000000000000000000, - "optimalUsageRatio": 450000000000000000000000000, - "stableRateSlope1": 0, - "stableRateSlope2": 0, - "variableRateSlope1": 70000000000000000000000000, + "maxExcessUsageRatio": 100000000000000000000000000, + "optimalUsageRatio": 900000000000000000000000000, + "stableRateSlope1": 20000000000000000000000000, + "stableRateSlope2": 600000000000000000000000000, + "variableRateSlope1": 60000000000000000000000000, + "variableRateSlope2": 600000000000000000000000000 + }, + "0xb873ec463CAC50112B0e14d060fbc4192406279f": { + "baseVariableBorrowRate": 200000000000000000000000000, + "maxExcessUsageRatio": 200000000000000000000000000, + "optimalUsageRatio": 800000000000000000000000000, + "stableRateSlope1": 220000000000000000000000000, + "stableRateSlope2": 1500000000000000000000000000, + "variableRateSlope1": 0, "variableRateSlope2": 3000000000000000000000000000 }, "0xb8975328Aa52c00B9Ec1e11e518C4900f2e6C62a": { @@ -1459,6 +1369,15 @@ "variableRateSlope1": 38000000000000000000000000, "variableRateSlope2": 800000000000000000000000000 }, + "0xc83cDb49F234EC6666D7857B3EAa1302b109394C": { + "baseVariableBorrowRate": 200000000000000000000000000, + "maxExcessUsageRatio": 200000000000000000000000000, + "optimalUsageRatio": 800000000000000000000000000, + "stableRateSlope1": 20000000000000000000000000, + "stableRateSlope2": 750000000000000000000000000, + "variableRateSlope1": 0, + "variableRateSlope2": 3000000000000000000000000000 + }, "0xd4cA26F2496195C4F886D464D8578368236bB747": { "baseVariableBorrowRate": 0, "maxExcessUsageRatio": 550000000000000000000000000, @@ -1468,22 +1387,13 @@ "variableRateSlope1": 0, "variableRateSlope2": 0 }, - "0xf41E8F817e6C399d1AdE102059c454093b24f35B": { - "baseVariableBorrowRate": 0, + "0xeB65a3163Fd8900F4fE9a044e18966706b69A74D": { + "baseVariableBorrowRate": 200000000000000000000000000, "maxExcessUsageRatio": 350000000000000000000000000, "optimalUsageRatio": 650000000000000000000000000, "stableRateSlope1": 100000000000000000000000000, "stableRateSlope2": 3000000000000000000000000000, - "variableRateSlope1": 80000000000000000000000000, - "variableRateSlope2": 3000000000000000000000000000 - }, - "0xfd71623D7F41360aefE200de4f17E20A29e1d58C": { - "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 550000000000000000000000000, - "optimalUsageRatio": 450000000000000000000000000, - "stableRateSlope1": 100000000000000000000000000, - "stableRateSlope2": 3000000000000000000000000000, - "variableRateSlope1": 70000000000000000000000000, + "variableRateSlope1": 0, "variableRateSlope2": 3000000000000000000000000000 }, "0xff04ed5f7a6C3a0F1e5Ea20617F8C6f513D5A77c": { @@ -1494,15 +1404,6 @@ "stableRateSlope2": 0, "variableRateSlope1": 80000000000000000000000000, "variableRateSlope2": 2000000000000000000000000000 - }, - "0xfffE32106A68aA3eD39CcCE673B646423EEaB62a": { - "baseVariableBorrowRate": 0, - "maxExcessUsageRatio": 200000000000000000000000000, - "optimalUsageRatio": 800000000000000000000000000, - "stableRateSlope1": 20000000000000000000000000, - "stableRateSlope2": 750000000000000000000000000, - "variableRateSlope1": 40000000000000000000000000, - "variableRateSlope2": 750000000000000000000000000 } } } \ No newline at end of file diff --git a/scripts/CrosschainForwarders.s.sol b/scripts/CrosschainForwarders.s.sol deleted file mode 100644 index a4fd05b76..000000000 --- a/scripts/CrosschainForwarders.s.sol +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import '../src/ScriptUtils.sol'; -import {CrosschainForwarderPolygon} from '../src/crosschainforwarders/CrosschainForwarderPolygon.sol'; -import {CrosschainForwarderOptimism} from '../src/crosschainforwarders/CrosschainForwarderOptimism.sol'; -import {CrosschainForwarderArbitrum} from '../src/crosschainforwarders/CrosschainForwarderArbitrum.sol'; -import {CrosschainForwarderMetis} from '../src/crosschainforwarders/CrosschainForwarderMetis.sol'; - -contract DeployPol is EthereumScript { - function run() external broadcast { - new CrosschainForwarderPolygon(); - } -} - -contract DeployOpt is EthereumScript { - function run() external broadcast { - new CrosschainForwarderOptimism(); - } -} - -contract DeployArb is EthereumScript { - function run() external broadcast { - new CrosschainForwarderArbitrum(); - } -} - -contract DeployMet is EthereumScript { - function run() external broadcast { - new CrosschainForwarderMetis(); - } -} diff --git a/src/AaveHelpers.sol b/src/AaveHelpers.sol deleted file mode 100644 index a41e99ef9..000000000 --- a/src/AaveHelpers.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity >=0.7.5 <0.9.0; - -import {GovHelpers, AaveGovernanceV2} from './GovHelpers.sol'; -import {ProxyHelpers} from './ProxyHelpers.sol'; -import {ProtocolV3TestBase} from './ProtocolV3TestBase.sol'; diff --git a/src/GovHelpers.sol b/src/GovHelpers.sol deleted file mode 100644 index 564a486c7..000000000 --- a/src/GovHelpers.sol +++ /dev/null @@ -1,579 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0 -pragma solidity >=0.7.5 <0.9.0; -pragma abicoder v2; - -import {Vm} from 'forge-std/Vm.sol'; -import {console2} from 'forge-std/console2.sol'; -import {IpfsUtils} from './IpfsUtils.sol'; -import {AaveGovernanceV2, IAaveGovernanceV2, IExecutorWithTimelock} from 'aave-address-book/AaveGovernanceV2.sol'; -import {IPoolAddressesProvider} from 'aave-address-book/AaveV3.sol'; -import {AaveV3Avalanche} from 'aave-address-book/AaveV3Avalanche.sol'; -import {AaveV3Harmony} from 'aave-address-book/AaveV3Harmony.sol'; -import {AaveV3Fantom} from 'aave-address-book/AaveV3Fantom.sol'; -import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; -import {ProxyHelpers} from './ProxyHelpers.sol'; -import {ChainIds} from './ChainIds.sol'; -import {StorageHelpers} from './StorageHelpers.sol'; - -interface CommonExecutor { - /** - * @dev Execute the ActionsSet - * @param actionsSetId id of the ActionsSet to execute - **/ - function execute(uint256 actionsSetId) external payable; -} - -interface IProposalValidator { - /** - * @dev Get voting duration constant value - * @return the voting duration value in seconds - **/ - function VOTING_DURATION() external view returns (uint256); -} - -library GovHelpers { - error ExecutorNotFound(); - error LongBytesNotSupportedYet(); - - struct Payload { - address target; - uint256 value; - string signature; - bytes callData; - bool withDelegatecall; - } - - function ipfsHashFile(Vm vm, string memory filePath) internal returns (bytes32) { - return IpfsUtils.ipfsHashFile(vm, filePath, false); - } - - function buildMainnet(address payloadAddress) internal pure returns (Payload memory) { - require(payloadAddress != address(0), 'NON_ZERO_TARGET'); - require( - payloadAddress != AaveGovernanceV2.CROSSCHAIN_FORWARDER_OPTIMISM && - payloadAddress != AaveGovernanceV2.CROSSCHAIN_FORWARDER_METIS && - payloadAddress != AaveGovernanceV2.CROSSCHAIN_FORWARDER_ARBITRUM && - payloadAddress != AaveGovernanceV2.CROSSCHAIN_FORWARDER_POLYGON && - payloadAddress != AaveGovernanceV2.CROSSCHAIN_FORWARDER_BASE, - 'PAYLOAD_CANT_BE_FORWARDER' - ); - - return - Payload({ - target: payloadAddress, - signature: 'execute()', - callData: '', - value: 0, - withDelegatecall: true - }); - } - - function buildOptimism(address payloadAddress) internal pure returns (Payload memory) { - return - _buildL2({ - forwarder: AaveGovernanceV2.CROSSCHAIN_FORWARDER_OPTIMISM, - payloadAddress: payloadAddress - }); - } - - function buildArbitrum(address payloadAddress) internal pure returns (Payload memory) { - return - _buildL2({ - forwarder: AaveGovernanceV2.CROSSCHAIN_FORWARDER_ARBITRUM, - payloadAddress: payloadAddress - }); - } - - function buildPolygon(address payloadAddress) internal pure returns (Payload memory) { - return - _buildL2({ - forwarder: AaveGovernanceV2.CROSSCHAIN_FORWARDER_POLYGON, - payloadAddress: payloadAddress - }); - } - - function buildMetis(address payloadAddress) internal pure returns (Payload memory) { - return - _buildL2({ - forwarder: AaveGovernanceV2.CROSSCHAIN_FORWARDER_METIS, - payloadAddress: payloadAddress - }); - } - - function buildBase(address payloadAddress) internal pure returns (Payload memory) { - return - _buildL2({ - forwarder: AaveGovernanceV2.CROSSCHAIN_FORWARDER_BASE, - payloadAddress: payloadAddress - }); - } - - function _buildL2( - address forwarder, - address payloadAddress - ) private pure returns (Payload memory) { - require(payloadAddress != address(0), 'NON_ZERO_TARGET'); - return - Payload({ - target: forwarder, - value: 0, - signature: 'execute(address)', - callData: abi.encode(payloadAddress), - withDelegatecall: true - }); - } - - function createProposal(Payload[] memory payloads, bytes32 ipfsHash) internal returns (uint256) { - return _createProposal(AaveGovernanceV2.SHORT_EXECUTOR, payloads, ipfsHash, false); - } - - function createProposal( - Payload[] memory payloads, - bytes32 ipfsHash, - bool emitLog - ) internal returns (uint256) { - return _createProposal(AaveGovernanceV2.SHORT_EXECUTOR, payloads, ipfsHash, emitLog); - } - - function createProposal( - Payload[] memory payloads, - bytes32 ipfsHash, - address executor - ) internal returns (uint256) { - return _createProposal(executor, payloads, ipfsHash, false); - } - - function createProposal( - Payload[] memory payloads, - bytes32 ipfsHash, - bool emitLog, - address executor - ) internal returns (uint256) { - return _createProposal(executor, payloads, ipfsHash, emitLog); - } - - function _createProposal( - address executor, - Payload[] memory payloads, - bytes32 ipfsHash, - bool emitLog - ) private returns (uint256) { - require(block.chainid == ChainIds.MAINNET, 'MAINNET_ONLY'); - require(payloads.length != 0, 'MINIMUM_ONE_PAYLOAD'); - require(ipfsHash != bytes32(0), 'NON_ZERO_IPFS_HASH'); - - address[] memory targets = new address[](payloads.length); - uint256[] memory values = new uint256[](payloads.length); - string[] memory signatures = new string[](payloads.length); - bytes[] memory calldatas = new bytes[](payloads.length); - bool[] memory withDelegatecalls = new bool[](payloads.length); - for (uint256 i = 0; i < payloads.length; i++) { - require(payloads[i].target != address(0), 'NON_ZERO_TARGET'); - targets[i] = payloads[i].target; - signatures[i] = payloads[i].signature; - calldatas[i] = payloads[i].callData; - values[i] = payloads[i].value; - withDelegatecalls[i] = payloads[i].withDelegatecall; - } - - if (emitLog) { - console2.logBytes( - abi.encodeWithSelector( - AaveGovernanceV2.GOV.create.selector, - IExecutorWithTimelock(executor), - targets, - values, - signatures, - calldatas, - withDelegatecalls, - ipfsHash - ) - ); - } - - return - AaveGovernanceV2.GOV.create( - IExecutorWithTimelock(executor), - targets, - values, - signatures, - calldatas, - withDelegatecalls, - ipfsHash - ); - } - - /** - * @dev Impersonate the ecosystem reserve and creates the proposal. - */ - function createTestProposal( - Vm vm, - Payload[] memory payloads, - address executor - ) internal returns (uint256) { - vm.deal(MiscEthereum.ECOSYSTEM_RESERVE, 1 ether); - vm.startPrank(MiscEthereum.ECOSYSTEM_RESERVE); - uint256 proposalId = _createProposal(executor, payloads, bytes32('test'), false); - vm.stopPrank(); - return proposalId; - } - - function passVoteAndExecute(Vm vm, uint256 proposalId) internal { - passVoteAndQueue(vm, proposalId); - uint256 executionTime = AaveGovernanceV2.GOV.getProposalById(proposalId).executionTime; - vm.warp(executionTime + 1); - AaveGovernanceV2.GOV.execute(proposalId); - } - - function passVoteAndQueue(Vm vm, uint256 proposalId) internal { - passVote(vm, proposalId); - AaveGovernanceV2.GOV.queue(proposalId); - } - - /** - * Alter storage slots so the proposal passes - */ - function passVote(Vm vm, uint256 proposalId) internal { - uint256 power = 5000000 ether; - vm.roll(block.number + 1); - vm.store( - address(AaveGovernanceV2.GOV), - bytes32(uint256(keccak256(abi.encode(proposalId, 0x4))) + 11), - bytes32(power) - ); - uint256 endBlock = AaveGovernanceV2.GOV.getProposalById(proposalId).endBlock; - vm.roll(endBlock + 1); - } - - /** - * @dev executes latest actionset on a l2 executor - * @param vm Vm instance passed down from test - */ - function executeLatestActionSet(Vm vm, address executor) internal { - uint256 proposalCount = uint256(vm.load(executor, bytes32(uint256(5)))); - executeActionSet(vm, proposalCount - 1, executor); - } - - /** - * @dev executes specified actionset on a l2 executor - * @param vm Vm instance passed down from test - * @param actionSetId id of actionset to execute - */ - function executeActionSet(Vm vm, uint256 actionSetId, address executor) internal { - uint256 proposalBaseSlot = StorageHelpers.getStorageSlotUintMapping(6, actionSetId); - vm.store(executor, bytes32(proposalBaseSlot + 5), bytes32(block.timestamp)); - CommonExecutor(executor).execute(actionSetId); - } - - /** - * @dev executes specified payloadAddress on a specified executor via delegatecall - * @notice this method accepts arbitrary executors (guardians and executors) - * @param vm Vm instance passed down from test - * @param executor address of the executor - * @param payloadAddress address of payload to execute - */ - function executePayload(Vm vm, address payloadAddress, address executor) internal { - if ( - block.chainid == ChainIds.MAINNET && - (executor == AaveGovernanceV2.SHORT_EXECUTOR || executor == AaveGovernanceV2.LONG_EXECUTOR) - ) { - Payload[] memory proposals = new Payload[](1); - proposals[0] = Payload({ - target: payloadAddress, - signature: 'execute()', - callData: '', - withDelegatecall: true, - value: 0 - }); - uint256 proposalId = _queueProposalToL1ExecutorStorage(vm, executor, proposals); - AaveGovernanceV2.GOV.execute(proposalId); - } else if (_isKnownL2Executor(executor)) { - Payload[] memory proposals = new Payload[](1); - proposals[0] = Payload({ - target: payloadAddress, - signature: 'execute()', - callData: '', - withDelegatecall: true, - value: 0 - }); - uint256 proposalId = _queueProposalToL2ExecutorStorage(vm, executor, proposals); - CommonExecutor(executor).execute(proposalId); - } else { - MockExecutor mockExecutor = new MockExecutor(); - vm.etch(executor, address(mockExecutor).code); - MockExecutor(executor).execute(payloadAddress); - } - } - - /** - * @notice Executor storage is the same on all l2s - * @param vm vm - * @param params proposal - */ - function _queueProposalToL2ExecutorStorage( - Vm vm, - address l2Executor, - Payload[] memory params - ) internal returns (uint256) { - // count is stored in slot 5 - uint256 proposalCount = uint256(vm.load(l2Executor, bytes32(uint256(5)))); - // bump counter by 1 - vm.store(l2Executor, bytes32(uint256(5)), bytes32(proposalCount + 1)); - - // set storage array sizes - // actionSetSlot - uint256 proposalBaseSlot = StorageHelpers.getStorageSlotUintMapping(6, proposalCount); - // targets - vm.store(l2Executor, bytes32(proposalBaseSlot), bytes32(params.length)); - // values - vm.store(l2Executor, bytes32(proposalBaseSlot + 1), bytes32(params.length)); - // signatures - vm.store(l2Executor, bytes32(proposalBaseSlot + 2), bytes32(params.length)); - // calldatas - vm.store(l2Executor, bytes32(proposalBaseSlot + 3), bytes32(params.length)); - // withDelegateCalls - vm.store(l2Executor, bytes32(proposalBaseSlot + 4), bytes32(params.length)); - - // store actual values - for (uint256 i = 0; i < params.length; i++) { - // targets - vm.store( - l2Executor, - bytes32(StorageHelpers.arrLocation(proposalBaseSlot, i, 1)), - bytes32(uint256(uint160(params[i].target))) - ); - // values - vm.store( - l2Executor, - bytes32(StorageHelpers.arrLocation(proposalBaseSlot + 1, i, 1)), - bytes32(0) - ); - // signatures - if (bytes(params[i].signature).length > 31) revert LongBytesNotSupportedYet(); - vm.store( - l2Executor, - bytes32(StorageHelpers.arrLocation(proposalBaseSlot + 2, i, 1)), - bytes32( - bytes.concat( - bytes31(bytes(params[i].signature)), - bytes1(uint8(bytes(params[i].signature).length * 2)) - ) - ) - ); - // calldatas - if (params[i].callData.length > 31) revert LongBytesNotSupportedYet(); - vm.store( - l2Executor, - bytes32(StorageHelpers.arrLocation(proposalBaseSlot + 3, i, 1)), - bytes32( - bytes.concat( - bytes31(bytes(params[i].callData)), - bytes1(uint8(bytes(params[i].callData).length * 2)) - ) - ) - ); - // withDelegateCalls - vm.store( - l2Executor, - bytes32(StorageHelpers.arrLocation(proposalBaseSlot + 4, i, 1)), - bytes32(uint256(1)) - ); - } - // executiontime - vm.store(l2Executor, bytes32(proposalBaseSlot + 5), bytes32(block.timestamp)); - return proposalCount; - } - - /** - * @notice Creates a proposal via storage overwrites - * @param vm vm - * @param params proposal - */ - function _queueProposalToL1ExecutorStorage( - Vm vm, - address l1Executor, - Payload[] memory params - ) internal returns (uint256) { - // struct Proposal { - // uint256 id; // 0 - // address creator; // 1 - // IExecutorWithTimelock executor; // 2 - // address[] targets; // 3 - // uint256[] values; // 4 - // string[] signatures; // 5 - // bytes[] calldatas; // 6 - // bool[] withDelegatecalls; // 7 - // uint256 startBlock; // 8 - // uint256 endBlock; // 9 - // uint256 executionTime; // 10 - // uint256 forVotes; // 11 - // uint256 againstVotes; // 12 - // bool executed; // 13 0-8 - // bool canceled; // 13 9-16 - // address strategy; // 13 16-176 - // bytes32 ipfsHash; // 14 - // mapping(address => Vote) votes; // 15 - // } - // count is stored in slot 5 - uint256 proposalCount = uint256(vm.load(address(AaveGovernanceV2.GOV), bytes32(uint256(3)))); - // bump counter by 1 - vm.store(address(AaveGovernanceV2.GOV), bytes32(uint256(3)), bytes32(proposalCount + 1)); - - // set storage array sizes - // proposals - uint256 proposalBaseSlot = StorageHelpers.getStorageSlotUintMapping(4, proposalCount); - // id - vm.store(address(AaveGovernanceV2.GOV), bytes32(proposalBaseSlot), bytes32(proposalCount)); - // creator - vm.store( - address(AaveGovernanceV2.GOV), - bytes32(proposalBaseSlot + 1), - bytes32(uint256(uint160(msg.sender))) - ); - // executor - vm.store( - address(AaveGovernanceV2.GOV), - bytes32(proposalBaseSlot + 2), - bytes32(uint256(uint160(l1Executor))) - ); - // targets - vm.store(address(AaveGovernanceV2.GOV), bytes32(proposalBaseSlot + 3), bytes32(params.length)); - // values - vm.store(address(AaveGovernanceV2.GOV), bytes32(proposalBaseSlot + 4), bytes32(params.length)); - // signatures - vm.store(address(AaveGovernanceV2.GOV), bytes32(proposalBaseSlot + 5), bytes32(params.length)); - // calldatas - vm.store(address(AaveGovernanceV2.GOV), bytes32(proposalBaseSlot + 6), bytes32(params.length)); - // withDelegateCalls - vm.store(address(AaveGovernanceV2.GOV), bytes32(proposalBaseSlot + 7), bytes32(params.length)); - // block math - uint256 dalay = AaveGovernanceV2.GOV.getVotingDelay(); // (blocks) delay in voting blocks before voting can happen - uint256 duration = IProposalValidator(l1Executor).VOTING_DURATION(); // (blocks) duration of the voting - uint256 executionTime = block.timestamp; - // @dev the block timings are not accurate, but enough to satisfy execution - // startBlock - vm.store( - address(AaveGovernanceV2.GOV), - bytes32(proposalBaseSlot + 8), - bytes32(block.number - (dalay + duration)) - ); - // endBlock - vm.store( - address(AaveGovernanceV2.GOV), - bytes32(proposalBaseSlot + 9), - bytes32(block.number - 1) - ); - // executionTime - vm.store(address(AaveGovernanceV2.GOV), bytes32(proposalBaseSlot + 10), bytes32(executionTime)); - // forVotes - vm.store( - address(AaveGovernanceV2.GOV), - bytes32(proposalBaseSlot + 11), - bytes32(uint256(15_000_000 ether)) // TODO: calculate needed amount - ); - // strategy - vm.store( - address(AaveGovernanceV2.GOV), - bytes32(proposalBaseSlot + 13), - bytes32(uint256(uint160(AaveGovernanceV2.GOV.getGovernanceStrategy())) << 16) - ); - // store actual values - for (uint256 i = 0; i < params.length; i++) { - bytes32 queueHash = keccak256( - abi.encode( - params[i].target, - 0, - params[i].signature, - params[i].callData, - executionTime, - true - ) - ); - // queue hash on executor - vm.store( - l1Executor, - bytes32( - StorageHelpers.getStorageSlotBytes32Mapping( - // the mapping slot is 3 on short and 7 on long - l1Executor == AaveGovernanceV2.SHORT_EXECUTOR ? 3 : 7, - queueHash - ) - ), - bytes32(uint256(1)) - ); - // targets - vm.store( - address(AaveGovernanceV2.GOV), - bytes32(StorageHelpers.arrLocation(proposalBaseSlot + 3, i, 1)), - bytes32(uint256(uint160(params[i].target))) - ); - // values - vm.store( - address(AaveGovernanceV2.GOV), - bytes32(StorageHelpers.arrLocation(proposalBaseSlot + 4, i, 1)), - bytes32(0) - ); - // signatures - if (bytes(params[i].signature).length > 31) revert LongBytesNotSupportedYet(); - vm.store( - address(AaveGovernanceV2.GOV), - bytes32(StorageHelpers.arrLocation(proposalBaseSlot + 5, i, 1)), - bytes32( - bytes.concat( - bytes31(bytes(params[i].signature)), - bytes1(uint8(bytes(params[i].signature).length * 2)) - ) - ) - ); - // calldatas - if (params[i].callData.length > 31) revert LongBytesNotSupportedYet(); - vm.store( - address(AaveGovernanceV2.GOV), - bytes32(StorageHelpers.arrLocation(proposalBaseSlot + 6, i, 1)), - bytes32( - bytes.concat( - bytes31(bytes(params[i].callData)), - bytes1(uint8(bytes(params[i].callData).length * 2)) - ) - ) - ); - // withDelegateCalls - vm.store( - address(AaveGovernanceV2.GOV), - bytes32(StorageHelpers.arrLocation(proposalBaseSlot + 7, i, 1)), - bytes32(uint256(1)) - ); - } - return proposalCount; - } - - function _isKnownL2Executor(address executor) internal view returns (bool) { - if (executor == AaveGovernanceV2.OPTIMISM_BRIDGE_EXECUTOR && block.chainid == ChainIds.OPTIMISM) - return true; - if (executor == AaveGovernanceV2.POLYGON_BRIDGE_EXECUTOR && block.chainid == ChainIds.POLYGON) - return true; - if (executor == AaveGovernanceV2.METIS_BRIDGE_EXECUTOR && block.chainid == ChainIds.METIS) - return true; - if (executor == AaveGovernanceV2.ARBITRUM_BRIDGE_EXECUTOR && block.chainid == ChainIds.ARBITRUM) - return true; - if (executor == AaveGovernanceV2.BASE_BRIDGE_EXECUTOR && block.chainid == ChainIds.BASE) - return true; - // not a l2, but following same interface & stroage - if (executor == AaveGovernanceV2.ARC_TIMELOCK && block.chainid == ChainIds.MAINNET) return true; - return false; - } -} - -/** - * @dev Mock contract which allows performing a delegatecall to `execute` - * Intended to be used as replacement for L2 admins/executors to mock governance/gnosis execution. - */ -contract MockExecutor { - /** - * @notice Non-standard functionality used to skip governance and just execute a payload. - */ - function execute(address payload) public { - (bool success, ) = payload.delegatecall(abi.encodeWithSignature('execute()')); - require(success, 'PROPOSAL_EXECUTION_FAILED'); - } -} diff --git a/src/GovV3Helpers.sol b/src/GovV3Helpers.sol index 5a3f8ea8a..a879c66ab 100644 --- a/src/GovV3Helpers.sol +++ b/src/GovV3Helpers.sol @@ -23,47 +23,8 @@ import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; import {Address} from 'solidity-utils/contracts/oz-common/Address.sol'; import {StorageHelpers} from './StorageHelpers.sol'; import {ProxyHelpers} from './ProxyHelpers.sol'; -import {GovHelpers, IAaveGovernanceV2} from './GovHelpers.sol'; import {Create2Utils} from './ScriptUtils.sol'; -interface IGovernance_V2_5 { - /** - * @notice emitted when gas limit gets updated - * @param gasLimit the new gas limit - */ - event GasLimitUpdated(uint256 indexed gasLimit); - - /** - * @notice method to get the CrossChainController contract address of the currently deployed address - * @return address of CrossChainController contract - */ - function CROSS_CHAIN_CONTROLLER() external view returns (address); - - /** - * @notice method to get the name of the contract - * @return name string - */ - function NAME() external view returns (string memory); - - /** - * @notice method to get the gas limit used on destination chain to execute bridged message - * @return gas limit - * @dev this gas limit is assuming that the messages to forward are only payload execution messages - */ - function GAS_LIMIT() external view returns (uint256); - - /** - * @notice method to send a payload to execution chain - * @param payload object with the information needed for execution - */ - function forwardPayloadForExecution(PayloadsControllerUtils.Payload memory payload) external; - - /** - * @notice method to initialize governance v2.5 - */ - function initialize() external; -} - library GovV3Helpers { error CannotFindPayload(); error CannotFindPayloadsController(); @@ -588,37 +549,6 @@ library GovV3Helpers { GovernanceV3Ethereum.GOVERNANCE.executeProposal(proposalId); } - function build2_5Payload( - PayloadsControllerUtils.Payload memory payload - ) internal returns (GovHelpers.Payload memory) { - return - GovHelpers.Payload({ - target: address(GovernanceV3Ethereum.GOVERNANCE), - value: 0, - signature: 'forwardPayloadForExecution((uint256,uint8,address,uint40))', - callData: abi.encode(payload), - withDelegatecall: false - }); - } - - // temporarily patched create proposal for governance v2.5 - function createProposal2_5( - Vm vm, - PayloadsControllerUtils.Payload[] memory payloads, - bytes32 ipfsHash - ) internal returns (uint256) { - require(block.chainid == ChainIds.MAINNET, 'MAINNET_ONLY'); - require(payloads.length != 0, 'MINIMUM_ONE_PAYLOAD'); - require(ipfsHash != bytes32(0), 'NON_ZERO_IPFS_HASH'); - - generateProposalPreviewLink(vm, payloads, ipfsHash, address(0)); - GovHelpers.Payload[] memory gov2Payloads = new GovHelpers.Payload[](payloads.length); - for (uint256 i = 0; i < payloads.length; i++) { - gov2Payloads[i] = build2_5Payload(payloads[i]); - } - return GovHelpers.createProposal(gov2Payloads, ipfsHash, true); - } - /** * @dev creates a proposal with a single payload * @param vm Vm diff --git a/src/crosschainforwarders/CrosschainForwarderArbitrum.sol b/src/crosschainforwarders/CrosschainForwarderArbitrum.sol deleted file mode 100644 index 9c0aa56f2..000000000 --- a/src/crosschainforwarders/CrosschainForwarderArbitrum.sol +++ /dev/null @@ -1,110 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {AaveGovernanceV2} from 'aave-address-book/AaveGovernanceV2.sol'; -import {AaveV3Arbitrum} from 'aave-address-book/AaveV3Arbitrum.sol'; -import {IInbox} from 'governance-crosschain-bridges/contracts/dependencies/arbitrum/interfaces/IInbox.sol'; -import {IL2BridgeExecutor} from 'governance-crosschain-bridges/contracts/interfaces/IL2BridgeExecutor.sol'; - -/** - * @title A generic executor for proposals targeting the arbitrum v3 pool - * @author BGD Labs - * @notice You can **only** use this executor when the arbitrum payload has a `execute()` signature without parameters - * @notice You can **only** use this executor when the arbitrum payload is expected to be executed via `DELEGATECALL` - * @notice This contract assumes to be called via AAVE Governance V2 - * @notice This contract will assume the SHORT_EXECUTOR will be topped up with enough funds to fund the short executor - * @dev This executor is a generic wrapper to be used with Arbitrum Inbox (https://developer.offchainlabs.com/arbos/l1-to-l2-messaging) - * It encodes a parameterless `execute()` with delegate calls and a specified target. - * This encoded abi is then send to the Inbox to be synced executed on the arbitrum network. - * Once synced the ARBITRUM_BRIDGE_EXECUTOR will queue the execution of the payload. - */ -contract CrosschainForwarderArbitrum { - IInbox public constant INBOX = IInbox(0x4Dbd4fc535Ac27206064B68FfCf827b0A60BAB3f); - address public constant ARBITRUM_BRIDGE_EXECUTOR = AaveGovernanceV2.ARBITRUM_BRIDGE_EXECUTOR; - address public constant ARBITRUM_GUARDIAN = 0xbbd9f90699c1FA0D7A65870D241DD1f1217c96Eb; - - // amount of gwei to overpay on basefee for fast submission - uint256 public constant BASE_FEE_MARGIN = 10 gwei; - - /** - * @dev calculateRetryableSubmissionFee on `0x00000000000000000000000000000000000000C8` for a queue call with 1 slot will yield a constant gasLimit of `429478` - * To account for some margin we rounded up to 450000 - */ - uint256 public constant L2_GAS_LIMIT = 450000; - - /** - * @dev There is currently no oracle on L1 exposing gasPrice of arbitrum. Therefore we overpay by assuming 1 gwei (10x of current price). - */ - uint256 public constant L2_MAX_FEE_PER_GAS = 1 gwei; - - /** - * @dev returns the amount of gas needed for submitting the ticket - * @param bytesLength the payload bytes length (usually 580) - * @return uint256 maxSubmissionFee needed on L2 with BASE_FEE_MARGIN - * @return uint256 estimated L2 redepmption fee - */ - function getRequiredGas(uint256 bytesLength) public view returns (uint256, uint256) { - return ( - INBOX.calculateRetryableSubmissionFee(bytesLength, block.basefee + BASE_FEE_MARGIN), - L2_GAS_LIMIT * L2_MAX_FEE_PER_GAS - ); - } - - /** - * @dev checks if the short executor is topped up with enough eth for proposal execution - * with current basefee - * @param bytesLength the payload bytes length (usually 580) - * @return bool indicating if the SHORT_EXECUTOR has sufficient funds - * @return uint256 the gas required for ticket creation and redemption - */ - function hasSufficientGasForExecution(uint256 bytesLength) public view returns (bool, uint256) { - (uint256 maxSubmission, uint256 maxRedemption) = getRequiredGas(bytesLength); - uint256 requiredGas = maxSubmission + maxRedemption; - return (AaveGovernanceV2.SHORT_EXECUTOR.balance >= requiredGas, requiredGas); - } - - /** - * @dev encodes the queue call which is forwarded to arbitrum - * @param l2PayloadContract the address of the arbitrum payload - */ - function getEncodedPayload(address l2PayloadContract) public pure returns (bytes memory) { - address[] memory targets = new address[](1); - targets[0] = l2PayloadContract; - uint256[] memory values = new uint256[](1); - values[0] = 0; - string[] memory signatures = new string[](1); - signatures[0] = 'execute()'; - bytes[] memory calldatas = new bytes[](1); - calldatas[0] = ''; - bool[] memory withDelegatecalls = new bool[](1); - withDelegatecalls[0] = true; - return - abi.encodeWithSelector( - IL2BridgeExecutor.queue.selector, - targets, - values, - signatures, - calldatas, - withDelegatecalls - ); - } - - /** - * @dev this function will be executed once the proposal passes the mainnet vote. - * @param l2PayloadContract the arbitrum contract containing the `execute()` signature. - */ - function execute(address l2PayloadContract) public { - bytes memory queue = getEncodedPayload(l2PayloadContract); - (uint256 maxSubmission, uint256 maxRedemption) = getRequiredGas(queue.length); - INBOX.unsafeCreateRetryableTicket{value: maxSubmission + maxRedemption}( - ARBITRUM_BRIDGE_EXECUTOR, - 0, // l2CallValue - maxSubmission, // maxSubmissionCost - address(ARBITRUM_BRIDGE_EXECUTOR), // excessFeeRefundAddress - address(ARBITRUM_GUARDIAN), // callValueRefundAddress - L2_GAS_LIMIT, // gasLimit - L2_MAX_FEE_PER_GAS, // maxFeePerGas - queue - ); - } -} diff --git a/src/crosschainforwarders/CrosschainForwarderMetis.sol b/src/crosschainforwarders/CrosschainForwarderMetis.sol deleted file mode 100644 index 965dcb139..000000000 --- a/src/crosschainforwarders/CrosschainForwarderMetis.sol +++ /dev/null @@ -1,67 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {AaveGovernanceV2} from 'aave-address-book/AaveGovernanceV2.sol'; -import {ICrossDomainMessenger} from 'governance-crosschain-bridges/contracts/dependencies/optimism/interfaces/ICrossDomainMessenger.sol'; -import {IL2BridgeExecutor} from 'governance-crosschain-bridges/contracts/interfaces/IL2BridgeExecutor.sol'; - -/** - * @title A generic executor for proposals targeting the metis v3 pool - * @author BGD Labs - * @notice You can **only** use this executor when the metis payload has a `execute()` signature without parameters - * @notice You can **only** use this executor when the metis payload is expected to be executed via `DELEGATECALL` - * @notice The L2CrossDomainMessenger can **only** queue an action on metis with up to a max gas which is specified in `MAX_GAS_LIMIT`. - * It encodes and sends via the L2CrossDomainMessenger a message to queue for execution an action on L2, in the Aave METIS_BRIDGE_EXECUTOR. - */ -contract CrosschainForwarderMetis { - /** - * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages - * from L2 onto L1. In this contract it's used by the governance SHORT_EXECUTOR to send the encoded L2 queuing over the bridge. - */ - address public constant L1_CROSS_DOMAIN_MESSENGER_ADDRESS = - 0x081D1101855bD523bA69A9794e0217F0DB6323ff; - - /** - * @dev The metis bridge executor is a L2 governance execution contract. - * This contract allows queuing of proposals by allow listed addresses (in this case the L1 short executor). - * https://andromeda-explorer.metis.io/address/0x8EC77963068474a45016938Deb95E603Ca82a029 - */ - address public constant METIS_BRIDGE_EXECUTOR = AaveGovernanceV2.METIS_BRIDGE_EXECUTOR; - - /** - * @dev The gas limit of the queue transaction by the L2CrossDomainMessenger on L2. - * The limit seems reasonable considering the queue transaction, as all gas limits are prepaid. - */ - uint32 public constant MAX_GAS_LIMIT = 5_000_000; - - /** - * @dev this function will be executed once the proposal passes the mainnet vote. - * @param l2PayloadContract the metis contract containing the `execute()` signature. - */ - function execute(address l2PayloadContract) public { - address[] memory targets = new address[](1); - targets[0] = l2PayloadContract; - uint256[] memory values = new uint256[](1); - values[0] = 0; - string[] memory signatures = new string[](1); - signatures[0] = 'execute()'; - bytes[] memory calldatas = new bytes[](1); - calldatas[0] = ''; - bool[] memory withDelegatecalls = new bool[](1); - withDelegatecalls[0] = true; - - bytes memory queue = abi.encodeWithSelector( - IL2BridgeExecutor.queue.selector, - targets, - values, - signatures, - calldatas, - withDelegatecalls - ); - ICrossDomainMessenger(L1_CROSS_DOMAIN_MESSENGER_ADDRESS).sendMessage( - METIS_BRIDGE_EXECUTOR, - queue, - MAX_GAS_LIMIT - ); - } -} diff --git a/src/crosschainforwarders/CrosschainForwarderOptimism.sol b/src/crosschainforwarders/CrosschainForwarderOptimism.sol deleted file mode 100644 index fca432e82..000000000 --- a/src/crosschainforwarders/CrosschainForwarderOptimism.sol +++ /dev/null @@ -1,74 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {ICrossDomainMessenger} from 'governance-crosschain-bridges/contracts/dependencies/optimism/interfaces/ICrossDomainMessenger.sol'; -import {IL2BridgeExecutor} from 'governance-crosschain-bridges/contracts/interfaces/IL2BridgeExecutor.sol'; - -interface ICanonicalTransactionChain { - function enqueueL2GasPrepaid() external view returns (uint256); -} - -/** - * @title A generic executor for proposals targeting the optimism v3 pool - * @author BGD Labs - * @notice You can **only** use this executor when the optimism payload has a `execute()` signature without parameters - * @notice You can **only** use this executor when the optimism payload is expected to be executed via `DELEGATECALL` - * @notice You can **only** execute payloads on optimism with up to prepayed gas which is specified in `enqueueL2GasPrepaid` gas. - * Prepaid gas is the maximum gas covered by the bridge without additional payment. - * @dev This executor is a generic wrapper to be used with Optimism CrossDomainMessenger (https://etherscan.io/address/0x25ace71c97b33cc4729cf772ae268934f7ab5fa1) - * It encodes and sends via the L2CrossDomainMessenger a message to queue for execution an action on L2, in the Aave OPTIMISM_BRIDGE_EXECUTOR. - */ -contract CrosschainForwarderOptimism { - /** - * @dev The L1 Cross Domain Messenger contract sends messages from L1 to L2, and relays messages - * from L2 onto L1. In this contract it's used by the governance SHORT_EXECUTOR to send the encoded L2 queuing over the bridge. - */ - address public constant L1_CROSS_DOMAIN_MESSENGER_ADDRESS = - 0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1; - - /** - * @dev The optimism bridge executor is a L2 governance execution contract. - * This contract allows queuing of proposals by allow listed addresses (in this case the L1 short executor). - * https://optimistic.etherscan.io/address/0x7d9103572bE58FfE99dc390E8246f02dcAe6f611 - */ - address public constant OPTIMISM_BRIDGE_EXECUTOR = 0x7d9103572bE58FfE99dc390E8246f02dcAe6f611; - - /** - * @dev The CTC contract is an append only log of transactions which must be applied to the rollup state. - * It also holds configurations like the currently prepayed amount of gas which is what this contract is utilizing. - * https://etherscan.io/address/0x5e4e65926ba27467555eb562121fac00d24e9dd2#code - */ - ICanonicalTransactionChain public constant CANONICAL_TRANSACTION_CHAIN = - ICanonicalTransactionChain(0x5E4e65926BA27467555EB562121fac00D24E9dD2); - - /** - * @dev this function will be executed once the proposal passes the mainnet vote. - * @param l2PayloadContract the optimism contract containing the `execute()` signature. - */ - function execute(address l2PayloadContract) public { - address[] memory targets = new address[](1); - targets[0] = l2PayloadContract; - uint256[] memory values = new uint256[](1); - values[0] = 0; - string[] memory signatures = new string[](1); - signatures[0] = 'execute()'; - bytes[] memory calldatas = new bytes[](1); - calldatas[0] = ''; - bool[] memory withDelegatecalls = new bool[](1); - withDelegatecalls[0] = true; - - bytes memory queue = abi.encodeWithSelector( - IL2BridgeExecutor.queue.selector, - targets, - values, - signatures, - calldatas, - withDelegatecalls - ); - ICrossDomainMessenger(L1_CROSS_DOMAIN_MESSENGER_ADDRESS).sendMessage( - OPTIMISM_BRIDGE_EXECUTOR, - queue, - uint32(CANONICAL_TRANSACTION_CHAIN.enqueueL2GasPrepaid()) - ); - } -} diff --git a/src/crosschainforwarders/CrosschainForwarderPolygon.sol b/src/crosschainforwarders/CrosschainForwarderPolygon.sol deleted file mode 100644 index 1ada02d6c..000000000 --- a/src/crosschainforwarders/CrosschainForwarderPolygon.sol +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IFxStateSender} from 'governance-crosschain-bridges/contracts/dependencies/polygon/fxportal/FxRoot.sol'; - -/** - * @title A generic executor for proposals targeting the polygon v3 pool - * @author BGD Labs - * @notice You can **only** use this executor when the polygon payload has a `execute()` signature without parameters - * @notice You can **only** use this executor when the polygon payload is expected to be executed via `DELEGATECALL` - * @dev This executor is a generic wrapper to be used with FX bridges (https://github.com/fx-portal/contracts) - * It encodes a parameterless `execute()` with delegate calls and a specified target. - * This encoded abi is then send to the FX-root to be synced to the FX-child on the polygon network. - * Once synced the POLYGON_BRIDGE_EXECUTOR will queue the execution of the payload. - */ -contract CrosschainForwarderPolygon { - address public constant FX_ROOT_ADDRESS = 0xfe5e5D361b2ad62c541bAb87C45a0B9B018389a2; - address public constant POLYGON_BRIDGE_EXECUTOR = 0xdc9A35B16DB4e126cFeDC41322b3a36454B1F772; - - /** - * @dev this function will be executed once the proposal passes the mainnet vote. - * @param l2PayloadContract the polygon contract containing the `execute()` signature. - */ - function execute(address l2PayloadContract) public { - address[] memory targets = new address[](1); - targets[0] = l2PayloadContract; - uint256[] memory values = new uint256[](1); - values[0] = 0; - string[] memory signatures = new string[](1); - signatures[0] = 'execute()'; - bytes[] memory calldatas = new bytes[](1); - calldatas[0] = ''; - bool[] memory withDelegatecalls = new bool[](1); - withDelegatecalls[0] = true; - - bytes memory actions = abi.encode(targets, values, signatures, calldatas, withDelegatecalls); - IFxStateSender(FX_ROOT_ADDRESS).sendMessageToChild(POLYGON_BRIDGE_EXECUTOR, actions); - } -} diff --git a/src/crosschainforwarders/README.md b/src/crosschainforwarders/README.md deleted file mode 100644 index 7d5d866b6..000000000 --- a/src/crosschainforwarders/README.md +++ /dev/null @@ -1,59 +0,0 @@ -# CrosschainForwarder - -## About - -To simplify the process of creating a cross-chain proposal this repository contains opinionated `CrosschainForwarder` contracts for `Polygon`, `Optimism`, `Metis` and `Arbitrum` abstracting away the complexity of bridging & cross-chain gas calculations. -All the forwarders follow the same pattern. They expect a payload to be deployed on L2 and to be executed with a parameterless `execute()` signature and via `DELEGATECALL`. - -![visualization](./bridge-listing.png) - -### Polygon - -For a proposal to be executed on Polygon it needs to pass a mainnet governance proposal that sends an encoded payload via `sendMessageToChild(address,bytes)` on [FX_ROOT](https://etherscan.io/address/0xfe5e5D361b2ad62c541bAb87C45a0B9B018389a2#code)(mainnet) to [FX_CHILD](https://polygonscan.com/address/0x8397259c983751DAf40400790063935a11afa28a#code)(Polygon). -Once the state is synced to `FX_CHILD` on Polygon network it will queue the payload on [POLYGON_BRIDGE_EXECUTOR](https://polygonscan.com/address/0xdc9A35B16DB4e126cFeDC41322b3a36454B1F772#code). - -### Optimism - -For a proposal to be executed on Optimism it needs to pass a mainnet governance proposal that sends an encoded payload via `sendMessage(address,bytes,uint32)` on [L1_CROSS_DOMAIN_MESSENGER](https://etherscan.io/address/0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1)(mainnet) to [L2_CROSS_DOMAIN_MESSENGER](https://optimistic.etherscan.io/address/0x4200000000000000000000000000000000000007#code)(Optimism). -Once the state is `L2_CROSS_DOMAIN_MESSENGER` on Optimism it will queue the payload on [OPTIMISM_BRIDGE_EXECUTOR](https://optimistic.etherscan.io/address/0x7d9103572bE58FfE99dc390E8246f02dcAe6f611). - -### Metis - -Similar to Optimism, for a proposal to be executed on Metis it needs to pass a mainnet governance proposal that sends an encoded payload via `sendMessage(address,bytes,uint32)` on [L1_CROSS_DOMAIN_MESSENGER](https://etherscan.io/address/0x081D1101855bD523bA69A9794e0217F0DB6323ff)(mainnet) to [L2_CROSS_DOMAIN_MESSENGER](https://andromeda-explorer.metis.io/address/0x4200000000000000000000000000000000000007)(Metis). -Once the state is `L2_CROSS_DOMAIN_MESSENGER` on Metis it will queue the payload on [METIS_BRIDGE_EXECUTOR](https://andromeda-explorer.metis.io/address/0x8EC77963068474a45016938Deb95E603Ca82a029). - -Caveat: Opposed to the other messenger like on Optimism, using the Metis messenger requires a whitelist by the Metis team. The [SHORT_EXECUTOR](https://etherscan.io/address/0xEE56e2B3D491590B5b31738cC34d5232F378a8D5) has been whitelisted to use the messenger. Also, the gas to queue the payload by the messenger has been hardcoded to 5 million, which seems reasonable considering the queue transaction. Unlike Optimism, the Metis messenger has no limit on gas, and everything is prepaid. - -### Arbitrum - -For a proposal to be executed on Arbitrum it needs to pass a mainnet governance proposal that sends an encoded payload via `unsafeCreateRetryableTicket{value: uint256}(address,uint256,uint256,address,address,uint256,uint256,bytes)` on [INBOX](https://etherscan.io/address/0x4Dbd4fc535Ac27206064B68FfCf827b0A60BAB3f)(mainnet). The Arbitrum bridge will then call the bridged calldata via the L2_ALIAS of the mainnet `msg.sender` (in this case is the aliased mainnet governance executor) which will queue the payload on [ARBITRUM_BRIDGE_EXECUTOR](https://arbiscan.io/address/0x7d9103572bE58FfE99dc390E8246f02dcAe6f611). - -Caveat: Opposed to the other bridges, Arbitrum inbox bridge requires you to supply some gas. -For simplicity the `CrosschainForwarderArbitrum` expects some eth to be available on the [SHORT_EXECUTOR](https://etherscan.io/address/0xEE56e2B3D491590B5b31738cC34d5232F378a8D5). -You can check if you need to top-up the SHORT_EXECUTOR by calling `getRequiredGas(580)` on the `CrosschainForwarderArbitrum`. - -## Deployed addresses - -### Forwarders - -- [CrosschainForwarderPolygon](https://etherscan.io/address/0x158a6bc04f0828318821bae797f50b0a1299d45b#code) -- [CrosschainForwarderOptimism](https://etherscan.io/address/0x5f5c02875a8e9b5a26fbd09040abcfdeb2aa6711#code) -- [CrosschainForwarderMetis](https://etherscan.io/address/0x2fE52eF191F0BE1D98459BdaD2F1d3160336C08f#code) -- [CrosschainForwarderArbitrum](https://etherscan.io/address/0x2e2B1F112C4D79A9D22464F0D345dE9b792705f1#code) - -## References - -- [PolygonBridge: FxRoot](https://etherscan.io/address/0xfe5e5d361b2ad62c541bab87c45a0b9b018389a2#code) -- [PolygonBridge: PolygonBridgeExecutor](https://polygonscan.com/address/0xdc9A35B16DB4e126cFeDC41322b3a36454B1F772#code) - -- [OptimismBridge: L1CrossDomainMessenger](https://etherscan.io/address/0x25ace71c97b33cc4729cf772ae268934f7ab5fa1#readProxyContract) -- [OptimismBridge: OptimismBridgeExecutor](https://optimistic.etherscan.io/address/0x7d9103572be58ffe99dc390e8246f02dcae6f611#code) - -- [MetisBridge: L1CrossDomainMessenger](https://etherscan.io/address/0x081D1101855bD523bA69A9794e0217F0DB6323ff#code) -- [MetisBridge: MetisBridgeExecutor](https://andromeda-explorer.metis.io/address/0x8EC77963068474a45016938Deb95E603Ca82a029/contracts#address-tabs) - -- [ArbitrumBridge: Inbox](https://etherscan.io/address/0x4dbd4fc535ac27206064b68ffcf827b0a60bab3f#code) -- [ArtitrumBridge: ArbitrumBridgeExecutor](https://arbiscan.io/address/0x7d9103572be58ffe99dc390e8246f02dcae6f611#code) - -- [aave crosschain-bridge repository](https://github.com/aave/governance-crosschain-bridges#polygon-governance-bridge) -- [first ever Polygon bridge proposal](https://github.com/pakim249CAL/Polygon-Asset-Deployment-Generic-Executor) diff --git a/src/crosschainforwarders/bridge-listing.png b/src/crosschainforwarders/bridge-listing.png deleted file mode 100644 index 2ffb59451b521fb13c40d40a8f9134a837b110b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116589 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%0D$vp`?S_KPVoW;dR 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 ptx&k=cW5aTdyOajfB!XgzHVs4+HEoK7ASZvc3 0, true); - assertEq(maxSubmissionCost > 0, true); - assertEq(to, ARBITRUM_BRIDGE_EXECUTOR); - assertEq(excessFeeRefundAddress, ARBITRUM_BRIDGE_EXECUTOR); - assertEq(callValueRefundAddress, forwarder.ARBITRUM_GUARDIAN()); - assertEq(maxGas, forwarder.L2_GAS_LIMIT()); - assertEq(gasPriceBid, forwarder.L2_MAX_FEE_PER_GAS()); - assertEq(length, 580); - - // 3. mock the queuing on l2 with the data emitted on InboxMessageDelivered - vm.selectFork(arbitrumFork); - vm.startPrank(AddressAliasHelper.applyL1ToL2Alias(AaveGovernanceV2.SHORT_EXECUTOR)); - - (bool success, ) = ARBITRUM_BRIDGE_EXECUTOR.call(payload); - assertEq(success, true); - vm.stopPrank(); - // 4. execute the proposal - vm.expectEmit(true, true, true, true); - emit TestEvent(); - GovHelpers.executeLatestActionSet(vm, ARBITRUM_BRIDGE_EXECUTOR); - } -} diff --git a/tests/crosschainforwarders/MetisCrossChainForwarderTest.t.sol b/tests/crosschainforwarders/MetisCrossChainForwarderTest.t.sol deleted file mode 100644 index 9b59fb8e2..000000000 --- a/tests/crosschainforwarders/MetisCrossChainForwarderTest.t.sol +++ /dev/null @@ -1,79 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import 'forge-std/Test.sol'; -import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; -import {AaveGovernanceV2} from 'aave-address-book/AaveGovernanceV2.sol'; -import {IL2CrossDomainMessenger} from 'governance-crosschain-bridges/contracts/dependencies/optimism/interfaces/IL2CrossDomainMessenger.sol'; -import {GovHelpers} from '../../src/GovHelpers.sol'; -import {ProtocolV3TestBase} from '../../src/ProtocolV3TestBase.sol'; -import {CrosschainForwarderMetis} from '../../src/crosschainforwarders/CrosschainForwarderMetis.sol'; -import {PayloadWithEmit} from '../mocks/PayloadWithEmit.sol'; - -/** - * This test covers syncing between mainnet and metis. - */ -contract MetisCrossChainForwarderTest is ProtocolV3TestBase { - event TestEvent(); - // the identifiers of the forks - uint256 mainnetFork; - uint256 metisFork; - - address public constant METIS_BRIDGE_EXECUTOR = AaveGovernanceV2.METIS_BRIDGE_EXECUTOR; - - IL2CrossDomainMessenger public OVM_L2_CROSS_DOMAIN_MESSENGER = - IL2CrossDomainMessenger(0x4200000000000000000000000000000000000007); - - PayloadWithEmit public payloadWithEmit; - - CrosschainForwarderMetis public forwarder; - - function setUp() public { - mainnetFork = vm.createSelectFork(vm.rpcUrl('mainnet'), 17093477); - forwarder = new CrosschainForwarderMetis(); - metisFork = vm.createSelectFork(vm.rpcUrl('metis'), 5428548); - payloadWithEmit = new PayloadWithEmit(); - } - - function testProposalE2E() public { - // 1. create l1 proposal - vm.selectFork(mainnetFork); - vm.startPrank(MiscEthereum.ECOSYSTEM_RESERVE); - GovHelpers.Payload[] memory payloads = new GovHelpers.Payload[](1); - payloads[0] = GovHelpers.Payload({ - target: address(forwarder), - value: 0, - signature: 'execute(address)', - callData: abi.encode(address(payloadWithEmit)), - withDelegatecall: true - }); - - uint256 proposalId = GovHelpers.createProposal(payloads, 'ipfs'); - vm.stopPrank(); - - // 2. execute proposal and record logs so we can extract the emitted StateSynced event - vm.recordLogs(); - GovHelpers.passVoteAndExecute(vm, proposalId); - Vm.Log[] memory entries = vm.getRecordedLogs(); - assertEq( - keccak256('SentMessage(address,address,bytes,uint256,uint256,uint256)'), - entries[3].topics[0] - ); - assertEq(address(uint160(uint256(entries[3].topics[1]))), METIS_BRIDGE_EXECUTOR); - (address sender, bytes memory message, uint256 nonce) = abi.decode( - entries[3].data, - (address, bytes, uint256) - ); - - // 3. mock the receive on l2 with the data emitted on StateSynced - vm.selectFork(metisFork); - vm.startPrank(0x192E1101855bD523Ba69a9794e0217f0Db633510); // AddressAliasHelper.applyL1ToL2Alias on L1_CROSS_DOMAIN_MESSENGER_ADDRESS - OVM_L2_CROSS_DOMAIN_MESSENGER.relayMessage(METIS_BRIDGE_EXECUTOR, sender, message, nonce); - vm.stopPrank(); - - // 4. execute proposal on l2 - vm.expectEmit(true, true, true, true); - emit TestEvent(); - GovHelpers.executeLatestActionSet(vm, METIS_BRIDGE_EXECUTOR); - } -} diff --git a/tests/crosschainforwarders/OptimismCrossChainForwarderTest.t.sol b/tests/crosschainforwarders/OptimismCrossChainForwarderTest.t.sol deleted file mode 100644 index 982a70c33..000000000 --- a/tests/crosschainforwarders/OptimismCrossChainForwarderTest.t.sol +++ /dev/null @@ -1,81 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import 'forge-std/Test.sol'; -import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; -import {AaveV3Optimism} from 'aave-address-book/AaveV3Optimism.sol'; -import {AaveGovernanceV2, IExecutorWithTimelock} from 'aave-address-book/AaveGovernanceV2.sol'; -import {AddressAliasHelper} from 'governance-crosschain-bridges/contracts/dependencies/arbitrum/AddressAliasHelper.sol'; -import {IL2CrossDomainMessenger} from 'governance-crosschain-bridges/contracts/dependencies/optimism/interfaces/IL2CrossDomainMessenger.sol'; -import {GovHelpers} from '../../src/GovHelpers.sol'; -import {ProtocolV3TestBase, ReserveConfig, ReserveTokens, IERC20} from '../../src/ProtocolV3TestBase.sol'; -import {CrosschainForwarderOptimism} from '../../src/crosschainforwarders/CrosschainForwarderOptimism.sol'; -import {PayloadWithEmit} from '../mocks/PayloadWithEmit.sol'; - -/** - * This test covers syncing between mainnet and optimism. - */ -contract OptimismCrossChainForwarderTest is ProtocolV3TestBase { - event TestEvent(); - // the identifiers of the forks - uint256 mainnetFork; - uint256 optimismFork; - - address public constant OPTIMISM_BRIDGE_EXECUTOR = AaveGovernanceV2.OPTIMISM_BRIDGE_EXECUTOR; - - IL2CrossDomainMessenger public OVM_L2_CROSS_DOMAIN_MESSENGER = - IL2CrossDomainMessenger(0x4200000000000000000000000000000000000007); - - PayloadWithEmit public payloadWithEmit; - - CrosschainForwarderOptimism public forwarder; - - function setUp() public { - mainnetFork = vm.createSelectFork(vm.rpcUrl('mainnet'), 15783218); - forwarder = new CrosschainForwarderOptimism(); - optimismFork = vm.createSelectFork(vm.rpcUrl('optimism'), 30264427); - payloadWithEmit = new PayloadWithEmit(); - } - - function testProposalE2E() public { - // 1. create l1 proposal - vm.selectFork(mainnetFork); - vm.startPrank(MiscEthereum.ECOSYSTEM_RESERVE); - GovHelpers.Payload[] memory payloads = new GovHelpers.Payload[](1); - payloads[0] = GovHelpers.Payload({ - value: 0, - withDelegatecall: true, - target: address(forwarder), - signature: 'execute(address)', - callData: abi.encode(address(payloadWithEmit)) - }); - - uint256 proposalId = GovHelpers.createProposal( - payloads, - 0x7ecafb3b0b7e418336cccb0c82b3e25944011bf11e41f8dc541841da073fe4f1 - ); - vm.stopPrank(); - - // 2. execute proposal and record logs so we can extract the emitted StateSynced event - vm.recordLogs(); - GovHelpers.passVoteAndExecute(vm, proposalId); - Vm.Log[] memory entries = vm.getRecordedLogs(); - assertEq(keccak256('SentMessage(address,address,bytes,uint256,uint256)'), entries[3].topics[0]); - assertEq(address(uint160(uint256(entries[3].topics[1]))), OPTIMISM_BRIDGE_EXECUTOR); - (address sender, bytes memory message, uint256 nonce) = abi.decode( - entries[3].data, - (address, bytes, uint256) - ); - - // 3. mock the receive on l2 with the data emitted on StateSynced - vm.selectFork(optimismFork); - vm.startPrank(0x36BDE71C97B33Cc4729cf772aE268934f7AB70B2); // AddressAliasHelper.applyL1ToL2Alias on L1_CROSS_DOMAIN_MESSENGER_ADDRESS - OVM_L2_CROSS_DOMAIN_MESSENGER.relayMessage(OPTIMISM_BRIDGE_EXECUTOR, sender, message, nonce); - vm.stopPrank(); - - // 4. execute proposal on l2 - vm.expectEmit(true, true, true, true); - emit TestEvent(); - GovHelpers.executeLatestActionSet(vm, OPTIMISM_BRIDGE_EXECUTOR); - } -} diff --git a/tests/crosschainforwarders/PolygonCrossChainForwarderTest.t.sol b/tests/crosschainforwarders/PolygonCrossChainForwarderTest.t.sol deleted file mode 100644 index c0059134f..000000000 --- a/tests/crosschainforwarders/PolygonCrossChainForwarderTest.t.sol +++ /dev/null @@ -1,86 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import 'forge-std/Test.sol'; -import {MiscEthereum} from 'aave-address-book/MiscEthereum.sol'; -import {AaveV3Polygon} from 'aave-address-book/AaveV3Polygon.sol'; -import {AaveGovernanceV2, IExecutorWithTimelock} from 'aave-address-book/AaveGovernanceV2.sol'; -import {IStateReceiver} from 'governance-crosschain-bridges/contracts/dependencies/polygon/fxportal/FxChild.sol'; -import {GovHelpers} from '../../src/GovHelpers.sol'; -import {ProtocolV3TestBase, ReserveConfig, ReserveTokens, IERC20} from '../../src/ProtocolV3TestBase.sol'; -import {CrosschainForwarderPolygon} from '../../src/crosschainforwarders/CrosschainForwarderPolygon.sol'; -import {PayloadWithEmit} from '../mocks/PayloadWithEmit.sol'; - -/** - * This test covers syncing between mainnet and polygon. - */ -contract PolygonCrossChainForwarderTest is ProtocolV3TestBase { - event TestEvent(); - // the identifiers of the forks - uint256 mainnetFork; - uint256 polygonFork; - - address public constant BRIDGE_ADMIN = 0x0000000000000000000000000000000000001001; - - address public constant FX_CHILD_ADDRESS = 0x8397259c983751DAf40400790063935a11afa28a; - - address public constant POLYGON_BRIDGE_EXECUTOR = AaveGovernanceV2.POLYGON_BRIDGE_EXECUTOR; - - PayloadWithEmit public payloadWithEmit; - - CrosschainForwarderPolygon public forwarder; - - function setUp() public { - mainnetFork = vm.createSelectFork(vm.rpcUrl('mainnet'), 15275388); - forwarder = new CrosschainForwarderPolygon(); - polygonFork = vm.createSelectFork(vm.rpcUrl('polygon'), 31507646); - payloadWithEmit = new PayloadWithEmit(); - } - - // utility to transform memory to calldata so array range access is available - function _cutBytes(bytes calldata input) public pure returns (bytes calldata) { - return input[64:]; - } - - function testProposalE2E() public { - // 1. create l1 proposal - vm.selectFork(mainnetFork); - vm.startPrank(MiscEthereum.ECOSYSTEM_RESERVE); - GovHelpers.Payload[] memory payloads = new GovHelpers.Payload[](1); - payloads[0] = GovHelpers.Payload({ - value: 0, - withDelegatecall: true, - target: address(forwarder), - signature: 'execute(address)', - callData: abi.encode(address(payloadWithEmit)) - }); - - uint256 proposalId = GovHelpers.createProposal( - payloads, - 0xf6e50d5a3f824f5ab4ffa15fb79f4fa1871b8bf7af9e9b32c1aaaa9ea633006d - ); - vm.stopPrank(); - - // 2. execute proposal and record logs so we can extract the emitted StateSynced event - vm.recordLogs(); - GovHelpers.passVoteAndExecute(vm, proposalId); - - Vm.Log[] memory entries = vm.getRecordedLogs(); - assertEq(keccak256('StateSynced(uint256,address,bytes)'), entries[2].topics[0]); - assertEq(address(uint160(uint256(entries[2].topics[2]))), FX_CHILD_ADDRESS); - - // 3. mock the receive on l2 with the data emitted on StateSynced - vm.selectFork(polygonFork); - vm.startPrank(BRIDGE_ADMIN); - IStateReceiver(FX_CHILD_ADDRESS).onStateReceive( - uint256(entries[2].topics[1]), - this._cutBytes(entries[2].data) - ); - vm.stopPrank(); - - // 4. Forward time & execute proposal - vm.expectEmit(true, true, true, true); - emit TestEvent(); - GovHelpers.executeLatestActionSet(vm, POLYGON_BRIDGE_EXECUTOR); - } -} diff --git a/tests/v2-config-engine/AaveV2ConfigEngineTest.t.sol b/tests/v2-config-engine/AaveV2ConfigEngineTest.t.sol index 7d87b2b58..97b7e700d 100644 --- a/tests/v2-config-engine/AaveV2ConfigEngineTest.t.sol +++ b/tests/v2-config-engine/AaveV2ConfigEngineTest.t.sol @@ -7,16 +7,14 @@ import {DeployV2EngineEthLib} from '../../scripts/AaveV2ConfigEngine.s.sol'; import {DeployV2RatesFactoryEthLib} from '../../scripts/V2RateStrategyFactory.s.sol'; import {AaveV2Ethereum} from 'aave-address-book/AaveAddressBook.sol'; import {AaveV2EthereumAssets} from 'aave-address-book/AaveV2Ethereum.sol'; -import {AaveGovernanceV2} from 'aave-address-book/AaveGovernanceV2.sol'; import {IV2RateStrategyFactory} from '../../src/v2-config-engine/IV2RateStrategyFactory.sol'; -import {GovHelpers} from '../../src/GovHelpers.sol'; import '../../src/ProtocolV2TestBase.sol'; contract AaveV2ConfigEngineTest is ProtocolV2TestBase { using stdStorage for StdStorage; function testV2RateStrategiesUpdates() public { - vm.createSelectFork(vm.rpcUrl('mainnet'), 16727659); + vm.createSelectFork(vm.rpcUrl('mainnet'), 19036639); (address ratesFactory, ) = DeployV2RatesFactoryEthLib.deploy(); IAaveV2ConfigEngine engine = IAaveV2ConfigEngine(DeployV2EngineEthLib.deploy(ratesFactory)); @@ -32,7 +30,7 @@ contract AaveV2ConfigEngineTest is ProtocolV2TestBase { createConfigurationSnapshot('preTestV2RatesUpdates', AaveV2Ethereum.POOL); - GovHelpers.executePayload(vm, address(payload), AaveGovernanceV2.SHORT_EXECUTOR); + executePayload(vm, address(payload)); createConfigurationSnapshot('postTestV2RatesUpdates', AaveV2Ethereum.POOL); diff --git a/tests/v3-config-engine/AaveV3ConfigEngineGauntletProposal.t.sol b/tests/v3-config-engine/AaveV3ConfigEngineGauntletProposal.t.sol deleted file mode 100644 index d81ac6560..000000000 --- a/tests/v3-config-engine/AaveV3ConfigEngineGauntletProposal.t.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import 'forge-std/Test.sol'; - -import {AaveV3Polygon, AaveV3PolygonAssets} from 'aave-address-book/AaveV3Polygon.sol'; -import {AaveV3Avalanche, AaveV3AvalancheAssets} from 'aave-address-book/AaveV3Avalanche.sol'; -import {AaveV3Optimism, AaveV3OptimismAssets} from 'aave-address-book/AaveV3Optimism.sol'; -import {AaveV3Arbitrum, AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol'; -import {AaveV3Ethereum} from 'aave-address-book/AaveV3Ethereum.sol'; -import {AaveGovernanceV2} from 'aave-address-book/AaveGovernanceV2.sol'; -import {IAaveV3ConfigEngine} from '../../src/v3-config-engine/IAaveV3ConfigEngine.sol'; -import {AaveV3PolygonRatesUpdates070322} from '../mocks/gauntlet-updates/AaveV3PolygonRatesUpdates070322.sol'; -import {AaveV3AvalancheRatesUpdates070322} from '../mocks/gauntlet-updates/AaveV3AvalancheRatesUpdates070322.sol'; -import {AaveV3OptimismRatesUpdates070322} from '../mocks/gauntlet-updates/AaveV3OptimismRatesUpdates070322.sol'; -import {AaveV3ArbitrumRatesUpdates070322} from '../mocks/gauntlet-updates/AaveV3ArbitrumRatesUpdates070322.sol'; -import {DeployEnginePolLib, DeployEngineEthLib, DeployEngineAvaLib, DeployEngineOptLib, DeployEngineArbLib} from '../../scripts/AaveV3ConfigEngine.s.sol'; -import {GovHelpers} from '../../src/GovHelpers.sol'; -import '../../src/ProtocolV3TestBase.sol'; - -contract AaveV3PolygonConfigEngineRatesTest is ProtocolV3TestBase { - using stdStorage for StdStorage; - - function setUp() public { - vm.createSelectFork(vm.rpcUrl('polygon'), 40074125); - } - - function testEngine() public { - IAaveV3ConfigEngine engine = IAaveV3ConfigEngine(0xE202F2fc4b6A37Ba53cfD15bE42a762A645FCA07); - AaveV3PolygonRatesUpdates070322 payload = new AaveV3PolygonRatesUpdates070322(engine); - - createConfigurationSnapshot('preTestEnginePolV3Gauntlet', AaveV3Polygon.POOL); - - GovHelpers.executePayload(vm, address(payload), AaveGovernanceV2.POLYGON_BRIDGE_EXECUTOR); - - createConfigurationSnapshot('postTestEnginePolV3Gauntlet', AaveV3Polygon.POOL); - - diffReports('preTestEnginePolV3Gauntlet', 'postTestEnginePolV3Gauntlet'); - } -} - -contract AaveV3AvalancheConfigEngineRatesTest is ProtocolV3TestBase { - using stdStorage for StdStorage; - - function setUp() public { - vm.createSelectFork(vm.rpcUrl('avalanche'), 27134232); - } - - function testEngine() public { - IAaveV3ConfigEngine engine = IAaveV3ConfigEngine(0x49581e5575F49263f556b91daf8fb41D7854D94B); - AaveV3AvalancheRatesUpdates070322 payload = new AaveV3AvalancheRatesUpdates070322(engine); - - createConfigurationSnapshot('preTestEngineAvaV3Gauntlet', AaveV3Avalanche.POOL); - - GovHelpers.executePayload(vm, address(payload), 0xa35b76E4935449E33C56aB24b23fcd3246f13470); // Aave Avalanche's Guardian - - createConfigurationSnapshot('postTestEngineAvaV3Gauntlet', AaveV3Avalanche.POOL); - - diffReports('preTestEngineAvaV3Gauntlet', 'postTestEngineAvaV3Gauntlet'); - } -} - -contract AaveV3OptimismConfigEngineRatesTest is ProtocolV3TestBase { - using stdStorage for StdStorage; - - function setUp() public { - vm.createSelectFork(vm.rpcUrl('optimism'), 79074228); - } - - function testEngine() public { - IAaveV3ConfigEngine engine = IAaveV3ConfigEngine(0x7A9A9c14B35E58ffa1cC84aB421acE0FdcD289E3); - AaveV3OptimismRatesUpdates070322 payload = new AaveV3OptimismRatesUpdates070322(engine); - - createConfigurationSnapshot('preTestEngineOptV3Gauntlet', AaveV3Optimism.POOL); - - GovHelpers.executePayload(vm, address(payload), AaveGovernanceV2.OPTIMISM_BRIDGE_EXECUTOR); - - createConfigurationSnapshot('postTestEngineOptV3Gauntlet', AaveV3Optimism.POOL); - - diffReports('preTestEngineOptV3Gauntlet', 'postTestEngineOptV3Gauntlet'); - } -} - -contract AaveV3ArbitrumConfigEngineRatesTest is ProtocolV3TestBase { - using stdStorage for StdStorage; - - function setUp() public { - vm.createSelectFork(vm.rpcUrl('arbitrum'), 67634819); - } - - function testEngine() public { - IAaveV3ConfigEngine engine = IAaveV3ConfigEngine(0x0EfdfC1A940DE4E7E6acC9Bb801481f81B17fd20); - AaveV3ArbitrumRatesUpdates070322 payload = new AaveV3ArbitrumRatesUpdates070322(engine); - - createConfigurationSnapshot('preTestEngineArbV3Gauntlet', AaveV3Arbitrum.POOL); - - GovHelpers.executePayload(vm, address(payload), AaveGovernanceV2.ARBITRUM_BRIDGE_EXECUTOR); - - createConfigurationSnapshot('postTestEngineArbV3Gauntlet', AaveV3Arbitrum.POOL); - - diffReports('preTestEngineArbV3Gauntlet', 'postTestEngineArbV3Gauntlet'); - } -}