From 1c4c6d146b3473270eda63be508532e806752e46 Mon Sep 17 00:00:00 2001 From: Harsh Pandey Date: Fri, 2 Aug 2024 13:46:21 +0530 Subject: [PATCH 01/15] fix: update test block and fix remappings --- .gitmodules | 6 +++--- lib/aave-helpers | 1 + lib/protocol-v3.1-upgrade | 1 - remappings.txt | 25 +++++++------------------ src/contracts/RiskSteward.sol | 2 +- tests/RiskSteward.t.sol | 14 +++----------- tests/RiskStewardCapo.t.sol | 16 +++------------- 7 files changed, 18 insertions(+), 47 deletions(-) create mode 160000 lib/aave-helpers delete mode 160000 lib/protocol-v3.1-upgrade diff --git a/.gitmodules b/.gitmodules index 0cba566..2d7bd44 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,6 @@ -[submodule "lib/protocol-v3.1-upgrade"] - path = lib/protocol-v3.1-upgrade - url = https://github.com/bgd-labs/protocol-v3.1-upgrade [submodule "lib/aave-capo"] path = lib/aave-capo url = https://github.com/bgd-labs/aave-capo +[submodule "lib/aave-helpers"] + path = lib/aave-helpers + url = https://github.com/bgd-labs/aave-helpers diff --git a/lib/aave-helpers b/lib/aave-helpers new file mode 160000 index 0000000..8d9947c --- /dev/null +++ b/lib/aave-helpers @@ -0,0 +1 @@ +Subproject commit 8d9947cc2cf992a5606c7cba6e990d30e876d735 diff --git a/lib/protocol-v3.1-upgrade b/lib/protocol-v3.1-upgrade deleted file mode 160000 index a80a0fb..0000000 --- a/lib/protocol-v3.1-upgrade +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a80a0fb843e4aef524bad5acd8185a470d5d712f diff --git a/remappings.txt b/remappings.txt index 232d959..6453b16 100644 --- a/remappings.txt +++ b/remappings.txt @@ -1,20 +1,9 @@ -ds-test/=lib/protocol-v3.1-upgrade/lib/aave-helpers/lib/forge-std/lib/ds-test/src/ -forge-std/=lib/protocol-v3.1-upgrade/lib/aave-helpers/lib/forge-std/src/ -aave-v3-origin/=lib/protocol-v3.1-upgrade/lib/aave-v3-origin/src -aave-helpers/=lib/protocol-v3.1-upgrade/lib/aave-helpers/src -aave-address-book/=lib/protocol-v3.1-upgrade/lib/aave-helpers/lib/aave-address-book/src/ -solidity-utils/=lib/protocol-v3.1-upgrade/lib/aave-helpers/lib/solidity-utils/src -lib/aave-v3-origin:aave-v3-core/=lib/aave-v3-origin/src/core -lib/aave-v3-origin:aave-v3-periphery/=lib/aave-v3-origin/src/periphery/ -lib/protocol-v3.1-upgrade/lib/aave-helpers/lib/aave-address-book:aave-v3-core/=lib/protocol-v3.1-upgrade/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-core/ -lib/aave-helpers:aave-v3-core/=lib/aave-helpers/lib/aave-address-book/lib/aave-v3-core/ -lib/aave-helpers/lib/aave-address-book:aave-v3-core/=lib/protocol-v3.1-upgrade/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-core/ +aave-helpers/=lib/aave-helpers/src/ +forge-std/=lib/aave-helpers/lib/forge-std/src/ +aave-address-book/=lib/aave-helpers/lib/aave-address-book/src/ +solidity-utils/=lib/aave-helpers/lib/solidity-utils/src/ +aave-v3-origin/=lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/ +aave-v3-core/=lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/core +aave-v3-periphery/=lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/periphery aave-capo/=lib/aave-capo/src lib/aave-capo:cl-synchronicity-price-adapter/=lib/aave-capo/lib/cl-synchronicity-price-adapter/src/ - -@aave/core-v3/=lib/protocol-v3.1-upgrade/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-core/ -@aave/periphery-v3/=lib/protocol-v3.1-upgrade/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-periphery/ -aave-v3-core/=lib/protocol-v3.1-upgrade/lib/aave-v3-origin/src/core/ -aave-v3-periphery/=lib/protocol-v3.1-upgrade/lib/aave-v3-origin/src/periphery/ -governance-crosschain-bridges/=lib/protocol-v3.1-upgrade/lib/aave-helpers/lib/governance-crosschain-bridges/ -protocol-v3.1-upgrade/=lib/protocol-v3.1-upgrade/ \ No newline at end of file diff --git a/src/contracts/RiskSteward.sol b/src/contracts/RiskSteward.sol index 7389a35..8519e9a 100644 --- a/src/contracts/RiskSteward.sol +++ b/src/contracts/RiskSteward.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.0; import {IPoolDataProvider} from 'aave-address-book/AaveV3.sol'; import {Address} from 'solidity-utils/contracts/oz-common/Address.sol'; import {SafeCast} from 'solidity-utils/contracts/oz-common/SafeCast.sol'; -import {EngineFlags} from 'aave-helpers/v3-config-engine/EngineFlags.sol'; +import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol'; import {Ownable} from 'solidity-utils/contracts/oz-common/Ownable.sol'; import {IAaveV3ConfigEngine as IEngine} from 'aave-v3-origin/periphery/contracts/v3-config-engine/AaveV3ConfigEngine.sol'; import {IRiskSteward} from '../interfaces/IRiskSteward.sol'; diff --git a/tests/RiskSteward.t.sol b/tests/RiskSteward.t.sol index 6366e7a..c30a86a 100644 --- a/tests/RiskSteward.t.sol +++ b/tests/RiskSteward.t.sol @@ -7,7 +7,6 @@ import {IDefaultInterestRateStrategyV2} from 'aave-v3-origin/core/contracts/inte import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; import {RiskSteward, IRiskSteward, IEngine, EngineFlags} from 'src/contracts/RiskSteward.sol'; -import {DeploymentLibrary, UpgradePayload} from 'protocol-v3.1-upgrade/scripts/Deploy.s.sol'; import {IAaveV3ConfigEngine as IEngine} from 'aave-v3-origin/periphery/contracts/v3-config-engine/AaveV3ConfigEngine.sol'; import {GovV3Helpers} from 'aave-helpers/GovV3Helpers.sol'; import {ConfigEngineDeployer} from './utils/ConfigEngineDeployer.sol'; @@ -24,16 +23,9 @@ contract RiskSteward_Test is Test { event RiskConfigSet(IRiskSteward.Config indexed riskConfig); function setUp() public { - vm.createSelectFork(vm.rpcUrl('mainnet'), 19339970); + vm.createSelectFork(vm.rpcUrl('mainnet'), 20439517); - // update protocol to v3.1 - address v3_1_updatePayload = DeploymentLibrary._deployEthereum(); - GovV3Helpers.executePayload(vm, v3_1_updatePayload); - - // deploy new config engine - configEngine = ConfigEngineDeployer.deployEngine( - address(UpgradePayload(v3_1_updatePayload).DEFAULT_IR()) - ); + configEngine = AaveV3Ethereum.CONFIG_ENGINE; defaultRiskParamConfig = IRiskSteward.RiskParamConfig({ minDelay: 5 days, @@ -802,7 +794,7 @@ contract RiskSteward_Test is Test { function _validateRiskConfig( IRiskSteward.Config memory initialRiskConfig, IRiskSteward.Config memory updatedRiskConfig - ) internal { + ) internal pure { assertEq(initialRiskConfig.ltv.minDelay, updatedRiskConfig.ltv.minDelay); assertEq(initialRiskConfig.ltv.maxPercentChange, updatedRiskConfig.ltv.maxPercentChange); assertEq( diff --git a/tests/RiskStewardCapo.t.sol b/tests/RiskStewardCapo.t.sol index 425d17d..fd482d3 100644 --- a/tests/RiskStewardCapo.t.sol +++ b/tests/RiskStewardCapo.t.sol @@ -5,10 +5,9 @@ import 'forge-std/Test.sol'; import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; import {RiskSteward, IRiskSteward, IEngine, EngineFlags} from 'src/contracts/RiskSteward.sol'; -import {DeploymentLibrary, UpgradePayload} from 'protocol-v3.1-upgrade/scripts/Deploy.s.sol'; import {IAaveV3ConfigEngine as IEngine} from 'aave-v3-origin/periphery/contracts/v3-config-engine/AaveV3ConfigEngine.sol'; import {GovV3Helpers} from 'aave-helpers/GovV3Helpers.sol'; -import {EngineFlags} from 'aave-helpers/v3-config-engine/EngineFlags.sol'; +import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol'; import {ConfigEngineDeployer} from './utils/ConfigEngineDeployer.sol'; import {IPriceCapAdapter} from 'aave-capo/interfaces/IPriceCapAdapter.sol'; import {IPriceCapAdapterStable, IChainlinkAggregator} from 'aave-capo/interfaces/IPriceCapAdapterStable.sol'; @@ -27,16 +26,7 @@ contract RiskSteward_Capo_Test is Test { event AddressRestricted(address indexed contractAddress, bool indexed isRestricted); function setUp() public { - vm.createSelectFork(vm.rpcUrl('mainnet'), 19339970); - - // update protocol to v3.1 - address v3_1_updatePayload = DeploymentLibrary._deployEthereum(); - GovV3Helpers.executePayload(vm, v3_1_updatePayload); - - // deploy new config engine - address configEngine = ConfigEngineDeployer.deployEngine( - address(UpgradePayload(v3_1_updatePayload).DEFAULT_IR()) - ); + vm.createSelectFork(vm.rpcUrl('mainnet'), 20439517); IRiskSteward.RiskParamConfig memory defaultRiskParamConfig = IRiskSteward.RiskParamConfig({ minDelay: 5 days, @@ -61,7 +51,7 @@ contract RiskSteward_Capo_Test is Test { vm.startPrank(GovernanceV3Ethereum.EXECUTOR_LVL_1); steward = new RiskSteward( AaveV3Ethereum.AAVE_PROTOCOL_DATA_PROVIDER, - IEngine(configEngine), + IEngine(AaveV3Ethereum.CONFIG_ENGINE), riskCouncil, riskConfig ); From 1b77f2c821d1dcd33b116018936d79dd7bcb9ff8 Mon Sep 17 00:00:00 2001 From: Harsh Pandey Date: Fri, 2 Aug 2024 21:07:50 +0530 Subject: [PATCH 02/15] feat: deploy scripts --- .env.example | 6 +- Makefile | 4 + foundry.toml | 12 +++ scripts/DeployStewards.s.sol | 184 +++++++++++++++++++++++++++++++++++ 4 files changed, 204 insertions(+), 2 deletions(-) create mode 100644 scripts/DeployStewards.s.sol diff --git a/.env.example b/.env.example index c12ce8f..24e495f 100644 --- a/.env.example +++ b/.env.example @@ -18,6 +18,8 @@ RPC_BASE=https://base.llamarpc.com RPC_ZKEVM=https://zkevm-rpc.com RPC_GNOSIS=https://rpc.ankr.com/gnosis RPC_BNB=https://binance.llamarpc.com +RPC_SCROLL=https://rpc.scroll.io +RPC_ZK_SYNC=https://mainnet.era.zksync.io # Etherscan api keys for verification & download utils ETHERSCAN_API_KEY_MAINNET= @@ -30,5 +32,5 @@ ETHERSCAN_API_KEY_BASE= ETHERSCAN_API_KEY_ZKEVM= ETHERSCAN_API_KEY_GNOSIS= ETHERSCAN_API_KEY_BNB= - - +ETHERSCAN_API_KEY_SCROLL= +ETHERSCAN_API_KEY_ZK_SYNC= diff --git a/Makefile b/Makefile index 81bde7b..7609f51 100644 --- a/Makefile +++ b/Makefile @@ -22,3 +22,7 @@ git-diff : @mkdir -p diffs @npx prettier ${before} ${after} --write @printf '%s\n%s\n%s\n' "\`\`\`diff" "$$(git diff --no-index --diff-algorithm=patience --ignore-space-at-eol ${before} ${after})" "\`\`\`" > diffs/${out}.md + +# Deploy +deploy-ledger :; forge script ${contract} --rpc-url ${chain} $(if ${dry},--sender 0x25F2226B597E8F9514B3F68F00f494cF4f286491 -vvvv, --ledger --mnemonic-indexes ${MNEMONIC_INDEX} --sender ${LEDGER_SENDER} --verify -vvvv --slow --broadcast) +deploy-pk :; forge script ${contract} --rpc-url ${chain} $(if ${dry},--sender 0x25F2226B597E8F9514B3F68F00f494cF4f286491 -vvvv, --private-key ${PRIVATE_KEY} --verify -vvvv --slow --broadcast) diff --git a/foundry.toml b/foundry.toml index bc67e04..9497855 100644 --- a/foundry.toml +++ b/foundry.toml @@ -9,6 +9,14 @@ remappings = [ ] fs_permissions = [{ access = "write", path = "./reports" }] +[profile.zksync] +compile = true +fallback_oz = true +mode = '3' +libs = ['lib'] +zksolc = '0.5.1' +solc = '0.8.19' + [rpc_endpoints] mainnet = "${RPC_MAINNET}" optimism = "${RPC_OPTIMISM}" @@ -22,6 +30,8 @@ base = "${RPC_BASE}" zkevm = "${RPC_ZKEVM}" gnosis = "${RPC_GNOSIS}" bnb = "${RPC_BNB}" +scroll = ${RPC_SCROLL} +zksync = ${RPC_ZK_SYNC} [etherscan] mainnet = { key="${ETHERSCAN_API_KEY_MAINNET}", chainId=1 } @@ -35,5 +45,7 @@ base = { key="${ETHERSCAN_API_KEY_BASE}", chainId=8453 } zkevm = { key="${ETHERSCAN_API_KEY_ZKEVM}", chainId=1101 } gnosis = { key="${ETHERSCAN_API_KEY_GNOSIS}", chainId=100 } bnb = { key="${ETHERSCAN_API_KEY_BNB}", chainId=56 } +scroll = { key="${ETHERSCAN_API_KEY_SCROLL}", chainId= 534352 } +zksync = { key="${ETHERSCAN_API_KEY_ZK_SYNC}", chainId= 324 } # See more config options https://github.com/gakonst/foundry/tree/master/config diff --git a/scripts/DeployStewards.s.sol b/scripts/DeployStewards.s.sol new file mode 100644 index 0000000..241476b --- /dev/null +++ b/scripts/DeployStewards.s.sol @@ -0,0 +1,184 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import 'aave-helpers/ScriptUtils.sol'; +import 'aave-address-book/AaveAddressBook.sol'; +import {IOwnable} from 'aave-address-book/common/IOwnable.sol'; +import {RiskSteward, IRiskSteward, IPoolDataProvider, IEngine} from '../src/contracts/RiskSteward.sol'; + +library DeployRiskStewards { + function _deployRiskStewards( + address poolDataProvider, + address configEngine, + address riskCouncil, + address governance + ) internal returns (address) { + address riskSteward = address( + new RiskSteward( + IPoolDataProvider(poolDataProvider), + IEngine(configEngine), + riskCouncil, + _getRiskConfig() + ) + ); + IOwnable(riskSteward).transferOwnership(governance); + return riskSteward; + } + + function _getRiskConfig() internal pure returns (IRiskSteward.Config memory) { + return IRiskSteward.Config({ + ltv: IRiskSteward.RiskParamConfig({minDelay: 3 days, maxPercentChange: 3_00}), + liquidationThreshold: IRiskSteward.RiskParamConfig({minDelay: 3 days, maxPercentChange: 3_00}), + liquidationBonus: IRiskSteward.RiskParamConfig({minDelay: 3 days, maxPercentChange: 2_00}), + supplyCap: IRiskSteward.RiskParamConfig({minDelay: 3 days, maxPercentChange: 100_00}), + borrowCap: IRiskSteward.RiskParamConfig({minDelay: 3 days, maxPercentChange: 100_00}), + debtCeiling: IRiskSteward.RiskParamConfig({minDelay: 3 days, maxPercentChange: 100_00}), + baseVariableBorrowRate: IRiskSteward.RiskParamConfig({minDelay: 3 days, maxPercentChange: 2_00}), + variableRateSlope1: IRiskSteward.RiskParamConfig({minDelay: 3 days, maxPercentChange: 2_00}), + variableRateSlope2: IRiskSteward.RiskParamConfig({minDelay: 3 days, maxPercentChange: 20_00}), + optimalUsageRatio: IRiskSteward.RiskParamConfig({minDelay: 3 days, maxPercentChange: 10_00}), + priceCapLst: IRiskSteward.RiskParamConfig({minDelay: 3 days, maxPercentChange: 15_00}), + priceCapStable: IRiskSteward.RiskParamConfig({minDelay: 3 days, maxPercentChange: 2_00}) + }); + } +} + +// make deploy-ledger contract=scripts/DeployStewards.s.sol:DeployEthereum chain=mainnet dry=true +contract DeployEthereum is EthereumScript { + function run() external { + vm.startBroadcast(); + DeployRiskStewards._deployRiskStewards( + address(AaveV3Ethereum.AAVE_PROTOCOL_DATA_PROVIDER), + AaveV3Ethereum.CONFIG_ENGINE, + 0x47c71dFEB55Ebaa431Ae3fbF99Ea50e0D3d30fA8, // eth-risk-council + GovernanceV3Ethereum.EXECUTOR_LVL_1 + ); + vm.stopBroadcast(); + } +} + +// make deploy-ledger contract=scripts/DeployStewards.s.sol:DeployPolygon chain=polygon +contract DeployPolygon is PolygonScript { + function run() external { + vm.startBroadcast(); + DeployRiskStewards._deployRiskStewards( + address(AaveV3Polygon.AAVE_PROTOCOL_DATA_PROVIDER), + AaveV3Polygon.CONFIG_ENGINE, + 0x2C40FB1ACe63084fc0bB95F83C31B5854C6C4cB5, // pol-risk-council + GovernanceV3Polygon.EXECUTOR_LVL_1 + ); + vm.stopBroadcast(); + } +} + +// make deploy-ledger contract=scripts/DeployStewards.s.sol:DeployArbitrum chain=arbitrum +contract DeployArbitrum is ArbitrumScript { + function run() external { + vm.startBroadcast(); + DeployRiskStewards._deployRiskStewards( + address(AaveV3Arbitrum.AAVE_PROTOCOL_DATA_PROVIDER), + AaveV3Arbitrum.CONFIG_ENGINE, + 0x3Be327F22eB4BD8042e6944073b8826dCf357Aa2, // arb-risk-council + GovernanceV3Arbitrum.EXECUTOR_LVL_1 + ); + vm.stopBroadcast(); + } +} + +// make deploy-ledger contract=scripts/DeployStewards.s.sol:DeployOptimism chain=optimism +contract DeployOptimism is OptimismScript { + function run() external { + vm.startBroadcast(); + DeployRiskStewards._deployRiskStewards( + address(AaveV3Optimism.AAVE_PROTOCOL_DATA_PROVIDER), + AaveV3Optimism.CONFIG_ENGINE, + 0xCb86256A994f0c505c5e15c75BF85fdFEa0F2a56, // opt-risk-council + GovernanceV3Optimism.EXECUTOR_LVL_1 + ); + vm.stopBroadcast(); + } +} + +// make deploy-ledger contract=scripts/DeployStewards.s.sol:DeployAvalanche chain=avalanche +contract DeployAvalanche is AvalancheScript { + function run() external { + vm.startBroadcast(); + DeployRiskStewards._deployRiskStewards( + address(AaveV3Avalanche.AAVE_PROTOCOL_DATA_PROVIDER), + AaveV3Avalanche.CONFIG_ENGINE, + 0xCa66149425E7DC8f81276F6D80C4b486B9503D1a, // ava-risk-council + GovernanceV3Avalanche.EXECUTOR_LVL_1 + ); + vm.stopBroadcast(); + } +} + +// make deploy-ledger contract=scripts/DeployStewards.s.sol:DeployScroll chain=scroll +contract DeployScroll is ScrollScript { + function run() external { + vm.startBroadcast(); + DeployRiskStewards._deployRiskStewards( + address(AaveV3Scroll.AAVE_PROTOCOL_DATA_PROVIDER), + AaveV3Scroll.CONFIG_ENGINE, + 0x611439a74546888c3535B4dd119A5Cbb9f5332EA, // scroll-risk-council + GovernanceV3Scroll.EXECUTOR_LVL_1 + ); + vm.stopBroadcast(); + } +} + +// make deploy-ledger contract=scripts/DeployStewards.s.sol:DeployGnosis chain=gnosis +contract DeployGnosis is GnosisScript { + function run() external { + vm.startBroadcast(); + DeployRiskStewards._deployRiskStewards( + address(AaveV3Gnosis.AAVE_PROTOCOL_DATA_PROVIDER), + AaveV3Gnosis.CONFIG_ENGINE, + 0xF221B08dD10e0C68D74F035764931Baa3b030481, // gnosis-risk-council + GovernanceV3Gnosis.EXECUTOR_LVL_1 + ); + vm.stopBroadcast(); + } +} + +// make deploy-ledger contract=scripts/DeployStewards.s.sol:DeployBnb chain=bnb +contract DeployBNB is BNBScript { + function run() external { + vm.startBroadcast(); + DeployRiskStewards._deployRiskStewards( + address(AaveV3BNB.AAVE_PROTOCOL_DATA_PROVIDER), + AaveV3BNB.CONFIG_ENGINE, + 0x126dc589cc75f17385dD95516F3F1788d862E7bc, // bnb-risk-council + GovernanceV3BNB.EXECUTOR_LVL_1 + ); + vm.stopBroadcast(); + } +} + +// make deploy-ledger contract=scripts/DeployStewards.s.sol:DeployBase chain=base +contract DeployBase is BaseScript { + function run() external { + vm.startBroadcast(); + DeployRiskStewards._deployRiskStewards( + address(AaveV3Base.AAVE_PROTOCOL_DATA_PROVIDER), + AaveV3Base.CONFIG_ENGINE, + 0xfbeB4AcB31340bA4de9C87B11dfBf7e2bc8C0bF1, // base-risk-council + GovernanceV3Base.EXECUTOR_LVL_1 + ); + vm.stopBroadcast(); + } +} + +// make deploy-ledger contract=scripts/DeployStewards.s.sol:DeployMetis chain=metis +contract DeployMetis is MetisScript { + function run() external { + vm.startBroadcast(); + DeployRiskStewards._deployRiskStewards( + address(AaveV3Metis.AAVE_PROTOCOL_DATA_PROVIDER), + AaveV3Metis.CONFIG_ENGINE, + 0x0f547846920C34E70FBE4F3d87E46452a3FeAFfa, // metis-risk-council + GovernanceV3Metis.EXECUTOR_LVL_1 + ); + vm.stopBroadcast(); + } +} From b8a0def876f887496b02a85a5b21689b7c633375 Mon Sep 17 00:00:00 2001 From: Harsh Pandey Date: Thu, 8 Aug 2024 20:21:59 +0530 Subject: [PATCH 03/15] fix: deploy scripts --- foundry.toml | 21 ++++--- lib/aave-helpers | 2 +- scripts/DeployStewards.s.sol | 20 ++++++- scripts/RiskStewardsBase.s.sol | 101 +++++++++++++++++++++++++++++++++ 4 files changed, 133 insertions(+), 11 deletions(-) create mode 100644 scripts/RiskStewardsBase.s.sol diff --git a/foundry.toml b/foundry.toml index 9497855..aa2f12b 100644 --- a/foundry.toml +++ b/foundry.toml @@ -10,12 +10,19 @@ remappings = [ fs_permissions = [{ access = "write", path = "./reports" }] [profile.zksync] +src = 'zksync/src' +test = 'zksync/tests' +libs = ['lib'] +solc = '0.8.20' +fs_permissions = [{ access = "write", path = "./reports" }] +ffi = true +evm_version = 'shanghai' + +[profile.zksync.zksync] compile = true fallback_oz = true mode = '3' -libs = ['lib'] -zksolc = '0.5.1' -solc = '0.8.19' +zksolc = '1.4.1' [rpc_endpoints] mainnet = "${RPC_MAINNET}" @@ -30,13 +37,13 @@ base = "${RPC_BASE}" zkevm = "${RPC_ZKEVM}" gnosis = "${RPC_GNOSIS}" bnb = "${RPC_BNB}" -scroll = ${RPC_SCROLL} -zksync = ${RPC_ZK_SYNC} +scroll = "${RPC_SCROLL}" +zksync = "${RPC_ZK_SYNC}" [etherscan] mainnet = { key="${ETHERSCAN_API_KEY_MAINNET}", chainId=1 } optimism = { key="${ETHERSCAN_API_KEY_OPTIMISM}", chainId=10 } -avalanche = { key="${ETHERSCAN_API_KEY_AVALANCHE}", chainId=43114 } +avalanche = { key="${ETHERSCAN_API_KEY_AVALANCHE}", chainId=43114, url='https://api.snowscan.xyz/api' } polygon = { key="${ETHERSCAN_API_KEY_POLYGON}", chainId=137 } arbitrum = { key="${ETHERSCAN_API_KEY_ARBITRUM}", chainId=42161 } fantom = { key="${ETHERSCAN_API_KEY_FANTOM}", chainId=250 } @@ -44,7 +51,7 @@ metis = { key="any", chainId=1088, url='https://andromeda-explorer.metis.io/' } base = { key="${ETHERSCAN_API_KEY_BASE}", chainId=8453 } zkevm = { key="${ETHERSCAN_API_KEY_ZKEVM}", chainId=1101 } gnosis = { key="${ETHERSCAN_API_KEY_GNOSIS}", chainId=100 } -bnb = { key="${ETHERSCAN_API_KEY_BNB}", chainId=56 } +bnb = { key="${ETHERSCAN_API_KEY_BNB}", chainId=56, url='https://api.bscscan.com/api' } scroll = { key="${ETHERSCAN_API_KEY_SCROLL}", chainId= 534352 } zksync = { key="${ETHERSCAN_API_KEY_ZK_SYNC}", chainId= 324 } diff --git a/lib/aave-helpers b/lib/aave-helpers index 8d9947c..11b5c7b 160000 --- a/lib/aave-helpers +++ b/lib/aave-helpers @@ -1 +1 @@ -Subproject commit 8d9947cc2cf992a5606c7cba6e990d30e876d735 +Subproject commit 11b5c7bf7c43cdf2dc8eb9d9bbf66f600e9feaa7 diff --git a/scripts/DeployStewards.s.sol b/scripts/DeployStewards.s.sol index 241476b..798500b 100644 --- a/scripts/DeployStewards.s.sol +++ b/scripts/DeployStewards.s.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import 'aave-helpers/ScriptUtils.sol'; +import 'solidity-utils/contracts/utils/ScriptUtils.sol'; import 'aave-address-book/AaveAddressBook.sol'; import {IOwnable} from 'aave-address-book/common/IOwnable.sol'; import {RiskSteward, IRiskSteward, IPoolDataProvider, IEngine} from '../src/contracts/RiskSteward.sol'; @@ -43,7 +43,7 @@ library DeployRiskStewards { } } -// make deploy-ledger contract=scripts/DeployStewards.s.sol:DeployEthereum chain=mainnet dry=true +// make deploy-ledger contract=scripts/DeployStewards.s.sol:DeployEthereum chain=mainnet contract DeployEthereum is EthereumScript { function run() external { vm.startBroadcast(); @@ -57,6 +57,20 @@ contract DeployEthereum is EthereumScript { } } +// make deploy-ledger contract=scripts/DeployStewards.s.sol:DeployEthereumLido chain=mainnet +contract DeployEthereumLido is EthereumScript { + function run() external { + vm.startBroadcast(); + DeployRiskStewards._deployRiskStewards( + address(AaveV3EthereumLido.AAVE_PROTOCOL_DATA_PROVIDER), + AaveV3EthereumLido.CONFIG_ENGINE, + 0x47c71dFEB55Ebaa431Ae3fbF99Ea50e0D3d30fA8, // eth-risk-council + GovernanceV3Ethereum.EXECUTOR_LVL_1 + ); + vm.stopBroadcast(); + } +} + // make deploy-ledger contract=scripts/DeployStewards.s.sol:DeployPolygon chain=polygon contract DeployPolygon is PolygonScript { function run() external { @@ -141,7 +155,7 @@ contract DeployGnosis is GnosisScript { } } -// make deploy-ledger contract=scripts/DeployStewards.s.sol:DeployBnb chain=bnb +// make deploy-ledger contract=scripts/DeployStewards.s.sol:DeployBNB chain=bnb contract DeployBNB is BNBScript { function run() external { vm.startBroadcast(); diff --git a/scripts/RiskStewardsBase.s.sol b/scripts/RiskStewardsBase.s.sol new file mode 100644 index 0000000..4f4d65d --- /dev/null +++ b/scripts/RiskStewardsBase.s.sol @@ -0,0 +1,101 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import 'forge-std/Test.sol'; +import {Script} from 'forge-std/Script.sol'; +import {AaveGovernanceV2} from 'aave-address-book/AaveGovernanceV2.sol'; +import {IPool} from 'aave-address-book/AaveV3.sol'; +import {CapsPlusRiskSteward} from 'aave-helpers/riskstewards/CapsPlusRiskSteward.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-periphery/contracts/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol'; +import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/ProtocolV3TestBase.sol'; + +abstract contract RiskStewardBase is ProtocolV3TestBase { + error FailedUpdate(); + IPool immutable POOL; + CapsPlusRiskSteward immutable STEWARD; + + constructor(IPool pool, address steward) { + POOL = pool; + STEWARD = CapsPlusRiskSteward(steward); + } + + function capsUpdates() internal pure virtual returns (IAaveV3ConfigEngine.CapsUpdate[] memory); + + function name() internal pure virtual returns (string memory); + + /** + * @notice This script doesn't broadcast as it's intended to be used via safe + */ + function run(bool broadcastToSafe) external { + // only needed as long as things are mocked + // IAaveV3ConfigEngine.CapsUpdate[] memory updates = capsUpdates(); + vm.startPrank(STEWARD.RISK_COUNCIL()); + bytes memory callDatas = _simulateAndGenerateDiff(); + vm.stopPrank(); + emit log_string('safe address'); + emit log_address(STEWARD.RISK_COUNCIL()); + emit log_string('steward address:'); + emit log_address(address(STEWARD)); + emit log_string('calldata:'); + emit log_bytes(callDatas); + + if (broadcastToSafe) { + _sendToSafe(callDatas); + } + } + + function _simulateAndGenerateDiff() internal returns (bytes memory) { + IAaveV3ConfigEngine.CapsUpdate[] memory capUpdates = capsUpdates(); + string memory pre = string(abi.encodePacked('pre_', name())); + string memory post = string(abi.encodePacked('post_', name())); + createConfigurationSnapshot(pre, POOL, true, false, false, false); + bytes memory callDatas = abi.encodeWithSelector( + CapsPlusRiskSteward.updateCaps.selector, + capUpdates + ); + bool success; + bytes memory resultData; + (success, resultData) = address(STEWARD).call(callDatas); + _verifyCallResult(success, resultData); + createConfigurationSnapshot(post, POOL, true, false, false, false); + diffReports(pre, post); + + return callDatas; + } + + function _sendToSafe(bytes memory callDatas) internal { + string[] memory inputs = new string[](8); + inputs[0] = 'npx'; + inputs[1] = 'ts-node'; + inputs[2] = 'scripts/safe-helper.ts'; + inputs[3] = vm.toString(STEWARD.RISK_COUNCIL()); + inputs[4] = vm.toString(address(STEWARD)); + inputs[5] = vm.toString(callDatas); + inputs[6] = vm.toString(block.chainid); + inputs[7] = 'Call'; + vm.ffi(inputs); + } + + function _verifyCallResult( + bool success, + bytes memory returnData + ) private pure returns (bytes memory) { + if (success) { + return returnData; + } else { + // Look for revert reason and bubble it up if present + if (returnData.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + // solhint-disable-next-line no-inline-assembly + assembly { + let returndata_size := mload(returnData) + revert(add(32, returnData), returndata_size) + } + } else { + revert FailedUpdate(); + } + } + } +} From 2c9fa32d3c6bbf2201f9c7e71491c8e17130b0c7 Mon Sep 17 00:00:00 2001 From: Harsh Pandey Date: Fri, 9 Aug 2024 12:40:21 +0530 Subject: [PATCH 04/15] feat: add base test --- .gitignore | 1 + foundry.toml | 1 + package.json | 11 +- scripts/RiskStewardsBase.s.sol | 137 +- yarn.lock | 3537 +++++++++++++++++++++++++++++++- 5 files changed, 3644 insertions(+), 43 deletions(-) diff --git a/.gitignore b/.gitignore index d95519b..512bfbe 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # build and cache cache/ out/ +reports/ # general .env diff --git a/foundry.toml b/foundry.toml index aa2f12b..1733542 100644 --- a/foundry.toml +++ b/foundry.toml @@ -8,6 +8,7 @@ libs = ['lib'] remappings = [ ] fs_permissions = [{ access = "write", path = "./reports" }] +ffi = true [profile.zksync] src = 'zksync/src' diff --git a/package.json b/package.json index 8f1ee30..66e1624 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,15 @@ "homepage": "https://github.com/bgd-labs/aave-risk-stewards-2#readme", "devDependencies": { "prettier": "2.8.7", - "prettier-plugin-solidity": "1.1.3" + "prettier-plugin-solidity": "1.1.3", + "@bgd-labs/aave-cli": "^0.16.2", + "@ethersproject/hardware-wallets": "^5.7.0", + "@safe-global/safe-core-sdk": "^3.3.3", + "@safe-global/safe-ethers-lib": "^1.9.3", + "@safe-global/safe-service-client": "^2.0.1", + "dotenv": "^16.0.3", + "ethers": "5.7.2", + "ts-node": "^10.9.1", + "typescript": "^5.0.4" } } diff --git a/scripts/RiskStewardsBase.s.sol b/scripts/RiskStewardsBase.s.sol index 4f4d65d..b8c5ee6 100644 --- a/scripts/RiskStewardsBase.s.sol +++ b/scripts/RiskStewardsBase.s.sol @@ -1,26 +1,36 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import 'forge-std/Test.sol'; -import {Script} from 'forge-std/Script.sol'; -import {AaveGovernanceV2} from 'aave-address-book/AaveGovernanceV2.sol'; -import {IPool} from 'aave-address-book/AaveV3.sol'; -import {CapsPlusRiskSteward} from 'aave-helpers/riskstewards/CapsPlusRiskSteward.sol'; -import {IAaveV3ConfigEngine} from 'aave-v3-periphery/contracts/v3-config-engine/IAaveV3ConfigEngine.sol'; -import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol'; -import {ProtocolV3TestBase, ReserveConfig} from 'aave-helpers/ProtocolV3TestBase.sol'; - -abstract contract RiskStewardBase is ProtocolV3TestBase { +import {IAaveV3ConfigEngine as IEngine, IPool} from 'aave-v3-periphery/contracts/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {IRiskSteward} from '../src/interfaces/IRiskSteward.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/ProtocolV3TestBase.sol'; + +abstract contract RiskStewardsBase is ProtocolV3TestBase { error FailedUpdate(); IPool immutable POOL; - CapsPlusRiskSteward immutable STEWARD; + IRiskSteward immutable STEWARD; + + uint8 public constant MAX_TX = 5; - constructor(IPool pool, address steward) { - POOL = pool; - STEWARD = CapsPlusRiskSteward(steward); + constructor(address pool, address steward) { + POOL = IPool(pool); + STEWARD = IRiskSteward(steward); } - function capsUpdates() internal pure virtual returns (IAaveV3ConfigEngine.CapsUpdate[] memory); + function capsUpdates() internal pure virtual returns (IEngine.CapsUpdate[] memory); + + function collateralsUpdates() public view virtual returns (IEngine.CollateralUpdate[] memory) {} + + function rateStrategiesUpdates() + public + view + virtual + returns (IEngine.RateStrategyUpdate[] memory) + {} + + function lstPriceCapsUpdates() public view virtual returns (IRiskSteward.PriceCapLstUpdate[] memory) {} + + function stablePriceCapsUpdates() public view virtual returns (IRiskSteward.PriceCapStableUpdate[] memory) {} function name() internal pure virtual returns (string memory); @@ -28,39 +38,98 @@ abstract contract RiskStewardBase is ProtocolV3TestBase { * @notice This script doesn't broadcast as it's intended to be used via safe */ function run(bool broadcastToSafe) external { - // only needed as long as things are mocked - // IAaveV3ConfigEngine.CapsUpdate[] memory updates = capsUpdates(); vm.startPrank(STEWARD.RISK_COUNCIL()); - bytes memory callDatas = _simulateAndGenerateDiff(); + bytes[] memory callDatas = _simulateAndGenerateDiff(); vm.stopPrank(); + + if (callDatas.length > 1) emit log_string('** multiple calldatas emitted, please execute them all **'); emit log_string('safe address'); emit log_address(STEWARD.RISK_COUNCIL()); emit log_string('steward address:'); emit log_address(address(STEWARD)); - emit log_string('calldata:'); - emit log_bytes(callDatas); - if (broadcastToSafe) { - _sendToSafe(callDatas); + for (uint8 i = 0; i < callDatas.length; i++) { + emit log_string('calldata:'); + emit log_bytes(callDatas[i]); + + if (broadcastToSafe) { + _sendToSafe(callDatas[i]); + } } } - function _simulateAndGenerateDiff() internal returns (bytes memory) { - IAaveV3ConfigEngine.CapsUpdate[] memory capUpdates = capsUpdates(); + function _simulateAndGenerateDiff() internal returns (bytes[] memory) { + bytes[] memory callDatas = new bytes[](MAX_TX); + uint8 txCount; + string memory pre = string(abi.encodePacked('pre_', name())); string memory post = string(abi.encodePacked('post_', name())); - createConfigurationSnapshot(pre, POOL, true, false, false, false); - bytes memory callDatas = abi.encodeWithSelector( - CapsPlusRiskSteward.updateCaps.selector, - capUpdates - ); - bool success; - bytes memory resultData; - (success, resultData) = address(STEWARD).call(callDatas); - _verifyCallResult(success, resultData); - createConfigurationSnapshot(post, POOL, true, false, false, false); + + IEngine.CapsUpdate[] memory capUpdates = capsUpdates(); + IEngine.CollateralUpdate[] memory collateralUpdates = collateralsUpdates(); + IEngine.RateStrategyUpdate[] memory rateUpdates = rateStrategiesUpdates(); + IRiskSteward.PriceCapLstUpdate[] memory lstPriceCapUpdates = lstPriceCapsUpdates(); + IRiskSteward.PriceCapStableUpdate[] memory stablePriceCapUpdates = stablePriceCapsUpdates(); + + createConfigurationSnapshot(pre, POOL); + + if (capUpdates.length != 0) { + callDatas[txCount] = abi.encodeWithSelector( + IRiskSteward.updateCaps.selector, + capUpdates + ); + (bool success, bytes memory resultData) = address(STEWARD).call(callDatas[txCount]); + _verifyCallResult(success, resultData); + txCount++; + } + + if (collateralUpdates.length != 0) { + callDatas[txCount] = abi.encodeWithSelector( + IRiskSteward.updateCollateralSide.selector, + collateralUpdates + ); + (bool success, bytes memory resultData) = address(STEWARD).call(callDatas[txCount]); + _verifyCallResult(success, resultData); + txCount++; + } + + if (rateUpdates.length != 0) { + callDatas[txCount] = abi.encodeWithSelector( + IRiskSteward.updateRates.selector, + rateUpdates + ); + (bool success, bytes memory resultData) = address(STEWARD).call(callDatas[txCount]); + _verifyCallResult(success, resultData); + txCount++; + } + + if (lstPriceCapUpdates.length != 0) { + callDatas[txCount] = abi.encodeWithSelector( + IRiskSteward.updateLstPriceCaps.selector, + rateUpdates + ); + (bool success, bytes memory resultData) = address(STEWARD).call(callDatas[txCount]); + _verifyCallResult(success, resultData); + txCount++; + } + + if (stablePriceCapUpdates.length != 0) { + callDatas[txCount] = abi.encodeWithSelector( + IRiskSteward.updateStablePriceCaps.selector, + stablePriceCapUpdates + ); + (bool success, bytes memory resultData) = address(STEWARD).call(callDatas[txCount]); + _verifyCallResult(success, resultData); + txCount++; + } + + createConfigurationSnapshot(post, POOL); diffReports(pre, post); + // we defined the callDatas with MAX_TX size, we now squash it to the number of txs + assembly { + mstore(callDatas, txCount) + } return callDatas; } diff --git a/yarn.lock b/yarn.lock index 37a985d..3f2de87 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,28 +2,2731 @@ # yarn lockfile v1 +"@adraffy/ens-normalize@1.10.0": + version "1.10.0" + resolved "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz" + integrity sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q== + +"@assemblyscript/loader@^0.9.4": + version "0.9.4" + resolved "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.9.4.tgz" + integrity sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA== + +"@babel/code-frame@^7.0.0": + version "7.24.7" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== + dependencies: + "@babel/highlight" "^7.24.7" + picocolors "^1.0.0" + +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.7" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@bgd-labs/aave-address-book@^3.0.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@bgd-labs/aave-address-book/-/aave-address-book-3.1.0.tgz" + integrity sha512-1wy6m5asQhDG13xhm+ZAhwsTy1CBhow0/kyQIaVFcfar5PKJBnZr8ZVw7iA+AHD2LTRyoviVO5iSN24kWUHf2Q== + +"@bgd-labs/aave-cli@^0.16.2": + version "0.16.2" + resolved "https://registry.npmjs.org/@bgd-labs/aave-cli/-/aave-cli-0.16.2.tgz" + integrity sha512-+X7crEcX1HPdbi+9ZUF0c2TJ0oA9hLseYBWM/ogN04P6hjoRzOCGb5Wv2lK0bhesI2+OWTAHI23am986veZiPQ== + dependencies: + "@bgd-labs/aave-address-book" "^3.0.0" + "@bgd-labs/aave-v3-governance-cache" "^1.0.6" + "@bgd-labs/js-utils" "^1.4.2" + "@commander-js/extra-typings" "^11.1.0" + "@inquirer/prompts" "^3.3.2" + chalk "^4.1.2" + commander "^11.1.0" + deepmerge "^4.3.1" + dotenv "^16.4.1" + find-object-paths "^1.1.0" + gray-matter "^4.0.3" + ipfs-only-hash "^4.0.0" + json-bigint "^1.0.0" + object-hash "^3.0.0" + viem "^2.17.11" + zod "^3.23.8" + +"@bgd-labs/aave-v3-governance-cache@^1.0.6": + version "1.0.6" + resolved "https://registry.npmjs.org/@bgd-labs/aave-v3-governance-cache/-/aave-v3-governance-cache-1.0.6.tgz" + integrity sha512-FpWMBxt18c8pk+10gvWtHBuXhb1uVYF63PgIs6CY4WMSEs/42KCmGYJSamCNYR9nEEX4PVqjPViu3zBoqZOgCQ== + +"@bgd-labs/js-utils@^1.4.2": + version "1.4.2" + resolved "https://registry.npmjs.org/@bgd-labs/js-utils/-/js-utils-1.4.2.tgz" + integrity sha512-hKiorNIyEApdH1w7laYQ+sGkrCGZTem9kD5Ud7YP/ZKtkoPx12FcTAp+P+JZ42BerPEqzGLZMDRJDB2ZGKeAJw== + dependencies: + "@supercharge/promise-pool" "^3.1.1" + bs58 "^5.0.0" + gray-matter "^4.0.3" + tsx "^4.7.1" + +"@commander-js/extra-typings@^11.1.0": + version "11.1.0" + resolved "https://registry.npmjs.org/@commander-js/extra-typings/-/extra-typings-11.1.0.tgz" + integrity sha512-GuvZ38d23H+7Tz2C9DhzCepivsOsky03s5NI+KCy7ke1FNUvsJ2oO47scQ9YaGGhgjgNW5OYYNSADmbjcSoIhw== + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@esbuild/aix-ppc64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz#145b74d5e4a5223489cabdc238d8dad902df5259" + integrity sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ== + +"@esbuild/android-arm64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz#453bbe079fc8d364d4c5545069e8260228559832" + integrity sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ== + +"@esbuild/android-arm@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.23.0.tgz#26c806853aa4a4f7e683e519cd9d68e201ebcf99" + integrity sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g== + +"@esbuild/android-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.23.0.tgz#1e51af9a6ac1f7143769f7ee58df5b274ed202e6" + integrity sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ== + +"@esbuild/darwin-arm64@0.23.0": + version "0.23.0" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz" + integrity sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow== + +"@esbuild/darwin-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz#30c8f28a7ef4e32fe46501434ebe6b0912e9e86c" + integrity sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ== + +"@esbuild/freebsd-arm64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz#30f4fcec8167c08a6e8af9fc14b66152232e7fb4" + integrity sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw== + +"@esbuild/freebsd-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz#1003a6668fe1f5d4439e6813e5b09a92981bc79d" + integrity sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ== + +"@esbuild/linux-arm64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz#3b9a56abfb1410bb6c9138790f062587df3e6e3a" + integrity sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw== + +"@esbuild/linux-arm@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz#237a8548e3da2c48cd79ae339a588f03d1889aad" + integrity sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw== + +"@esbuild/linux-ia32@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz#4269cd19cb2de5de03a7ccfc8855dde3d284a238" + integrity sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA== + +"@esbuild/linux-loong64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz#82b568f5658a52580827cc891cb69d2cb4f86280" + integrity sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A== + +"@esbuild/linux-mips64el@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz#9a57386c926262ae9861c929a6023ed9d43f73e5" + integrity sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w== + +"@esbuild/linux-ppc64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz#f3a79fd636ba0c82285d227eb20ed8e31b4444f6" + integrity sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw== + +"@esbuild/linux-riscv64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz#f9d2ef8356ce6ce140f76029680558126b74c780" + integrity sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw== + +"@esbuild/linux-s390x@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz#45390f12e802201f38a0229e216a6aed4351dfe8" + integrity sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg== + +"@esbuild/linux-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz#c8409761996e3f6db29abcf9b05bee8d7d80e910" + integrity sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ== + +"@esbuild/netbsd-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz#ba70db0114380d5f6cfb9003f1d378ce989cd65c" + integrity sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw== + +"@esbuild/openbsd-arm64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz#72fc55f0b189f7a882e3cf23f332370d69dfd5db" + integrity sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ== + +"@esbuild/openbsd-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz#b6ae7a0911c18fe30da3db1d6d17a497a550e5d8" + integrity sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg== + +"@esbuild/sunos-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz#58f0d5e55b9b21a086bfafaa29f62a3eb3470ad8" + integrity sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA== + +"@esbuild/win32-arm64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz#b858b2432edfad62e945d5c7c9e5ddd0f528ca6d" + integrity sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ== + +"@esbuild/win32-ia32@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz#167ef6ca22a476c6c0c014a58b4f43ae4b80dec7" + integrity sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA== + +"@esbuild/win32-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz#db44a6a08520b5f25bbe409f34a59f2d4bcc7ced" + integrity sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g== + +"@ethereumjs/rlp@^4.0.1": + version "4.0.1" + resolved "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz" + integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw== + +"@ethereumjs/util@^8.1.0": + version "8.1.0" + resolved "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz" + integrity sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA== + dependencies: + "@ethereumjs/rlp" "^4.0.1" + ethereum-cryptography "^2.0.0" + micro-ftch "^0.3.1" + +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz" + integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + +"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz" + integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + +"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + +"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz" + integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + bn.js "^5.2.1" + +"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + +"@ethersproject/contracts@5.7.0", "@ethersproject/contracts@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz" + integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== + dependencies: + "@ethersproject/abi" "^5.7.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + +"@ethersproject/hardware-wallets@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/hardware-wallets/-/hardware-wallets-5.7.0.tgz" + integrity sha512-DjMMXIisRc8xFvEoLoYz1w7JDOYmaz/a0X9sp7Zu668RR8U1zCAyj5ow25HLRW+TCzEC5XiFetTXqS5kXonFCQ== + dependencies: + "@ledgerhq/hw-app-eth" "5.27.2" + "@ledgerhq/hw-transport" "5.26.0" + "@ledgerhq/hw-transport-u2f" "5.26.0" + ethers "^5.7.0" + optionalDependencies: + "@ledgerhq/hw-transport-node-hid" "5.26.0" + +"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz" + integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz" + integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz" + integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + aes-js "3.0.0" + scrypt-js "3.0.1" + +"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + js-sha3 "0.8.0" + +"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== + +"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz" + integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + +"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/providers@5.7.2": + version "5.7.2" + resolved "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bech32 "1.1.4" + ws "7.4.6" + +"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz" + integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz" + integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + hash.js "1.1.7" + +"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz" + integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" + +"@ethersproject/solidity@5.7.0", "@ethersproject/solidity@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz" + integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz" + integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.6.2", "@ethersproject/transactions@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz" + integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + +"@ethersproject/units@5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz" + integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/wallet@5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz" + integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/json-wallets" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== + dependencies: + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz" + integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@inquirer/checkbox@^1.5.2": + version "1.5.2" + resolved "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-1.5.2.tgz" + integrity sha512-CifrkgQjDkUkWexmgYYNyB5603HhTHI91vLFeQXh6qrTKiCMVASol01Rs1cv6LP/A2WccZSRlJKZhbaBIs/9ZA== + dependencies: + "@inquirer/core" "^6.0.0" + "@inquirer/type" "^1.1.6" + ansi-escapes "^4.3.2" + chalk "^4.1.2" + figures "^3.2.0" + +"@inquirer/confirm@^2.0.17": + version "2.0.17" + resolved "https://registry.npmjs.org/@inquirer/confirm/-/confirm-2.0.17.tgz" + integrity sha512-EqzhGryzmGpy2aJf6LxJVhndxYmFs+m8cxXzf8nejb1DE3sabf6mUgBcp4J0jAUEiAcYzqmkqRr7LPFh/WdnXA== + dependencies: + "@inquirer/core" "^6.0.0" + "@inquirer/type" "^1.1.6" + chalk "^4.1.2" + +"@inquirer/core@^6.0.0": + version "6.0.0" + resolved "https://registry.npmjs.org/@inquirer/core/-/core-6.0.0.tgz" + integrity sha512-fKi63Khkisgda3ohnskNf5uZJj+zXOaBvOllHsOkdsXRA/ubQLJQrZchFFi57NKbZzkTunXiBMdvWOv71alonw== + dependencies: + "@inquirer/type" "^1.1.6" + "@types/mute-stream" "^0.0.4" + "@types/node" "^20.10.7" + "@types/wrap-ansi" "^3.0.0" + ansi-escapes "^4.3.2" + chalk "^4.1.2" + cli-spinners "^2.9.2" + cli-width "^4.1.0" + figures "^3.2.0" + mute-stream "^1.0.0" + run-async "^3.0.0" + signal-exit "^4.1.0" + strip-ansi "^6.0.1" + wrap-ansi "^6.2.0" + +"@inquirer/editor@^1.2.15": + version "1.2.15" + resolved "https://registry.npmjs.org/@inquirer/editor/-/editor-1.2.15.tgz" + integrity sha512-gQ77Ls09x5vKLVNMH9q/7xvYPT6sIs5f7URksw+a2iJZ0j48tVS6crLqm2ugG33tgXHIwiEqkytY60Zyh5GkJQ== + dependencies: + "@inquirer/core" "^6.0.0" + "@inquirer/type" "^1.1.6" + chalk "^4.1.2" + external-editor "^3.1.0" + +"@inquirer/expand@^1.1.16": + version "1.1.16" + resolved "https://registry.npmjs.org/@inquirer/expand/-/expand-1.1.16.tgz" + integrity sha512-TGLU9egcuo+s7PxphKUCnJnpCIVY32/EwPCLLuu+gTvYiD8hZgx8Z2niNQD36sa6xcfpdLY6xXDBiL/+g1r2XQ== + dependencies: + "@inquirer/core" "^6.0.0" + "@inquirer/type" "^1.1.6" + chalk "^4.1.2" + figures "^3.2.0" + +"@inquirer/input@^1.2.16": + version "1.2.16" + resolved "https://registry.npmjs.org/@inquirer/input/-/input-1.2.16.tgz" + integrity sha512-Ou0LaSWvj1ni+egnyQ+NBtfM1885UwhRCMtsRt2bBO47DoC1dwtCa+ZUNgrxlnCHHF0IXsbQHYtIIjFGAavI4g== + dependencies: + "@inquirer/core" "^6.0.0" + "@inquirer/type" "^1.1.6" + chalk "^4.1.2" + +"@inquirer/password@^1.1.16": + version "1.1.16" + resolved "https://registry.npmjs.org/@inquirer/password/-/password-1.1.16.tgz" + integrity sha512-aZYZVHLUXZ2gbBot+i+zOJrks1WaiI95lvZCn1sKfcw6MtSSlYC8uDX8sTzQvAsQ8epHoP84UNvAIT0KVGOGqw== + dependencies: + "@inquirer/core" "^6.0.0" + "@inquirer/type" "^1.1.6" + ansi-escapes "^4.3.2" + chalk "^4.1.2" + +"@inquirer/prompts@^3.3.2": + version "3.3.2" + resolved "https://registry.npmjs.org/@inquirer/prompts/-/prompts-3.3.2.tgz" + integrity sha512-k52mOMRvTUejrqyF1h8Z07chC+sbaoaUYzzr1KrJXyj7yaX7Nrh0a9vktv8TuocRwIJOQMaj5oZEmkspEcJFYQ== + dependencies: + "@inquirer/checkbox" "^1.5.2" + "@inquirer/confirm" "^2.0.17" + "@inquirer/core" "^6.0.0" + "@inquirer/editor" "^1.2.15" + "@inquirer/expand" "^1.1.16" + "@inquirer/input" "^1.2.16" + "@inquirer/password" "^1.1.16" + "@inquirer/rawlist" "^1.2.16" + "@inquirer/select" "^1.3.3" + +"@inquirer/rawlist@^1.2.16": + version "1.2.16" + resolved "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-1.2.16.tgz" + integrity sha512-pZ6TRg2qMwZAOZAV6TvghCtkr53dGnK29GMNQ3vMZXSNguvGqtOVc4j/h1T8kqGJFagjyfBZhUPGwNS55O5qPQ== + dependencies: + "@inquirer/core" "^6.0.0" + "@inquirer/type" "^1.1.6" + chalk "^4.1.2" + +"@inquirer/select@^1.3.3": + version "1.3.3" + resolved "https://registry.npmjs.org/@inquirer/select/-/select-1.3.3.tgz" + integrity sha512-RzlRISXWqIKEf83FDC9ZtJ3JvuK1l7aGpretf41BCWYrvla2wU8W8MTRNMiPrPJ+1SIqrRC1nZdZ60hD9hRXLg== + dependencies: + "@inquirer/core" "^6.0.0" + "@inquirer/type" "^1.1.6" + ansi-escapes "^4.3.2" + chalk "^4.1.2" + figures "^3.2.0" + +"@inquirer/type@^1.1.6": + version "1.5.2" + resolved "https://registry.npmjs.org/@inquirer/type/-/type-1.5.2.tgz" + integrity sha512-w9qFkumYDCNyDZmNQjf/n6qQuvQ4dMC3BJesY4oF+yr0CxR5vxujflAVeIcS6U336uzi9GM0kAfZlLrZ9UTkpA== + dependencies: + mute-stream "^1.0.0" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.2" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.5.0" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@ledgerhq/cryptoassets@^5.27.2": + version "5.53.0" + resolved "https://registry.npmjs.org/@ledgerhq/cryptoassets/-/cryptoassets-5.53.0.tgz" + integrity sha512-M3ibc3LRuHid5UtL7FI3IC6nMEppvly98QHFoSa7lJU0HDzQxY6zHec/SPM4uuJUC8sXoGVAiRJDkgny54damw== + dependencies: + invariant "2" + +"@ledgerhq/devices@^5.26.0", "@ledgerhq/devices@^5.51.1": + version "5.51.1" + resolved "https://registry.npmjs.org/@ledgerhq/devices/-/devices-5.51.1.tgz" + integrity sha512-4w+P0VkbjzEXC7kv8T1GJ/9AVaP9I6uasMZ/JcdwZBS3qwvKo5A5z9uGhP5c7TvItzcmPb44b5Mw2kT+WjUuAA== + dependencies: + "@ledgerhq/errors" "^5.50.0" + "@ledgerhq/logs" "^5.50.0" + rxjs "6" + semver "^7.3.5" + +"@ledgerhq/errors@^5.26.0", "@ledgerhq/errors@^5.50.0": + version "5.50.0" + resolved "https://registry.npmjs.org/@ledgerhq/errors/-/errors-5.50.0.tgz" + integrity sha512-gu6aJ/BHuRlpU7kgVpy2vcYk6atjB4iauP2ymF7Gk0ez0Y/6VSMVSJvubeEQN+IV60+OBK0JgeIZG7OiHaw8ow== + +"@ledgerhq/hw-app-eth@5.27.2": + version "5.27.2" + resolved "https://registry.npmjs.org/@ledgerhq/hw-app-eth/-/hw-app-eth-5.27.2.tgz" + integrity sha512-llNdrE894cCN8j6yxJEUniciyLVcLmu5N0UmIJLOObztG+5rOF4bX54h4SreTWK+E10Z0CzHSeyE5Lz/tVcqqQ== + dependencies: + "@ledgerhq/cryptoassets" "^5.27.2" + "@ledgerhq/errors" "^5.26.0" + "@ledgerhq/hw-transport" "^5.26.0" + bignumber.js "^9.0.1" + rlp "^2.2.6" + +"@ledgerhq/hw-transport-node-hid-noevents@^5.26.0": + version "5.51.1" + resolved "https://registry.npmjs.org/@ledgerhq/hw-transport-node-hid-noevents/-/hw-transport-node-hid-noevents-5.51.1.tgz" + integrity sha512-9wFf1L8ZQplF7XOY2sQGEeOhpmBRzrn+4X43kghZ7FBDoltrcK+s/D7S+7ffg3j2OySyP6vIIIgloXylao5Scg== + dependencies: + "@ledgerhq/devices" "^5.51.1" + "@ledgerhq/errors" "^5.50.0" + "@ledgerhq/hw-transport" "^5.51.1" + "@ledgerhq/logs" "^5.50.0" + node-hid "2.1.1" + +"@ledgerhq/hw-transport-node-hid@5.26.0": + version "5.26.0" + resolved "https://registry.npmjs.org/@ledgerhq/hw-transport-node-hid/-/hw-transport-node-hid-5.26.0.tgz" + integrity sha512-qhaefZVZatJ6UuK8Wb6WSFNOLWc2mxcv/xgsfKi5HJCIr4bPF/ecIeN+7fRcEaycxj4XykY6Z4A7zDVulfFH4w== + dependencies: + "@ledgerhq/devices" "^5.26.0" + "@ledgerhq/errors" "^5.26.0" + "@ledgerhq/hw-transport" "^5.26.0" + "@ledgerhq/hw-transport-node-hid-noevents" "^5.26.0" + "@ledgerhq/logs" "^5.26.0" + lodash "^4.17.20" + node-hid "1.3.0" + usb "^1.6.3" + +"@ledgerhq/hw-transport-u2f@5.26.0": + version "5.26.0" + resolved "https://registry.npmjs.org/@ledgerhq/hw-transport-u2f/-/hw-transport-u2f-5.26.0.tgz" + integrity sha512-QTxP1Rsh+WZ184LUOelYVLeaQl3++V3I2jFik+l9JZtakwEHjD0XqOT750xpYNL/vfHsy31Wlz+oicdxGzFk+w== + dependencies: + "@ledgerhq/errors" "^5.26.0" + "@ledgerhq/hw-transport" "^5.26.0" + "@ledgerhq/logs" "^5.26.0" + u2f-api "0.2.7" + +"@ledgerhq/hw-transport@5.26.0": + version "5.26.0" + resolved "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-5.26.0.tgz" + integrity sha512-NFeJOJmyEfAX8uuIBTpocWHcz630sqPcXbu864Q+OCBm4EK5UOKV1h/pX7e0xgNIKY8zhJ/O4p4cIZp9tnXLHQ== + dependencies: + "@ledgerhq/devices" "^5.26.0" + "@ledgerhq/errors" "^5.26.0" + events "^3.2.0" + +"@ledgerhq/hw-transport@^5.26.0", "@ledgerhq/hw-transport@^5.51.1": + version "5.51.1" + resolved "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-5.51.1.tgz" + integrity sha512-6wDYdbWrw9VwHIcoDnqWBaDFyviyjZWv6H9vz9Vyhe4Qd7TIFmbTl/eWs6hZvtZBza9K8y7zD8ChHwRI4s9tSw== + dependencies: + "@ledgerhq/devices" "^5.51.1" + "@ledgerhq/errors" "^5.50.0" + events "^3.3.0" + +"@ledgerhq/logs@^5.26.0", "@ledgerhq/logs@^5.50.0": + version "5.50.0" + resolved "https://registry.npmjs.org/@ledgerhq/logs/-/logs-5.50.0.tgz" + integrity sha512-swKHYCOZUGyVt4ge0u8a7AwNcA//h4nx5wIi0sruGye1IJ5Cva0GyK9L2/WdX+kWVTKp92ZiEo1df31lrWGPgA== + +"@multiformats/base-x@^4.0.1": + version "4.0.1" + resolved "https://registry.npmjs.org/@multiformats/base-x/-/base-x-4.0.1.tgz" + integrity sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw== + +"@noble/curves@1.4.0": + version "1.4.0" + resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz" + integrity sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg== + dependencies: + "@noble/hashes" "1.4.0" + +"@noble/curves@1.4.2", "@noble/curves@~1.4.0": + version "1.4.2" + resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz" + integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== + dependencies: + "@noble/hashes" "1.4.0" + +"@noble/curves@^1.4.0": + version "1.5.0" + resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.5.0.tgz" + integrity sha512-J5EKamIHnKPyClwVrzmaf5wSdQXgdHcPZIZLu3bwnbeCx8/7NPK5q2ZBWF+5FvYGByjiQQsJYX6jfgB2wDPn3A== + dependencies: + "@noble/hashes" "1.4.0" + +"@noble/hashes@1.4.0", "@noble/hashes@^1.4.0", "@noble/hashes@~1.4.0": + version "1.4.0" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz" + integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== + +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz" + integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz" + integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz" + integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz" + integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz" + integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz" + integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz" + integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz" + integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== + +"@safe-global/safe-core-sdk-types@^1.9.2": + version "1.10.1" + resolved "https://registry.npmjs.org/@safe-global/safe-core-sdk-types/-/safe-core-sdk-types-1.10.1.tgz" + integrity sha512-BKvuYTLOlY16Rq6qCXglmnL6KxInDuXMFqZMaCzwDKiEh+uoHu3xCumG5tVtWOkCgBF4XEZXMqwZUiLcon7IsA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/contracts" "^5.7.0" + "@safe-global/safe-deployments" "^1.20.2" + web3-core "^1.8.1" + web3-utils "^1.8.1" + +"@safe-global/safe-core-sdk-utils@^1.7.4": + version "1.7.4" + resolved "https://registry.npmjs.org/@safe-global/safe-core-sdk-utils/-/safe-core-sdk-utils-1.7.4.tgz" + integrity sha512-ITocwSWlFUA1K9VMP/eJiMfgbP/I9qDxAaFz7ukj5N5NZD3ihVQZkmqML6hjse5UhrfjCnfIEcLkNZhtB2XC2Q== + dependencies: + "@safe-global/safe-core-sdk-types" "^1.9.2" + semver "^7.3.8" + web3-utils "^1.8.1" + +"@safe-global/safe-core-sdk@^3.3.3": + version "3.3.5" + resolved "https://registry.npmjs.org/@safe-global/safe-core-sdk/-/safe-core-sdk-3.3.5.tgz" + integrity sha512-ul+WmpxZOXgDIXrZ6MIHptThYbm0CVV3/rypMQEn4tZLkudh/yXK7EuWBFnx9prR3MePuku51Zcz9fu1vi7sfQ== + dependencies: + "@ethersproject/solidity" "^5.7.0" + "@safe-global/safe-core-sdk-types" "^1.9.2" + "@safe-global/safe-core-sdk-utils" "^1.7.4" + "@safe-global/safe-deployments" "^1.25.0" + ethereumjs-util "^7.1.5" + semver "^7.3.8" + web3-utils "^1.8.1" + zksync-web3 "^0.14.3" + +"@safe-global/safe-deployments@^1.20.2", "@safe-global/safe-deployments@^1.25.0": + version "1.37.3" + resolved "https://registry.npmjs.org/@safe-global/safe-deployments/-/safe-deployments-1.37.3.tgz" + integrity sha512-EtbiOJVGe697+GcbHtfo75NYpp+hTlIIBqL2ETPLGoQBHoxo9HWbGX/6ZkVxsZv/NN4nKawyMi+MvpUkH9VXGg== + dependencies: + semver "^7.6.2" + +"@safe-global/safe-ethers-lib@^1.9.3": + version "1.9.4" + resolved "https://registry.npmjs.org/@safe-global/safe-ethers-lib/-/safe-ethers-lib-1.9.4.tgz" + integrity sha512-WhzcmNun0s0VxeVQKRqaapV0vEpdm76zZBR2Du+S+58u1r57OjZkOSL2Gru0tdwkt3FIZZtE3OhDu09M70pVkA== + dependencies: + "@safe-global/safe-core-sdk-types" "^1.9.2" + "@safe-global/safe-core-sdk-utils" "^1.7.4" + ethers "5.7.2" + +"@safe-global/safe-service-client@^2.0.1": + version "2.0.3" + resolved "https://registry.npmjs.org/@safe-global/safe-service-client/-/safe-service-client-2.0.3.tgz" + integrity sha512-t5eOopQUbP5HxixG0/TUGxzzNetLrNCxnLtt2RTzDVdlvgf/QGHywUqlJ5/eF8YBeZO/TNz6uAoLUMJ0u69IAg== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@safe-global/safe-core-sdk-types" "^1.9.2" + node-fetch "^2.6.6" + +"@scure/base@~1.1.6": + version "1.1.7" + resolved "https://registry.npmjs.org/@scure/base/-/base-1.1.7.tgz" + integrity sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g== + +"@scure/bip32@1.4.0": + version "1.4.0" + resolved "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz" + integrity sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg== + dependencies: + "@noble/curves" "~1.4.0" + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" + +"@scure/bip39@1.3.0": + version "1.3.0" + resolved "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz" + integrity sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ== + dependencies: + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" + "@solidity-parser/parser@^0.16.0": version "0.16.0" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.16.0.tgz#1fb418c816ca1fc3a1e94b08bcfe623ec4e1add4" + resolved "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.0.tgz" integrity sha512-ESipEcHyRHg4Np4SqBCfcXwyxxna1DgFVz69bgpLV8vzl/NP1DtcKsJ4dJZXWQhY/Z4J2LeKBiOkOVZn9ct33Q== dependencies: antlr4ts "^0.5.0-alpha.4" +"@supercharge/promise-pool@^3.1.1": + version "3.2.0" + resolved "https://registry.npmjs.org/@supercharge/promise-pool/-/promise-pool-3.2.0.tgz" + integrity sha512-pj0cAALblTZBPtMltWOlZTQSLT07jIaFNeM8TWoJD1cQMgDB9mcMlVMoetiB35OzNJpqQ2b+QEtwiR9f20mADg== + +"@tsconfig/node10@^1.0.7": + version "1.0.11" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz" + integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@types/bn.js@^5.1.0", "@types/bn.js@^5.1.1": + version "5.1.5" + resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.5.tgz" + integrity sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A== + dependencies: + "@types/node" "*" + +"@types/long@^4.0.1": + version "4.0.2" + resolved "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz" + integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== + +"@types/minimist@^1.2.0": + version "1.2.5" + resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz" + integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== + +"@types/mute-stream@^0.0.4": + version "0.0.4" + resolved "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz" + integrity sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow== + dependencies: + "@types/node" "*" + +"@types/node@*", "@types/node@>=13.7.0": + version "22.1.0" + resolved "https://registry.npmjs.org/@types/node/-/node-22.1.0.tgz" + integrity sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw== + dependencies: + undici-types "~6.13.0" + +"@types/node@^12.12.6": + version "12.20.55" + resolved "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz" + integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== + +"@types/node@^20.10.7": + version "20.14.14" + resolved "https://registry.npmjs.org/@types/node/-/node-20.14.14.tgz" + integrity sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ== + dependencies: + undici-types "~5.26.4" + +"@types/normalize-package-data@^2.4.0": + version "2.4.4" + resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz" + integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== + +"@types/pbkdf2@^3.0.0": + version "3.1.2" + resolved "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz" + integrity sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew== + dependencies: + "@types/node" "*" + +"@types/secp256k1@^4.0.1": + version "4.0.6" + resolved "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz" + integrity sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ== + dependencies: + "@types/node" "*" + +"@types/wrap-ansi@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz" + integrity sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g== + +abitype@1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/abitype/-/abitype-1.0.5.tgz" + integrity sha512-YzDhti7cjlfaBhHutMaboYB21Ha3rXR9QTkNJFzYC4kC8YclaiwPBBBJY8ejFdu2wnJeZCVZSMlQJ7fi8S6hsw== + +abortcontroller-polyfill@^1.7.5: + version "1.7.5" + resolved "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz" + integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ== + +acorn-walk@^8.1.1: + version "8.3.3" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz" + integrity sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw== + dependencies: + acorn "^8.11.0" + +acorn@^8.11.0, acorn@^8.4.1: + version "8.12.1" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== + +aes-js@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz" + integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== + +ansi-escapes@^4.3.2: + version "4.3.2" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" + integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + antlr4ts@^0.5.0-alpha.4: version "0.5.0-alpha.4" - resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" + resolved "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz" integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.7" + resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz" + integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" + integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +base-x@^3.0.2: + version "3.0.10" + resolved "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz" + integrity sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ== + dependencies: + safe-buffer "^5.0.1" + +base-x@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz" + integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bech32@1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz" + integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== + +bignumber.js@^9.0.0, bignumber.js@^9.0.1: + version "9.1.2" + resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz" + integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +bl@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz" + integrity sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ== + dependencies: + buffer "^6.0.3" + inherits "^2.0.4" + readable-stream "^3.4.0" + +blakejs@^1.1.0: + version "1.2.1" + resolved "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz" + integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== + +bn.js@4.11.6: + version "4.11.6" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz" + integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== + +bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browserify-aes@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +bs58@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz" + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== + dependencies: + base-x "^3.0.2" + +bs58@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz" + integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== + dependencies: + base-x "^4.0.0" + +bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +bufferutil@^4.0.1: + version "4.0.8" + resolved "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz" + integrity sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw== + dependencies: + node-gyp-build "^4.3.0" + +call-bind@^1.0.2, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +cids@^1.0.0, cids@^1.1.5, cids@^1.1.6: + version "1.1.9" + resolved "https://registry.npmjs.org/cids/-/cids-1.1.9.tgz" + integrity sha512-l11hWRfugIcbGuTZwAM5PwpjPPjyb6UZOGwlHSnOBV5o07XhQ4gNpBN67FbODvpjyHtd+0Xs6KNvUcGBiDRsdg== + dependencies: + multibase "^4.0.1" + multicodec "^3.0.1" + multihashes "^4.0.1" + uint8arrays "^3.0.0" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +cli-spinners@^2.9.2: + version "2.9.2" + resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + +cli-width@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz" + integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz" + integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +commander@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz" + integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-fetch@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz" + integrity sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g== + dependencies: + node-fetch "^2.6.12" + +d@1, d@^1.0.1, d@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/d/-/d-1.0.2.tgz" + integrity sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw== + dependencies: + es5-ext "^0.10.64" + type "^2.7.2" + +debug@^2.2.0: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4.3.1: + version "4.3.6" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== + dependencies: + ms "2.1.2" + +decamelize-keys@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz" + integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0, decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +decompress-response@^4.2.0: + version "4.2.1" + resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz" + integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== + dependencies: + mimic-response "^2.0.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deepmerge@^4.3.1: + version "4.3.1" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz" + integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +dotenv@^16.0.3, dotenv@^16.4.1: + version "16.4.5" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + +elliptic@6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +elliptic@^6.5.4: + version "6.5.6" + resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.6.tgz" + integrity sha512-mpzdtpeCLuS3BmE3pO3Cpp5bbjlOPY2Q0PgoF+Od1XZrHLYI28Xe3ossCmYCQt11FQKEYd9+PF8jymTvtWJSHQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +err-code@^3.0.0, err-code@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz" + integrity sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es5-ext@^0.10.35, es5-ext@^0.10.62, es5-ext@^0.10.63, es5-ext@^0.10.64, es5-ext@~0.10.14: + version "0.10.64" + resolved "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz" + integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg== + dependencies: + es6-iterator "^2.0.3" + es6-symbol "^3.1.3" + esniff "^2.0.1" + next-tick "^1.1.0" + +es6-iterator@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz" + integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-promise@^4.2.8: + version "4.2.8" + resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-symbol@^3.1.1, es6-symbol@^3.1.3: + version "3.1.4" + resolved "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz" + integrity sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg== + dependencies: + d "^1.0.2" + ext "^1.7.0" + +esbuild@~0.23.0: + version "0.23.0" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz" + integrity sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA== + optionalDependencies: + "@esbuild/aix-ppc64" "0.23.0" + "@esbuild/android-arm" "0.23.0" + "@esbuild/android-arm64" "0.23.0" + "@esbuild/android-x64" "0.23.0" + "@esbuild/darwin-arm64" "0.23.0" + "@esbuild/darwin-x64" "0.23.0" + "@esbuild/freebsd-arm64" "0.23.0" + "@esbuild/freebsd-x64" "0.23.0" + "@esbuild/linux-arm" "0.23.0" + "@esbuild/linux-arm64" "0.23.0" + "@esbuild/linux-ia32" "0.23.0" + "@esbuild/linux-loong64" "0.23.0" + "@esbuild/linux-mips64el" "0.23.0" + "@esbuild/linux-ppc64" "0.23.0" + "@esbuild/linux-riscv64" "0.23.0" + "@esbuild/linux-s390x" "0.23.0" + "@esbuild/linux-x64" "0.23.0" + "@esbuild/netbsd-x64" "0.23.0" + "@esbuild/openbsd-arm64" "0.23.0" + "@esbuild/openbsd-x64" "0.23.0" + "@esbuild/sunos-x64" "0.23.0" + "@esbuild/win32-arm64" "0.23.0" + "@esbuild/win32-ia32" "0.23.0" + "@esbuild/win32-x64" "0.23.0" + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +esniff@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz" + integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg== + dependencies: + d "^1.0.1" + es5-ext "^0.10.62" + event-emitter "^0.3.5" + type "^2.7.2" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +ethereum-bloom-filters@^1.0.6: + version "1.2.0" + resolved "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.2.0.tgz" + integrity sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA== + dependencies: + "@noble/hashes" "^1.4.0" + +ethereum-cryptography@^0.1.3: + version "0.1.3" + resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== + dependencies: + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" + +ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2: + version "2.2.1" + resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz" + integrity sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg== + dependencies: + "@noble/curves" "1.4.2" + "@noble/hashes" "1.4.0" + "@scure/bip32" "1.4.0" + "@scure/bip39" "1.3.0" + +ethereumjs-util@^7.1.5: + version "7.1.5" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + +ethers@5.7.2, ethers@^5.7.0: + version "5.7.2" + resolved "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== + dependencies: + "@ethersproject/abi" "5.7.0" + "@ethersproject/abstract-provider" "5.7.0" + "@ethersproject/abstract-signer" "5.7.0" + "@ethersproject/address" "5.7.0" + "@ethersproject/base64" "5.7.0" + "@ethersproject/basex" "5.7.0" + "@ethersproject/bignumber" "5.7.0" + "@ethersproject/bytes" "5.7.0" + "@ethersproject/constants" "5.7.0" + "@ethersproject/contracts" "5.7.0" + "@ethersproject/hash" "5.7.0" + "@ethersproject/hdnode" "5.7.0" + "@ethersproject/json-wallets" "5.7.0" + "@ethersproject/keccak256" "5.7.0" + "@ethersproject/logger" "5.7.0" + "@ethersproject/networks" "5.7.1" + "@ethersproject/pbkdf2" "5.7.0" + "@ethersproject/properties" "5.7.0" + "@ethersproject/providers" "5.7.2" + "@ethersproject/random" "5.7.0" + "@ethersproject/rlp" "5.7.0" + "@ethersproject/sha2" "5.7.0" + "@ethersproject/signing-key" "5.7.0" + "@ethersproject/solidity" "5.7.0" + "@ethersproject/strings" "5.7.0" + "@ethersproject/transactions" "5.7.0" + "@ethersproject/units" "5.7.0" + "@ethersproject/wallet" "5.7.0" + "@ethersproject/web" "5.7.1" + "@ethersproject/wordlists" "5.7.0" + +ethjs-unit@0.1.6: + version "0.1.6" + resolved "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz" + integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== + dependencies: + bn.js "4.11.6" + number-to-bn "1.7.0" + +event-emitter@^0.3.5: + version "0.3.5" + resolved "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz" + integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA== + dependencies: + d "1" + es5-ext "~0.10.14" + +eventemitter3@4.0.4: + version "4.0.4" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz" + integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== + +events@^3.2.0, events@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + +ext@^1.7.0: + version "1.7.0" + resolved "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz" + integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== + dependencies: + type "^2.7.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +external-editor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +figures@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +find-object-paths@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/find-object-paths/-/find-object-paths-1.1.0.tgz" + integrity sha512-UJvfPQibLUOrXl76PJ49cYbXJPsU1lYX6Pw7mHVW+ahaGx6kVHiozNIQriDc/EOlSvkDa6L9GyTFXPYQsa6sGA== + +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz" + integrity sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg== + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-tsconfig@^4.7.5: + version "4.7.6" + resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz" + integrity sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA== + dependencies: + resolve-pkg-maps "^1.0.0" + +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz" + integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +gray-matter@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz" + integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== + dependencies: + js-yaml "^3.13.1" + kind-of "^6.0.2" + section-matter "^1.0.0" + strip-bom-string "^1.0.0" + +hamt-sharding@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/hamt-sharding/-/hamt-sharding-2.0.1.tgz" + integrity sha512-vnjrmdXG9dDs1m/H4iJ6z0JFI2NtgsW5keRkTcM85NGak69Mkf5PHUqBz+Xs0T4sg0ppvj9O5EGAJo40FTxmmA== + dependencies: + sparse-array "^1.3.1" + uint8arrays "^3.0.0" + +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: + version "1.1.7" + resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hasown@^2.0.0, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +hosted-git-info@^4.0.1: + version "4.1.0" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== + dependencies: + lru-cache "^6.0.0" + +http-https@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz" + integrity sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg== + +iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.13, ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@~1.3.0: + version "1.3.8" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +interface-ipld-format@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/interface-ipld-format/-/interface-ipld-format-1.0.1.tgz" + integrity sha512-WV/ar+KQJVoQpqRDYdo7YPGYIUHJxCuOEhdvsRpzLqoOIVCqPKdMMYmsLL1nCRsF3yYNio+PAJbCKiv6drrEAg== + dependencies: + cids "^1.1.6" + multicodec "^3.0.1" + multihashes "^4.0.2" + +invariant@2: + version "2.2.4" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +ipfs-only-hash@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/ipfs-only-hash/-/ipfs-only-hash-4.0.0.tgz" + integrity sha512-TE1DZCvfw8i3gcsTq3P4TFx3cKFJ3sluu/J3XINkJhIN9OwJgNMqKA+WnKx6ByCb1IoPXsTp1KM7tupElb6SyA== + dependencies: + ipfs-unixfs-importer "^7.0.1" + meow "^9.0.0" + +ipfs-unixfs-importer@^7.0.1: + version "7.0.3" + resolved "https://registry.npmjs.org/ipfs-unixfs-importer/-/ipfs-unixfs-importer-7.0.3.tgz" + integrity sha512-qeFOlD3AQtGzr90sr5Tq1Bi8pT5Nr2tSI8z310m7R4JDYgZc6J1PEZO3XZQ8l1kuGoqlAppBZuOYmPEqaHcVQQ== + dependencies: + bl "^5.0.0" + cids "^1.1.5" + err-code "^3.0.1" + hamt-sharding "^2.0.0" + ipfs-unixfs "^4.0.3" + ipld-dag-pb "^0.22.2" + it-all "^1.0.5" + it-batch "^1.0.8" + it-first "^1.0.6" + it-parallel-batch "^1.0.9" + merge-options "^3.0.4" + multihashing-async "^2.1.0" + rabin-wasm "^0.1.4" + uint8arrays "^2.1.2" + +ipfs-unixfs@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/ipfs-unixfs/-/ipfs-unixfs-4.0.3.tgz" + integrity sha512-hzJ3X4vlKT8FQ3Xc4M1szaFVjsc1ZydN+E4VQ91aXxfpjFn9G2wsMo1EFdAXNq/BUnN5dgqIOMP5zRYr3DTsAw== + dependencies: + err-code "^3.0.1" + protobufjs "^6.10.2" + +ipld-dag-pb@^0.22.2: + version "0.22.3" + resolved "https://registry.npmjs.org/ipld-dag-pb/-/ipld-dag-pb-0.22.3.tgz" + integrity sha512-dfG5C5OVAR4FEP7Al2CrHWvAyIM7UhAQrjnOYOIxXGQz5NlEj6wGX0XQf6Ru6or1na6upvV3NQfstapQG8X2rg== + dependencies: + cids "^1.0.0" + interface-ipld-format "^1.0.0" + multicodec "^3.0.1" + multihashing-async "^2.0.0" + protobufjs "^6.10.2" + stable "^0.1.8" + uint8arrays "^2.0.5" + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-callable@^1.1.3: + version "1.2.7" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.13.0, is-core-module@^2.5.0: + version "2.15.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz" + integrity sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA== + dependencies: + hasown "^2.0.2" + +is-extendable@^0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz" + integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-hex-prefixed@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz" + integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== + +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" + integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-typed-array@^1.1.3: + version "1.1.13" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isows@1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/isows/-/isows-1.0.4.tgz" + integrity sha512-hEzjY+x9u9hPmBom9IIAqdJCwNLax+xrPb51vEPpERoFlIxgmZcHzsT5jKG06nvInKOBGvReAVz80Umed5CczQ== + +it-all@^1.0.5: + version "1.0.6" + resolved "https://registry.npmjs.org/it-all/-/it-all-1.0.6.tgz" + integrity sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A== + +it-batch@^1.0.8, it-batch@^1.0.9: + version "1.0.9" + resolved "https://registry.npmjs.org/it-batch/-/it-batch-1.0.9.tgz" + integrity sha512-7Q7HXewMhNFltTsAMdSz6luNhyhkhEtGGbYek/8Xb/GiqYMtwUmopE1ocPSiJKKp3rM4Dt045sNFoUu+KZGNyA== + +it-first@^1.0.6: + version "1.0.7" + resolved "https://registry.npmjs.org/it-first/-/it-first-1.0.7.tgz" + integrity sha512-nvJKZoBpZD/6Rtde6FXqwDqDZGF1sCADmr2Zoc0hZsIvnE449gRFnGctxDf09Bzc/FWnHXAdaHVIetY6lrE0/g== + +it-parallel-batch@^1.0.9: + version "1.0.11" + resolved "https://registry.npmjs.org/it-parallel-batch/-/it-parallel-batch-1.0.11.tgz" + integrity sha512-UWsWHv/kqBpMRmyZJzlmZeoAMA0F3SZr08FBdbhtbe+MtoEBgr/ZUAKrnenhXCBrsopy76QjRH2K/V8kNdupbQ== + dependencies: + it-batch "^1.0.9" + +js-sha3@0.8.0, js-sha3@^0.8.0: + version "0.8.0" + resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +json-bigint@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz" + integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== + dependencies: + bignumber.js "^9.0.0" + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +keccak@^3.0.0: + version "3.0.4" + resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz" + integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" + +kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash@^4.17.20: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +long@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/long/-/long-4.0.0.tgz" + integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +map-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" + integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== + +map-obj@^4.0.0: + version "4.3.0" + resolved "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz" + integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +meow@^9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz" + integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize "^1.2.0" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.18.0" + yargs-parser "^20.2.3" + +merge-options@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz" + integrity sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ== + dependencies: + is-plain-obj "^2.1.0" + +micro-ftch@^0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz" + integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== + +mimic-response@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz" + integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + +minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: + version "1.2.8" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +multibase@^4.0.1: + version "4.0.6" + resolved "https://registry.npmjs.org/multibase/-/multibase-4.0.6.tgz" + integrity sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ== + dependencies: + "@multiformats/base-x" "^4.0.1" + +multicodec@^3.0.1: + version "3.2.1" + resolved "https://registry.npmjs.org/multicodec/-/multicodec-3.2.1.tgz" + integrity sha512-+expTPftro8VAW8kfvcuNNNBgb9gPeNYV9dn+z1kJRWF2vih+/S79f2RVeIwmrJBUJ6NT9IUPWnZDQvegEh5pw== + dependencies: + uint8arrays "^3.0.0" + varint "^6.0.0" + +multiformats@^9.4.2: + version "9.9.0" + resolved "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz" + integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== + +multihashes@^4.0.1, multihashes@^4.0.2: + version "4.0.3" + resolved "https://registry.npmjs.org/multihashes/-/multihashes-4.0.3.tgz" + integrity sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA== + dependencies: + multibase "^4.0.1" + uint8arrays "^3.0.0" + varint "^5.0.2" + +multihashing-async@^2.0.0, multihashing-async@^2.1.0: + version "2.1.4" + resolved "https://registry.npmjs.org/multihashing-async/-/multihashing-async-2.1.4.tgz" + integrity sha512-sB1MiQXPSBTNRVSJc2zM157PXgDtud2nMFUEIvBrsq5Wv96sUclMRK/ecjoP1T/W61UJBqt4tCTwMkUpt2Gbzg== + dependencies: + blakejs "^1.1.0" + err-code "^3.0.0" + js-sha3 "^0.8.0" + multihashes "^4.0.1" + murmurhash3js-revisited "^3.0.0" + uint8arrays "^3.0.0" + +murmurhash3js-revisited@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz" + integrity sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g== + +mute-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz" + integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== + +nan@^2.14.0: + version "2.20.0" + resolved "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz" + integrity sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw== + +napi-build-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz" + integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== + +next-tick@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz" + integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== + +node-abi@^2.18.0, node-abi@^2.21.0, node-abi@^2.7.0: + version "2.30.1" + resolved "https://registry.npmjs.org/node-abi/-/node-abi-2.30.1.tgz" + integrity sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w== + dependencies: + semver "^5.4.1" + +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-addon-api@^3.0.2: + version "3.2.1" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz" + integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== + +node-addon-api@^4.2.0: + version "4.3.0" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz" + integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== + +node-fetch@^2.6.1, node-fetch@^2.6.12, node-fetch@^2.6.6: + version "2.7.0" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: + version "4.8.1" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz" + integrity sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw== + +node-hid@1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/node-hid/-/node-hid-1.3.0.tgz" + integrity sha512-BA6G4V84kiNd1uAChub/Z/5s/xS3EHBCxotQ0nyYrUG65mXewUDHE1tWOSqA2dp3N+mV0Ffq9wo2AW9t4p/G7g== + dependencies: + bindings "^1.5.0" + nan "^2.14.0" + node-abi "^2.18.0" + prebuild-install "^5.3.4" + +node-hid@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/node-hid/-/node-hid-2.1.1.tgz" + integrity sha512-Skzhqow7hyLZU93eIPthM9yjot9lszg9xrKxESleEs05V2NcbUptZc5HFqzjOkSmL0sFlZFr3kmvaYebx06wrw== + dependencies: + bindings "^1.5.0" + node-addon-api "^3.0.2" + prebuild-install "^6.0.0" + +noop-logger@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz" + integrity sha512-6kM8CLXvuW5crTxsAtva2YLrRrDaiTIkIePWs9moLHqbFWT94WpNFjwS/5dfLfECg5i/lkmw3aoqVidxt23TEQ== + +normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-package-data@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz" + integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== + dependencies: + hosted-git-info "^4.0.1" + is-core-module "^2.5.0" + semver "^7.3.4" + validate-npm-package-license "^3.0.1" + +npmlog@^4.0.1: + version "4.1.2" + resolved "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" + integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== + +number-to-bn@1.7.0: + version "1.7.0" + resolved "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz" + integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== + dependencies: + bn.js "4.11.6" + strip-hex-prefix "1.0.0" + +object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +oboe@2.1.5: + version "2.1.5" + resolved "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz" + integrity sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA== + dependencies: + http-https "^1.0.0" + +once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +pbkdf2@^3.0.17: + version "3.1.2" + resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +picocolors@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz" + integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== + +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + +prebuild-install@^5.3.4: + version "5.3.6" + resolved "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.6.tgz" + integrity sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg== + dependencies: + detect-libc "^1.0.3" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^1.0.1" + node-abi "^2.7.0" + noop-logger "^0.1.1" + npmlog "^4.0.1" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^3.0.3" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + which-pm-runs "^1.0.0" + +prebuild-install@^6.0.0: + version "6.1.4" + resolved "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.4.tgz" + integrity sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ== + dependencies: + detect-libc "^1.0.3" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^1.0.1" + node-abi "^2.21.0" + npmlog "^4.0.1" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^3.0.3" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + prettier-plugin-solidity@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.3.tgz#9a35124f578404caf617634a8cab80862d726cba" + resolved "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.3.tgz" integrity sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg== dependencies: "@solidity-parser/parser" "^0.16.0" @@ -32,22 +2735,840 @@ prettier-plugin-solidity@1.1.3: prettier@2.8.7: version "2.8.7" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.7.tgz#bb79fc8729308549d28fe3a98fce73d2c0656450" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz" integrity sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw== +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +protobufjs@^6.10.2: + version "6.11.4" + resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz" + integrity sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.1" + "@types/node" ">=13.7.0" + long "^4.0.0" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== + +rabin-wasm@^0.1.4: + version "0.1.5" + resolved "https://registry.npmjs.org/rabin-wasm/-/rabin-wasm-0.1.5.tgz" + integrity sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA== + dependencies: + "@assemblyscript/loader" "^0.9.4" + bl "^5.0.0" + debug "^4.3.1" + minimist "^1.2.5" + node-fetch "^2.6.1" + readable-stream "^3.6.0" + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +readable-stream@^2.0.6: + version "2.3.8" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + +resolve@^1.10.0: + version "1.22.8" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rlp@^2.2.4, rlp@^2.2.6: + version "2.2.7" + resolved "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== + dependencies: + bn.js "^5.2.0" + +run-async@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz" + integrity sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q== + +rxjs@6: + version "6.6.7" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +scrypt-js@3.0.1, scrypt-js@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +secp256k1@^4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== + dependencies: + elliptic "^6.5.4" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +section-matter@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz" + integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== + dependencies: + extend-shallow "^2.0.1" + kind-of "^6.0.0" + +"semver@2 || 3 || 4 || 5", semver@^5.4.1: + version "5.7.2" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@^7.3.4, semver@^7.3.5, semver@^7.6.2: + version "7.6.3" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + semver@^7.3.8: version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== dependencies: lru-cache "^6.0.0" +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +signal-exit@^3.0.0: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +signal-exit@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^3.0.3: + version "3.1.1" + resolved "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz" + integrity sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA== + dependencies: + decompress-response "^4.2.0" + once "^1.3.1" + simple-concat "^1.0.0" + solidity-comments-extractor@^0.0.7: version "0.0.7" - resolved "https://registry.yarnpkg.com/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz#99d8f1361438f84019795d928b931f4e5c39ca19" + resolved "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz" integrity sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw== +sparse-array@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/sparse-array/-/sparse-array-1.3.2.tgz" + integrity sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg== + +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.5.0" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.18" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz" + integrity sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" + integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom-string@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz" + integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== + +strip-hex-prefix@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz" + integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== + dependencies: + is-hex-prefixed "1.0.0" + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tar-fs@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +trim-newlines@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz" + integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== + +ts-node@^10.9.1: + version "10.9.2" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tsx@^4.7.1: + version "4.17.0" + resolved "https://registry.npmjs.org/tsx/-/tsx-4.17.0.tgz" + integrity sha512-eN4mnDA5UMKDt4YZixo9tBioibaMBpoxBkD+rIPAjVmYERSG0/dWEY1CEFuV89CgASlKL499q8AhmkMnnjtOJg== + dependencies: + esbuild "~0.23.0" + get-tsconfig "^4.7.5" + optionalDependencies: + fsevents "~2.3.3" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + +type-fest@^0.18.0: + version "0.18.1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz" + integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type@^2.7.2: + version "2.7.3" + resolved "https://registry.npmjs.org/type/-/type-2.7.3.tgz" + integrity sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ== + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typescript@^5.0.4: + version "5.5.4" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz" + integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== + +u2f-api@0.2.7: + version "0.2.7" + resolved "https://registry.npmjs.org/u2f-api/-/u2f-api-0.2.7.tgz" + integrity sha512-fqLNg8vpvLOD5J/z4B6wpPg4Lvowz1nJ9xdHcCzdUPKcFE/qNCceV2gNZxSJd5vhAZemHr/K/hbzVA0zxB5mkg== + +uint8arrays@^2.0.5, uint8arrays@^2.1.2: + version "2.1.10" + resolved "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.10.tgz" + integrity sha512-Q9/hhJa2836nQfEJSZTmr+pg9+cDJS9XEAp7N2Vg5MzL3bK/mkMVfjscRGYruP9jNda6MAdf4QD/y78gSzkp6A== + dependencies: + multiformats "^9.4.2" + +uint8arrays@^3.0.0: + version "3.1.1" + resolved "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz" + integrity sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg== + dependencies: + multiformats "^9.4.2" + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +undici-types@~6.13.0: + version "6.13.0" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz" + integrity sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg== + +usb@^1.6.3: + version "1.9.2" + resolved "https://registry.npmjs.org/usb/-/usb-1.9.2.tgz" + integrity sha512-dryNz030LWBPAf6gj8vyq0Iev3vPbCLHCT8dBw3gQRXRzVNsIdeuU+VjPp3ksmSPkeMAl1k+kQ14Ij0QHyeiAg== + dependencies: + node-addon-api "^4.2.0" + node-gyp-build "^4.3.0" + +utf-8-validate@^5.0.2: + version "5.0.10" + resolved "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz" + integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== + dependencies: + node-gyp-build "^4.3.0" + +utf8@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz" + integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +util@^0.12.5: + version "0.12.5" + resolved "https://registry.npmjs.org/util/-/util-0.12.5.tgz" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +varint@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz" + integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== + +varint@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz" + integrity sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg== + +viem@^2.17.11: + version "2.19.3" + resolved "https://registry.npmjs.org/viem/-/viem-2.19.3.tgz" + integrity sha512-djOw1X/jOvDOEMiol4g/T030MVncF2utC9G929ODNJ/00E7UXjSpwOeuyapmaqn831eSIHlELicZETYl2vI9oQ== + dependencies: + "@adraffy/ens-normalize" "1.10.0" + "@noble/curves" "1.4.0" + "@noble/hashes" "1.4.0" + "@scure/bip32" "1.4.0" + "@scure/bip39" "1.3.0" + abitype "1.0.5" + isows "1.0.4" + webauthn-p256 "0.0.5" + ws "8.17.1" + +web3-core-helpers@1.10.4: + version "1.10.4" + resolved "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.4.tgz" + integrity sha512-r+L5ylA17JlD1vwS8rjhWr0qg7zVoVMDvWhajWA5r5+USdh91jRUYosp19Kd1m2vE034v7Dfqe1xYRoH2zvG0g== + dependencies: + web3-eth-iban "1.10.4" + web3-utils "1.10.4" + +web3-core-method@1.10.4: + version "1.10.4" + resolved "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.10.4.tgz" + integrity sha512-uZTb7flr+Xl6LaDsyTeE2L1TylokCJwTDrIVfIfnrGmnwLc6bmTWCCrm71sSrQ0hqs6vp/MKbQYIYqUN0J8WyA== + dependencies: + "@ethersproject/transactions" "^5.6.2" + web3-core-helpers "1.10.4" + web3-core-promievent "1.10.4" + web3-core-subscriptions "1.10.4" + web3-utils "1.10.4" + +web3-core-promievent@1.10.4: + version "1.10.4" + resolved "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.10.4.tgz" + integrity sha512-2de5WnJQ72YcIhYwV/jHLc4/cWJnznuoGTJGD29ncFQHAfwW/MItHFSVKPPA5v8AhJe+r6y4Y12EKvZKjQVBvQ== + dependencies: + eventemitter3 "4.0.4" + +web3-core-requestmanager@1.10.4: + version "1.10.4" + resolved "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.10.4.tgz" + integrity sha512-vqP6pKH8RrhT/2MoaU+DY/OsYK9h7HmEBNCdoMj+4ZwujQtw/Mq2JifjwsJ7gits7Q+HWJwx8q6WmQoVZAWugg== + dependencies: + util "^0.12.5" + web3-core-helpers "1.10.4" + web3-providers-http "1.10.4" + web3-providers-ipc "1.10.4" + web3-providers-ws "1.10.4" + +web3-core-subscriptions@1.10.4: + version "1.10.4" + resolved "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.10.4.tgz" + integrity sha512-o0lSQo/N/f7/L76C0HV63+S54loXiE9fUPfHFcTtpJRQNDBVsSDdWRdePbWwR206XlsBqD5VHApck1//jEafTw== + dependencies: + eventemitter3 "4.0.4" + web3-core-helpers "1.10.4" + +web3-core@^1.8.1: + version "1.10.4" + resolved "https://registry.npmjs.org/web3-core/-/web3-core-1.10.4.tgz" + integrity sha512-B6elffYm81MYZDTrat7aEhnhdtVE3lDBUZft16Z8awYMZYJDbnykEbJVS+l3mnA7AQTnSDr/1MjWofGDLBJPww== + dependencies: + "@types/bn.js" "^5.1.1" + "@types/node" "^12.12.6" + bignumber.js "^9.0.0" + web3-core-helpers "1.10.4" + web3-core-method "1.10.4" + web3-core-requestmanager "1.10.4" + web3-utils "1.10.4" + +web3-eth-iban@1.10.4: + version "1.10.4" + resolved "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.4.tgz" + integrity sha512-0gE5iNmOkmtBmbKH2aTodeompnNE8jEyvwFJ6s/AF6jkw9ky9Op9cqfzS56AYAbrqEFuClsqB/AoRves7LDELw== + dependencies: + bn.js "^5.2.1" + web3-utils "1.10.4" + +web3-providers-http@1.10.4: + version "1.10.4" + resolved "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.10.4.tgz" + integrity sha512-m2P5Idc8hdiO0l60O6DSCPw0kw64Zgi0pMjbEFRmxKIck2Py57RQMu4bxvkxJwkF06SlGaEQF8rFZBmuX7aagQ== + dependencies: + abortcontroller-polyfill "^1.7.5" + cross-fetch "^4.0.0" + es6-promise "^4.2.8" + web3-core-helpers "1.10.4" + +web3-providers-ipc@1.10.4: + version "1.10.4" + resolved "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.10.4.tgz" + integrity sha512-YRF/bpQk9z3WwjT+A6FI/GmWRCASgd+gC0si7f9zbBWLXjwzYAKG73bQBaFRAHex1hl4CVcM5WUMaQXf3Opeuw== + dependencies: + oboe "2.1.5" + web3-core-helpers "1.10.4" + +web3-providers-ws@1.10.4: + version "1.10.4" + resolved "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.10.4.tgz" + integrity sha512-j3FBMifyuFFmUIPVQR4pj+t5ILhAexAui0opgcpu9R5LxQrLRUZxHSnU+YO25UycSOa/NAX8A+qkqZNpcFAlxA== + dependencies: + eventemitter3 "4.0.4" + web3-core-helpers "1.10.4" + websocket "^1.0.32" + +web3-utils@1.10.4, web3-utils@^1.8.1: + version "1.10.4" + resolved "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.4.tgz" + integrity sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A== + dependencies: + "@ethereumjs/util" "^8.1.0" + bn.js "^5.2.1" + ethereum-bloom-filters "^1.0.6" + ethereum-cryptography "^2.1.2" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + utf8 "3.0.0" + +webauthn-p256@0.0.5: + version "0.0.5" + resolved "https://registry.npmjs.org/webauthn-p256/-/webauthn-p256-0.0.5.tgz" + integrity sha512-drMGNWKdaixZNobeORVIqq7k5DsRC9FnG201K2QjeOoQLmtSDaSsVZdkg6n5jUALJKcAG++zBPJXmv6hy0nWFg== + dependencies: + "@noble/curves" "^1.4.0" + "@noble/hashes" "^1.4.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +websocket@^1.0.32: + version "1.0.35" + resolved "https://registry.npmjs.org/websocket/-/websocket-1.0.35.tgz" + integrity sha512-/REy6amwPZl44DDzvRCkaI1q1bIiQB0mEFQLUrhz3z2EK91cp3n72rAjUlrTP0zV22HJIUOVHQGPxhFRjxjt+Q== + dependencies: + bufferutil "^4.0.1" + debug "^2.2.0" + es5-ext "^0.10.63" + typedarray-to-buffer "^3.1.5" + utf-8-validate "^5.0.2" + yaeti "^0.0.6" + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-pm-runs@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz" + integrity sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA== + +which-typed-array@^1.1.14, which-typed-array@^1.1.2: + version "1.1.15" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.2" + +wide-align@^1.1.0: + version "1.1.5" + resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@7.4.6: + version "7.4.6" + resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + +ws@8.17.1: + version "8.17.1" + resolved "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== + +yaeti@^0.0.6: + version "0.0.6" + resolved "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz" + integrity sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug== + yallist@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@^20.2.3: + version "20.2.9" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +zksync-web3@^0.14.3: + version "0.14.4" + resolved "https://registry.npmjs.org/zksync-web3/-/zksync-web3-0.14.4.tgz" + integrity sha512-kYehMD/S6Uhe1g434UnaMN+sBr9nQm23Ywn0EUP5BfQCsbjcr3ORuS68PosZw8xUTu3pac7G6YMSnNHk+fwzvg== + +zod@^3.23.8: + version "3.23.8" + resolved "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz" + integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== From 1beab9b1b919cebc2fcdcfc2856b510def7337e3 Mon Sep 17 00:00:00 2001 From: Harsh Pandey Date: Wed, 28 Aug 2024 16:02:48 +0530 Subject: [PATCH 05/15] feat: snapshot diffs and base tests --- .env.example | 4 +- .gitignore | 1 + Makefile | 6 ++- .../pre_Scroll_example_post_Scroll_example.md | 25 ++++++++++ ..._arbitrum_example_post_arbitrum_example.md | 25 ++++++++++ ...valanche_example_post_avalanche_example.md | 25 ++++++++++ diffs/pre_base_example_post_base_example.md | 48 +++++++++++++++++++ diffs/pre_bnb_example_post_bnb_example.md | 30 ++++++++++++ ..._ethereum_example_post_ethereum_example.md | 5 ++ .../pre_gnosis_example_post_gnosis_example.md | 25 ++++++++++ diffs/pre_metis_example_post_metis_example.md | 25 ++++++++++ ..._optimism_example_post_optimism_example.md | 25 ++++++++++ foundry.toml | 14 +++--- lib/aave-helpers | 2 +- remappings.txt | 2 +- scripts/RiskStewardsBase.s.sol | 24 ++++++---- scripts/{ => deploy}/DeployStewards.s.sol | 2 +- scripts/networks/RiskStewardsArbitrum.s.sol | 11 +++++ scripts/networks/RiskStewardsAvalanche.s.sol | 11 +++++ scripts/networks/RiskStewardsBNB.s.sol | 11 +++++ scripts/networks/RiskStewardsBaseChain.s.sol | 11 +++++ scripts/networks/RiskStewardsEthereum.s.sol | 11 +++++ .../networks/RiskStewardsEthereumLido.s.sol | 11 +++++ scripts/networks/RiskStewardsGnosis.s.sol | 11 +++++ scripts/networks/RiskStewardsMetis.s.sol | 11 +++++ scripts/networks/RiskStewardsOptimism.s.sol | 11 +++++ scripts/networks/RiskStewardsPolygon.s.sol | 11 +++++ scripts/networks/RiskStewardsScroll.s.sol | 11 +++++ src/contracts/examples/ArbitrumExample.s.sol | 27 +++++++++++ src/contracts/examples/AvalancheExample.s.sol | 27 +++++++++++ src/contracts/examples/BNBExample.s.sol | 32 +++++++++++++ src/contracts/examples/BaseExample.s.sol | 39 +++++++++++++++ src/contracts/examples/EthereumExample.s.sol | 32 +++++++++++++ .../examples/EthereumLidoExample.s.sol | 30 ++++++++++++ src/contracts/examples/GnosisExample.s.sol | 27 +++++++++++ src/contracts/examples/MetisExample.s.sol | 27 +++++++++++ src/contracts/examples/OptimismExample.s.sol | 27 +++++++++++ src/contracts/examples/PolygonExample.s.sol | 27 +++++++++++ src/contracts/examples/ScrollExample.s.sol | 27 +++++++++++ tests/RiskSteward.t.sol | 2 +- tests/RiskStewardCapo.t.sol | 2 +- 41 files changed, 712 insertions(+), 23 deletions(-) create mode 100644 diffs/pre_Scroll_example_post_Scroll_example.md create mode 100644 diffs/pre_arbitrum_example_post_arbitrum_example.md create mode 100644 diffs/pre_avalanche_example_post_avalanche_example.md create mode 100644 diffs/pre_base_example_post_base_example.md create mode 100644 diffs/pre_bnb_example_post_bnb_example.md create mode 100644 diffs/pre_ethereum_example_post_ethereum_example.md create mode 100644 diffs/pre_gnosis_example_post_gnosis_example.md create mode 100644 diffs/pre_metis_example_post_metis_example.md create mode 100644 diffs/pre_optimism_example_post_optimism_example.md rename scripts/{ => deploy}/DeployStewards.s.sol (99%) create mode 100644 scripts/networks/RiskStewardsArbitrum.s.sol create mode 100644 scripts/networks/RiskStewardsAvalanche.s.sol create mode 100644 scripts/networks/RiskStewardsBNB.s.sol create mode 100644 scripts/networks/RiskStewardsBaseChain.s.sol create mode 100644 scripts/networks/RiskStewardsEthereum.s.sol create mode 100644 scripts/networks/RiskStewardsEthereumLido.s.sol create mode 100644 scripts/networks/RiskStewardsGnosis.s.sol create mode 100644 scripts/networks/RiskStewardsMetis.s.sol create mode 100644 scripts/networks/RiskStewardsOptimism.s.sol create mode 100644 scripts/networks/RiskStewardsPolygon.s.sol create mode 100644 scripts/networks/RiskStewardsScroll.s.sol create mode 100644 src/contracts/examples/ArbitrumExample.s.sol create mode 100644 src/contracts/examples/AvalancheExample.s.sol create mode 100644 src/contracts/examples/BNBExample.s.sol create mode 100644 src/contracts/examples/BaseExample.s.sol create mode 100644 src/contracts/examples/EthereumExample.s.sol create mode 100644 src/contracts/examples/EthereumLidoExample.s.sol create mode 100644 src/contracts/examples/GnosisExample.s.sol create mode 100644 src/contracts/examples/MetisExample.s.sol create mode 100644 src/contracts/examples/OptimismExample.s.sol create mode 100644 src/contracts/examples/PolygonExample.s.sol create mode 100644 src/contracts/examples/ScrollExample.s.sol diff --git a/.env.example b/.env.example index 24e495f..0d79413 100644 --- a/.env.example +++ b/.env.example @@ -19,7 +19,7 @@ RPC_ZKEVM=https://zkevm-rpc.com RPC_GNOSIS=https://rpc.ankr.com/gnosis RPC_BNB=https://binance.llamarpc.com RPC_SCROLL=https://rpc.scroll.io -RPC_ZK_SYNC=https://mainnet.era.zksync.io +RPC_ZKSYNC=https://mainnet.era.zksync.io # Etherscan api keys for verification & download utils ETHERSCAN_API_KEY_MAINNET= @@ -33,4 +33,4 @@ ETHERSCAN_API_KEY_ZKEVM= ETHERSCAN_API_KEY_GNOSIS= ETHERSCAN_API_KEY_BNB= ETHERSCAN_API_KEY_SCROLL= -ETHERSCAN_API_KEY_ZK_SYNC= +ETHERSCAN_API_KEY_ZKSYNC= diff --git a/.gitignore b/.gitignore index 512bfbe..26e143a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ cache/ out/ reports/ +zkout/ # general .env diff --git a/Makefile b/Makefile index 7609f51..360993d 100644 --- a/Makefile +++ b/Makefile @@ -24,5 +24,7 @@ git-diff : @printf '%s\n%s\n%s\n' "\`\`\`diff" "$$(git diff --no-index --diff-algorithm=patience --ignore-space-at-eol ${before} ${after})" "\`\`\`" > diffs/${out}.md # Deploy -deploy-ledger :; forge script ${contract} --rpc-url ${chain} $(if ${dry},--sender 0x25F2226B597E8F9514B3F68F00f494cF4f286491 -vvvv, --ledger --mnemonic-indexes ${MNEMONIC_INDEX} --sender ${LEDGER_SENDER} --verify -vvvv --slow --broadcast) -deploy-pk :; forge script ${contract} --rpc-url ${chain} $(if ${dry},--sender 0x25F2226B597E8F9514B3F68F00f494cF4f286491 -vvvv, --private-key ${PRIVATE_KEY} --verify -vvvv --slow --broadcast) +deploy-ledger :; FOUNDRY_PROFILE=${chain} forge script $(if $(filter zksync,${chain}),--zksync) ${contract} --rpc-url ${chain} $(if ${dry},--sender 0x25F2226B597E8F9514B3F68F00f494cF4f286491 -vvvv, --ledger --mnemonic-indexes ${MNEMONIC_INDEX} --sender ${LEDGER_SENDER} --verify -vvvv --slow --broadcast) +deploy-pk :; FOUNDRY_PROFILE=${chain} forge script $(if $(filter zksync,${chain}),--zksync) ${contract} --rpc-url ${chain} $(if ${dry},--sender 0x25F2226B597E8F9514B3F68F00f494cF4f286491 -vvvv, --private-key ${PRIVATE_KEY} --verify -vvvv --slow --broadcast) + +run-script:; FOUNDRY_PROFILE=${network} forge script ${contract_path} --rpc-url ${network} --sig "run(bool)" ${broadcast} -vv diff --git a/diffs/pre_Scroll_example_post_Scroll_example.md b/diffs/pre_Scroll_example_post_Scroll_example.md new file mode 100644 index 0000000..0af261b --- /dev/null +++ b/diffs/pre_Scroll_example_post_Scroll_example.md @@ -0,0 +1,25 @@ +## Reserve changes + +### Reserves altered + +#### wstETH ([0xf610A9dfB7C89644979b4A0f27063E9e7d7Cda32](https://scrollscan.com/address/0xf610A9dfB7C89644979b4A0f27063E9e7d7Cda32)) + +| description | value before | value after | +| --- | --- | --- | +| supplyCap | 22,000 wstETH | 30,000 wstETH | + + +## Raw diff + +```json +{ + "reserves": { + "0xf610A9dfB7C89644979b4A0f27063E9e7d7Cda32": { + "supplyCap": { + "from": 22000, + "to": 30000 + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/pre_arbitrum_example_post_arbitrum_example.md b/diffs/pre_arbitrum_example_post_arbitrum_example.md new file mode 100644 index 0000000..4f18414 --- /dev/null +++ b/diffs/pre_arbitrum_example_post_arbitrum_example.md @@ -0,0 +1,25 @@ +## Reserve changes + +### Reserves altered + +#### wstETH ([0x5979D7b546E38E414F7E9822514be443A4800529](https://arbiscan.io/address/0x5979D7b546E38E414F7E9822514be443A4800529)) + +| description | value before | value after | +| --- | --- | --- | +| supplyCap | 69,000 wstETH | 75,600 wstETH | + + +## Raw diff + +```json +{ + "reserves": { + "0x5979D7b546E38E414F7E9822514be443A4800529": { + "supplyCap": { + "from": 69000, + "to": 75600 + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/pre_avalanche_example_post_avalanche_example.md b/diffs/pre_avalanche_example_post_avalanche_example.md new file mode 100644 index 0000000..ff0a43c --- /dev/null +++ b/diffs/pre_avalanche_example_post_avalanche_example.md @@ -0,0 +1,25 @@ +## Reserve changes + +### Reserves altered + +#### USDC ([0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E](https://snowtrace.io/address/0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E)) + +| description | value before | value after | +| --- | --- | --- | +| supplyCap | 170,000,000 USDC | 200,000,000 USDC | + + +## Raw diff + +```json +{ + "reserves": { + "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E": { + "supplyCap": { + "from": 170000000, + "to": 200000000 + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/pre_base_example_post_base_example.md b/diffs/pre_base_example_post_base_example.md new file mode 100644 index 0000000..a0ef7f6 --- /dev/null +++ b/diffs/pre_base_example_post_base_example.md @@ -0,0 +1,48 @@ +## Reserve changes + +### Reserve altered + +#### WETH ([0x4200000000000000000000000000000000000006](https://basescan.org/address/0x4200000000000000000000000000000000000006)) + +| description | value before | value after | +| --- | --- | --- | +| liquidationThreshold | 83 % [8300] | 84 % [8400] | + + +#### USDC ([0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913](https://basescan.org/address/0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913)) + +| description | value before | value after | +| --- | --- | --- | +| ltv | 75 % [7500] | 77 % [7700] | +| liquidationThreshold | 78 % [7800] | 79 % [7900] | +| liquidationBonus | 5 % | 6 % | + + +## Raw diff + +```json +{ + "reserves": { + "0x4200000000000000000000000000000000000006": { + "liquidationThreshold": { + "from": 8300, + "to": 8400 + } + }, + "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913": { + "liquidationBonus": { + "from": 10500, + "to": 10600 + }, + "liquidationThreshold": { + "from": 7800, + "to": 7900 + }, + "ltv": { + "from": 7500, + "to": 7700 + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/pre_bnb_example_post_bnb_example.md b/diffs/pre_bnb_example_post_bnb_example.md new file mode 100644 index 0000000..36fe7ce --- /dev/null +++ b/diffs/pre_bnb_example_post_bnb_example.md @@ -0,0 +1,30 @@ +## Raw diff + +```json +{ + "strategies": { + "0x2170Ed0880ac9A755fd29B2688956BD959F933F8": { + "baseVariableBorrowRate": { + "from": "0", + "to": "10000000000000000000000000" + }, + "maxVariableBorrowRate": { + "from": "827000000000000000000000000", + "to": "940000000000000000000000000" + }, + "optimalUsageRatio": { + "from": "800000000000000000000000000", + "to": "850000000000000000000000000" + }, + "variableRateSlope1": { + "from": "27000000000000000000000000", + "to": "30000000000000000000000000" + }, + "variableRateSlope2": { + "from": "800000000000000000000000000", + "to": "900000000000000000000000000" + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/pre_ethereum_example_post_ethereum_example.md b/diffs/pre_ethereum_example_post_ethereum_example.md new file mode 100644 index 0000000..c15d3e2 --- /dev/null +++ b/diffs/pre_ethereum_example_post_ethereum_example.md @@ -0,0 +1,5 @@ +## Raw diff + +```json +{} +``` \ No newline at end of file diff --git a/diffs/pre_gnosis_example_post_gnosis_example.md b/diffs/pre_gnosis_example_post_gnosis_example.md new file mode 100644 index 0000000..113ab77 --- /dev/null +++ b/diffs/pre_gnosis_example_post_gnosis_example.md @@ -0,0 +1,25 @@ +## Reserve changes + +### Reserves altered + +#### wstETH ([0x6C76971f98945AE98dD7d4DFcA8711ebea946eA6](https://gnosisscan.io/address/0x6C76971f98945AE98dD7d4DFcA8711ebea946eA6)) + +| description | value before | value after | +| --- | --- | --- | +| supplyCap | 7,500 wstETH | 8,000 wstETH | + + +## Raw diff + +```json +{ + "reserves": { + "0x6C76971f98945AE98dD7d4DFcA8711ebea946eA6": { + "supplyCap": { + "from": 7500, + "to": 8000 + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/pre_metis_example_post_metis_example.md b/diffs/pre_metis_example_post_metis_example.md new file mode 100644 index 0000000..b781ea9 --- /dev/null +++ b/diffs/pre_metis_example_post_metis_example.md @@ -0,0 +1,25 @@ +## Reserve changes + +### Reserves altered + +#### WETH ([0x420000000000000000000000000000000000000A](https://explorer.metis.io/address/0x420000000000000000000000000000000000000A)) + +| description | value before | value after | +| --- | --- | --- | +| supplyCap | 2,300 WETH | 3,000 WETH | + + +## Raw diff + +```json +{ + "reserves": { + "0x420000000000000000000000000000000000000A": { + "supplyCap": { + "from": 2300, + "to": 3000 + } + } + } +} +``` \ No newline at end of file diff --git a/diffs/pre_optimism_example_post_optimism_example.md b/diffs/pre_optimism_example_post_optimism_example.md new file mode 100644 index 0000000..1b14d20 --- /dev/null +++ b/diffs/pre_optimism_example_post_optimism_example.md @@ -0,0 +1,25 @@ +## Reserve changes + +### Reserves altered + +#### wstETH ([0x1F32b1c2345538c0c6f582fCB022739c4A194Ebb](https://optimistic.etherscan.io/address/0x1F32b1c2345538c0c6f582fCB022739c4A194Ebb)) + +| description | value before | value after | +| --- | --- | --- | +| supplyCap | 34,500 wstETH | 40,000 wstETH | + + +## Raw diff + +```json +{ + "reserves": { + "0x1F32b1c2345538c0c6f582fCB022739c4A194Ebb": { + "supplyCap": { + "from": 34500, + "to": 40000 + } + } + } +} +``` \ No newline at end of file diff --git a/foundry.toml b/foundry.toml index 1733542..3346c5f 100644 --- a/foundry.toml +++ b/foundry.toml @@ -9,15 +9,17 @@ remappings = [ ] fs_permissions = [{ access = "write", path = "./reports" }] ffi = true +evm_version = 'shanghai' [profile.zksync] -src = 'zksync/src' -test = 'zksync/tests' +src = 'zksync' +test = 'zksync' +script = 'scripts' libs = ['lib'] -solc = '0.8.20' +solc = '0.8.19' fs_permissions = [{ access = "write", path = "./reports" }] ffi = true -evm_version = 'shanghai' +evm_version = 'paris' [profile.zksync.zksync] compile = true @@ -39,7 +41,7 @@ zkevm = "${RPC_ZKEVM}" gnosis = "${RPC_GNOSIS}" bnb = "${RPC_BNB}" scroll = "${RPC_SCROLL}" -zksync = "${RPC_ZK_SYNC}" +zksync = "${RPC_ZKSYNC}" [etherscan] mainnet = { key="${ETHERSCAN_API_KEY_MAINNET}", chainId=1 } @@ -54,6 +56,6 @@ zkevm = { key="${ETHERSCAN_API_KEY_ZKEVM}", chainId=1101 } gnosis = { key="${ETHERSCAN_API_KEY_GNOSIS}", chainId=100 } bnb = { key="${ETHERSCAN_API_KEY_BNB}", chainId=56, url='https://api.bscscan.com/api' } scroll = { key="${ETHERSCAN_API_KEY_SCROLL}", chainId= 534352 } -zksync = { key="${ETHERSCAN_API_KEY_ZK_SYNC}", chainId= 324 } +zksync = { key="${ETHERSCAN_API_KEY_ZKSYNC}", chainId= 324 } # See more config options https://github.com/gakonst/foundry/tree/master/config diff --git a/lib/aave-helpers b/lib/aave-helpers index 11b5c7b..ec361cc 160000 --- a/lib/aave-helpers +++ b/lib/aave-helpers @@ -1 +1 @@ -Subproject commit 11b5c7bf7c43cdf2dc8eb9d9bbf66f600e9feaa7 +Subproject commit ec361cce9c7ec45c5de71393c1ec941f02a91186 diff --git a/remappings.txt b/remappings.txt index 6453b16..9b47e90 100644 --- a/remappings.txt +++ b/remappings.txt @@ -1,4 +1,4 @@ -aave-helpers/=lib/aave-helpers/src/ +aave-helpers/=lib/aave-helpers/ forge-std/=lib/aave-helpers/lib/forge-std/src/ aave-address-book/=lib/aave-helpers/lib/aave-address-book/src/ solidity-utils/=lib/aave-helpers/lib/solidity-utils/src/ diff --git a/scripts/RiskStewardsBase.s.sol b/scripts/RiskStewardsBase.s.sol index b8c5ee6..6ecef7d 100644 --- a/scripts/RiskStewardsBase.s.sol +++ b/scripts/RiskStewardsBase.s.sol @@ -3,7 +3,9 @@ pragma solidity ^0.8.0; import {IAaveV3ConfigEngine as IEngine, IPool} from 'aave-v3-periphery/contracts/v3-config-engine/IAaveV3ConfigEngine.sol'; import {IRiskSteward} from '../src/interfaces/IRiskSteward.sol'; -import {ProtocolV3TestBase} from 'aave-helpers/ProtocolV3TestBase.sol'; +import {ProtocolV3TestBase} from 'aave-helpers/src/ProtocolV3TestBase.sol'; +import {IOwnable} from 'aave-address-book/common/IOwnable.sol'; +import {IACLManager} from 'aave-address-book/AaveV3.sol'; abstract contract RiskStewardsBase is ProtocolV3TestBase { error FailedUpdate(); @@ -17,20 +19,20 @@ abstract contract RiskStewardsBase is ProtocolV3TestBase { STEWARD = IRiskSteward(steward); } - function capsUpdates() internal pure virtual returns (IEngine.CapsUpdate[] memory); + function capsUpdates() internal pure virtual returns (IEngine.CapsUpdate[] memory) {} - function collateralsUpdates() public view virtual returns (IEngine.CollateralUpdate[] memory) {} + function collateralsUpdates() internal pure virtual returns (IEngine.CollateralUpdate[] memory) {} function rateStrategiesUpdates() - public - view + internal + pure virtual returns (IEngine.RateStrategyUpdate[] memory) {} - function lstPriceCapsUpdates() public view virtual returns (IRiskSteward.PriceCapLstUpdate[] memory) {} + function lstPriceCapsUpdates() internal pure virtual returns (IRiskSteward.PriceCapLstUpdate[] memory) {} - function stablePriceCapsUpdates() public view virtual returns (IRiskSteward.PriceCapStableUpdate[] memory) {} + function stablePriceCapsUpdates() internal pure virtual returns (IRiskSteward.PriceCapStableUpdate[] memory) {} function name() internal pure virtual returns (string memory); @@ -38,6 +40,12 @@ abstract contract RiskStewardsBase is ProtocolV3TestBase { * @notice This script doesn't broadcast as it's intended to be used via safe */ function run(bool broadcastToSafe) external { + // TODO: remove once risk stewards are activated via governance + vm.startPrank(IOwnable(address(STEWARD)).owner()); + address aclManager = STEWARD.POOL_DATA_PROVIDER().ADDRESSES_PROVIDER().getACLManager(); + IACLManager(aclManager).grantRole(IACLManager(aclManager).RISK_ADMIN_ROLE(), address(STEWARD)); + vm.stopPrank(); + vm.startPrank(STEWARD.RISK_COUNCIL()); bytes[] memory callDatas = _simulateAndGenerateDiff(); vm.stopPrank(); @@ -106,7 +114,7 @@ abstract contract RiskStewardsBase is ProtocolV3TestBase { if (lstPriceCapUpdates.length != 0) { callDatas[txCount] = abi.encodeWithSelector( IRiskSteward.updateLstPriceCaps.selector, - rateUpdates + lstPriceCapUpdates ); (bool success, bytes memory resultData) = address(STEWARD).call(callDatas[txCount]); _verifyCallResult(success, resultData); diff --git a/scripts/DeployStewards.s.sol b/scripts/deploy/DeployStewards.s.sol similarity index 99% rename from scripts/DeployStewards.s.sol rename to scripts/deploy/DeployStewards.s.sol index 798500b..8b9f823 100644 --- a/scripts/DeployStewards.s.sol +++ b/scripts/deploy/DeployStewards.s.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.0; import 'solidity-utils/contracts/utils/ScriptUtils.sol'; import 'aave-address-book/AaveAddressBook.sol'; import {IOwnable} from 'aave-address-book/common/IOwnable.sol'; -import {RiskSteward, IRiskSteward, IPoolDataProvider, IEngine} from '../src/contracts/RiskSteward.sol'; +import {RiskSteward, IRiskSteward, IPoolDataProvider, IEngine} from '../../src/contracts/RiskSteward.sol'; library DeployRiskStewards { function _deployRiskStewards( diff --git a/scripts/networks/RiskStewardsArbitrum.s.sol b/scripts/networks/RiskStewardsArbitrum.s.sol new file mode 100644 index 0000000..9c72296 --- /dev/null +++ b/scripts/networks/RiskStewardsArbitrum.s.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Arbitrum} from 'aave-address-book/AaveV3Arbitrum.sol'; +import {RiskStewardsBase} from '../RiskStewardsBase.s.sol'; + +abstract contract RiskStewardsArbitrum is RiskStewardsBase { + constructor() + RiskStewardsBase(address(AaveV3Arbitrum.POOL), AaveV3Arbitrum.RISK_STEWARD) + {} +} diff --git a/scripts/networks/RiskStewardsAvalanche.s.sol b/scripts/networks/RiskStewardsAvalanche.s.sol new file mode 100644 index 0000000..c650fdf --- /dev/null +++ b/scripts/networks/RiskStewardsAvalanche.s.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Avalanche} from 'aave-address-book/AaveV3Avalanche.sol'; +import {RiskStewardsBase} from '../RiskStewardsBase.s.sol'; + +abstract contract RiskStewardsAvalanche is RiskStewardsBase { + constructor() + RiskStewardsBase(address(AaveV3Avalanche.POOL), AaveV3Avalanche.RISK_STEWARD) + {} +} diff --git a/scripts/networks/RiskStewardsBNB.s.sol b/scripts/networks/RiskStewardsBNB.s.sol new file mode 100644 index 0000000..c48a491 --- /dev/null +++ b/scripts/networks/RiskStewardsBNB.s.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3BNB} from 'aave-address-book/AaveV3BNB.sol'; +import {RiskStewardsBase} from '../RiskStewardsBase.s.sol'; + +abstract contract RiskStewardsBNB is RiskStewardsBase { + constructor() + RiskStewardsBase(address(AaveV3BNB.POOL), AaveV3BNB.RISK_STEWARD) + {} +} diff --git a/scripts/networks/RiskStewardsBaseChain.s.sol b/scripts/networks/RiskStewardsBaseChain.s.sol new file mode 100644 index 0000000..773804d --- /dev/null +++ b/scripts/networks/RiskStewardsBaseChain.s.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Base} from 'aave-address-book/AaveV3Base.sol'; +import {RiskStewardsBase} from '../RiskStewardsBase.s.sol'; + +abstract contract RiskStewardsBaseChain is RiskStewardsBase { + constructor() + RiskStewardsBase(address(AaveV3Base.POOL), AaveV3Base.RISK_STEWARD) + {} +} diff --git a/scripts/networks/RiskStewardsEthereum.s.sol b/scripts/networks/RiskStewardsEthereum.s.sol new file mode 100644 index 0000000..e639b85 --- /dev/null +++ b/scripts/networks/RiskStewardsEthereum.s.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Ethereum} from 'aave-address-book/AaveV3Ethereum.sol'; +import {RiskStewardsBase} from '../RiskStewardsBase.s.sol'; + +abstract contract RiskStewardsEthereum is RiskStewardsBase { + constructor() + RiskStewardsBase(address(AaveV3Ethereum.POOL), AaveV3Ethereum.RISK_STEWARD) + {} +} diff --git a/scripts/networks/RiskStewardsEthereumLido.s.sol b/scripts/networks/RiskStewardsEthereumLido.s.sol new file mode 100644 index 0000000..84beb59 --- /dev/null +++ b/scripts/networks/RiskStewardsEthereumLido.s.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumLido} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {RiskStewardsBase} from '../RiskStewardsBase.s.sol'; + +abstract contract RiskStewardsEthereumLido is RiskStewardsBase { + constructor() + RiskStewardsBase(address(AaveV3EthereumLido.POOL), AaveV3EthereumLido.RISK_STEWARD) + {} +} diff --git a/scripts/networks/RiskStewardsGnosis.s.sol b/scripts/networks/RiskStewardsGnosis.s.sol new file mode 100644 index 0000000..2d4391d --- /dev/null +++ b/scripts/networks/RiskStewardsGnosis.s.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Gnosis} from 'aave-address-book/AaveV3Gnosis.sol'; +import {RiskStewardsBase} from '../RiskStewardsBase.s.sol'; + +abstract contract RiskStewardsGnosis is RiskStewardsBase { + constructor() + RiskStewardsBase(address(AaveV3Gnosis.POOL), AaveV3Gnosis.RISK_STEWARD) + {} +} diff --git a/scripts/networks/RiskStewardsMetis.s.sol b/scripts/networks/RiskStewardsMetis.s.sol new file mode 100644 index 0000000..301038a --- /dev/null +++ b/scripts/networks/RiskStewardsMetis.s.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Metis} from 'aave-address-book/AaveV3Metis.sol'; +import {RiskStewardsBase} from '../RiskStewardsBase.s.sol'; + +abstract contract RiskStewardsMetis is RiskStewardsBase { + constructor() + RiskStewardsBase(address(AaveV3Metis.POOL), AaveV3Metis.RISK_STEWARD) + {} +} diff --git a/scripts/networks/RiskStewardsOptimism.s.sol b/scripts/networks/RiskStewardsOptimism.s.sol new file mode 100644 index 0000000..b7bb3e5 --- /dev/null +++ b/scripts/networks/RiskStewardsOptimism.s.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Optimism} from 'aave-address-book/AaveV3Optimism.sol'; +import {RiskStewardsBase} from '../RiskStewardsBase.s.sol'; + +abstract contract RiskStewardsOptimism is RiskStewardsBase { + constructor() + RiskStewardsBase(address(AaveV3Optimism.POOL), AaveV3Optimism.RISK_STEWARD) + {} +} diff --git a/scripts/networks/RiskStewardsPolygon.s.sol b/scripts/networks/RiskStewardsPolygon.s.sol new file mode 100644 index 0000000..3b3b9ee --- /dev/null +++ b/scripts/networks/RiskStewardsPolygon.s.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Polygon} from 'aave-address-book/AaveV3Polygon.sol'; +import {RiskStewardsBase} from '../RiskStewardsBase.s.sol'; + +abstract contract RiskStewardsPolygon is RiskStewardsBase { + constructor() + RiskStewardsBase(address(AaveV3Polygon.POOL), AaveV3Polygon.RISK_STEWARD) + {} +} diff --git a/scripts/networks/RiskStewardsScroll.s.sol b/scripts/networks/RiskStewardsScroll.s.sol new file mode 100644 index 0000000..ea779de --- /dev/null +++ b/scripts/networks/RiskStewardsScroll.s.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3Scroll} from 'aave-address-book/AaveV3Scroll.sol'; +import {RiskStewardsBase} from '../RiskStewardsBase.s.sol'; + +abstract contract RiskStewardsScroll is RiskStewardsBase { + constructor() + RiskStewardsBase(address(AaveV3Scroll.POOL), AaveV3Scroll.RISK_STEWARD) + {} +} diff --git a/src/contracts/examples/ArbitrumExample.s.sol b/src/contracts/examples/ArbitrumExample.s.sol new file mode 100644 index 0000000..76807be --- /dev/null +++ b/src/contracts/examples/ArbitrumExample.s.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3ArbitrumAssets} from 'aave-address-book/AaveV3Arbitrum.sol'; +import {IAaveV3ConfigEngine as IEngine} from 'aave-v3-periphery/contracts/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol'; +import {RiskStewardsArbitrum} from '../../../scripts/networks/RiskStewardsArbitrum.s.sol'; + +// make run-script network=arbitrum contract_path=src/contracts/examples/ArbitrumExample.s.sol:ArbitrumExample broadcast=false +contract ArbitrumExample is RiskStewardsArbitrum { + /** + * @return string name identifier used for the diff + */ + function name() internal pure override returns (string memory) { + return 'arbitrum_example'; + } + + function capsUpdates() internal pure override returns (IEngine.CapsUpdate[] memory) { + IEngine.CapsUpdate[] memory capUpdates = new IEngine.CapsUpdate[](1); + capUpdates[0] = IEngine.CapsUpdate({ + asset: AaveV3ArbitrumAssets.wstETH_UNDERLYING, + supplyCap: 75_600, + borrowCap: EngineFlags.KEEP_CURRENT + }); + return capUpdates; + } +} diff --git a/src/contracts/examples/AvalancheExample.s.sol b/src/contracts/examples/AvalancheExample.s.sol new file mode 100644 index 0000000..f07f1ac --- /dev/null +++ b/src/contracts/examples/AvalancheExample.s.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3AvalancheAssets} from 'aave-address-book/AaveV3Avalanche.sol'; +import {IAaveV3ConfigEngine as IEngine} from 'aave-v3-periphery/contracts/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol'; +import {RiskStewardsAvalanche} from '../../../scripts/networks/RiskStewardsAvalanche.s.sol'; + +// make run-script network=avalanche contract_path=src/contracts/examples/AvalancheExample.s.sol:AvalancheExample broadcast=false +contract AvalancheExample is RiskStewardsAvalanche { + /** + * @return string name identifier used for the diff + */ + function name() internal pure override returns (string memory) { + return 'avalanche_example'; + } + + function capsUpdates() internal pure override returns (IEngine.CapsUpdate[] memory) { + IEngine.CapsUpdate[] memory capUpdates = new IEngine.CapsUpdate[](1); + capUpdates[0] = IEngine.CapsUpdate({ + asset: AaveV3AvalancheAssets.USDC_UNDERLYING, + supplyCap: 200_000_000, + borrowCap: EngineFlags.KEEP_CURRENT + }); + return capUpdates; + } +} diff --git a/src/contracts/examples/BNBExample.s.sol b/src/contracts/examples/BNBExample.s.sol new file mode 100644 index 0000000..ea54ee5 --- /dev/null +++ b/src/contracts/examples/BNBExample.s.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3BNBAssets} from 'aave-address-book/AaveV3BNB.sol'; +import {IAaveV3ConfigEngine as IEngine} from 'aave-v3-periphery/contracts/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol'; +import {RiskStewardsBNB} from '../../../scripts/networks/RiskStewardsBNB.s.sol'; + +// make run-script network=bnb contract_path=src/contracts/examples/BNBExample.s.sol:BNBExample broadcast=false +contract BNBExample is RiskStewardsBNB { + /** + * @return string name identifier used for the diff + */ + function name() internal pure override returns (string memory) { + return 'bnb_example'; + } + + function rateStrategiesUpdates() internal pure override returns (IEngine.RateStrategyUpdate[] memory) { + IEngine.RateStrategyUpdate[] memory rateUpdates = new IEngine.RateStrategyUpdate[](1); + rateUpdates[0] = IEngine.RateStrategyUpdate({ + asset: AaveV3BNBAssets.ETH_UNDERLYING, + params: IEngine.InterestRateInputData({ + optimalUsageRatio: 85_00, + baseVariableBorrowRate: 1_00, + variableRateSlope1: 3_00, + variableRateSlope2: 90_00 + }) + }); + + return rateUpdates; + } +} diff --git a/src/contracts/examples/BaseExample.s.sol b/src/contracts/examples/BaseExample.s.sol new file mode 100644 index 0000000..c09430c --- /dev/null +++ b/src/contracts/examples/BaseExample.s.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3BaseAssets} from 'aave-address-book/AaveV3Base.sol'; +import {IAaveV3ConfigEngine as IEngine} from 'aave-v3-periphery/contracts/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol'; +import {RiskStewardsBaseChain} from '../../../scripts/networks/RiskStewardsBaseChain.s.sol'; + +// make run-script network=base contract_path=src/contracts/examples/BaseExample.s.sol:BaseExample broadcast=false +contract BaseExample is RiskStewardsBaseChain { + /** + * @return string name identifier used for the diff + */ + function name() internal pure override returns (string memory) { + return 'base_example'; + } + + function collateralsUpdates() internal pure override returns (IEngine.CollateralUpdate[] memory) { + IEngine.CollateralUpdate[] memory collateralUpdates = new IEngine.CollateralUpdate[](2); + collateralUpdates[0] = IEngine.CollateralUpdate({ + asset: AaveV3BaseAssets.USDC_UNDERLYING, + ltv: 77_00, + liqThreshold: 79_00, + liqBonus: 6_00, + debtCeiling: EngineFlags.KEEP_CURRENT, + liqProtocolFee: EngineFlags.KEEP_CURRENT + }); + collateralUpdates[1] = IEngine.CollateralUpdate({ + asset: AaveV3BaseAssets.WETH_UNDERLYING, + ltv: EngineFlags.KEEP_CURRENT, + liqThreshold: 84_00, + liqBonus: EngineFlags.KEEP_CURRENT, + debtCeiling: EngineFlags.KEEP_CURRENT, + liqProtocolFee: EngineFlags.KEEP_CURRENT + }); + + return collateralUpdates; + } +} diff --git a/src/contracts/examples/EthereumExample.s.sol b/src/contracts/examples/EthereumExample.s.sol new file mode 100644 index 0000000..83c9658 --- /dev/null +++ b/src/contracts/examples/EthereumExample.s.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {IAaveV3ConfigEngine as IEngine} from 'aave-v3-periphery/contracts/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol'; +import {RiskStewardsEthereum} from '../../../scripts/networks/RiskStewardsEthereum.s.sol'; +import {IRiskSteward, IPriceCapAdapter} from '../../interfaces/IRiskSteward.sol'; + +// make run-script network=mainnet contract_path=src/contracts/examples/EthereumExample.s.sol:EthereumExample broadcast=false +contract EthereumExample is RiskStewardsEthereum { + /** + * @return string name identifier used for the diff + */ + function name() internal pure override returns (string memory) { + return 'ethereum_example'; + } + + function lstPriceCapsUpdates() internal pure override returns (IRiskSteward.PriceCapLstUpdate[] memory) { + IRiskSteward.PriceCapLstUpdate[] memory priceCapUpdates = new IRiskSteward.PriceCapLstUpdate[](1); + + priceCapUpdates[0] = IRiskSteward.PriceCapLstUpdate({ + oracle: AaveV3EthereumAssets.wstETH_ORACLE, + priceCapUpdateParams: IPriceCapAdapter.PriceCapUpdateParams({ + snapshotTimestamp: 1723621200, + snapshotRatio: 1177101458282319168, + maxYearlyRatioGrowthPercent: 10_64 + }) + }); + return priceCapUpdates; + } +} diff --git a/src/contracts/examples/EthereumLidoExample.s.sol b/src/contracts/examples/EthereumLidoExample.s.sol new file mode 100644 index 0000000..2a90930 --- /dev/null +++ b/src/contracts/examples/EthereumLidoExample.s.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumLidoAssets} from 'aave-address-book/AaveV3EthereumLido.sol'; +import {IAaveV3ConfigEngine as IEngine} from 'aave-v3-periphery/contracts/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol'; +import {RiskStewardsEthereumLido} from '../../../scripts/networks/RiskStewardsEthereumLido.s.sol'; + +// make run-script network=mainnet contract_path=src/contracts/examples/EthereumLidoExample.s.sol:EthereumLidoExample broadcast=false +contract EthereumLidoExample is RiskStewardsEthereumLido { + /** + * @return string name identifier used for the diff + */ + function name() internal pure override returns (string memory) { + return 'ethereumlido_example'; + } + + /** + * @return IEngine.CapsUpdate[] capUpdates to be performed + */ + function capsUpdates() internal pure override returns (IEngine.CapsUpdate[] memory) { + IEngine.CapsUpdate[] memory capUpdates = new IEngine.CapsUpdate[](1); + capUpdates[0] = IEngine.CapsUpdate( + AaveV3EthereumLidoAssets.wstETH_UNDERLYING, + 700_000, + EngineFlags.KEEP_CURRENT + ); + return capUpdates; + } +} diff --git a/src/contracts/examples/GnosisExample.s.sol b/src/contracts/examples/GnosisExample.s.sol new file mode 100644 index 0000000..5f96dda --- /dev/null +++ b/src/contracts/examples/GnosisExample.s.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3GnosisAssets} from 'aave-address-book/AaveV3Gnosis.sol'; +import {IAaveV3ConfigEngine as IEngine} from 'aave-v3-periphery/contracts/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol'; +import {RiskStewardsGnosis} from '../../../scripts/networks/RiskStewardsGnosis.s.sol'; + +// make run-script network=gnosis contract_path=src/contracts/examples/GnosisExample.s.sol:GnosisExample broadcast=false +contract GnosisExample is RiskStewardsGnosis { + /** + * @return string name identifier used for the diff + */ + function name() internal pure override returns (string memory) { + return 'gnosis_example'; + } + + function capsUpdates() internal pure override returns (IEngine.CapsUpdate[] memory) { + IEngine.CapsUpdate[] memory capUpdates = new IEngine.CapsUpdate[](1); + capUpdates[0] = IEngine.CapsUpdate( + AaveV3GnosisAssets.wstETH_UNDERLYING, + 8_000, + EngineFlags.KEEP_CURRENT + ); + return capUpdates; + } +} diff --git a/src/contracts/examples/MetisExample.s.sol b/src/contracts/examples/MetisExample.s.sol new file mode 100644 index 0000000..c26f379 --- /dev/null +++ b/src/contracts/examples/MetisExample.s.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3MetisAssets} from 'aave-address-book/AaveV3Metis.sol'; +import {IAaveV3ConfigEngine as IEngine} from 'aave-v3-periphery/contracts/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol'; +import {RiskStewardsMetis} from '../../../scripts/networks/RiskStewardsMetis.s.sol'; + +// make run-script network=metis contract_path=src/contracts/examples/MetisExample.s.sol:MetisExample broadcast=false +contract MetisExample is RiskStewardsMetis { + /** + * @return string name identifier used for the diff + */ + function name() internal pure override returns (string memory) { + return 'metis_example'; + } + + function capsUpdates() internal pure override returns (IEngine.CapsUpdate[] memory) { + IEngine.CapsUpdate[] memory capUpdates = new IEngine.CapsUpdate[](1); + capUpdates[0] = IEngine.CapsUpdate( + AaveV3MetisAssets.WETH_UNDERLYING, + 3_000, + EngineFlags.KEEP_CURRENT + ); + return capUpdates; + } +} diff --git a/src/contracts/examples/OptimismExample.s.sol b/src/contracts/examples/OptimismExample.s.sol new file mode 100644 index 0000000..856f147 --- /dev/null +++ b/src/contracts/examples/OptimismExample.s.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3OptimismAssets} from 'aave-address-book/AaveV3Optimism.sol'; +import {IAaveV3ConfigEngine as IEngine} from 'aave-v3-periphery/contracts/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol'; +import {RiskStewardsOptimism} from '../../../scripts/networks/RiskStewardsOptimism.s.sol'; + +// make run-script network=optimism contract_path=src/contracts/examples/OptimismExample.s.sol:OptimismExample broadcast=false +contract OptimismExample is RiskStewardsOptimism { + /** + * @return string name identifier used for the diff + */ + function name() internal pure override returns (string memory) { + return 'optimism_example'; + } + + function capsUpdates() internal pure override returns (IEngine.CapsUpdate[] memory) { + IEngine.CapsUpdate[] memory capUpdates = new IEngine.CapsUpdate[](1); + capUpdates[0] = IEngine.CapsUpdate( + AaveV3OptimismAssets.wstETH_UNDERLYING, + 40_000, + EngineFlags.KEEP_CURRENT + ); + return capUpdates; + } +} diff --git a/src/contracts/examples/PolygonExample.s.sol b/src/contracts/examples/PolygonExample.s.sol new file mode 100644 index 0000000..f9df849 --- /dev/null +++ b/src/contracts/examples/PolygonExample.s.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3PolygonAssets} from 'aave-address-book/AaveV3Polygon.sol'; +import {IAaveV3ConfigEngine as IEngine} from 'aave-v3-periphery/contracts/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol'; +import {RiskStewardsPolygon} from '../../../scripts/networks/RiskStewardsPolygon.s.sol'; + +// make run-script network=polygon contract_path=src/contracts/examples/PolygonExample.s.sol:PolygonExample broadcast=false +contract PolygonExample is RiskStewardsPolygon { + /** + * @return string name identifier used for the diff + */ + function name() internal pure override returns (string memory) { + return 'polygon_example'; + } + + function capsUpdates() internal pure override returns (IEngine.CapsUpdate[] memory) { + IEngine.CapsUpdate[] memory capUpdates = new IEngine.CapsUpdate[](1); + capUpdates[0] = IEngine.CapsUpdate( + AaveV3PolygonAssets.wstETH_UNDERLYING, + 75_000, + EngineFlags.KEEP_CURRENT + ); + return capUpdates; + } +} diff --git a/src/contracts/examples/ScrollExample.s.sol b/src/contracts/examples/ScrollExample.s.sol new file mode 100644 index 0000000..e9c5713 --- /dev/null +++ b/src/contracts/examples/ScrollExample.s.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3ScrollAssets} from 'aave-address-book/AaveV3Scroll.sol'; +import {IAaveV3ConfigEngine as IEngine} from 'aave-v3-periphery/contracts/v3-config-engine/IAaveV3ConfigEngine.sol'; +import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol'; +import {RiskStewardsScroll} from '../../../scripts/networks/RiskStewardsScroll.s.sol'; + +// make run-script network=scroll contract_path=src/contracts/examples/ScrollExample.s.sol:ScrollExample broadcast=false +contract ScrollExample is RiskStewardsScroll { + /** + * @return string name identifier used for the diff + */ + function name() internal pure override returns (string memory) { + return 'Scroll_example'; + } + + function capsUpdates() internal pure override returns (IEngine.CapsUpdate[] memory) { + IEngine.CapsUpdate[] memory capUpdates = new IEngine.CapsUpdate[](1); + capUpdates[0] = IEngine.CapsUpdate( + AaveV3ScrollAssets.wstETH_UNDERLYING, + 30_000, + EngineFlags.KEEP_CURRENT + ); + return capUpdates; + } +} diff --git a/tests/RiskSteward.t.sol b/tests/RiskSteward.t.sol index c30a86a..b4f2fc2 100644 --- a/tests/RiskSteward.t.sol +++ b/tests/RiskSteward.t.sol @@ -8,7 +8,7 @@ import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; import {RiskSteward, IRiskSteward, IEngine, EngineFlags} from 'src/contracts/RiskSteward.sol'; import {IAaveV3ConfigEngine as IEngine} from 'aave-v3-origin/periphery/contracts/v3-config-engine/AaveV3ConfigEngine.sol'; -import {GovV3Helpers} from 'aave-helpers/GovV3Helpers.sol'; +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; import {ConfigEngineDeployer} from './utils/ConfigEngineDeployer.sol'; contract RiskSteward_Test is Test { diff --git a/tests/RiskStewardCapo.t.sol b/tests/RiskStewardCapo.t.sol index fd482d3..310bb93 100644 --- a/tests/RiskStewardCapo.t.sol +++ b/tests/RiskStewardCapo.t.sol @@ -6,7 +6,7 @@ import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; import {AaveV3Ethereum, AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; import {RiskSteward, IRiskSteward, IEngine, EngineFlags} from 'src/contracts/RiskSteward.sol'; import {IAaveV3ConfigEngine as IEngine} from 'aave-v3-origin/periphery/contracts/v3-config-engine/AaveV3ConfigEngine.sol'; -import {GovV3Helpers} from 'aave-helpers/GovV3Helpers.sol'; +import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol'; import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol'; import {ConfigEngineDeployer} from './utils/ConfigEngineDeployer.sol'; import {IPriceCapAdapter} from 'aave-capo/interfaces/IPriceCapAdapter.sol'; From 52d7374a5919f4de3195707753336fc3ec67a7e5 Mon Sep 17 00:00:00 2001 From: Harsh Pandey Date: Wed, 28 Aug 2024 17:37:05 +0530 Subject: [PATCH 06/15] feat: add generator files --- generator/cli.ts | 159 ++++++++ generator/common.ts | 114 ++++++ .../__snapshots__/rateUpdates.spec.ts.snap | 360 ++++++++++++++++++ generator/features/capsUpdates.ts | 67 ++++ generator/features/collateralsUpdates.ts | 88 +++++ generator/features/mocks/configs.ts | 130 +++++++ generator/features/rateUpdates.spec.ts | 37 ++ generator/features/rateUpdates.ts | 181 +++++++++ generator/features/types.ts | 107 ++++++ generator/generator.ts | 101 +++++ generator/prompts.spec.ts | 82 ++++ generator/prompts.ts | 68 ++++ generator/prompts/addressPrompt.spec.ts | 54 +++ generator/prompts/addressPrompt.ts | 24 ++ generator/prompts/advancedInput.ts | 94 +++++ generator/prompts/assetsSelectPrompt.ts | 21 + generator/prompts/boolPrompt.ts | 44 +++ generator/prompts/numberPrompt.ts | 34 ++ generator/prompts/percentPrompt.ts | 49 +++ generator/prompts/stringPrompt.ts | 22 ++ generator/prompts/types.ts | 12 + generator/templates/aip.template.ts | 52 +++ generator/templates/proposal.template.ts | 70 ++++ generator/templates/script.template.ts | 120 ++++++ generator/templates/test.template.ts | 53 +++ generator/templates/zksync.script.template.ts | 97 +++++ generator/types.ts | 104 +++++ generator/utils/constants.ts | 8 + generator/utils/importsResolver.spec.ts | 44 +++ generator/utils/importsResolver.ts | 106 ++++++ package.json | 15 +- yarn.lock | 68 +++- 32 files changed, 2582 insertions(+), 3 deletions(-) create mode 100644 generator/cli.ts create mode 100644 generator/common.ts create mode 100644 generator/features/__snapshots__/rateUpdates.spec.ts.snap create mode 100644 generator/features/capsUpdates.ts create mode 100644 generator/features/collateralsUpdates.ts create mode 100644 generator/features/mocks/configs.ts create mode 100644 generator/features/rateUpdates.spec.ts create mode 100644 generator/features/rateUpdates.ts create mode 100644 generator/features/types.ts create mode 100644 generator/generator.ts create mode 100644 generator/prompts.spec.ts create mode 100644 generator/prompts.ts create mode 100644 generator/prompts/addressPrompt.spec.ts create mode 100644 generator/prompts/addressPrompt.ts create mode 100644 generator/prompts/advancedInput.ts create mode 100644 generator/prompts/assetsSelectPrompt.ts create mode 100644 generator/prompts/boolPrompt.ts create mode 100644 generator/prompts/numberPrompt.ts create mode 100644 generator/prompts/percentPrompt.ts create mode 100644 generator/prompts/stringPrompt.ts create mode 100644 generator/prompts/types.ts create mode 100644 generator/templates/aip.template.ts create mode 100644 generator/templates/proposal.template.ts create mode 100644 generator/templates/script.template.ts create mode 100644 generator/templates/test.template.ts create mode 100644 generator/templates/zksync.script.template.ts create mode 100644 generator/types.ts create mode 100644 generator/utils/constants.ts create mode 100644 generator/utils/importsResolver.spec.ts create mode 100644 generator/utils/importsResolver.ts diff --git a/generator/cli.ts b/generator/cli.ts new file mode 100644 index 0000000..fa67e43 --- /dev/null +++ b/generator/cli.ts @@ -0,0 +1,159 @@ +import path from 'path'; +import {Command, Option} from 'commander'; +import {CHAIN_TO_CHAIN_ID, getDate, getPoolChain, pascalCase} from './common'; +import {input, checkbox} from '@inquirer/prompts'; +import { + CodeArtifact, + ConfigFile, + FEATURE, + FeatureModule, + Options, + POOLS, + PoolCache, + PoolConfigs, + PoolIdentifier, +} from './types'; +import {capsUpdates} from './features/capsUpdates'; +import {rateUpdatesV3} from './features/rateUpdates'; +import {collateralsUpdates} from './features/collateralsUpdates'; +import {generateFiles, writeFiles} from './generator'; +import {CHAIN_ID_CLIENT_MAP} from '@bgd-labs/js-utils'; +import {getBlockNumber} from 'viem/actions'; + +const program = new Command(); + +program + .name('proposal-generator') + .description('CLI to generate aave proposals') + .version('1.0.0') + .addOption(new Option('-f, --force', 'force creation (might overwrite existing files)')) + .addOption(new Option('-p, --pools ').choices(POOLS)) + .addOption(new Option('-t, --title ', 'aip title')) + .addOption(new Option('-a, --author ', 'author')) + .addOption(new Option('-d, --discussion ', 'forum link')) + .addOption(new Option('-s, --snapshot ', 'snapshot link')) + .addOption(new Option('-c, --configFile ', 'path to config file')) + .allowExcessArguments(false) + .parse(process.argv); + +let options = program.opts(); +let poolConfigs: PoolConfigs = {}; + +const FEATURE_MODULES_V3 = [ + rateUpdatesV3, + capsUpdates, + collateralsUpdates, +]; + +async function generateDeterministicPoolCache(pool: PoolIdentifier): Promise { + const chain = getPoolChain(pool); + const client = CHAIN_ID_CLIENT_MAP[CHAIN_TO_CHAIN_ID[chain]]; + return {blockNumber: Number(await getBlockNumber(client))}; +} + +async function fetchPoolOptions(pool: PoolIdentifier) { + poolConfigs[pool] = { + configs: {}, + artifacts: [], + cache: await generateDeterministicPoolCache(pool), + }; + + const features = await checkbox({ + message: `What do you want to do on ${pool}?`, + choices: FEATURE_MODULES_V3.map((m) => ({value: m.value, name: m.description})), + }); + for (const feature of features) { + const module = FEATURE_MODULES_V3.find((m) => m.value === feature)!; + poolConfigs[pool]!.configs[feature] = await module.cli({ + options, + pool, + cache: poolConfigs[pool]!.cache, + }); + poolConfigs[pool]!.artifacts.push( + module.build({ + options, + pool, + cfg: poolConfigs[pool]!.configs[feature], + cache: poolConfigs[pool]!.cache, + }), + ); + } +} + +if (options.configFile) { + const {config: cfgFile}: {config: ConfigFile} = await import( + path.join(process.cwd(), options.configFile) + ); + options = {...options, ...cfgFile.rootOptions}; + poolConfigs = cfgFile.poolOptions as any; + for (const pool of options.pools) { + if (poolConfigs[pool]) { + poolConfigs[pool]!.artifacts = []; + for (const feature of Object.keys(poolConfigs[pool]!.configs)) { + const module = FEATURE_MODULES_V3.find((m) => m.value === feature)!; + poolConfigs[pool]!.artifacts.push( + module.build({ + options, + pool, + cfg: poolConfigs[pool]!.configs[feature], + cache: poolConfigs[pool]!.cache, + }), + ); + } + } else { + await fetchPoolOptions(pool); + } + } +} else { + options.pools = await checkbox({ + message: 'Chains this proposal targets', + choices: POOLS.map((v) => ({name: v, value: v})), + required: true, + }); + + if (!options.title) { + options.title = await input({ + message: + 'Short title of your steward update that will be used as contract name (please refrain from including author or date)', + validate(input) { + if (input.length == 0) return "Your title can't be empty"; + // this is no exact math + // fully qualified identifiers are not allowed to be longer then 300 chars on etherscan api + // the path is roughly src(3)/date(8)_title/title_date(8):title_date(8), so 3 + 3*8 + 3 title.length + // so 80 sounds like a reasonable upper bound to stay below 300 character limit + if (input.trim().length > 80) return 'Your title is to long'; + return true; + }, + }); + } + options.shortName = pascalCase(options.title); + options.date = getDate(); + + if (!options.author) { + options.author = await input({ + message: 'Author of your proposal', + validate(input) { + if (input.length == 0) return "Your author can't be empty"; + return true; + }, + }); + } + + if (!options.discussion) { + options.discussion = await input({ + message: 'Link to forum discussion', + }); + } + + for (const pool of options.pools) { + await fetchPoolOptions(pool); + } +} + +try { + const files = await generateFiles(options, poolConfigs); + await writeFiles(options, files); +} catch (e) { + console.log(JSON.stringify({options, poolConfigs}, null, 2)); + throw e; +} diff --git a/generator/common.ts b/generator/common.ts new file mode 100644 index 0000000..19c2131 --- /dev/null +++ b/generator/common.ts @@ -0,0 +1,114 @@ +import * as addressBook from '@bgd-labs/aave-address-book'; +import {Options, PoolIdentifier, PoolIdentifierV3} from './types'; +import { + arbitrum, + avalanche, + mainnet, + metis, + optimism, + polygon, + base, + bsc, + gnosis, + scroll, + zkSync, +} from 'viem/chains'; + +export const AVAILABLE_CHAINS = [ + 'Ethereum', + 'Optimism', + 'Arbitrum', + 'Polygon', + 'Avalanche', + 'Fantom', + 'Harmony', + 'Metis', + 'Base', + 'BNB', + 'Gnosis', + 'Scroll', + 'ZkSync', +] as const; + +export function getAssets(pool: PoolIdentifier): string[] { + const assets = addressBook[pool].ASSETS; + return Object.keys(assets); +} + +export function getEModes(pool: PoolIdentifierV3) { + const eModes = addressBook[pool].E_MODES; + return eModes; +} + +export function getVersion(pool: PoolIdentifier) { + return 'V3'; +} + +export function getPoolChain(pool: PoolIdentifier) { + const chain = AVAILABLE_CHAINS.find((chain) => pool.indexOf(chain) !== -1); + if (!chain) throw new Error('cannot find chain for pool'); + return chain; +} + +export function getDate() { + const date = new Date(); + const years = date.getFullYear(); + const months = date.getMonth() + 1; // it's js so months are 0 indexed + const day = date.getDate(); + return `${years}${months <= 9 ? '0' : ''}${months}${day <= 9 ? '0' : ''}${day}`; +} + +/** + * Prefix with the date for proper sorting + * @param {*} options + * @returns + */ +export function generateFolderName(options: Options) { + return `${options.date}_${options.pools.length === 1 ? options.pools[0] : 'Multi'}_${ + options.shortName + }`; +} + +/** + * Suffix with the date as prefixing would generate invalid contract names + * @param {*} options + * @param {*} chain + * @returns + */ +export function generateContractName(options: Options, pool?: PoolIdentifier) { + let name = pool ? `${pool}_` : ''; + name += `${options.shortName}`; + name += `_${options.date}`; + return name; +} + +export function getChainAlias(chain) { + return chain === 'Ethereum' ? 'mainnet' : chain.toLowerCase(); +} + +export function pascalCase(str: string) { + return str + .replace(/[\W]/g, ' ') // remove special chars as this is used for solc contract name + .replace(/(\w)(\w*)/g, function (g0, g1, g2) { + return g1.toUpperCase() + g2; + }) + .replace(/ /g, ''); +} + +export const CHAIN_TO_CHAIN_ID = { + Ethereum: mainnet.id, + Polygon: polygon.id, + Optimism: optimism.id, + Arbitrum: arbitrum.id, + Avalanche: avalanche.id, + Metis: metis.id, + Base: base.id, + BNB: bsc.id, + Gnosis: gnosis.id, + Scroll: scroll.id, + ZkSync: zkSync.id, +}; + +export function flagAsRequired(message: string, required?: boolean) { + return required ? `${message}*` : message; +} diff --git a/generator/features/__snapshots__/rateUpdates.spec.ts.snap b/generator/features/__snapshots__/rateUpdates.spec.ts.snap new file mode 100644 index 0000000..3f272ac --- /dev/null +++ b/generator/features/__snapshots__/rateUpdates.spec.ts.snap @@ -0,0 +1,360 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`feature: rateUpdatesV2 > should properly generate files 1`] = ` +{ + "aip": "--- +title: "test" +author: "test" +discussions: "test" +snapshot: "test" +--- + +## Simple Summary + +## Motivation + +## Specification + +## References + +- Implementation: [AaveV2EthereumAMM](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20231023_AaveV2EthereumAMM_Test/AaveV2EthereumAMM_Test_20231023.sol) +- Tests: [AaveV2EthereumAMM](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20231023_AaveV2EthereumAMM_Test/AaveV2EthereumAMM_Test_20231023.t.sol) +- [Snapshot](test) +- [Discussion](test) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). +", + "jsonConfig": "import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV2EthereumAMM'], + title: 'test', + shortName: 'Test', + date: '20231023', + author: 'test', + discussion: 'test', + snapshot: 'test', + }, + poolOptions: { + AaveV2EthereumAMM: { + configs: { + RATE_UPDATE_V2: [ + { + asset: 'WETH', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '6', + variableRateSlope1: '', + variableRateSlope2: '', + stableRateSlope1: '', + stableRateSlope2: '', + }, + }, + { + asset: 'DAI', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '4', + variableRateSlope1: '10', + variableRateSlope2: '', + stableRateSlope1: '', + stableRateSlope2: '', + }, + }, + { + asset: 'USDC', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '4', + variableRateSlope1: '10', + variableRateSlope2: '', + stableRateSlope1: '', + stableRateSlope2: '', + }, + }, + { + asset: 'USDT', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '6', + variableRateSlope1: '10', + variableRateSlope2: '', + stableRateSlope1: '', + stableRateSlope2: '', + }, + }, + { + asset: 'WBTC', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '5', + variableRateSlope1: '', + variableRateSlope2: '', + stableRateSlope1: '', + stableRateSlope2: '', + }, + }, + ], + }, + cache: {blockNumber: 42}, + }, + }, +}; +", + "payloads": [ + { + "contractName": "AaveV2EthereumAMM_Test_20231023", + "payload": "// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV2EthereumAMMAssets} from 'aave-address-book/AaveV2EthereumAMM.sol'; +import {AaveV2PayloadEthereumAMM} from 'aave-helpers/src/v2-config-engine/AaveV2PayloadEthereumAMM.sol'; +import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol'; +import {IAaveV2ConfigEngine} from 'aave-helpers/src/v2-config-engine/IAaveV2ConfigEngine.sol'; +import {IV2RateStrategyFactory} from 'aave-helpers/src/v2-config-engine/IV2RateStrategyFactory.sol'; +/** + * @title test + * @author test + * - Snapshot: test + * - Discussion: test + */ +contract AaveV2EthereumAMM_Test_20231023 is AaveV2PayloadEthereumAMM { + function rateStrategiesUpdates() + public + pure + override + returns (IAaveV2ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV2ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV2ConfigEngine.RateStrategyUpdate[](5); + rateStrategies[0] = IAaveV2ConfigEngine.RateStrategyUpdate({ + asset: AaveV2EthereumAMMAssets.WETH_UNDERLYING, + params: IV2RateStrategyFactory.RateStrategyParams({ + optimalUtilizationRate: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: _bpsToRay(6_00), + variableRateSlope1: EngineFlags.KEEP_CURRENT, + variableRateSlope2: EngineFlags.KEEP_CURRENT, + stableRateSlope1: EngineFlags.KEEP_CURRENT, + stableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); + rateStrategies[1] = IAaveV2ConfigEngine.RateStrategyUpdate({ + asset: AaveV2EthereumAMMAssets.DAI_UNDERLYING, + params: IV2RateStrategyFactory.RateStrategyParams({ + optimalUtilizationRate: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: _bpsToRay(4_00), + variableRateSlope1: _bpsToRay(10_00), + variableRateSlope2: EngineFlags.KEEP_CURRENT, + stableRateSlope1: EngineFlags.KEEP_CURRENT, + stableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); + rateStrategies[2] = IAaveV2ConfigEngine.RateStrategyUpdate({ + asset: AaveV2EthereumAMMAssets.USDC_UNDERLYING, + params: IV2RateStrategyFactory.RateStrategyParams({ + optimalUtilizationRate: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: _bpsToRay(4_00), + variableRateSlope1: _bpsToRay(10_00), + variableRateSlope2: EngineFlags.KEEP_CURRENT, + stableRateSlope1: EngineFlags.KEEP_CURRENT, + stableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); + rateStrategies[3] = IAaveV2ConfigEngine.RateStrategyUpdate({ + asset: AaveV2EthereumAMMAssets.USDT_UNDERLYING, + params: IV2RateStrategyFactory.RateStrategyParams({ + optimalUtilizationRate: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: _bpsToRay(6_00), + variableRateSlope1: _bpsToRay(10_00), + variableRateSlope2: EngineFlags.KEEP_CURRENT, + stableRateSlope1: EngineFlags.KEEP_CURRENT, + stableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); + rateStrategies[4] = IAaveV2ConfigEngine.RateStrategyUpdate({ + asset: AaveV2EthereumAMMAssets.WBTC_UNDERLYING, + params: IV2RateStrategyFactory.RateStrategyParams({ + optimalUtilizationRate: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: _bpsToRay(5_00), + variableRateSlope1: EngineFlags.KEEP_CURRENT, + variableRateSlope2: EngineFlags.KEEP_CURRENT, + stableRateSlope1: EngineFlags.KEEP_CURRENT, + stableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); + + return rateStrategies; + } +} +", + "pool": "AaveV2EthereumAMM", + "test": "// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV2EthereumAMM} from 'aave-address-book/AaveV2EthereumAMM.sol'; + +import 'forge-std/Test.sol'; +import {ProtocolV2TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV2TestBase.sol'; +import {AaveV2EthereumAMM_Test_20231023} from './AaveV2EthereumAMM_Test_20231023.sol'; + +/** + * @dev Test for AaveV2EthereumAMM_Test_20231023 + * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20231023_AaveV2EthereumAMM_Test/AaveV2EthereumAMM_Test_20231023.t.sol -vv + */ +contract AaveV2EthereumAMM_Test_20231023_Test is ProtocolV2TestBase { + AaveV2EthereumAMM_Test_20231023 internal proposal; + + function setUp() public { + vm.createSelectFork(vm.rpcUrl('mainnet'), 42); + proposal = new AaveV2EthereumAMM_Test_20231023(); + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest('AaveV2EthereumAMM_Test_20231023', AaveV2EthereumAMM.POOL, address(proposal)); + } +} +", + }, + ], + "scripts": { + "defaultScript": "// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; +import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; +import {EthereumScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; +import {AaveV2EthereumAMM_Test_20231023} from './AaveV2EthereumAMM_Test_20231023.sol'; + +/** + * @dev Deploy Ethereum + * deploy-command: make deploy-ledger contract=src/20231023_AaveV2EthereumAMM_Test/Test_20231023.s.sol:DeployEthereum chain=mainnet + * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/Test_20231023.s.sol/1/run-latest.json + */ +contract DeployEthereum is EthereumScript { + function run() external broadcast { + // deploy payloads + address payload0 = GovV3Helpers.deployDeterministic( + type(AaveV2EthereumAMM_Test_20231023).creationCode + ); + + // compose action + IPayloadsControllerCore.ExecutionAction[] + memory actions = new IPayloadsControllerCore.ExecutionAction[](1); + actions[0] = GovV3Helpers.buildAction(payload0); + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } +} + +/** + * @dev Create Proposal + * command: make deploy-ledger contract=src/20231023_AaveV2EthereumAMM_Test/Test_20231023.s.sol:CreateProposal chain=mainnet + */ +contract CreateProposal is EthereumScript { + function run() external { + // create payloads + PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](1); + + // compose actions for validation + IPayloadsControllerCore.ExecutionAction[] + memory actionsEthereum = new IPayloadsControllerCore.ExecutionAction[](1); + actionsEthereum[0] = GovV3Helpers.buildAction( + type(AaveV2EthereumAMM_Test_20231023).creationCode + ); + payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal( + vm, + payloads, + GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, + GovV3Helpers.ipfsHashFile(vm, 'src/20231023_AaveV2EthereumAMM_Test/Test.md') + ); + } +} +", + }, +} +`; + +exports[`feature: rateUpdatesV2 > should return reasonable code 1`] = ` +{ + "code": { + "fn": [ + "function rateStrategiesUpdates() + public + pure + override + returns (IAaveV2ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV2ConfigEngine.RateStrategyUpdate[] memory rateStrategies = new IAaveV2ConfigEngine.RateStrategyUpdate[](5); + rateStrategies[0] = IAaveV2ConfigEngine.RateStrategyUpdate({ + asset: AaveV2EthereumAMMAssets.WETH_UNDERLYING, + params: IV2RateStrategyFactory.RateStrategyParams({ + optimalUtilizationRate: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: _bpsToRay(6_00), + variableRateSlope1: EngineFlags.KEEP_CURRENT, + variableRateSlope2: EngineFlags.KEEP_CURRENT, + stableRateSlope1: EngineFlags.KEEP_CURRENT, + stableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); +rateStrategies[1] = IAaveV2ConfigEngine.RateStrategyUpdate({ + asset: AaveV2EthereumAMMAssets.DAI_UNDERLYING, + params: IV2RateStrategyFactory.RateStrategyParams({ + optimalUtilizationRate: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: _bpsToRay(4_00), + variableRateSlope1: _bpsToRay(10_00), + variableRateSlope2: EngineFlags.KEEP_CURRENT, + stableRateSlope1: EngineFlags.KEEP_CURRENT, + stableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); +rateStrategies[2] = IAaveV2ConfigEngine.RateStrategyUpdate({ + asset: AaveV2EthereumAMMAssets.USDC_UNDERLYING, + params: IV2RateStrategyFactory.RateStrategyParams({ + optimalUtilizationRate: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: _bpsToRay(4_00), + variableRateSlope1: _bpsToRay(10_00), + variableRateSlope2: EngineFlags.KEEP_CURRENT, + stableRateSlope1: EngineFlags.KEEP_CURRENT, + stableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); +rateStrategies[3] = IAaveV2ConfigEngine.RateStrategyUpdate({ + asset: AaveV2EthereumAMMAssets.USDT_UNDERLYING, + params: IV2RateStrategyFactory.RateStrategyParams({ + optimalUtilizationRate: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: _bpsToRay(6_00), + variableRateSlope1: _bpsToRay(10_00), + variableRateSlope2: EngineFlags.KEEP_CURRENT, + stableRateSlope1: EngineFlags.KEEP_CURRENT, + stableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); +rateStrategies[4] = IAaveV2ConfigEngine.RateStrategyUpdate({ + asset: AaveV2EthereumAMMAssets.WBTC_UNDERLYING, + params: IV2RateStrategyFactory.RateStrategyParams({ + optimalUtilizationRate: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: _bpsToRay(5_00), + variableRateSlope1: EngineFlags.KEEP_CURRENT, + variableRateSlope2: EngineFlags.KEEP_CURRENT, + stableRateSlope1: EngineFlags.KEEP_CURRENT, + stableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); + + + return rateStrategies; + }", + ], + }, +} +`; diff --git a/generator/features/capsUpdates.ts b/generator/features/capsUpdates.ts new file mode 100644 index 0000000..6df207f --- /dev/null +++ b/generator/features/capsUpdates.ts @@ -0,0 +1,67 @@ +import {CodeArtifact, FEATURE, FeatureModule} from '../types'; +import {CapsUpdate, CapsUpdatePartial} from './types'; +import { + assetsSelectPrompt, + translateAssetToAssetLibUnderlying, +} from '../prompts/assetsSelectPrompt'; +import {numberPrompt, translateJsNumberToSol} from '../prompts/numberPrompt'; + +export async function fetchCapsUpdate(required?: boolean): Promise { + return { + supplyCap: await numberPrompt({ + message: 'New supply cap', + required, + }), + borrowCap: await numberPrompt({ + message: 'New borrow cap', + required, + }), + }; +} + +type CapsUpdates = CapsUpdate[]; + +export const capsUpdates: FeatureModule = { + value: FEATURE.CAPS_UPDATE, + description: 'CapsUpdates (supplyCap, borrowCap)', + async cli({pool}) { + console.log(`Fetching information for CapsUpdates on ${pool}`); + const assets = await assetsSelectPrompt({ + message: 'Select the assets you want to amend', + pool, + }); + + const response: CapsUpdates = []; + for (const asset of assets) { + console.log(`collecting info for ${asset}`); + response.push({asset, ...(await fetchCapsUpdate())}); + } + return response; + }, + build({pool, cfg}) { + const response: CodeArtifact = { + code: { + fn: [ + `function capsUpdates() public pure override returns (IAaveV3ConfigEngine.CapsUpdate[] memory) { + IAaveV3ConfigEngine.CapsUpdate[] memory capsUpdate = new IAaveV3ConfigEngine.CapsUpdate[](${ + cfg.length + }); + + ${cfg + .map( + (cfg, ix) => `capsUpdate[${ix}] = IAaveV3ConfigEngine.CapsUpdate({ + asset: ${translateAssetToAssetLibUnderlying(cfg.asset, pool)}, + supplyCap: ${translateJsNumberToSol(cfg.supplyCap)}, + borrowCap: ${translateJsNumberToSol(cfg.borrowCap)} + });`, + ) + .join('\n')} + + return capsUpdate; + }`, + ], + }, + }; + return response; + }, +}; diff --git a/generator/features/collateralsUpdates.ts b/generator/features/collateralsUpdates.ts new file mode 100644 index 0000000..8b0eb28 --- /dev/null +++ b/generator/features/collateralsUpdates.ts @@ -0,0 +1,88 @@ +import {CodeArtifact, FEATURE, FeatureModule, PoolIdentifier} from '../types'; +import {percentInput} from '../prompts'; +import {CollateralUpdate, CollateralUpdatePartial} from './types'; +import { + assetsSelectPrompt, + translateAssetToAssetLibUnderlying, +} from '../prompts/assetsSelectPrompt'; +import {numberPrompt, translateJsNumberToSol} from '../prompts/numberPrompt'; +import {percentPrompt, translateJsPercentToSol} from '../prompts/percentPrompt'; + +export async function fetchCollateralUpdate( + pool: PoolIdentifier, + required?: boolean, +): Promise { + return { + ltv: await percentPrompt({ + message: 'Loan to value', + required, + }), + liqThreshold: await percentPrompt({ + message: 'Liquidation Threshold', + required, + }), + liqBonus: await percentPrompt({ + message: 'Liquidation bonus', + required, + }), + debtCeiling: await numberPrompt({ + message: 'Debt ceiling', + required, + }), + liqProtocolFee: await percentPrompt({ + message: 'Liquidation protocol fee', + required, + }), + }; +} + +type CollateralUpdates = CollateralUpdate[]; + +export const collateralsUpdates: FeatureModule = { + value: FEATURE.COLLATERALS_UPDATE, + description: 'CollateralsUpdates (ltv,lt,lb,debtCeiling,liqProtocolFee,eModeCategory)', + async cli({pool}) { + console.log(`Fetching information for Collateral Updates on ${pool}`); + + const response: CollateralUpdates = []; + const assets = await assetsSelectPrompt({ + message: 'Select the assets you want to amend', + pool, + }); + for (const asset of assets) { + console.log(`collecting info for ${asset}`); + + response.push({asset, ...(await fetchCollateralUpdate(pool))}); + } + return response; + }, + build({pool, cfg}) { + const response: CodeArtifact = { + code: { + fn: [ + `function collateralsUpdates() public pure override returns (IAaveV3ConfigEngine.CollateralUpdate[] memory) { + IAaveV3ConfigEngine.CollateralUpdate[] memory collateralUpdate = new IAaveV3ConfigEngine.CollateralUpdate[](${ + cfg.length + }); + + ${cfg + .map( + (cfg, ix) => `collateralUpdate[${ix}] = IAaveV3ConfigEngine.CollateralUpdate({ + asset: ${translateAssetToAssetLibUnderlying(cfg.asset, pool)}, + ltv: ${translateJsPercentToSol(cfg.ltv)}, + liqThreshold: ${translateJsPercentToSol(cfg.liqThreshold)}, + liqBonus: ${translateJsPercentToSol(cfg.liqBonus)}, + debtCeiling: ${translateJsNumberToSol(cfg.debtCeiling)}, + liqProtocolFee: ${translateJsPercentToSol(cfg.liqProtocolFee)} + });`, + ) + .join('\n')} + + return collateralUpdate; + }`, + ], + }, + }; + return response; + }, +}; diff --git a/generator/features/mocks/configs.ts b/generator/features/mocks/configs.ts new file mode 100644 index 0000000..1266a49 --- /dev/null +++ b/generator/features/mocks/configs.ts @@ -0,0 +1,130 @@ +import {Options} from '../../types'; +import {EModeCategoryUpdate, Listing, PriceFeedUpdate, RateStrategyUpdate} from '../types'; + +export const MOCK_OPTIONS: Options = { + pools: ['AaveV3Ethereum'], + title: 'test', + shortName: 'Test', + date: '20231023', + author: 'test', + discussion: 'test', + snapshot: 'test', +}; + +export const assetListingConfig: Listing[] = [ + { + assetSymbol: 'PSP', + decimals: 18, + priceFeed: '0x72AFAECF99C9d9C8215fF44C77B94B99C28741e8', + ltv: '40', + liqThreshold: '50', + liqBonus: '5', + debtCeiling: '100000', + liqProtocolFee: '20', + enabledToBorrow: 'ENABLED', + flashloanable: 'ENABLED', + stableRateModeEnabled: 'DISABLED', + borrowableInIsolation: 'DISABLED', + withSiloedBorrowing: 'DISABLED', + reserveFactor: '20', + supplyCap: '10000', + borrowCap: '5000', + rateStrategyParams: { + optimalUtilizationRate: '80', + baseVariableBorrowRate: '0', + variableRateSlope1: '10', + variableRateSlope2: '100', + stableRateSlope1: '10', + stableRateSlope2: '100', + baseStableRateOffset: '1', + stableRateExcessOffset: '0', + optimalStableToTotalDebtRatio: '10', + }, + eModeCategory: 'AaveV3EthereumEModes.NONE', + asset: '0xcAfE001067cDEF266AfB7Eb5A286dCFD277f3dE5', + }, +]; + +export const priceFeedsUpdateConfig: PriceFeedUpdate[] = [ + { + asset: 'DAI', + priceFeed: '0xae7ab96520de3a18e5e111b5eaab095312d7fe84', + }, +]; + +export const emodeUpdates: EModeCategoryUpdate[] = [ + { + eModeCategory: 2, + ltv: '20_00', + liqThreshold: '30_00', + liqBonus: '5_00', + priceSource: '0x0000000000000000000000000000000000000000', + label: 'label', + }, + { + eModeCategory: 'AaveV3EthereumEModes.ETH_CORRELATED', + ltv: 'EngineFlags.KEEP_CURRENT', + liqThreshold: '50_00', + liqBonus: 'EngineFlags.KEEP_CURRENT', + priceSource: '', + label: '', + }, +]; + +export const rateUpdateV2: RateStrategyUpdate[] = [ + { + asset: 'WETH', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '6', + variableRateSlope1: '', + variableRateSlope2: '', + stableRateSlope1: '', + stableRateSlope2: '', + }, + }, + { + asset: 'DAI', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '4', + variableRateSlope1: '10', + variableRateSlope2: '', + stableRateSlope1: '', + stableRateSlope2: '', + }, + }, + { + asset: 'USDC', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '4', + variableRateSlope1: '10', + variableRateSlope2: '', + stableRateSlope1: '', + stableRateSlope2: '', + }, + }, + { + asset: 'USDT', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '6', + variableRateSlope1: '10', + variableRateSlope2: '', + stableRateSlope1: '', + stableRateSlope2: '', + }, + }, + { + asset: 'WBTC', + params: { + optimalUtilizationRate: '', + baseVariableBorrowRate: '5', + variableRateSlope1: '', + variableRateSlope2: '', + stableRateSlope1: '', + stableRateSlope2: '', + }, + }, +]; diff --git a/generator/features/rateUpdates.spec.ts b/generator/features/rateUpdates.spec.ts new file mode 100644 index 0000000..8ae10e4 --- /dev/null +++ b/generator/features/rateUpdates.spec.ts @@ -0,0 +1,37 @@ +// sum.test.js +import {expect, describe, it} from 'vitest'; +import {MOCK_OPTIONS, rateUpdateV2} from './mocks/configs'; +import {generateFiles} from '../generator'; +import {FEATURE, PoolConfigs} from '../types'; +import {rateUpdatesV2} from './rateUpdates'; + +describe('feature: rateUpdatesV2', () => { + it('should return reasonable code', () => { + const output = rateUpdatesV2.build({ + options: MOCK_OPTIONS, + pool: 'AaveV2EthereumAMM', + cfg: rateUpdateV2, + cache: {blockNumber: 42}, + }); + expect(output).toMatchSnapshot(); + }); + + it('should properly generate files', async () => { + const poolConfigs: PoolConfigs = { + ['AaveV2EthereumAMM']: { + artifacts: [ + rateUpdatesV2.build({ + options: {...MOCK_OPTIONS, pools: ['AaveV2EthereumAMM']}, + pool: 'AaveV2EthereumAMM', + cfg: rateUpdateV2, + cache: {blockNumber: 42}, + }), + ], + configs: {[FEATURE.RATE_UPDATE_V2]: rateUpdateV2}, + cache: {blockNumber: 42}, + }, + }; + const files = await generateFiles({...MOCK_OPTIONS, pools: ['AaveV2EthereumAMM']}, poolConfigs); + expect(files).toMatchSnapshot(); + }); +}); diff --git a/generator/features/rateUpdates.ts b/generator/features/rateUpdates.ts new file mode 100644 index 0000000..4c65b13 --- /dev/null +++ b/generator/features/rateUpdates.ts @@ -0,0 +1,181 @@ +import {CodeArtifact, FEATURE, FeatureModule} from '../types'; +import {RateStrategyParams, RateStrategyUpdate} from './types'; +import { + assetsSelectPrompt, + translateAssetToAssetLibUnderlying, +} from '../prompts/assetsSelectPrompt'; +import {percentPrompt, translateJsPercentToSol} from '../prompts/percentPrompt'; + +export async function fetchRateStrategyParamsV2(required?: boolean): Promise { + return { + optimalUtilizationRate: await percentPrompt({ + message: 'optimalUtilizationRate', + required, + }), + baseVariableBorrowRate: await percentPrompt({ + message: 'baseVariableBorrowRate', + required, + }), + variableRateSlope1: await percentPrompt({ + message: 'variableRateSlope1', + required, + }), + variableRateSlope2: await percentPrompt({ + message: 'variableRateSlope2', + required, + }), + stableRateSlope1: await percentPrompt({ + message: 'stableRateSlope1', + required, + }), + stableRateSlope2: await percentPrompt({ + message: 'stableRateSlope2', + required, + }), + }; +} + +export async function fetchRateStrategyParamsV3(required?: boolean) { + return { + optimalUtilizationRate: await percentPrompt({ + message: 'optimalUtilizationRate', + required, + }), + baseVariableBorrowRate: await percentPrompt({ + message: 'baseVariableBorrowRate', + required, + }), + variableRateSlope1: await percentPrompt({ + message: 'variableRateSlope1', + required, + }), + variableRateSlope2: await percentPrompt({ + message: 'variableRateSlope2', + required, + }), + }; +} + +export const rateUpdatesV2: FeatureModule = { + value: FEATURE.RATE_UPDATE_V2, + description: 'RateStrategiesUpdates', + async cli({pool}) { + console.log(`Fetching information for RatesUpdate on ${pool}`); + const assets = await assetsSelectPrompt({ + message: 'Select the assets you want to amend', + pool, + }); + const response: RateStrategyUpdate[] = []; + for (const asset of assets) { + console.log(`Fetching info for ${asset}`); + response.push({asset, params: await fetchRateStrategyParamsV2()}); + } + return response; + }, + build({pool, cfg}) { + const response: CodeArtifact = { + code: { + fn: [ + `function rateStrategiesUpdates() + public + pure + override + returns (IAaveV2ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV2ConfigEngine.RateStrategyUpdate[] memory rateStrategies = new IAaveV2ConfigEngine.RateStrategyUpdate[](${ + cfg.length + }); + ${cfg + .map( + (cfg, ix) => `rateStrategies[${ix}] = IAaveV2ConfigEngine.RateStrategyUpdate({ + asset: ${translateAssetToAssetLibUnderlying(cfg.asset, pool)}, + params: IV2RateStrategyFactory.RateStrategyParams({ + optimalUtilizationRate: ${translateJsPercentToSol( + cfg.params.optimalUtilizationRate, + true, + )}, + baseVariableBorrowRate: ${translateJsPercentToSol( + cfg.params.baseVariableBorrowRate, + true, + )}, + variableRateSlope1: ${translateJsPercentToSol( + cfg.params.variableRateSlope1, + true, + )}, + variableRateSlope2: ${translateJsPercentToSol( + cfg.params.variableRateSlope2, + true, + )}, + stableRateSlope1: ${translateJsPercentToSol(cfg.params.stableRateSlope1, true)}, + stableRateSlope2: ${translateJsPercentToSol(cfg.params.stableRateSlope2, true)} + }) + });`, + ) + .join('\n')} + + + return rateStrategies; + }`, + ], + }, + }; + return response; + }, +}; + +export const rateUpdatesV3: FeatureModule = { + value: FEATURE.RATE_UPDATE_V3, + description: 'RateStrategiesUpdates', + async cli({pool}) { + console.log(`Fetching information for RatesUpdate on ${pool}`); + const assets = await assetsSelectPrompt({ + message: 'Select the assets you want to amend', + pool, + }); + const response: RateStrategyUpdate[] = []; + for (const asset of assets) { + console.log(`Fetching info for ${asset}`); + response.push({asset, params: await fetchRateStrategyParamsV3()}); + } + return response; + }, + build({pool, cfg}) { + const response: CodeArtifact = { + code: { + fn: [ + `function rateStrategiesUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) + { + IAaveV3ConfigEngine.RateStrategyUpdate[] memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](${ + cfg.length + }); + ${cfg + .map( + (cfg, ix) => `rateStrategies[${ix}] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: ${translateAssetToAssetLibUnderlying(cfg.asset, pool)}, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: ${translateJsPercentToSol( + cfg.params.optimalUtilizationRate, + )}, + baseVariableBorrowRate: ${translateJsPercentToSol( + cfg.params.baseVariableBorrowRate, + )}, + variableRateSlope1: ${translateJsPercentToSol(cfg.params.variableRateSlope1)}, + variableRateSlope2: ${translateJsPercentToSol(cfg.params.variableRateSlope2)} + }) + });`, + ) + .join('\n')} + + + return rateStrategies; + }`, + ], + }, + }; + return response; + }, +}; diff --git a/generator/features/types.ts b/generator/features/types.ts new file mode 100644 index 0000000..d1b4e4f --- /dev/null +++ b/generator/features/types.ts @@ -0,0 +1,107 @@ +import {Hex} from 'viem'; +import {NumberInputValues, PercentInputValues} from '../prompts'; +import {BooleanSelectValues} from '../prompts/boolPrompt'; + +export interface AssetSelector { + asset: string; +} + +export interface TokenImplementations { + aToken: Hex; + vToken: Hex; + sToken: Hex; +} + +export interface CapsUpdatePartial { + supplyCap: NumberInputValues; + borrowCap: NumberInputValues; +} + +export interface CapsUpdate extends CapsUpdatePartial, AssetSelector {} + +export interface BorrowUpdatePartial { + enabledToBorrow: BooleanSelectValues; + flashloanable: BooleanSelectValues; + stableRateModeEnabled: BooleanSelectValues; + borrowableInIsolation: BooleanSelectValues; + withSiloedBorrowing: BooleanSelectValues; + reserveFactor: PercentInputValues; +} + +export interface BorrowUpdate extends BorrowUpdatePartial, AssetSelector {} + +export interface CollateralUpdatePartial { + ltv: PercentInputValues; + liqThreshold: PercentInputValues; + liqBonus: PercentInputValues; + debtCeiling: NumberInputValues; + liqProtocolFee: PercentInputValues; +} + +export interface CollateralUpdate extends CollateralUpdatePartial, AssetSelector {} + +export interface PriceFeedUpdatePartial { + priceFeed: Hex; +} + +export interface PriceFeedUpdate extends PriceFeedUpdatePartial, AssetSelector {} + +export interface AssetEModeUpdatePartial { + eModeCategory: string; +} + +export interface AssetEModeUpdate extends AssetEModeUpdatePartial, AssetSelector {} + +export interface EModeCategoryUpdate { + // library accessor or new id + eModeCategory: string | number; + ltv: NumberInputValues; + liqThreshold: NumberInputValues; + liqBonus: NumberInputValues; + priceSource?: Hex | ''; + label: string; +} + +export interface RateStrategyParams { + optimalUtilizationRate: string; + baseVariableBorrowRate: string; + variableRateSlope1: string; + variableRateSlope2: string; + stableRateSlope1?: string; + stableRateSlope2?: string; + baseStableRateOffset?: string; + stableRateExcessOffset?: string; + optimalStableToTotalDebtRatio?: string; +} + +export interface RateStrategyUpdate extends AssetSelector { + params: RateStrategyParams; +} + +export interface Listing + extends CollateralUpdatePartial, + BorrowUpdatePartial, + CapsUpdatePartial, + PriceFeedUpdatePartial { + asset: Hex; + assetSymbol: string; + rateStrategyParams: RateStrategyParams; + eModeCategory: string; + decimals: number; +} + +export interface ListingWithCustomImpl { + base: Listing; + implementations: TokenImplementations; +} + +export interface TokenStream { + asset: Hex; + receiver: Hex; + duration: string; + amount: string; +} + +export interface FreezeUpdate extends AssetSelector { + shouldBeFrozen: boolean; +} diff --git a/generator/generator.ts b/generator/generator.ts new file mode 100644 index 0000000..60f007a --- /dev/null +++ b/generator/generator.ts @@ -0,0 +1,101 @@ +import fs from 'fs'; +import path from 'path'; +import {generateContractName, generateFolderName} from './common'; +import {proposalTemplate} from './templates/proposal.template'; +import {testTemplate} from './templates/test.template'; +import {confirm} from '@inquirer/prompts'; +import {ConfigFile, Options, PoolConfigs, PoolIdentifier, Files} from './types'; +import prettier from 'prettier'; + +const prettierSolCfg = await prettier.resolveConfig('foo.sol'); +const prettierTsCfg = await prettier.resolveConfig('foo.ts'); + +/** + * Generates all the file contents for aip/tests/payloads & script + * @param options + * @param poolConfigs + * @returns + */ +export async function generateFiles(options: Options, poolConfigs: PoolConfigs): Promise { + const jsonConfig = await prettier.format( + `import {ConfigFile} from '../../generator/types'; + export const config: ConfigFile = ${JSON.stringify({ + rootOptions: options, + poolOptions: (Object.keys(poolConfigs) as PoolIdentifier[]).reduce((acc, pool) => { + acc[pool] = {configs: poolConfigs[pool]!.configs, cache: poolConfigs[pool]!.cache}; + return acc; + }, {}), + } as ConfigFile)}`, + {...prettierTsCfg, filepath: 'foo.ts'}, + ); + + async function createPayload(options: Options, pool: PoolIdentifier) { + const contractName = generateContractName(options, pool); + const testCode = testTemplate(options, poolConfigs[pool]!, pool); + + return { + pool, + payload: await prettier.format(proposalTemplate(options, poolConfigs[pool]!, pool), { + ...prettierSolCfg, + filepath: 'foo.sol', + }), + test: await prettier.format(testCode, { + ...prettierSolCfg, + filepath: 'foo.sol', + }), + contractName: contractName, + }; + } + + return { + jsonConfig, + payloads: await Promise.all(options.pools.map((pool) => createPayload(options, pool))), + }; +} + +async function askBeforeWrite(options: Options, path: string, content: string) { + if (!options.force && fs.existsSync(path)) { + const currentContent = fs.readFileSync(path, {encoding: 'utf8'}); + // skip if content did not change + if (currentContent === content) return; + const force = await confirm({ + message: `A file already exists at ${path} do you want to overwrite`, + default: false, + }); + if (!force) return; + } + fs.writeFileSync(path, content); +} + +/** + * Writes the files according to defined folder/file format + * @param options + * @param param1 + */ +export async function writeFiles(options: Options, {jsonConfig, payloads}: Files) { + const baseName = generateFolderName(options); + const baseFolder = path.join(process.cwd(), 'src/contracts/updates/', baseName); + + if (fs.existsSync(baseFolder)) { + if (!options.force && fs.existsSync(baseFolder)) { + const force = await confirm({ + message: 'A proposal already exists at that location, do you want to continue?', + default: false, + }); + if (!force) return; + } + } else { + fs.mkdirSync(baseFolder, {recursive: true}); + } + + // write config + await askBeforeWrite(options, path.join(baseFolder, 'config.ts'), jsonConfig); + + for (const {payload, contractName} of payloads) { + await askBeforeWrite( + options, + path.join(baseFolder, `${contractName}.sol`), + payload, + ); + } +} diff --git a/generator/prompts.spec.ts b/generator/prompts.spec.ts new file mode 100644 index 0000000..4c7a932 --- /dev/null +++ b/generator/prompts.spec.ts @@ -0,0 +1,82 @@ +import {expect, describe, it} from 'vitest'; +import {render} from '@inquirer/testing'; +import { + numberPrompt, + transformNumberToHumanReadable, + translateJsNumberToSol, +} from './prompts/numberPrompt'; +import { + percentPrompt, + transformNumberToPercent, + translateJsPercentToSol, +} from './prompts/percentPrompt'; + +describe('prompts', () => { + describe('numberInput', () => { + it('handles "yes"', async () => { + const {answer, events, getScreen} = await render(numberPrompt, { + message: 'Enter number?', + }); + + expect(getScreen()).toMatchInlineSnapshot('"? Enter number?"'); + + events.type('yes112.3'); + expect(getScreen()).toMatchInlineSnapshot('"? Enter number? 1,123"'); + + events.keypress('enter'); + await expect(answer).resolves.toEqual('1123'); + }); + }); + + describe('percentInput', () => { + it('handles "yes"', async () => { + const {answer, events, getScreen} = await render(percentPrompt, { + message: 'Enter number?', + }); + + expect(getScreen()).toMatchInlineSnapshot('"? Enter number?"'); + + events.type('yes12.3'); + expect(getScreen()).toMatchInlineSnapshot('"? Enter number? 12.3 %"'); + + events.keypress('enter'); + await expect(answer).resolves.toEqual('12.3'); + }); + }); + /** + * Transformers are here to format the input based on a users input + * They do not change the users input value though, the effect is purely visual + */ + describe('transforms', () => { + it('transformNumberToHumanReadable: should return a human readable full number', () => { + expect(transformNumberToHumanReadable('1000')).toBe('1,000'); + expect(transformNumberToHumanReadable('1000000')).toBe('1,000,000'); + }); + + it('transformNumberToPercent: should return a human readable % number', () => { + expect(transformNumberToPercent('100')).toBe('100 %'); + expect(transformNumberToPercent('3333.33')).toBe('3,333.33 %'); + expect(transformNumberToPercent('0.33')).toBe('0.33 %'); + expect(transformNumberToPercent('0.3')).toBe('0.3 %'); + }); + }); + + /** + * Translates, translate the js input value to solidity + */ + describe('translate', () => { + it('translateJsNumberToSol: should properly translate values', () => { + expect(translateJsNumberToSol('0')).toBe('0'); + expect(translateJsNumberToSol('1000')).toBe('1_000'); + expect(translateJsNumberToSol('1000000')).toBe('1_000_000'); + }); + + it('translateJsPercentToSol: should properly translate % values', () => { + expect(translateJsPercentToSol('0')).toBe('0'); + expect(translateJsPercentToSol('100')).toBe('100_00'); + expect(translateJsPercentToSol('3333.33')).toBe('3_333_33'); + expect(translateJsPercentToSol('0.33')).toBe('33'); + expect(translateJsPercentToSol('0.3')).toBe('30'); + }); + }); +}); diff --git a/generator/prompts.ts b/generator/prompts.ts new file mode 100644 index 0000000..a128002 --- /dev/null +++ b/generator/prompts.ts @@ -0,0 +1,68 @@ +import {checkbox, select} from '@inquirer/prompts'; +import {ENGINE_FLAGS, PoolIdentifier} from './types'; +import {getEModes} from './common'; + +// TRANSLATIONS +function translateEModeToEModeLib(value: string, pool: PoolIdentifier) { + if (value === ENGINE_FLAGS.KEEP_CURRENT) return `EngineFlags.KEEP_CURRENT`; + return `${pool}EModes.${value}`; +} + +// PROMPTS +interface GenericPrompt { + message: string; + disableKeepCurrent?: T; + transform?: (value: string) => string; + defaultValue?: string; +} + +interface PercentInputPrompt extends GenericPrompt { + toRay?: boolean; +} + +export type PercentInputValues = typeof ENGINE_FLAGS.KEEP_CURRENT | string; + +export type NumberInputValues = typeof ENGINE_FLAGS.KEEP_CURRENT | string; + +interface EModeSelectPrompt extends GenericPrompt { + pool: PoolIdentifier; +} + +export async function eModeSelect({ + message, + disableKeepCurrent, + pool, +}: EModeSelectPrompt) { + const eModes = getEModes(pool as any); + if (Object.keys(eModes).length != 0) { + const eMode = await select({ + message, + choices: [ + ...(disableKeepCurrent ? [] : [{value: ENGINE_FLAGS.KEEP_CURRENT}]), + ...Object.keys(eModes).map((eMode) => ({value: eMode})), + ], + }); + return translateEModeToEModeLib(eMode, pool); + } else { + console.log('No e-mode category active on the current pool'); + return '0'; + } +} + +export async function eModesSelect({message, pool}: EModeSelectPrompt) { + const eModes = getEModes(pool as any); + if (Object.keys(eModes).length != 0) { + const values = await checkbox({ + message, + choices: [ + ...Object.keys(eModes) + .filter((e) => e != 'NONE') + .map((eMode) => ({value: eMode})), + ], + required: true, + }); + return values.map((mode) => translateEModeToEModeLib(mode, pool)); + } else { + console.log('No e-mode category active on the current pool'); + } +} diff --git a/generator/prompts/addressPrompt.spec.ts b/generator/prompts/addressPrompt.spec.ts new file mode 100644 index 0000000..a68860d --- /dev/null +++ b/generator/prompts/addressPrompt.spec.ts @@ -0,0 +1,54 @@ +import {expect, describe, it} from 'vitest'; +import {render} from '@inquirer/testing'; +import {addressPrompt, translateJsAddressToSol} from './addressPrompt'; + +describe('addresses', () => { + describe('addressPrompt', () => { + it('handles "required"', async () => { + const {answer, events, getScreen} = await render(addressPrompt, { + message: 'Enter address?', + required: true, + }); + + expect(getScreen()).toMatchInlineSnapshot('"? Enter address?*"'); + + events.keypress('enter'); + await Promise.resolve(); + expect(getScreen()).toMatchInlineSnapshot( + '"? Enter address?*\n> You must provide a valid value"', + ); + + events.type('XX0xXXae7ab96520de3a18e5e111b5eaab095312d7fe84'); + expect(getScreen()).toMatchInlineSnapshot( + '"? Enter address?* 0xae7ab96520de3a18e5e111b5eaab095312d7fe84"', + ); + + events.keypress('enter'); + await expect(answer).resolves.toEqual('0xae7ab96520de3a18e5e111b5eaab095312d7fe84'); + }); + + it('handles "optional"', async () => { + const {answer, events, getScreen} = await render(addressPrompt, { + message: 'Enter address?', + }); + + expect(getScreen()).toMatchInlineSnapshot('"? Enter address?"'); + + events.keypress('enter'); + await Promise.resolve(); + await expect(answer).resolves.toEqual(''); + }); + }); + + /** + * Translates, translate the js input value to solidity + */ + describe('translate', () => { + it('translateJsAddressToSol: should properly translate values to addresses', () => { + expect(translateJsAddressToSol('')).toBe('EngineFlags.KEEP_CURRENT_ADDRESS'); + expect(translateJsAddressToSol('0xae7ab96520de3a18e5e111b5eaab095312d7fe84')).toBe( + '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84', + ); + }); + }); +}); diff --git a/generator/prompts/addressPrompt.ts b/generator/prompts/addressPrompt.ts new file mode 100644 index 0000000..2f49319 --- /dev/null +++ b/generator/prompts/addressPrompt.ts @@ -0,0 +1,24 @@ +import {Hex, getAddress, isAddress} from 'viem'; +import {GenericPrompt} from './types'; +import {advancedInput} from './advancedInput'; +import {flagAsRequired} from '../common'; + +export async function addressPrompt( + {message, required}: GenericPrompt, + opts?, +): Promise { + const value = await advancedInput( + { + message: flagAsRequired(message, required), + validate: (v) => (required ? isAddress(v) : isAddress(v) || v === ''), + pattern: /^(0|0x|0x[A-Fa-f0-9]{0,40})?$/, + }, + opts, + ); + return value as Hex; +} + +export function translateJsAddressToSol(value?: string) { + if (!value) return `EngineFlags.KEEP_CURRENT_ADDRESS`; + return getAddress(value); +} diff --git a/generator/prompts/advancedInput.ts b/generator/prompts/advancedInput.ts new file mode 100644 index 0000000..ed87570 --- /dev/null +++ b/generator/prompts/advancedInput.ts @@ -0,0 +1,94 @@ +import { + createPrompt, + useState, + useKeypress, + usePrefix, + isEnterKey, + isBackspaceKey, + type PromptConfig, +} from '@inquirer/core'; +import type {} from '@inquirer/type'; +import chalk from 'chalk'; + +export type InputConfig = PromptConfig<{ + default?: string; + transformer?: (value: string, {isFinal}: {isFinal: boolean}) => string; + validate?: (value: string) => boolean | string | Promise; + pattern?: RegExp; + patternError?: string; +}>; + +/** + * It's a modified input prompt allowing to specify a pattern + * The input will simply discard any non conform input and show an error + */ +export const advancedInput = createPrompt((config, done) => { + const {validate = () => true, pattern, patternError} = config; + const [status, setStatus] = useState('pending'); + const [defaultValue = '', setDefaultValue] = useState(config.default); + const [errorMsg, setError] = useState(undefined); + const [value, setValue] = useState(''); + + const isLoading = status === 'loading'; + const prefix = usePrefix(isLoading); + + useKeypress(async (key, rl) => { + // Ignore keypress while our prompt is doing other processing. + if (status !== 'pending') { + return; + } + + if (isEnterKey(key)) { + const answer = value || defaultValue; + setStatus('loading'); + const isValid = await validate(answer); + if (isValid === true) { + setValue(answer); + setStatus('done'); + done(answer); + } else { + // Reset the readline line value to the previous value. On line event, the value + // get cleared, forcing the user to re-enter the value instead of fixing it. + rl.write(value); + setError(isValid || 'You must provide a valid value'); + setStatus('pending'); + } + } else if (isBackspaceKey(key) && !value) { + setDefaultValue(undefined); + } else if (key.name === 'tab' && !value) { + setDefaultValue(undefined); + rl.clearLine(0); // Remove the tab character. + rl.write(defaultValue); + setValue(defaultValue); + } else if (!pattern || pattern?.test(rl.line)) { + setValue(rl.line); + setError(undefined); + } else { + const line = rl.line; + rl.clearLine(0); + rl.write(line.slice(0, -1)); + setError(patternError); + } + }); + + const message = chalk.bold(config.message); + let formattedValue = value; + if (typeof config.transformer === 'function') { + formattedValue = config.transformer(value, {isFinal: status === 'done'}); + } + if (status === 'done') { + formattedValue = chalk.cyan(formattedValue); + } + + let defaultStr = ''; + if (defaultValue && status !== 'done' && !value) { + defaultStr = chalk.dim(` (${defaultValue})`); + } + + let error = ''; + if (errorMsg) { + error = chalk.red(`> ${errorMsg}`); + } + + return [`${prefix} ${message}${defaultStr} ${formattedValue}`, error]; +}); diff --git a/generator/prompts/assetsSelectPrompt.ts b/generator/prompts/assetsSelectPrompt.ts new file mode 100644 index 0000000..01a2fca --- /dev/null +++ b/generator/prompts/assetsSelectPrompt.ts @@ -0,0 +1,21 @@ +import {checkbox} from '@inquirer/prompts'; +import {GenericPoolPrompt} from './types'; +import {getAssets} from '../common'; +import {PoolIdentifier} from '../types'; + +/** + * allows selecting multiple assets + * TODO: enforce selection of at least one asset (next version of inquirer ships with required) + * @param param0 + * @returns + */ +export async function assetsSelectPrompt({pool, message}: GenericPoolPrompt) { + return await checkbox({ + message, + choices: getAssets(pool).map((asset) => ({name: asset, value: asset})), + }); +} + +export function translateAssetToAssetLibUnderlying(value: string, pool: PoolIdentifier) { + return `${pool}Assets.${value}_UNDERLYING`; +} diff --git a/generator/prompts/boolPrompt.ts b/generator/prompts/boolPrompt.ts new file mode 100644 index 0000000..d73e835 --- /dev/null +++ b/generator/prompts/boolPrompt.ts @@ -0,0 +1,44 @@ +import {select} from '@inquirer/prompts'; +import {ENGINE_FLAGS} from '../types'; +import {GenericPrompt} from './types'; + +export type BooleanSelectValues = + | typeof ENGINE_FLAGS.KEEP_CURRENT + | typeof ENGINE_FLAGS.ENABLED + | typeof ENGINE_FLAGS.DISABLED; + +export async function boolPrompt({ + message, + required, + defaultValue, +}: GenericPrompt & { + defaultValue?: T extends true + ? Exclude + : BooleanSelectValues; +}): Promise : BooleanSelectValues> { + const choices = [ + ...(required ? [] : [{value: ENGINE_FLAGS.KEEP_CURRENT}]), + {value: ENGINE_FLAGS.ENABLED}, + {value: ENGINE_FLAGS.DISABLED}, + ]; + return select< + T extends true ? Exclude : BooleanSelectValues + >({ + message, + choices: choices as any, + default: defaultValue, + }); +} + +export function translateJsBoolToSol(value: string) { + switch (value) { + case ENGINE_FLAGS.ENABLED: + return `EngineFlags.ENABLED`; + case ENGINE_FLAGS.DISABLED: + return `EngineFlags.DISABLED`; + case ENGINE_FLAGS.KEEP_CURRENT: + return `EngineFlags.KEEP_CURRENT`; + default: + throw new Error('unknown boolean select value'); + } +} diff --git a/generator/prompts/numberPrompt.ts b/generator/prompts/numberPrompt.ts new file mode 100644 index 0000000..1d2db60 --- /dev/null +++ b/generator/prompts/numberPrompt.ts @@ -0,0 +1,34 @@ +import {advancedInput} from './advancedInput'; +import {GenericPrompt} from './types'; + +function isNumber(value: string) { + return !isNaN(value as unknown as number); +} + +export function transformNumberToHumanReadable(value: string) { + if (value && isNumber(value)) { + return new Intl.NumberFormat('en-us').format(BigInt(value)); + } + return value; +} + +export async function numberPrompt({message, required}: GenericPrompt, opts?) { + return await advancedInput( + { + message, + transformer: transformNumberToHumanReadable, + validate: (v) => { + if (required && v.length == 0) return false; + return isNumber(v); + }, + pattern: /^[0-9]*$/, + patternError: 'Only full numbers are allowed', + }, + opts, + ); +} + +export function translateJsNumberToSol(value?: string) { + if (!value) return `EngineFlags.KEEP_CURRENT`; + return String(value).replace(/\B(?=(\d{3})+(?!\d))/g, '_'); +} diff --git a/generator/prompts/percentPrompt.ts b/generator/prompts/percentPrompt.ts new file mode 100644 index 0000000..f36665c --- /dev/null +++ b/generator/prompts/percentPrompt.ts @@ -0,0 +1,49 @@ +import {advancedInput} from './advancedInput'; +import {GenericPrompt} from './types'; + +function isNumber(value: string) { + return !isNaN(value as unknown as number); +} + +export function transformNumberToPercent(value: string) { + if (value && isNumber(value)) { + return ( + new Intl.NumberFormat('en-us', { + maximumFractionDigits: 2, + }).format(value as unknown as number) + ' %' + ); + } + return value; +} + +export async function percentPrompt( + {message, required}: GenericPrompt, + opts?, +): Promise { + const value = await advancedInput( + { + message, + transformer: transformNumberToPercent, + validate: (v) => { + if (required && v.length == 0) return false; + return isNumber(v); + }, + pattern: /^[0-9]*\.?[0-9]*$/, + patternError: 'Only decimal numbers are allowed (e.g. 1.1)', + }, + opts, + ); + return value; +} +export function translateJsPercentToSol(value?: string, bpsToRay?: boolean) { + if (!value) return `EngineFlags.KEEP_CURRENT`; + const formattedValue = new Intl.NumberFormat('en-us', { + maximumFractionDigits: 2, + minimumFractionDigits: 2, + }).format(value as unknown as number); + const _value = ( + Number(value) >= 1 ? formattedValue : formattedValue.replace(/^0\.0*(?=[0-9])/, '') + ).replace(/[\.,]/g, '_'); + if (bpsToRay) return `_bpsToRay(${_value})`; + return _value; +} diff --git a/generator/prompts/stringPrompt.ts b/generator/prompts/stringPrompt.ts new file mode 100644 index 0000000..52f5253 --- /dev/null +++ b/generator/prompts/stringPrompt.ts @@ -0,0 +1,22 @@ +import {flagAsRequired} from '../common'; +import {advancedInput} from './advancedInput'; +import {GenericPrompt} from './types'; + +export async function stringPrompt( + {message, defaultValue, required}: GenericPrompt, + opts?, +) { + return advancedInput( + { + message: flagAsRequired(message, required), + default: defaultValue, + validate: (v) => (required ? v.trim().length != 0 : true), + }, + opts, + ); +} + +export function stringOrKeepCurrent(value: string) { + if (!value) return `EngineFlags.KEEP_CURRENT_STRING`; + return `"${value}"`; +} diff --git a/generator/prompts/types.ts b/generator/prompts/types.ts new file mode 100644 index 0000000..bf96220 --- /dev/null +++ b/generator/prompts/types.ts @@ -0,0 +1,12 @@ +import {PoolIdentifier} from '../types'; + +export interface GenericPrompt { + message: string; + required?: T; + transform?: (value: string) => string; + defaultValue?: string; +} + +export interface GenericPoolPrompt extends GenericPrompt { + pool: PoolIdentifier; +} diff --git a/generator/templates/aip.template.ts b/generator/templates/aip.template.ts new file mode 100644 index 0000000..41b90fc --- /dev/null +++ b/generator/templates/aip.template.ts @@ -0,0 +1,52 @@ +import {generateContractName, generateFolderName} from '../common'; +import {Options, PoolConfigs, PoolIdentifier} from '../types'; + +export function generateAIP(options: Options, configs: PoolConfigs) { + return `--- +title: ${`"${options.title}"` || 'TODO'} +author: ${`"${options.author}"` || 'TODO'} +discussions: ${`"${options.discussion}"` || 'TODO'}${ + options.snapshot ? `\nsnapshot: "${options.snapshot}"\n` : '' + } +--- + +## Simple Summary + +## Motivation + +## Specification + +${Object.keys(configs) + .map((pool) => { + return configs[pool as keyof typeof configs]!.artifacts.filter( + (artifact) => artifact.aip?.specification, + ).map((artifact) => artifact.aip?.specification); + }) + .filter((a) => a) + .join('\n\n')} + +## References + +- Implementation: ${options.pools + .map( + (pool) => + `[${pool}](https://github.com/bgd-labs/aave-proposals-v3/blob/main/${pool === 'AaveV3ZkSync' ? 'zksync/src' : 'src'}/${generateFolderName( + options, + )}/${generateContractName(options, pool)}.sol)`, + ) + .join(', ')} +- Tests: ${options.pools + .map( + (pool) => + `[${pool}](https://github.com/bgd-labs/aave-proposals-v3/blob/main/${pool === 'AaveV3ZkSync' ? 'zksync/src' : 'src'}/${generateFolderName( + options, + )}/${generateContractName(options, pool)}.t.sol)`, + ) + .join(', ')} +- [Snapshot](${options.snapshot || 'TODO'}) +- [Discussion](${options.discussion || 'TODO'}) + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/).\n`; +} diff --git a/generator/templates/proposal.template.ts b/generator/templates/proposal.template.ts new file mode 100644 index 0000000..ccaa87c --- /dev/null +++ b/generator/templates/proposal.template.ts @@ -0,0 +1,70 @@ +import {generateContractName, getPoolChain, getVersion} from '../common'; +import {FEATURE, Options, PoolConfig, PoolIdentifier} from '../types'; +import {prefixWithImports} from '../utils/importsResolver'; +import {prefixWithPragma} from '../utils/constants'; + +export const proposalTemplate = ( + options: Options, + poolConfig: PoolConfig, + pool: PoolIdentifier, +) => { + const {title, author, snapshot, discussion} = options; + const poolName = /AaveV[2|3](.*)/.test(pool) && pool.match(/AaveV[2|3](.*)/)![1]; + const version = getVersion(pool); + const contractName = generateContractName(options, pool); + + const constants = poolConfig.artifacts + .map((artifact) => artifact.code?.constants) + .flat() + .filter((f) => f !== undefined) + .join('\n'); + const functions = poolConfig.artifacts + .map((artifact) => artifact.code?.fn) + .flat() + .filter((f) => f !== undefined) + .join('\n'); + const innerExecute = poolConfig.artifacts + .map((artifact) => artifact.code?.execute) + .flat() + .filter((f) => f !== undefined) + .join('\n'); + + let optionalExecute = ''; + const usesConfigEngine = Object.keys(poolConfig.configs).some( + (f) => ![FEATURE.OTHERS, FEATURE.FLASH_BORROWER, FEATURE.FREEZE].includes(f), + ); + const isAssetListing = Object.keys(poolConfig.configs).some((f) => + [FEATURE.ASSET_LISTING, FEATURE.ASSET_LISTING_CUSTOM].includes(f), + ); + if (innerExecute) { + if (usesConfigEngine) { + optionalExecute = `function _postExecute() internal override { + ${innerExecute} + }`; + } else { + optionalExecute = `function execute() external { + ${innerExecute} + }`; + } + } + + const contract = `/** + * @title ${title || 'TODO'} + * @author ${author || 'TODO'} + * - Snapshot: ${snapshot || 'TODO'} + * - Discussion: ${discussion || 'TODO'} + */ + contract ${contractName} is ${ + usesConfigEngine ? `Aave${version}Payload${poolName}` : 'IProposalGenericExecutor' + } { + ${isAssetListing ? 'using SafeERC20 for IERC20;' : ''} + + ${constants} + + ${optionalExecute} + + ${functions} + }`; + + return prefixWithPragma(prefixWithImports(contract)); +}; diff --git a/generator/templates/script.template.ts b/generator/templates/script.template.ts new file mode 100644 index 0000000..600e50c --- /dev/null +++ b/generator/templates/script.template.ts @@ -0,0 +1,120 @@ +import { + CHAIN_TO_CHAIN_ID, + generateContractName, + generateFolderName, + getChainAlias, + getPoolChain, + getVotingPortal, +} from '../common'; +import {Options} from '../types'; +import {prefixWithImports} from '../utils/importsResolver'; +import {prefixWithPragma} from '../utils/constants'; + +export function generateScript(options: Options) { + const folderName = generateFolderName(options); + const fileName = generateContractName(options); + const votingPortal = getVotingPortal(options.votingNetwork); + let template = ''; + const chains = [...new Set(options.pools.map((pool) => getPoolChain(pool)!))]; + + // generate imports + template += `import {${['Ethereum', ...chains.filter((c) => c !== 'Ethereum' && c !== 'ZkSync')] + .map((chain) => `${chain}Script`) + .join(', ')}} from 'solidity-utils/contracts/utils/ScriptUtils.sol';\n`; + template += options.pools + .filter((c) => c !== 'AaveV3ZkSync') + .map((pool) => { + const name = generateContractName(options, pool); + return `import {${name}} from './${name}.sol';`; + }) + .join('\n'); + template += '\n\n'; + + const poolsToChainsMap = options.pools.reduce((acc, pool) => { + const chain = getPoolChain(pool); + const contractName = generateContractName(options, pool); + if (!acc[chain]) acc[chain] = []; + acc[chain].push({contractName, pool}); + return acc; + }, {}); + + // generate chain scripts + template += Object.keys(poolsToChainsMap) + .filter((c) => c !== 'ZkSync') + .map((chain) => { + return `/** + * @dev Deploy ${chain} + * deploy-command: make deploy-ledger contract=src/${folderName}/${fileName}.s.sol:Deploy${chain} chain=${getChainAlias( + chain, + )} + * verify-command: FOUNDRY_PROFILE=${getChainAlias(chain)} npx catapulta-verify -b broadcast/${fileName}.s.sol/${ + CHAIN_TO_CHAIN_ID[chain] + }/run-latest.json + */ + contract Deploy${chain} is ${chain}Script { + function run() external broadcast { + // deploy payloads + ${poolsToChainsMap[chain] + .map( + ({contractName, pool}, ix) => + `address payload${ix} = GovV3Helpers.deployDeterministic(type(${contractName}).creationCode);`, + ) + .join('\n')} + + // compose action + IPayloadsControllerCore.ExecutionAction[] memory actions = new IPayloadsControllerCore.ExecutionAction[](${ + poolsToChainsMap[chain].length + }); + ${poolsToChainsMap[chain] + .map( + ({contractName, pool}, ix) => `actions[${ix}] = GovV3Helpers.buildAction(payload${ix});`, + ) + .join('\n')} + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } + }`; + }) + .join('\n\n'); + template += '\n\n'; + + // generate proposal creation script + template += `/** + * @dev Create Proposal + * command: make deploy-ledger contract=src/${folderName}/${fileName}.s.sol:CreateProposal chain=mainnet + */ +contract CreateProposal is EthereumScript { + function run() external { + // create payloads + PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](${ + Object.keys(poolsToChainsMap).length + }); + + // compose actions for validation + ${Object.keys(poolsToChainsMap) + .map((chain, ix) => { + let template = `IPayloadsControllerCore.ExecutionAction[] memory actions${chain} = new IPayloadsControllerCore.ExecutionAction[](${poolsToChainsMap[chain].length});\n`; + template += poolsToChainsMap[chain] + .map(({contractName, pool}, ix) => { + return pool == 'AaveV3ZkSync' + ? `actions${chain}[${ix}] = GovV3Helpers.buildActionZkSync(vm, '${contractName}');` + : `actions${chain}[${ix}] = GovV3Helpers.buildAction(type(${contractName}).creationCode);`; + }) + .join('\n'); + template += `payloads[${ix}] = GovV3Helpers.build${ + chain == 'Ethereum' ? 'Mainnet' : chain + }Payload(vm, actions${chain});\n`; + return template; + }) + .join('\n')} + + // create proposal + vm.startBroadcast(); + GovV3Helpers.createProposal(vm, payloads, ${votingPortal}, GovV3Helpers.ipfsHashFile(vm, 'src/${folderName}/${ + options.shortName + }.md')); + } +}`; + return prefixWithPragma(prefixWithImports(template)); +} diff --git a/generator/templates/test.template.ts b/generator/templates/test.template.ts new file mode 100644 index 0000000..d0540af --- /dev/null +++ b/generator/templates/test.template.ts @@ -0,0 +1,53 @@ +import { + generateContractName, + generateFolderName, + getChainAlias, + getPoolChain, +} from '../common'; +import {Options, PoolConfig, PoolIdentifier} from '../types'; +import {prefixWithPragma} from '../utils/constants'; +import {prefixWithImports} from '../utils/importsResolver'; + +export const testTemplate = (options: Options, poolConfig: PoolConfig, pool: PoolIdentifier) => { + const folderName = generateFolderName(options); + const chain = getPoolChain(pool); + const contractName = generateContractName(options, pool); + + const testBase = 'ProtocolV3TestBase'; + + const functions = poolConfig.artifacts + .map((artifact) => artifact.test?.fn) + .flat() + .filter((f) => f !== undefined) + .join('\n'); + + let template = ` +import 'forge-std/Test.sol'; +import {${testBase}, ReserveConfig} from 'aave-helpers/${chain === 'ZkSync' ? 'zksync/src/' : 'src/'}${testBase}.sol'; +import {${contractName}} from './${contractName}.sol'; + +/** + * @dev Test for ${contractName} + * command: FOUNDRY_PROFILE=${getChainAlias(chain)} forge test ${chain === 'ZkSync' ? '--zksync --match-path=zksync/src/' : '--match-path=src/'}${folderName}/${contractName}.t.sol -vv + */ +contract ${contractName}_Test is ${testBase} { + ${contractName} internal proposal; + + function setUp() public ${chain === 'ZkSync' ? 'override' : ''} { + vm.createSelectFork(vm.rpcUrl('${getChainAlias(chain)}'), ${poolConfig.cache.blockNumber}); + proposal = new ${contractName}(); + + ${chain === 'ZkSync' ? 'super.setUp();' : ''} + } + + /** + * @dev executes the generic test suite including e2e and config snapshots + */ + function test_defaultProposalExecution() public { + defaultTest('${contractName}', ${pool}.POOL, address(proposal)); + } + + ${functions} +}`; + return prefixWithPragma(prefixWithImports(template)); +}; diff --git a/generator/templates/zksync.script.template.ts b/generator/templates/zksync.script.template.ts new file mode 100644 index 0000000..a6bb2a5 --- /dev/null +++ b/generator/templates/zksync.script.template.ts @@ -0,0 +1,97 @@ +import { + CHAIN_TO_CHAIN_ID, + generateContractName, + generateFolderName, + getChainAlias, + getPoolChain, +} from '../common'; +import {Options} from '../types'; +import {prefixWithImports} from '../utils/importsResolver'; +import {prefixWithPragma} from '../utils/constants'; + +export function generateZkSyncScript(options: Options) { + const folderName = generateFolderName(options); + const fileName = generateContractName(options); + const zkSyncPools = options.pools.filter((c) => c == 'AaveV3ZkSync'); + + const chain = 'ZkSync'; + let template = ''; + + // generate imports + template += `import {ZkSyncScript} from 'aave-helpers/src/ScriptUtils.sol';\n`; + + template += zkSyncPools + .map((pool) => { + const name = generateContractName(options, pool); + return `import {${name}} from './${name}.sol';`; + }) + .join('\n'); + template += '\n\n'; + + const poolsToChainsMap = zkSyncPools.reduce((acc, pool) => { + const chain = getPoolChain(pool); + const contractName = generateContractName(options, pool); + if (!acc[chain]) acc[chain] = []; + acc[chain].push({contractName, pool}); + return acc; + }, {}); + + // generate zksync wrapper contract for deploying payloads + template += ` + ${poolsToChainsMap[chain] + .map( + ({contractName}) => + ` + // @dev wrapper factory contract for deploying the payload + contract Deploy_${contractName} { + address public immutable PAYLOAD; + + constructor() { + PAYLOAD = GovV3Helpers.deployDeterministicZkSync( + type(${contractName}).creationCode + ); + } + }`, + ) + .join('\n')} + `; + template += '\n\n'; + + // generate chain scripts + template += `/** + * @dev Deploy ${chain} + * deploy-command: make deploy-ledger contract=zksync/src/${folderName}/${fileName}.s.sol:Deploy${chain} chain=${getChainAlias( + chain, + )} + * verify-command: FOUNDRY_PROFILE=${getChainAlias(chain)} npx catapulta-verify -b broadcast/${fileName}.s.sol/${ + CHAIN_TO_CHAIN_ID[chain] + }/run-latest.json + */ + contract Deploy${chain} is ${chain}Script { + function run() external broadcast { + // deploy payloads + ${poolsToChainsMap[chain] + .map( + ({contractName, pool}, ix) => + `address payload${ix} = new Deploy_${contractName}().PAYLOAD();`, + ) + .join('\n')} + + // compose action + IPayloadsControllerCore.ExecutionAction[] memory actions = new IPayloadsControllerCore.ExecutionAction[](${ + poolsToChainsMap[chain].length + }); + ${poolsToChainsMap[chain] + .map( + ({contractName, pool}, ix) => `actions[${ix}] = GovV3Helpers.buildAction(payload${ix});`, + ) + .join('\n')} + + // register action at payloadsController + GovV3Helpers.createPayload(actions); + } + }`; + template += '\n\n'; + + return prefixWithPragma(prefixWithImports(template)); +} diff --git a/generator/types.ts b/generator/types.ts new file mode 100644 index 0000000..a829207 --- /dev/null +++ b/generator/types.ts @@ -0,0 +1,104 @@ +import * as addressBook from '@bgd-labs/aave-address-book'; +import { + CapsUpdate, + CollateralUpdate, + RateStrategyUpdate, +} from './features/types'; + +export const V3_POOLS = [ + 'AaveV3Ethereum', + 'AaveV3EthereumLido', + 'AaveV3Polygon', + 'AaveV3Avalanche', + 'AaveV3Optimism', + 'AaveV3Arbitrum', + 'AaveV3Metis', + 'AaveV3Base', + 'AaveV3Gnosis', + 'AaveV3Scroll', + 'AaveV3BNB', + 'AaveV3ZkSync', +] as const satisfies readonly (keyof typeof addressBook)[]; + +export const POOLS = [ + ...V3_POOLS, +] as const satisfies readonly (keyof typeof addressBook)[]; + +export type PoolIdentifier = (typeof POOLS)[number]; +export type PoolIdentifierV3 = (typeof V3_POOLS)[number]; + +export interface Options { + force?: boolean; + pools: PoolIdentifier[]; + title: string; + // automatically generated shortName from title + shortName: string; + author: string; + discussion: string; + snapshot: string; + configFile?: string; + date: string; +} + +export type PoolConfigs = Partial>; + +export type CodeArtifact = { + code?: { + constants?: string[]; + fn?: string[]; + execute?: string[]; + }; + test?: { + fn?: string[]; + }; + aip?: { + specification: string[]; + }; +}; + +export enum FEATURE { + CAPS_UPDATE = 'CAPS_UPDATE', + COLLATERALS_UPDATE = 'COLLATERALS_UPDATE', + RATE_UPDATE_V3 = 'RATE_UPDATE_V3', + OTHERS = 'OTHERS', +} + +export interface FeatureModule { + description: string; + value: FEATURE; + cli: (args: {options: Options; pool: PoolIdentifier; cache: PoolCache}) => Promise; + build: (args: {options: Options; pool: PoolIdentifier; cache: PoolCache; cfg: T}) => CodeArtifact; +} + +export const ENGINE_FLAGS = { + KEEP_CURRENT: 'KEEP_CURRENT', + KEEP_CURRENT_STRING: 'KEEP_CURRENT_STRING', + KEEP_CURRENT_ADDRESS: 'KEEP_CURRENT_ADDRESS', + ENABLED: 'ENABLED', + DISABLED: 'DISABLED', +} as const; + +export const AVAILABLE_VERSIONS = {V2: 'V2', V3: 'V3'} as const; + +export type ConfigFile = { + rootOptions: Options; + poolOptions: Partial>>; +}; + +export type PoolCache = {blockNumber: number}; + +export interface PoolConfig { + artifacts: CodeArtifact[]; + configs: { + [FEATURE.CAPS_UPDATE]?: CapsUpdate[]; + [FEATURE.COLLATERALS_UPDATE]?: CollateralUpdate[]; + [FEATURE.RATE_UPDATE_V3]?: RateStrategyUpdate[]; + [FEATURE.OTHERS]?: {}; + }; + cache: PoolCache; +} + +export type Files = { + jsonConfig: string; + payloads: {pool: PoolIdentifier; payload: string; test: string; contractName: string}[]; +}; diff --git a/generator/utils/constants.ts b/generator/utils/constants.ts new file mode 100644 index 0000000..05cdcfe --- /dev/null +++ b/generator/utils/constants.ts @@ -0,0 +1,8 @@ +export function prefixWithPragma(code: string) { + return ( + `// SPDX-License-Identifier: MIT + pragma solidity ^0.8.0;\n\n` + code + ); +} + +export const TEST_EXECUTE_PROPOSAL = `GovV3Helpers.executePayload(vm,address(proposal));`; diff --git a/generator/utils/importsResolver.spec.ts b/generator/utils/importsResolver.spec.ts new file mode 100644 index 0000000..926309b --- /dev/null +++ b/generator/utils/importsResolver.spec.ts @@ -0,0 +1,44 @@ +// sum.test.js +import {expect, describe, it} from 'vitest'; +import {prefixWithImports} from './importsResolver'; + +describe('prefixWithImports', () => { + it('should resolve IProposalGenericExecutor', () => { + expect(prefixWithImports(`is IProposalGenericExecutor {`)).toContain( + `import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol';`, + ); + }); + + it('should resolve Engine imports', () => { + expect(prefixWithImports(`GovV3Helpers.createPayload`)).toContain( + `import {GovV3Helpers} from 'aave-helpers/src/GovV3Helpers.sol';`, + ); + }); + + it('should detect v3 Engine imports', () => { + expect(prefixWithImports(`EngineFlags.KEEP_CURRENT`)).toContain( + `import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol';`, + ); + + expect(prefixWithImports('IAaveV3ConfigEngine.CapsUpdate')).toContain( + `import {IAaveV3ConfigEngine} from 'aave-v3-periphery/contracts/v3-config-engine/IAaveV3ConfigEngine.sol';`, + ); + }); + + it('should detect v2 Engine imports', () => { + const result = prefixWithImports('IAaveV2ConfigEngine.RateStrategyUpdate'); + expect(result).toContain( + `import {IAaveV2ConfigEngine} from 'aave-helpers/src/v2-config-engine/IAaveV2ConfigEngine.sol';`, + ); + }); + + it('should detect addressbook imports', () => { + expect(prefixWithImports('AaveV2Ethereum.POOL AaveV2EthereumAssets.DAI')).toContain( + `import {AaveV2Ethereum,AaveV2EthereumAssets} from 'aave-address-book/AaveV2Ethereum.sol';`, + ); + + expect(prefixWithImports('AaveV3Avalanche.POOL')).toContain( + `import {AaveV3Avalanche} from 'aave-address-book/AaveV3Avalanche.sol';`, + ); + }); +}); diff --git a/generator/utils/importsResolver.ts b/generator/utils/importsResolver.ts new file mode 100644 index 0000000..45cdbe4 --- /dev/null +++ b/generator/utils/importsResolver.ts @@ -0,0 +1,106 @@ +/** + * As a payload can consist of multiple features combined it's a mess to manage imports + * Therefore instead of maintaining imports, we just extract them from the generated code instead. + */ + +const GovernanceImports = [ + 'GovV3Helpers', + 'IPayloadsControllerCore', + 'PayloadsControllerUtils', +] as const; + +/** + * @dev matches the code from known address book imports and generates an import statement satisfying the used libraries + * @param code + * @returns + */ +function generateAddressBookImports(code: string) { + const imports: string[] = []; + let root = ''; + // lookbehind for I to not match interfaces like IAaveV3ConfigEngine + const addressBookMatch = code.match(/(? 0) return `import {${imports}} from 'aave-address-book/${root}.sol';\n`; +} + +function generateEngineImport(code: string) { + const matches = [...code.matchAll(/Aave(V[2..3])Payload([A-Za-z]+)/g)].flat(); + if (matches.length > 0) + return `import {${matches[0]}} from 'aave-helpers/src/${matches[1].toLowerCase()}-config-engine/${ + matches[0] + }.sol';\n`; +} + +function findMatches(code: string, needles: string[] | readonly string[]) { + return needles.filter((needle) => RegExp(needle, 'g').test(code)); +} + +function findMatch(code: string, needle: string) { + return RegExp(needle, 'g').test(code); +} + +/** + * @dev Returns the input string prefixed with imports + * @param code + * @returns + */ +export function prefixWithImports(code: string) { + let imports = ''; + const govMatches = findMatches(code, GovernanceImports); + // gov related imports + if (govMatches.length > 0) + imports += `import {${govMatches}} from 'aave-helpers/src/GovV3Helpers.sol';\n`; + // address book imports + const addressBookImports = generateAddressBookImports(code); + if (addressBookImports) { + imports += addressBookImports; + } + // generic Executor + if (findMatch(code, 'IProposalGenericExecutor')) { + imports += `import {IProposalGenericExecutor} from 'aave-helpers/src/interfaces/IProposalGenericExecutor.sol';\n`; + } + const configEngineImport = generateEngineImport(code); + if (configEngineImport) { + imports += configEngineImport; + } + // shared config engine imports + if (findMatch(code, 'EngineFlags')) { + imports += `import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol';\n`; + } + // v3 config engine imports + if (findMatch(code, 'IAaveV3ConfigEngine')) { + imports += `import {IAaveV3ConfigEngine} from 'aave-v3-periphery/contracts/v3-config-engine/IAaveV3ConfigEngine.sol';\n`; + } + // v2 config engine imports + if (findMatch(code, 'IAaveV2ConfigEngine')) { + imports += `import {IAaveV2ConfigEngine} from 'aave-helpers/src/v2-config-engine/IAaveV2ConfigEngine.sol';\n`; + } + if (findMatch(code, 'IV2RateStrategyFactory')) { + imports += `import {IV2RateStrategyFactory} from 'aave-helpers/src/v2-config-engine/IV2RateStrategyFactory.sol';\n`; + } + // common imports + if (findMatch(code, 'IERC20')) { + imports += `import {IERC20} from 'solidity-utils/contracts/oz-common/interfaces/IERC20.sol';\n`; + } + if (findMatch(code, 'forceApprove')) { + imports += `import {SafeERC20} from 'solidity-utils/contracts/oz-common/SafeERC20.sol';\n`; + } + if (findMatch(code, 'GovernanceV3Ethereum')) { + imports += `import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol';\n`; + } + + return imports + code; +} diff --git a/package.json b/package.json index 66e1624..5f977a6 100644 --- a/package.json +++ b/package.json @@ -3,12 +3,17 @@ "version": "1.0.0", "scripts": { "lint": "prettier ./", - "lint:fix": "npm run lint -- --write" + "lint:fix": "npm run lint -- --write", + "generate": "tsx generator/cli" }, "repository": { "type": "git", "url": "git+https://github.com/bgd-labs/aave-risk-stewards-2.git" }, + "engines": { + "node": ">=20.0.0" + }, + "type": "module", "keywords": [], "author": "BGD labs", "license": "BUSL-1.1", @@ -19,7 +24,13 @@ "devDependencies": { "prettier": "2.8.7", "prettier-plugin-solidity": "1.1.3", + "@bgd-labs/aave-address-book": "^3.1.1", "@bgd-labs/aave-cli": "^0.16.2", + "@bgd-labs/js-utils": "^1.4.2", + "@inquirer/prompts": "^3.3.0", + "@inquirer/testing": "^2.1.13", + "commander": "^12.1.0", + "husky": "^8.0.3", "@ethersproject/hardware-wallets": "^5.7.0", "@safe-global/safe-core-sdk": "^3.3.3", "@safe-global/safe-ethers-lib": "^1.9.3", @@ -27,6 +38,8 @@ "dotenv": "^16.0.3", "ethers": "5.7.2", "ts-node": "^10.9.1", + "tsx": "^4.16.3", + "viem": "^2.18.6", "typescript": "^5.0.4" } } diff --git a/yarn.lock b/yarn.lock index 3f2de87..0ac356b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -40,6 +40,11 @@ resolved "https://registry.npmjs.org/@bgd-labs/aave-address-book/-/aave-address-book-3.1.0.tgz" integrity sha512-1wy6m5asQhDG13xhm+ZAhwsTy1CBhow0/kyQIaVFcfar5PKJBnZr8ZVw7iA+AHD2LTRyoviVO5iSN24kWUHf2Q== +"@bgd-labs/aave-address-book@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@bgd-labs/aave-address-book/-/aave-address-book-3.1.1.tgz#46e528f5b86dff0a26b17fd7573e2abf4c2c1c44" + integrity sha512-H3oQFMCgnL0BsQuSTAaj9M3zBm1uK3Uk6qfPH29ktLxhipE4UVqglhC/ZQVMT2wlgf1bMBjmsvwgTDRDOwXuFQ== + "@bgd-labs/aave-cli@^0.16.2": version "0.16.2" resolved "https://registry.npmjs.org/@bgd-labs/aave-cli/-/aave-cli-0.16.2.tgz" @@ -656,7 +661,7 @@ ansi-escapes "^4.3.2" chalk "^4.1.2" -"@inquirer/prompts@^3.3.2": +"@inquirer/prompts@^3.3.0", "@inquirer/prompts@^3.3.2": version "3.3.2" resolved "https://registry.npmjs.org/@inquirer/prompts/-/prompts-3.3.2.tgz" integrity sha512-k52mOMRvTUejrqyF1h8Z07chC+sbaoaUYzzr1KrJXyj7yaX7Nrh0a9vktv8TuocRwIJOQMaj5oZEmkspEcJFYQ== @@ -691,7 +696,19 @@ chalk "^4.1.2" figures "^3.2.0" -"@inquirer/type@^1.1.6": +"@inquirer/testing@^2.1.13": + version "2.1.31" + resolved "https://registry.yarnpkg.com/@inquirer/testing/-/testing-2.1.31.tgz#180d726c2de100aaf3946537f30c73b16858bc06" + integrity sha512-Dab4avme+Q6lFGtbJkOW5e5SZpehrG6kCpTMzx7RcGDzpCIbGsjok+jVzhW5hd790i+EizMPS+7c+PaxQPTSgA== + dependencies: + "@inquirer/type" "^1.5.2" + "@types/mute-stream" "^0.0.4" + "@types/node" "^22.1.0" + ansi-escapes "^4.3.2" + mute-stream "^1.0.0" + strip-ansi "^6.0.1" + +"@inquirer/type@^1.1.6", "@inquirer/type@^1.5.2": version "1.5.2" resolved "https://registry.npmjs.org/@inquirer/type/-/type-1.5.2.tgz" integrity sha512-w9qFkumYDCNyDZmNQjf/n6qQuvQ4dMC3BJesY4oF+yr0CxR5vxujflAVeIcS6U336uzi9GM0kAfZlLrZ9UTkpA== @@ -1047,6 +1064,13 @@ dependencies: undici-types "~5.26.4" +"@types/node@^22.1.0": + version "22.5.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.1.tgz#de01dce265f6b99ed32b295962045d10b5b99560" + integrity sha512-KkHsxej0j9IW1KKOOAA/XBA0z08UFSrRQHErzEfA3Vgq57eXIMYboIlHJuYIfd+lwCQjtKqUu3UnmKbtUc9yRw== + dependencies: + undici-types "~6.19.2" + "@types/normalize-package-data@^2.4.0": version "2.4.4" resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz" @@ -1425,6 +1449,11 @@ commander@^11.1.0: resolved "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz" integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== +commander@^12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" + integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== + console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" @@ -2045,6 +2074,11 @@ http-https@^1.0.0: resolved "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz" integrity sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg== +husky@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" + integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== + iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" @@ -3199,6 +3233,16 @@ tslib@^1.9.0: resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tsx@^4.16.3: + version "4.19.0" + resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.19.0.tgz#6166cb399b17d14d125e6158d23384045cfdf4f6" + integrity sha512-bV30kM7bsLZKZIOCHeMNVMJ32/LuJzLVajkQI/qf92J2Qr08ueLQvW00PUZGiuLPP760UINwupgUj8qrSCPUKg== + dependencies: + esbuild "~0.23.0" + get-tsconfig "^4.7.5" + optionalDependencies: + fsevents "~2.3.3" + tsx@^4.7.1: version "4.17.0" resolved "https://registry.npmjs.org/tsx/-/tsx-4.17.0.tgz" @@ -3282,6 +3326,11 @@ undici-types@~6.13.0: resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz" integrity sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg== +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + usb@^1.6.3: version "1.9.2" resolved "https://registry.npmjs.org/usb/-/usb-1.9.2.tgz" @@ -3356,6 +3405,21 @@ viem@^2.17.11: webauthn-p256 "0.0.5" ws "8.17.1" +viem@^2.18.6: + version "2.20.1" + resolved "https://registry.yarnpkg.com/viem/-/viem-2.20.1.tgz#91742e19c24e6294cf5c4015f1cba46afd0b95d7" + integrity sha512-a/BSe25TSfkc423GTSKYl1O0ON2J5huoQeOLkylHT1WS8wh3JFqb8nfAq7vg+aZ+W06BCTn36bbi47yp4D92Cg== + dependencies: + "@adraffy/ens-normalize" "1.10.0" + "@noble/curves" "1.4.0" + "@noble/hashes" "1.4.0" + "@scure/bip32" "1.4.0" + "@scure/bip39" "1.3.0" + abitype "1.0.5" + isows "1.0.4" + webauthn-p256 "0.0.5" + ws "8.17.1" + web3-core-helpers@1.10.4: version "1.10.4" resolved "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.4.tgz" From 3c50d6ba9575fc108cac32df1fcf583873604119 Mon Sep 17 00:00:00 2001 From: Harsh Pandey Date: Wed, 28 Aug 2024 18:49:52 +0530 Subject: [PATCH 07/15] fix: examples --- scripts/RiskStewardsBase.s.sol | 12 ++++++------ .../{ArbitrumExample.s.sol => ArbitrumExample.sol} | 6 +++--- .../{AvalancheExample.s.sol => AvalancheExample.sol} | 6 +++--- .../examples/{BNBExample.s.sol => BNBExample.sol} | 6 +++--- .../examples/{BaseExample.s.sol => BaseExample.sol} | 6 +++--- .../{EthereumExample.s.sol => EthereumExample.sol} | 6 +++--- ...reumLidoExample.s.sol => EthereumLidoExample.sol} | 6 +++--- .../{GnosisExample.s.sol => GnosisExample.sol} | 6 +++--- .../{MetisExample.s.sol => MetisExample.sol} | 6 +++--- .../{OptimismExample.s.sol => OptimismExample.sol} | 6 +++--- .../{PolygonExample.s.sol => PolygonExample.sol} | 6 +++--- .../{ScrollExample.s.sol => ScrollExample.sol} | 6 +++--- 12 files changed, 39 insertions(+), 39 deletions(-) rename src/contracts/examples/{ArbitrumExample.s.sol => ArbitrumExample.sol} (80%) rename src/contracts/examples/{AvalancheExample.s.sol => AvalancheExample.sol} (80%) rename src/contracts/examples/{BNBExample.s.sol => BNBExample.sol} (82%) rename src/contracts/examples/{BaseExample.s.sol => BaseExample.sol} (85%) rename src/contracts/examples/{EthereumExample.s.sol => EthereumExample.sol} (83%) rename src/contracts/examples/{EthereumLidoExample.s.sol => EthereumLidoExample.sol} (81%) rename src/contracts/examples/{GnosisExample.s.sol => GnosisExample.sol} (80%) rename src/contracts/examples/{MetisExample.s.sol => MetisExample.sol} (80%) rename src/contracts/examples/{OptimismExample.s.sol => OptimismExample.sol} (80%) rename src/contracts/examples/{PolygonExample.s.sol => PolygonExample.sol} (80%) rename src/contracts/examples/{ScrollExample.s.sol => ScrollExample.sol} (80%) diff --git a/scripts/RiskStewardsBase.s.sol b/scripts/RiskStewardsBase.s.sol index 6ecef7d..6ca8917 100644 --- a/scripts/RiskStewardsBase.s.sol +++ b/scripts/RiskStewardsBase.s.sol @@ -19,22 +19,22 @@ abstract contract RiskStewardsBase is ProtocolV3TestBase { STEWARD = IRiskSteward(steward); } - function capsUpdates() internal pure virtual returns (IEngine.CapsUpdate[] memory) {} + function capsUpdates() public pure virtual returns (IEngine.CapsUpdate[] memory) {} - function collateralsUpdates() internal pure virtual returns (IEngine.CollateralUpdate[] memory) {} + function collateralsUpdates() public pure virtual returns (IEngine.CollateralUpdate[] memory) {} function rateStrategiesUpdates() - internal + public pure virtual returns (IEngine.RateStrategyUpdate[] memory) {} - function lstPriceCapsUpdates() internal pure virtual returns (IRiskSteward.PriceCapLstUpdate[] memory) {} + function lstPriceCapsUpdates() public pure virtual returns (IRiskSteward.PriceCapLstUpdate[] memory) {} - function stablePriceCapsUpdates() internal pure virtual returns (IRiskSteward.PriceCapStableUpdate[] memory) {} + function stablePriceCapsUpdates() public pure virtual returns (IRiskSteward.PriceCapStableUpdate[] memory) {} - function name() internal pure virtual returns (string memory); + function name() public pure virtual returns (string memory); /** * @notice This script doesn't broadcast as it's intended to be used via safe diff --git a/src/contracts/examples/ArbitrumExample.s.sol b/src/contracts/examples/ArbitrumExample.sol similarity index 80% rename from src/contracts/examples/ArbitrumExample.s.sol rename to src/contracts/examples/ArbitrumExample.sol index 76807be..416dd15 100644 --- a/src/contracts/examples/ArbitrumExample.s.sol +++ b/src/contracts/examples/ArbitrumExample.sol @@ -6,16 +6,16 @@ import {IAaveV3ConfigEngine as IEngine} from 'aave-v3-periphery/contracts/v3-con import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol'; import {RiskStewardsArbitrum} from '../../../scripts/networks/RiskStewardsArbitrum.s.sol'; -// make run-script network=arbitrum contract_path=src/contracts/examples/ArbitrumExample.s.sol:ArbitrumExample broadcast=false +// make run-script network=arbitrum contract_path=src/contracts/examples/ArbitrumExample.sol:ArbitrumExample broadcast=false contract ArbitrumExample is RiskStewardsArbitrum { /** * @return string name identifier used for the diff */ - function name() internal pure override returns (string memory) { + function name() public pure override returns (string memory) { return 'arbitrum_example'; } - function capsUpdates() internal pure override returns (IEngine.CapsUpdate[] memory) { + function capsUpdates() public pure override returns (IEngine.CapsUpdate[] memory) { IEngine.CapsUpdate[] memory capUpdates = new IEngine.CapsUpdate[](1); capUpdates[0] = IEngine.CapsUpdate({ asset: AaveV3ArbitrumAssets.wstETH_UNDERLYING, diff --git a/src/contracts/examples/AvalancheExample.s.sol b/src/contracts/examples/AvalancheExample.sol similarity index 80% rename from src/contracts/examples/AvalancheExample.s.sol rename to src/contracts/examples/AvalancheExample.sol index f07f1ac..a5997bc 100644 --- a/src/contracts/examples/AvalancheExample.s.sol +++ b/src/contracts/examples/AvalancheExample.sol @@ -6,16 +6,16 @@ import {IAaveV3ConfigEngine as IEngine} from 'aave-v3-periphery/contracts/v3-con import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol'; import {RiskStewardsAvalanche} from '../../../scripts/networks/RiskStewardsAvalanche.s.sol'; -// make run-script network=avalanche contract_path=src/contracts/examples/AvalancheExample.s.sol:AvalancheExample broadcast=false +// make run-script network=avalanche contract_path=src/contracts/examples/AvalancheExample.sol:AvalancheExample broadcast=false contract AvalancheExample is RiskStewardsAvalanche { /** * @return string name identifier used for the diff */ - function name() internal pure override returns (string memory) { + function name() public pure override returns (string memory) { return 'avalanche_example'; } - function capsUpdates() internal pure override returns (IEngine.CapsUpdate[] memory) { + function capsUpdates() public pure override returns (IEngine.CapsUpdate[] memory) { IEngine.CapsUpdate[] memory capUpdates = new IEngine.CapsUpdate[](1); capUpdates[0] = IEngine.CapsUpdate({ asset: AaveV3AvalancheAssets.USDC_UNDERLYING, diff --git a/src/contracts/examples/BNBExample.s.sol b/src/contracts/examples/BNBExample.sol similarity index 82% rename from src/contracts/examples/BNBExample.s.sol rename to src/contracts/examples/BNBExample.sol index ea54ee5..b40b9a2 100644 --- a/src/contracts/examples/BNBExample.s.sol +++ b/src/contracts/examples/BNBExample.sol @@ -6,16 +6,16 @@ import {IAaveV3ConfigEngine as IEngine} from 'aave-v3-periphery/contracts/v3-con import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol'; import {RiskStewardsBNB} from '../../../scripts/networks/RiskStewardsBNB.s.sol'; -// make run-script network=bnb contract_path=src/contracts/examples/BNBExample.s.sol:BNBExample broadcast=false +// make run-script network=bnb contract_path=src/contracts/examples/BNBExample.sol:BNBExample broadcast=false contract BNBExample is RiskStewardsBNB { /** * @return string name identifier used for the diff */ - function name() internal pure override returns (string memory) { + function name() public pure override returns (string memory) { return 'bnb_example'; } - function rateStrategiesUpdates() internal pure override returns (IEngine.RateStrategyUpdate[] memory) { + function rateStrategiesUpdates() public pure override returns (IEngine.RateStrategyUpdate[] memory) { IEngine.RateStrategyUpdate[] memory rateUpdates = new IEngine.RateStrategyUpdate[](1); rateUpdates[0] = IEngine.RateStrategyUpdate({ asset: AaveV3BNBAssets.ETH_UNDERLYING, diff --git a/src/contracts/examples/BaseExample.s.sol b/src/contracts/examples/BaseExample.sol similarity index 85% rename from src/contracts/examples/BaseExample.s.sol rename to src/contracts/examples/BaseExample.sol index c09430c..ec25ab0 100644 --- a/src/contracts/examples/BaseExample.s.sol +++ b/src/contracts/examples/BaseExample.sol @@ -6,16 +6,16 @@ import {IAaveV3ConfigEngine as IEngine} from 'aave-v3-periphery/contracts/v3-con import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol'; import {RiskStewardsBaseChain} from '../../../scripts/networks/RiskStewardsBaseChain.s.sol'; -// make run-script network=base contract_path=src/contracts/examples/BaseExample.s.sol:BaseExample broadcast=false +// make run-script network=base contract_path=src/contracts/examples/BaseExample.sol:BaseExample broadcast=false contract BaseExample is RiskStewardsBaseChain { /** * @return string name identifier used for the diff */ - function name() internal pure override returns (string memory) { + function name() public pure override returns (string memory) { return 'base_example'; } - function collateralsUpdates() internal pure override returns (IEngine.CollateralUpdate[] memory) { + function collateralsUpdates() public pure override returns (IEngine.CollateralUpdate[] memory) { IEngine.CollateralUpdate[] memory collateralUpdates = new IEngine.CollateralUpdate[](2); collateralUpdates[0] = IEngine.CollateralUpdate({ asset: AaveV3BaseAssets.USDC_UNDERLYING, diff --git a/src/contracts/examples/EthereumExample.s.sol b/src/contracts/examples/EthereumExample.sol similarity index 83% rename from src/contracts/examples/EthereumExample.s.sol rename to src/contracts/examples/EthereumExample.sol index 83c9658..e547b2f 100644 --- a/src/contracts/examples/EthereumExample.s.sol +++ b/src/contracts/examples/EthereumExample.sol @@ -7,16 +7,16 @@ import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFl import {RiskStewardsEthereum} from '../../../scripts/networks/RiskStewardsEthereum.s.sol'; import {IRiskSteward, IPriceCapAdapter} from '../../interfaces/IRiskSteward.sol'; -// make run-script network=mainnet contract_path=src/contracts/examples/EthereumExample.s.sol:EthereumExample broadcast=false +// make run-script network=mainnet contract_path=src/contracts/examples/EthereumExample.sol:EthereumExample broadcast=false contract EthereumExample is RiskStewardsEthereum { /** * @return string name identifier used for the diff */ - function name() internal pure override returns (string memory) { + function name() public pure override returns (string memory) { return 'ethereum_example'; } - function lstPriceCapsUpdates() internal pure override returns (IRiskSteward.PriceCapLstUpdate[] memory) { + function lstPriceCapsUpdates() public pure override returns (IRiskSteward.PriceCapLstUpdate[] memory) { IRiskSteward.PriceCapLstUpdate[] memory priceCapUpdates = new IRiskSteward.PriceCapLstUpdate[](1); priceCapUpdates[0] = IRiskSteward.PriceCapLstUpdate({ diff --git a/src/contracts/examples/EthereumLidoExample.s.sol b/src/contracts/examples/EthereumLidoExample.sol similarity index 81% rename from src/contracts/examples/EthereumLidoExample.s.sol rename to src/contracts/examples/EthereumLidoExample.sol index 2a90930..f5d5cc4 100644 --- a/src/contracts/examples/EthereumLidoExample.s.sol +++ b/src/contracts/examples/EthereumLidoExample.sol @@ -6,19 +6,19 @@ import {IAaveV3ConfigEngine as IEngine} from 'aave-v3-periphery/contracts/v3-con import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol'; import {RiskStewardsEthereumLido} from '../../../scripts/networks/RiskStewardsEthereumLido.s.sol'; -// make run-script network=mainnet contract_path=src/contracts/examples/EthereumLidoExample.s.sol:EthereumLidoExample broadcast=false +// make run-script network=mainnet contract_path=src/contracts/examples/EthereumLidoExample.sol:EthereumLidoExample broadcast=false contract EthereumLidoExample is RiskStewardsEthereumLido { /** * @return string name identifier used for the diff */ - function name() internal pure override returns (string memory) { + function name() public pure override returns (string memory) { return 'ethereumlido_example'; } /** * @return IEngine.CapsUpdate[] capUpdates to be performed */ - function capsUpdates() internal pure override returns (IEngine.CapsUpdate[] memory) { + function capsUpdates() public pure override returns (IEngine.CapsUpdate[] memory) { IEngine.CapsUpdate[] memory capUpdates = new IEngine.CapsUpdate[](1); capUpdates[0] = IEngine.CapsUpdate( AaveV3EthereumLidoAssets.wstETH_UNDERLYING, diff --git a/src/contracts/examples/GnosisExample.s.sol b/src/contracts/examples/GnosisExample.sol similarity index 80% rename from src/contracts/examples/GnosisExample.s.sol rename to src/contracts/examples/GnosisExample.sol index 5f96dda..6edfac2 100644 --- a/src/contracts/examples/GnosisExample.s.sol +++ b/src/contracts/examples/GnosisExample.sol @@ -6,16 +6,16 @@ import {IAaveV3ConfigEngine as IEngine} from 'aave-v3-periphery/contracts/v3-con import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol'; import {RiskStewardsGnosis} from '../../../scripts/networks/RiskStewardsGnosis.s.sol'; -// make run-script network=gnosis contract_path=src/contracts/examples/GnosisExample.s.sol:GnosisExample broadcast=false +// make run-script network=gnosis contract_path=src/contracts/examples/GnosisExample.sol:GnosisExample broadcast=false contract GnosisExample is RiskStewardsGnosis { /** * @return string name identifier used for the diff */ - function name() internal pure override returns (string memory) { + function name() public pure override returns (string memory) { return 'gnosis_example'; } - function capsUpdates() internal pure override returns (IEngine.CapsUpdate[] memory) { + function capsUpdates() public pure override returns (IEngine.CapsUpdate[] memory) { IEngine.CapsUpdate[] memory capUpdates = new IEngine.CapsUpdate[](1); capUpdates[0] = IEngine.CapsUpdate( AaveV3GnosisAssets.wstETH_UNDERLYING, diff --git a/src/contracts/examples/MetisExample.s.sol b/src/contracts/examples/MetisExample.sol similarity index 80% rename from src/contracts/examples/MetisExample.s.sol rename to src/contracts/examples/MetisExample.sol index c26f379..e422711 100644 --- a/src/contracts/examples/MetisExample.s.sol +++ b/src/contracts/examples/MetisExample.sol @@ -6,16 +6,16 @@ import {IAaveV3ConfigEngine as IEngine} from 'aave-v3-periphery/contracts/v3-con import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol'; import {RiskStewardsMetis} from '../../../scripts/networks/RiskStewardsMetis.s.sol'; -// make run-script network=metis contract_path=src/contracts/examples/MetisExample.s.sol:MetisExample broadcast=false +// make run-script network=metis contract_path=src/contracts/examples/MetisExample.sol:MetisExample broadcast=false contract MetisExample is RiskStewardsMetis { /** * @return string name identifier used for the diff */ - function name() internal pure override returns (string memory) { + function name() public pure override returns (string memory) { return 'metis_example'; } - function capsUpdates() internal pure override returns (IEngine.CapsUpdate[] memory) { + function capsUpdates() public pure override returns (IEngine.CapsUpdate[] memory) { IEngine.CapsUpdate[] memory capUpdates = new IEngine.CapsUpdate[](1); capUpdates[0] = IEngine.CapsUpdate( AaveV3MetisAssets.WETH_UNDERLYING, diff --git a/src/contracts/examples/OptimismExample.s.sol b/src/contracts/examples/OptimismExample.sol similarity index 80% rename from src/contracts/examples/OptimismExample.s.sol rename to src/contracts/examples/OptimismExample.sol index 856f147..4ffc4ef 100644 --- a/src/contracts/examples/OptimismExample.s.sol +++ b/src/contracts/examples/OptimismExample.sol @@ -6,16 +6,16 @@ import {IAaveV3ConfigEngine as IEngine} from 'aave-v3-periphery/contracts/v3-con import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol'; import {RiskStewardsOptimism} from '../../../scripts/networks/RiskStewardsOptimism.s.sol'; -// make run-script network=optimism contract_path=src/contracts/examples/OptimismExample.s.sol:OptimismExample broadcast=false +// make run-script network=optimism contract_path=src/contracts/examples/OptimismExample.sol:OptimismExample broadcast=false contract OptimismExample is RiskStewardsOptimism { /** * @return string name identifier used for the diff */ - function name() internal pure override returns (string memory) { + function name() public pure override returns (string memory) { return 'optimism_example'; } - function capsUpdates() internal pure override returns (IEngine.CapsUpdate[] memory) { + function capsUpdates() public pure override returns (IEngine.CapsUpdate[] memory) { IEngine.CapsUpdate[] memory capUpdates = new IEngine.CapsUpdate[](1); capUpdates[0] = IEngine.CapsUpdate( AaveV3OptimismAssets.wstETH_UNDERLYING, diff --git a/src/contracts/examples/PolygonExample.s.sol b/src/contracts/examples/PolygonExample.sol similarity index 80% rename from src/contracts/examples/PolygonExample.s.sol rename to src/contracts/examples/PolygonExample.sol index f9df849..04678c8 100644 --- a/src/contracts/examples/PolygonExample.s.sol +++ b/src/contracts/examples/PolygonExample.sol @@ -6,16 +6,16 @@ import {IAaveV3ConfigEngine as IEngine} from 'aave-v3-periphery/contracts/v3-con import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol'; import {RiskStewardsPolygon} from '../../../scripts/networks/RiskStewardsPolygon.s.sol'; -// make run-script network=polygon contract_path=src/contracts/examples/PolygonExample.s.sol:PolygonExample broadcast=false +// make run-script network=polygon contract_path=src/contracts/examples/PolygonExample.sol:PolygonExample broadcast=false contract PolygonExample is RiskStewardsPolygon { /** * @return string name identifier used for the diff */ - function name() internal pure override returns (string memory) { + function name() public pure override returns (string memory) { return 'polygon_example'; } - function capsUpdates() internal pure override returns (IEngine.CapsUpdate[] memory) { + function capsUpdates() public pure override returns (IEngine.CapsUpdate[] memory) { IEngine.CapsUpdate[] memory capUpdates = new IEngine.CapsUpdate[](1); capUpdates[0] = IEngine.CapsUpdate( AaveV3PolygonAssets.wstETH_UNDERLYING, diff --git a/src/contracts/examples/ScrollExample.s.sol b/src/contracts/examples/ScrollExample.sol similarity index 80% rename from src/contracts/examples/ScrollExample.s.sol rename to src/contracts/examples/ScrollExample.sol index e9c5713..973ef3d 100644 --- a/src/contracts/examples/ScrollExample.s.sol +++ b/src/contracts/examples/ScrollExample.sol @@ -6,16 +6,16 @@ import {IAaveV3ConfigEngine as IEngine} from 'aave-v3-periphery/contracts/v3-con import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol'; import {RiskStewardsScroll} from '../../../scripts/networks/RiskStewardsScroll.s.sol'; -// make run-script network=scroll contract_path=src/contracts/examples/ScrollExample.s.sol:ScrollExample broadcast=false +// make run-script network=scroll contract_path=src/contracts/examples/ScrollExample.sol:ScrollExample broadcast=false contract ScrollExample is RiskStewardsScroll { /** * @return string name identifier used for the diff */ - function name() internal pure override returns (string memory) { + function name() public pure override returns (string memory) { return 'Scroll_example'; } - function capsUpdates() internal pure override returns (IEngine.CapsUpdate[] memory) { + function capsUpdates() public pure override returns (IEngine.CapsUpdate[] memory) { IEngine.CapsUpdate[] memory capUpdates = new IEngine.CapsUpdate[](1); capUpdates[0] = IEngine.CapsUpdate( AaveV3ScrollAssets.wstETH_UNDERLYING, From 8ba7b78ad4b90e66772938415584cd44bd4d7c93 Mon Sep 17 00:00:00 2001 From: Harsh Pandey Date: Wed, 28 Aug 2024 18:50:43 +0530 Subject: [PATCH 08/15] fix: generator imports and contracts --- generator/templates/aip.template.ts | 52 ----------------------- generator/templates/proposal.template.ts | 54 +++++------------------- generator/types.ts | 1 - generator/utils/importsResolver.ts | 12 ++++++ 4 files changed, 23 insertions(+), 96 deletions(-) delete mode 100644 generator/templates/aip.template.ts diff --git a/generator/templates/aip.template.ts b/generator/templates/aip.template.ts deleted file mode 100644 index 41b90fc..0000000 --- a/generator/templates/aip.template.ts +++ /dev/null @@ -1,52 +0,0 @@ -import {generateContractName, generateFolderName} from '../common'; -import {Options, PoolConfigs, PoolIdentifier} from '../types'; - -export function generateAIP(options: Options, configs: PoolConfigs) { - return `--- -title: ${`"${options.title}"` || 'TODO'} -author: ${`"${options.author}"` || 'TODO'} -discussions: ${`"${options.discussion}"` || 'TODO'}${ - options.snapshot ? `\nsnapshot: "${options.snapshot}"\n` : '' - } ---- - -## Simple Summary - -## Motivation - -## Specification - -${Object.keys(configs) - .map((pool) => { - return configs[pool as keyof typeof configs]!.artifacts.filter( - (artifact) => artifact.aip?.specification, - ).map((artifact) => artifact.aip?.specification); - }) - .filter((a) => a) - .join('\n\n')} - -## References - -- Implementation: ${options.pools - .map( - (pool) => - `[${pool}](https://github.com/bgd-labs/aave-proposals-v3/blob/main/${pool === 'AaveV3ZkSync' ? 'zksync/src' : 'src'}/${generateFolderName( - options, - )}/${generateContractName(options, pool)}.sol)`, - ) - .join(', ')} -- Tests: ${options.pools - .map( - (pool) => - `[${pool}](https://github.com/bgd-labs/aave-proposals-v3/blob/main/${pool === 'AaveV3ZkSync' ? 'zksync/src' : 'src'}/${generateFolderName( - options, - )}/${generateContractName(options, pool)}.t.sol)`, - ) - .join(', ')} -- [Snapshot](${options.snapshot || 'TODO'}) -- [Discussion](${options.discussion || 'TODO'}) - -## Copyright - -Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/).\n`; -} diff --git a/generator/templates/proposal.template.ts b/generator/templates/proposal.template.ts index ccaa87c..7b674c9 100644 --- a/generator/templates/proposal.template.ts +++ b/generator/templates/proposal.template.ts @@ -1,5 +1,5 @@ -import {generateContractName, getPoolChain, getVersion} from '../common'; -import {FEATURE, Options, PoolConfig, PoolIdentifier} from '../types'; +import {generateContractName, getPoolChain, getVersion, generateFolderName, getChainAlias} from '../common'; +import {Options, PoolConfig, PoolIdentifier} from '../types'; import {prefixWithImports} from '../utils/importsResolver'; import {prefixWithPragma} from '../utils/constants'; @@ -8,60 +8,28 @@ export const proposalTemplate = ( poolConfig: PoolConfig, pool: PoolIdentifier, ) => { - const {title, author, snapshot, discussion} = options; - const poolName = /AaveV[2|3](.*)/.test(pool) && pool.match(/AaveV[2|3](.*)/)![1]; - const version = getVersion(pool); + const {title, author, discussion} = options; + const chain = getPoolChain(pool); + const folderName = generateFolderName(options); const contractName = generateContractName(options, pool); - const constants = poolConfig.artifacts - .map((artifact) => artifact.code?.constants) - .flat() - .filter((f) => f !== undefined) - .join('\n'); const functions = poolConfig.artifacts .map((artifact) => artifact.code?.fn) .flat() .filter((f) => f !== undefined) .join('\n'); - const innerExecute = poolConfig.artifacts - .map((artifact) => artifact.code?.execute) - .flat() - .filter((f) => f !== undefined) - .join('\n'); - - let optionalExecute = ''; - const usesConfigEngine = Object.keys(poolConfig.configs).some( - (f) => ![FEATURE.OTHERS, FEATURE.FLASH_BORROWER, FEATURE.FREEZE].includes(f), - ); - const isAssetListing = Object.keys(poolConfig.configs).some((f) => - [FEATURE.ASSET_LISTING, FEATURE.ASSET_LISTING_CUSTOM].includes(f), - ); - if (innerExecute) { - if (usesConfigEngine) { - optionalExecute = `function _postExecute() internal override { - ${innerExecute} - }`; - } else { - optionalExecute = `function execute() external { - ${innerExecute} - }`; - } - } const contract = `/** * @title ${title || 'TODO'} * @author ${author || 'TODO'} - * - Snapshot: ${snapshot || 'TODO'} - * - Discussion: ${discussion || 'TODO'} + * - discussion: ${discussion || 'TODO'} + * - deploy-command: make run-script contract=src/contracts/updates/${folderName}/${contractName}.sol:${contractName} network=${getChainAlias(chain)} broadcast=false */ - contract ${contractName} is ${ - usesConfigEngine ? `Aave${version}Payload${poolName}` : 'IProposalGenericExecutor' + contract ${contractName} is ${`RiskStewards${chain}` } { - ${isAssetListing ? 'using SafeERC20 for IERC20;' : ''} - - ${constants} - - ${optionalExecute} + function name() public pure override returns (string memory) { + return '${contractName}'; + } ${functions} }`; diff --git a/generator/types.ts b/generator/types.ts index a829207..4553748 100644 --- a/generator/types.ts +++ b/generator/types.ts @@ -35,7 +35,6 @@ export interface Options { shortName: string; author: string; discussion: string; - snapshot: string; configFile?: string; date: string; } diff --git a/generator/utils/importsResolver.ts b/generator/utils/importsResolver.ts index 45cdbe4..08ba0c7 100644 --- a/generator/utils/importsResolver.ts +++ b/generator/utils/importsResolver.ts @@ -36,6 +36,14 @@ function generateAddressBookImports(code: string) { if (imports.length > 0) return `import {${imports}} from 'aave-address-book/${root}.sol';\n`; } +function generateRiskStewardImport(code: string) { + const match = code.match(/RiskStewards(\w+)/); + + if (match) { + return `import {RiskStewards${match[1]}} from '../../../../scripts/networks/RiskStewards${match[1]}.s.sol';\n`; + } +} + function generateEngineImport(code: string) { const matches = [...code.matchAll(/Aave(V[2..3])Payload([A-Za-z]+)/g)].flat(); if (matches.length > 0) @@ -76,6 +84,10 @@ export function prefixWithImports(code: string) { if (configEngineImport) { imports += configEngineImport; } + const riskStewardImport = generateRiskStewardImport(code); + if (riskStewardImport) { + imports += riskStewardImport; + } // shared config engine imports if (findMatch(code, 'EngineFlags')) { imports += `import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol';\n`; From af8e11e1b320be94e1f380b5826a5ec92172cf59 Mon Sep 17 00:00:00 2001 From: Harsh Pandey Date: Fri, 30 Aug 2024 18:44:10 +0530 Subject: [PATCH 09/15] feat: add generator for lst and stable price cap adapter updates --- generator/cli.ts | 8 +- generator/features/collateralsUpdates.ts | 1 - generator/features/lstPriceCapsUpdates.ts | 82 ++++++++++++++++ generator/features/rateUpdates.ts | 98 +------------------- generator/features/stablePriceCapsUpdates.ts | 66 +++++++++++++ generator/features/types.ts | 77 +++------------ generator/prompts/addressPrompt.ts | 5 + generator/prompts/numberPrompt.ts | 2 +- generator/types.ts | 21 ++--- generator/utils/importsResolver.ts | 7 +- 10 files changed, 185 insertions(+), 182 deletions(-) create mode 100644 generator/features/lstPriceCapsUpdates.ts create mode 100644 generator/features/stablePriceCapsUpdates.ts diff --git a/generator/cli.ts b/generator/cli.ts index fa67e43..50819f8 100644 --- a/generator/cli.ts +++ b/generator/cli.ts @@ -3,10 +3,7 @@ import {Command, Option} from 'commander'; import {CHAIN_TO_CHAIN_ID, getDate, getPoolChain, pascalCase} from './common'; import {input, checkbox} from '@inquirer/prompts'; import { - CodeArtifact, ConfigFile, - FEATURE, - FeatureModule, Options, POOLS, PoolCache, @@ -16,6 +13,8 @@ import { import {capsUpdates} from './features/capsUpdates'; import {rateUpdatesV3} from './features/rateUpdates'; import {collateralsUpdates} from './features/collateralsUpdates'; +import {lstPriceCapsUpdates} from './features/lstPriceCapsUpdates'; +import {stablePriceCapsUpdates} from './features/stablePriceCapsUpdates'; import {generateFiles, writeFiles} from './generator'; import {CHAIN_ID_CLIENT_MAP} from '@bgd-labs/js-utils'; import {getBlockNumber} from 'viem/actions'; @@ -31,7 +30,6 @@ program .addOption(new Option('-t, --title ', 'aip title')) .addOption(new Option('-a, --author ', 'author')) .addOption(new Option('-d, --discussion ', 'forum link')) - .addOption(new Option('-s, --snapshot ', 'snapshot link')) .addOption(new Option('-c, --configFile ', 'path to config file')) .allowExcessArguments(false) .parse(process.argv); @@ -43,6 +41,8 @@ const FEATURE_MODULES_V3 = [ rateUpdatesV3, capsUpdates, collateralsUpdates, + lstPriceCapsUpdates, + stablePriceCapsUpdates ]; async function generateDeterministicPoolCache(pool: PoolIdentifier): Promise { diff --git a/generator/features/collateralsUpdates.ts b/generator/features/collateralsUpdates.ts index 8b0eb28..cc53ae4 100644 --- a/generator/features/collateralsUpdates.ts +++ b/generator/features/collateralsUpdates.ts @@ -1,5 +1,4 @@ import {CodeArtifact, FEATURE, FeatureModule, PoolIdentifier} from '../types'; -import {percentInput} from '../prompts'; import {CollateralUpdate, CollateralUpdatePartial} from './types'; import { assetsSelectPrompt, diff --git a/generator/features/lstPriceCapsUpdates.ts b/generator/features/lstPriceCapsUpdates.ts new file mode 100644 index 0000000..5a14794 --- /dev/null +++ b/generator/features/lstPriceCapsUpdates.ts @@ -0,0 +1,82 @@ +import {CodeArtifact, FEATURE, FeatureModule} from '../types'; +import {LstPriceCapUpdate, LstPriceCapUpdatePartial} from './types'; +import { + assetsSelectPrompt +} from '../prompts/assetsSelectPrompt'; +import {numberPrompt} from '../prompts/numberPrompt'; +import {percentPrompt, translateJsPercentToSol} from '../prompts/percentPrompt'; +import {translateJsAssetOracleToSol} from '../prompts/addressPrompt'; + +export async function fetchLstPriceCapUpdate( + required?: boolean, +): Promise { + return { + snapshotTimestamp: await numberPrompt({ + message: 'Snapshot Timestamp', + required, + }, { + skipTransform: true + } + ), + snapshotRatio: await numberPrompt({ + message: 'Snapshot Ratio', + required, + }, { + skipTransform: true + } + ), + maxYearlyRatioGrowthPercent: await percentPrompt({ + message: 'Max Yearly Ratio Growth Percent', + required, + }), + }; +} + +type LstPriceCapUpdates = LstPriceCapUpdate[]; + +export const lstPriceCapsUpdates: FeatureModule = { + value: FEATURE.LST_PRICE_CAP_UPDATE, + description: 'LstPriceCapUpdates (snapshotTimestamp,snapshotRatio,maxYearlyRatioGrowthPercent)', + async cli({pool}) { + console.log(`Fetching information for LST Price Cap Updates on ${pool}`); + + const response: LstPriceCapUpdates = []; + const assets = await assetsSelectPrompt({ + message: 'Select the asset whose oracle you want to amend', + pool, + }); + for (const asset of assets) { + console.log(`collecting info for ${asset}`); + + response.push({asset, ...(await fetchLstPriceCapUpdate(true))}); + } + return response; + }, + build({pool, cfg}) { + const response: CodeArtifact = { + code: { + fn: [ + `function lstPriceCapsUpdates() public pure override returns (IRiskSteward.PriceCapLstUpdate[] memory) { + IRiskSteward.PriceCapLstUpdate[] memory priceCapUpdates = new IRiskSteward.PriceCapLstUpdate[](${cfg.length}); + + ${cfg + .map( + (cfg, ix) => `priceCapUpdates[${ix}] = IRiskSteward.PriceCapLstUpdate({ + oracle: ${translateJsAssetOracleToSol(pool, cfg.asset)}, + priceCapUpdateParams: IPriceCapAdapter.PriceCapUpdateParams({ + snapshotTimestamp: ${cfg.snapshotTimestamp}, + snapshotRatio: ${cfg.snapshotRatio}, + maxYearlyRatioGrowthPercent: ${translateJsPercentToSol(cfg.maxYearlyRatioGrowthPercent)}, + }) + });`, + ) + .join('\n')} + + return priceCapUpdates; + }`, + ], + }, + }; + return response; + }, +}; diff --git a/generator/features/rateUpdates.ts b/generator/features/rateUpdates.ts index 4c65b13..0c8505f 100644 --- a/generator/features/rateUpdates.ts +++ b/generator/features/rateUpdates.ts @@ -1,40 +1,11 @@ import {CodeArtifact, FEATURE, FeatureModule} from '../types'; -import {RateStrategyParams, RateStrategyUpdate} from './types'; +import {RateStrategyUpdate} from './types'; import { assetsSelectPrompt, translateAssetToAssetLibUnderlying, } from '../prompts/assetsSelectPrompt'; import {percentPrompt, translateJsPercentToSol} from '../prompts/percentPrompt'; -export async function fetchRateStrategyParamsV2(required?: boolean): Promise { - return { - optimalUtilizationRate: await percentPrompt({ - message: 'optimalUtilizationRate', - required, - }), - baseVariableBorrowRate: await percentPrompt({ - message: 'baseVariableBorrowRate', - required, - }), - variableRateSlope1: await percentPrompt({ - message: 'variableRateSlope1', - required, - }), - variableRateSlope2: await percentPrompt({ - message: 'variableRateSlope2', - required, - }), - stableRateSlope1: await percentPrompt({ - message: 'stableRateSlope1', - required, - }), - stableRateSlope2: await percentPrompt({ - message: 'stableRateSlope2', - required, - }), - }; -} - export async function fetchRateStrategyParamsV3(required?: boolean) { return { optimalUtilizationRate: await percentPrompt({ @@ -56,73 +27,6 @@ export async function fetchRateStrategyParamsV3(required?: boolean) { }; } -export const rateUpdatesV2: FeatureModule = { - value: FEATURE.RATE_UPDATE_V2, - description: 'RateStrategiesUpdates', - async cli({pool}) { - console.log(`Fetching information for RatesUpdate on ${pool}`); - const assets = await assetsSelectPrompt({ - message: 'Select the assets you want to amend', - pool, - }); - const response: RateStrategyUpdate[] = []; - for (const asset of assets) { - console.log(`Fetching info for ${asset}`); - response.push({asset, params: await fetchRateStrategyParamsV2()}); - } - return response; - }, - build({pool, cfg}) { - const response: CodeArtifact = { - code: { - fn: [ - `function rateStrategiesUpdates() - public - pure - override - returns (IAaveV2ConfigEngine.RateStrategyUpdate[] memory) - { - IAaveV2ConfigEngine.RateStrategyUpdate[] memory rateStrategies = new IAaveV2ConfigEngine.RateStrategyUpdate[](${ - cfg.length - }); - ${cfg - .map( - (cfg, ix) => `rateStrategies[${ix}] = IAaveV2ConfigEngine.RateStrategyUpdate({ - asset: ${translateAssetToAssetLibUnderlying(cfg.asset, pool)}, - params: IV2RateStrategyFactory.RateStrategyParams({ - optimalUtilizationRate: ${translateJsPercentToSol( - cfg.params.optimalUtilizationRate, - true, - )}, - baseVariableBorrowRate: ${translateJsPercentToSol( - cfg.params.baseVariableBorrowRate, - true, - )}, - variableRateSlope1: ${translateJsPercentToSol( - cfg.params.variableRateSlope1, - true, - )}, - variableRateSlope2: ${translateJsPercentToSol( - cfg.params.variableRateSlope2, - true, - )}, - stableRateSlope1: ${translateJsPercentToSol(cfg.params.stableRateSlope1, true)}, - stableRateSlope2: ${translateJsPercentToSol(cfg.params.stableRateSlope2, true)} - }) - });`, - ) - .join('\n')} - - - return rateStrategies; - }`, - ], - }, - }; - return response; - }, -}; - export const rateUpdatesV3: FeatureModule = { value: FEATURE.RATE_UPDATE_V3, description: 'RateStrategiesUpdates', diff --git a/generator/features/stablePriceCapsUpdates.ts b/generator/features/stablePriceCapsUpdates.ts new file mode 100644 index 0000000..f7ce479 --- /dev/null +++ b/generator/features/stablePriceCapsUpdates.ts @@ -0,0 +1,66 @@ +import {CodeArtifact, FEATURE, FeatureModule} from '../types'; +import {StablePriceCapUpdate, StablePriceCapUpdatePartial} from './types'; +import { + assetsSelectPrompt +} from '../prompts/assetsSelectPrompt'; +import {numberPrompt} from '../prompts/numberPrompt'; +import {translateJsAssetOracleToSol} from '../prompts/addressPrompt'; + +export async function fetchStablePriceCapUpdate( + required?: boolean, +): Promise { + return { + priceCap: await numberPrompt({ + message: 'Price Cap', + required, + }, { + skipTransform: true + } + ) + }; +} + +type StablePriceCapUpdates = StablePriceCapUpdate[]; + +export const stablePriceCapsUpdates: FeatureModule = { + value: FEATURE.STABLE_PRICE_CAP_UPDATE, + description: 'StablePriceCapUpdates (priceCap)', + async cli({pool}) { + console.log(`Fetching information for Stable Price Cap Updates on ${pool}`); + + const response: StablePriceCapUpdates = []; + const assets = await assetsSelectPrompt({ + message: 'Select the asset whose oracle you want to amend', + pool, + }); + for (const asset of assets) { + console.log(`collecting info for ${asset}`); + + response.push({asset, ...(await fetchStablePriceCapUpdate(true))}); + } + return response; + }, + build({pool, cfg}) { + const response: CodeArtifact = { + code: { + fn: [ + `function stablePriceCapsUpdates() public pure override returns (IRiskSteward.PriceCapStableUpdate[] memory) { + IRiskSteward.PriceCapStableUpdate[] memory priceCapUpdates = new IRiskSteward.PriceCapStableUpdate[](${cfg.length}); + + ${cfg + .map( + (cfg, ix) => `priceCapUpdates[${ix}] = IRiskSteward.PriceCapStableUpdate({ + oracle: ${translateJsAssetOracleToSol(pool, cfg.asset)}, + priceCap: ${cfg.priceCap} + });`, + ) + .join('\n')} + + return priceCapUpdates; + }`, + ], + }, + }; + return response; + }, +}; diff --git a/generator/features/types.ts b/generator/features/types.ts index d1b4e4f..830fc2e 100644 --- a/generator/features/types.ts +++ b/generator/features/types.ts @@ -1,17 +1,9 @@ -import {Hex} from 'viem'; import {NumberInputValues, PercentInputValues} from '../prompts'; -import {BooleanSelectValues} from '../prompts/boolPrompt'; export interface AssetSelector { asset: string; } -export interface TokenImplementations { - aToken: Hex; - vToken: Hex; - sToken: Hex; -} - export interface CapsUpdatePartial { supplyCap: NumberInputValues; borrowCap: NumberInputValues; @@ -19,17 +11,6 @@ export interface CapsUpdatePartial { export interface CapsUpdate extends CapsUpdatePartial, AssetSelector {} -export interface BorrowUpdatePartial { - enabledToBorrow: BooleanSelectValues; - flashloanable: BooleanSelectValues; - stableRateModeEnabled: BooleanSelectValues; - borrowableInIsolation: BooleanSelectValues; - withSiloedBorrowing: BooleanSelectValues; - reserveFactor: PercentInputValues; -} - -export interface BorrowUpdate extends BorrowUpdatePartial, AssetSelector {} - export interface CollateralUpdatePartial { ltv: PercentInputValues; liqThreshold: PercentInputValues; @@ -40,37 +21,11 @@ export interface CollateralUpdatePartial { export interface CollateralUpdate extends CollateralUpdatePartial, AssetSelector {} -export interface PriceFeedUpdatePartial { - priceFeed: Hex; -} - -export interface PriceFeedUpdate extends PriceFeedUpdatePartial, AssetSelector {} - -export interface AssetEModeUpdatePartial { - eModeCategory: string; -} - -export interface AssetEModeUpdate extends AssetEModeUpdatePartial, AssetSelector {} - -export interface EModeCategoryUpdate { - // library accessor or new id - eModeCategory: string | number; - ltv: NumberInputValues; - liqThreshold: NumberInputValues; - liqBonus: NumberInputValues; - priceSource?: Hex | ''; - label: string; -} - export interface RateStrategyParams { optimalUtilizationRate: string; baseVariableBorrowRate: string; variableRateSlope1: string; variableRateSlope2: string; - stableRateSlope1?: string; - stableRateSlope2?: string; - baseStableRateOffset?: string; - stableRateExcessOffset?: string; optimalStableToTotalDebtRatio?: string; } @@ -78,30 +33,20 @@ export interface RateStrategyUpdate extends AssetSelector { params: RateStrategyParams; } -export interface Listing - extends CollateralUpdatePartial, - BorrowUpdatePartial, - CapsUpdatePartial, - PriceFeedUpdatePartial { - asset: Hex; - assetSymbol: string; - rateStrategyParams: RateStrategyParams; - eModeCategory: string; - decimals: number; +export interface OracleSelector { + oracle: string; } -export interface ListingWithCustomImpl { - base: Listing; - implementations: TokenImplementations; +export interface LstPriceCapUpdatePartial { + snapshotTimestamp: NumberInputValues; + snapshotRatio: NumberInputValues; + maxYearlyRatioGrowthPercent: PercentInputValues; } -export interface TokenStream { - asset: Hex; - receiver: Hex; - duration: string; - amount: string; +export interface StablePriceCapUpdatePartial { + priceCap: NumberInputValues; } -export interface FreezeUpdate extends AssetSelector { - shouldBeFrozen: boolean; -} +export interface LstPriceCapUpdate extends LstPriceCapUpdatePartial, AssetSelector {} + +export interface StablePriceCapUpdate extends StablePriceCapUpdatePartial, AssetSelector {} diff --git a/generator/prompts/addressPrompt.ts b/generator/prompts/addressPrompt.ts index 2f49319..d801fbe 100644 --- a/generator/prompts/addressPrompt.ts +++ b/generator/prompts/addressPrompt.ts @@ -1,3 +1,4 @@ +import {PoolIdentifier} from './../types'; import {Hex, getAddress, isAddress} from 'viem'; import {GenericPrompt} from './types'; import {advancedInput} from './advancedInput'; @@ -22,3 +23,7 @@ export function translateJsAddressToSol(value?: string) { if (!value) return `EngineFlags.KEEP_CURRENT_ADDRESS`; return getAddress(value); } + +export function translateJsAssetOracleToSol(pool: PoolIdentifier, assetName: string) { + return `${pool}Assets.${assetName}_ORACLE`; +} diff --git a/generator/prompts/numberPrompt.ts b/generator/prompts/numberPrompt.ts index 1d2db60..453e22b 100644 --- a/generator/prompts/numberPrompt.ts +++ b/generator/prompts/numberPrompt.ts @@ -16,7 +16,7 @@ export async function numberPrompt({message, required}: GenericPrompt, opts?) { return await advancedInput( { message, - transformer: transformNumberToHumanReadable, + transformer: opts.skipTransform ? undefined : transformNumberToHumanReadable, validate: (v) => { if (required && v.length == 0) return false; return isNumber(v); diff --git a/generator/types.ts b/generator/types.ts index 4553748..85ddb7a 100644 --- a/generator/types.ts +++ b/generator/types.ts @@ -2,7 +2,9 @@ import * as addressBook from '@bgd-labs/aave-address-book'; import { CapsUpdate, CollateralUpdate, + LstPriceCapUpdate, RateStrategyUpdate, + StablePriceCapUpdate, } from './features/types'; export const V3_POOLS = [ @@ -16,8 +18,7 @@ export const V3_POOLS = [ 'AaveV3Base', 'AaveV3Gnosis', 'AaveV3Scroll', - 'AaveV3BNB', - 'AaveV3ZkSync', + 'AaveV3BNB' ] as const satisfies readonly (keyof typeof addressBook)[]; export const POOLS = [ @@ -47,19 +48,14 @@ export type CodeArtifact = { fn?: string[]; execute?: string[]; }; - test?: { - fn?: string[]; - }; - aip?: { - specification: string[]; - }; }; export enum FEATURE { CAPS_UPDATE = 'CAPS_UPDATE', COLLATERALS_UPDATE = 'COLLATERALS_UPDATE', RATE_UPDATE_V3 = 'RATE_UPDATE_V3', - OTHERS = 'OTHERS', + LST_PRICE_CAP_UPDATE = 'LST_PRICE_CAP_UPDATE', + STABLE_PRICE_CAP_UPDATE = 'STABLE_PRICE_CAP_UPDATE', } export interface FeatureModule { @@ -77,7 +73,7 @@ export const ENGINE_FLAGS = { DISABLED: 'DISABLED', } as const; -export const AVAILABLE_VERSIONS = {V2: 'V2', V3: 'V3'} as const; +export const AVAILABLE_VERSIONS = {V3: 'V3'} as const; export type ConfigFile = { rootOptions: Options; @@ -92,12 +88,13 @@ export interface PoolConfig { [FEATURE.CAPS_UPDATE]?: CapsUpdate[]; [FEATURE.COLLATERALS_UPDATE]?: CollateralUpdate[]; [FEATURE.RATE_UPDATE_V3]?: RateStrategyUpdate[]; - [FEATURE.OTHERS]?: {}; + [FEATURE.LST_PRICE_CAP_UPDATE]?: LstPriceCapUpdate[]; + [FEATURE.STABLE_PRICE_CAP_UPDATE]?: StablePriceCapUpdate[]; }; cache: PoolCache; } export type Files = { jsonConfig: string; - payloads: {pool: PoolIdentifier; payload: string; test: string; contractName: string}[]; + payloads: {pool: PoolIdentifier; payload: string; contractName: string}[]; }; diff --git a/generator/utils/importsResolver.ts b/generator/utils/importsResolver.ts index 08ba0c7..314e904 100644 --- a/generator/utils/importsResolver.ts +++ b/generator/utils/importsResolver.ts @@ -37,11 +37,16 @@ function generateAddressBookImports(code: string) { } function generateRiskStewardImport(code: string) { + let imports: string = ''; const match = code.match(/RiskStewards(\w+)/); if (match) { - return `import {RiskStewards${match[1]}} from '../../../../scripts/networks/RiskStewards${match[1]}.s.sol';\n`; + imports = `import {RiskStewards${match[1]}} from '../../../../scripts/networks/RiskStewards${match[1]}.s.sol';\n`; + if (findMatch(code, 'IRiskSteward')) { + imports += `import {IRiskSteward${findMatch(code, 'IPriceCapAdapter') ? ', IPriceCapAdapter': ''}} from '../../../interfaces/IRiskSteward.sol';\n`; + } } + return imports; } function generateEngineImport(code: string) { From 5ba7d2bae4e5170c8cf3715417026c7f80e13f40 Mon Sep 17 00:00:00 2001 From: Harsh Pandey Date: Fri, 30 Aug 2024 19:49:00 +0530 Subject: [PATCH 10/15] feat: add snapshot tests for generator --- .../__snapshots__/capUpdates.spec.ts.snap | 81 +++ .../collateralUpdates.spec.ts.snap | 105 +++ .../lstPriceCapUpdates.spec.ts.snap | 103 +++ .../__snapshots__/rateUpdates.spec.ts.snap | 342 +++------- .../stablePriceCapUpdates.spec.ts.snap | 85 +++ generator/features/capUpdates.spec.ts | 37 + generator/features/collateralUpdates.spec.ts | 37 + generator/features/lstPriceCapUpdates.spec.ts | 37 + generator/features/mocks/configs.ts | 90 +-- generator/features/rateUpdates.spec.ts | 26 +- .../features/stablePriceCapUpdates.spec.ts | 37 + generator/features/types.ts | 5 - generator/generator.ts | 6 - generator/templates/test.template.ts | 53 -- package.json | 2 + yarn.lock | 631 +++++++++++++++++- 16 files changed, 1287 insertions(+), 390 deletions(-) create mode 100644 generator/features/__snapshots__/capUpdates.spec.ts.snap create mode 100644 generator/features/__snapshots__/collateralUpdates.spec.ts.snap create mode 100644 generator/features/__snapshots__/lstPriceCapUpdates.spec.ts.snap create mode 100644 generator/features/__snapshots__/stablePriceCapUpdates.spec.ts.snap create mode 100644 generator/features/capUpdates.spec.ts create mode 100644 generator/features/collateralUpdates.spec.ts create mode 100644 generator/features/lstPriceCapUpdates.spec.ts create mode 100644 generator/features/stablePriceCapUpdates.spec.ts delete mode 100644 generator/templates/test.template.ts diff --git a/generator/features/__snapshots__/capUpdates.spec.ts.snap b/generator/features/__snapshots__/capUpdates.spec.ts.snap new file mode 100644 index 0000000..ef8e65c --- /dev/null +++ b/generator/features/__snapshots__/capUpdates.spec.ts.snap @@ -0,0 +1,81 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`feature: capUpdates > should properly generate files 1`] = ` +{ + "jsonConfig": "import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3Ethereum'], + title: 'test', + shortName: 'Test', + date: '20231023', + author: 'test', + discussion: 'test', + }, + poolOptions: { + AaveV3Ethereum: { + configs: {CAPS_UPDATE: [{asset: 'WETH', supplyCap: '10000', borrowCap: '5000'}]}, + cache: {blockNumber: 42}, + }, + }, +}; +", + "payloads": [ + { + "contractName": "AaveV3Ethereum_Test_20231023", + "payload": "// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {RiskStewardsEthereum} from '../../../../scripts/networks/RiskStewardsEthereum.s.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-periphery/contracts/v3-config-engine/IAaveV3ConfigEngine.sol'; + +/** + * @title test + * @author test + * - discussion: test + * - deploy-command: make run-script contract=src/contracts/updates/20231023_AaveV3Ethereum_Test/AaveV3Ethereum_Test_20231023.sol:AaveV3Ethereum_Test_20231023 network=mainnet broadcast=false + */ +contract AaveV3Ethereum_Test_20231023 is RiskStewardsEthereum { + function name() public pure override returns (string memory) { + return 'AaveV3Ethereum_Test_20231023'; + } + + function capsUpdates() public pure override returns (IAaveV3ConfigEngine.CapsUpdate[] memory) { + IAaveV3ConfigEngine.CapsUpdate[] memory capsUpdate = new IAaveV3ConfigEngine.CapsUpdate[](1); + + capsUpdate[0] = IAaveV3ConfigEngine.CapsUpdate({ + asset: AaveV3EthereumAssets.WETH_UNDERLYING, + supplyCap: 10_000, + borrowCap: 5_000 + }); + + return capsUpdate; + } +} +", + "pool": "AaveV3Ethereum", + }, + ], +} +`; + +exports[`feature: capUpdates > should return reasonable code 1`] = ` +{ + "code": { + "fn": [ + "function capsUpdates() public pure override returns (IAaveV3ConfigEngine.CapsUpdate[] memory) { + IAaveV3ConfigEngine.CapsUpdate[] memory capsUpdate = new IAaveV3ConfigEngine.CapsUpdate[](1); + + capsUpdate[0] = IAaveV3ConfigEngine.CapsUpdate({ + asset: AaveV3EthereumAssets.WETH_UNDERLYING, + supplyCap: 10_000, + borrowCap: 5_000 + }); + + return capsUpdate; + }", + ], + }, +} +`; diff --git a/generator/features/__snapshots__/collateralUpdates.spec.ts.snap b/generator/features/__snapshots__/collateralUpdates.spec.ts.snap new file mode 100644 index 0000000..d458893 --- /dev/null +++ b/generator/features/__snapshots__/collateralUpdates.spec.ts.snap @@ -0,0 +1,105 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`feature: collateralUpdates > should properly generate files 1`] = ` +{ + "jsonConfig": "import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3Ethereum'], + title: 'test', + shortName: 'Test', + date: '20231023', + author: 'test', + discussion: 'test', + }, + poolOptions: { + AaveV3Ethereum: { + configs: { + COLLATERALS_UPDATE: [ + { + asset: 'DAI', + ltv: '8500', + liqThreshold: '8800', + liqBonus: '600', + debtCeiling: '', + liqProtocolFee: '1200', + }, + ], + }, + cache: {blockNumber: 42}, + }, + }, +}; +", + "payloads": [ + { + "contractName": "AaveV3Ethereum_Test_20231023", + "payload": "// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {RiskStewardsEthereum} from '../../../../scripts/networks/RiskStewardsEthereum.s.sol'; +import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-periphery/contracts/v3-config-engine/IAaveV3ConfigEngine.sol'; + +/** + * @title test + * @author test + * - discussion: test + * - deploy-command: make run-script contract=src/contracts/updates/20231023_AaveV3Ethereum_Test/AaveV3Ethereum_Test_20231023.sol:AaveV3Ethereum_Test_20231023 network=mainnet broadcast=false + */ +contract AaveV3Ethereum_Test_20231023 is RiskStewardsEthereum { + function name() public pure override returns (string memory) { + return 'AaveV3Ethereum_Test_20231023'; + } + + function collateralsUpdates() + public + pure + override + returns (IAaveV3ConfigEngine.CollateralUpdate[] memory) + { + IAaveV3ConfigEngine.CollateralUpdate[] + memory collateralUpdate = new IAaveV3ConfigEngine.CollateralUpdate[](1); + + collateralUpdate[0] = IAaveV3ConfigEngine.CollateralUpdate({ + asset: AaveV3EthereumAssets.DAI_UNDERLYING, + ltv: 8_500_00, + liqThreshold: 8_800_00, + liqBonus: 600_00, + debtCeiling: EngineFlags.KEEP_CURRENT, + liqProtocolFee: 1_200_00 + }); + + return collateralUpdate; + } +} +", + "pool": "AaveV3Ethereum", + }, + ], +} +`; + +exports[`feature: collateralUpdates > should return reasonable code 1`] = ` +{ + "code": { + "fn": [ + "function collateralsUpdates() public pure override returns (IAaveV3ConfigEngine.CollateralUpdate[] memory) { + IAaveV3ConfigEngine.CollateralUpdate[] memory collateralUpdate = new IAaveV3ConfigEngine.CollateralUpdate[](1); + + collateralUpdate[0] = IAaveV3ConfigEngine.CollateralUpdate({ + asset: AaveV3EthereumAssets.DAI_UNDERLYING, + ltv: 8_500_00, + liqThreshold: 8_800_00, + liqBonus: 600_00, + debtCeiling: EngineFlags.KEEP_CURRENT, + liqProtocolFee: 1_200_00 + }); + + return collateralUpdate; + }", + ], + }, +} +`; diff --git a/generator/features/__snapshots__/lstPriceCapUpdates.spec.ts.snap b/generator/features/__snapshots__/lstPriceCapUpdates.spec.ts.snap new file mode 100644 index 0000000..98ce92e --- /dev/null +++ b/generator/features/__snapshots__/lstPriceCapUpdates.spec.ts.snap @@ -0,0 +1,103 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`feature: lstPriceCapUpdates > should properly generate files 1`] = ` +{ + "jsonConfig": "import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3Ethereum'], + title: 'test', + shortName: 'Test', + date: '20231023', + author: 'test', + discussion: 'test', + }, + poolOptions: { + AaveV3Ethereum: { + configs: { + LST_PRICE_CAP_UPDATE: [ + { + asset: 'wstETH', + snapshotTimestamp: '1723621200', + snapshotRatio: '1177101458282319168', + maxYearlyRatioGrowthPercent: '10.64', + }, + ], + }, + cache: {blockNumber: 42}, + }, + }, +}; +", + "payloads": [ + { + "contractName": "AaveV3Ethereum_Test_20231023", + "payload": "// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {RiskStewardsEthereum} from '../../../../scripts/networks/RiskStewardsEthereum.s.sol'; +import {IRiskSteward, IPriceCapAdapter} from '../../../interfaces/IRiskSteward.sol'; + +/** + * @title test + * @author test + * - discussion: test + * - deploy-command: make run-script contract=src/contracts/updates/20231023_AaveV3Ethereum_Test/AaveV3Ethereum_Test_20231023.sol:AaveV3Ethereum_Test_20231023 network=mainnet broadcast=false + */ +contract AaveV3Ethereum_Test_20231023 is RiskStewardsEthereum { + function name() public pure override returns (string memory) { + return 'AaveV3Ethereum_Test_20231023'; + } + + function lstPriceCapsUpdates() + public + pure + override + returns (IRiskSteward.PriceCapLstUpdate[] memory) + { + IRiskSteward.PriceCapLstUpdate[] memory priceCapUpdates = new IRiskSteward.PriceCapLstUpdate[]( + 1 + ); + + priceCapUpdates[0] = IRiskSteward.PriceCapLstUpdate({ + oracle: AaveV3EthereumAssets.wstETH_ORACLE, + priceCapUpdateParams: IPriceCapAdapter.PriceCapUpdateParams({ + snapshotTimestamp: 1723621200, + snapshotRatio: 1177101458282319168, + maxYearlyRatioGrowthPercent: 10_64 + }) + }); + + return priceCapUpdates; + } +} +", + "pool": "AaveV3Ethereum", + }, + ], +} +`; + +exports[`feature: lstPriceCapUpdates > should return reasonable code 1`] = ` +{ + "code": { + "fn": [ + "function lstPriceCapsUpdates() public pure override returns (IRiskSteward.PriceCapLstUpdate[] memory) { + IRiskSteward.PriceCapLstUpdate[] memory priceCapUpdates = new IRiskSteward.PriceCapLstUpdate[](1); + + priceCapUpdates[0] = IRiskSteward.PriceCapLstUpdate({ + oracle: AaveV3EthereumAssets.wstETH_ORACLE, + priceCapUpdateParams: IPriceCapAdapter.PriceCapUpdateParams({ + snapshotTimestamp: 1723621200, + snapshotRatio: 1177101458282319168, + maxYearlyRatioGrowthPercent: 10_64, + }) + }); + + return priceCapUpdates; + }", + ], + }, +} +`; diff --git a/generator/features/__snapshots__/rateUpdates.spec.ts.snap b/generator/features/__snapshots__/rateUpdates.spec.ts.snap index 3f272ac..23620ef 100644 --- a/generator/features/__snapshots__/rateUpdates.spec.ts.snap +++ b/generator/features/__snapshots__/rateUpdates.spec.ts.snap @@ -1,46 +1,21 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`feature: rateUpdatesV2 > should properly generate files 1`] = ` +exports[`feature: rateUpdatesV3 > should properly generate files 1`] = ` { - "aip": "--- -title: "test" -author: "test" -discussions: "test" -snapshot: "test" ---- - -## Simple Summary - -## Motivation - -## Specification - -## References - -- Implementation: [AaveV2EthereumAMM](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20231023_AaveV2EthereumAMM_Test/AaveV2EthereumAMM_Test_20231023.sol) -- Tests: [AaveV2EthereumAMM](https://github.com/bgd-labs/aave-proposals-v3/blob/main/src/20231023_AaveV2EthereumAMM_Test/AaveV2EthereumAMM_Test_20231023.t.sol) -- [Snapshot](test) -- [Discussion](test) - -## Copyright - -Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). -", "jsonConfig": "import {ConfigFile} from '../../generator/types'; export const config: ConfigFile = { rootOptions: { - pools: ['AaveV2EthereumAMM'], + pools: ['AaveV3Ethereum'], title: 'test', shortName: 'Test', date: '20231023', author: 'test', discussion: 'test', - snapshot: 'test', }, poolOptions: { - AaveV2EthereumAMM: { + AaveV3Ethereum: { configs: { - RATE_UPDATE_V2: [ + RATE_UPDATE_V3: [ { asset: 'WETH', params: { @@ -48,8 +23,6 @@ export const config: ConfigFile = { baseVariableBorrowRate: '6', variableRateSlope1: '', variableRateSlope2: '', - stableRateSlope1: '', - stableRateSlope2: '', }, }, { @@ -59,8 +32,6 @@ export const config: ConfigFile = { baseVariableBorrowRate: '4', variableRateSlope1: '10', variableRateSlope2: '', - stableRateSlope1: '', - stableRateSlope2: '', }, }, { @@ -70,8 +41,6 @@ export const config: ConfigFile = { baseVariableBorrowRate: '4', variableRateSlope1: '10', variableRateSlope2: '', - stableRateSlope1: '', - stableRateSlope2: '', }, }, { @@ -81,8 +50,6 @@ export const config: ConfigFile = { baseVariableBorrowRate: '6', variableRateSlope1: '10', variableRateSlope2: '', - stableRateSlope1: '', - stableRateSlope2: '', }, }, { @@ -92,8 +59,6 @@ export const config: ConfigFile = { baseVariableBorrowRate: '5', variableRateSlope1: '', variableRateSlope2: '', - stableRateSlope1: '', - stableRateSlope2: '', }, }, ], @@ -105,83 +70,77 @@ export const config: ConfigFile = { ", "payloads": [ { - "contractName": "AaveV2EthereumAMM_Test_20231023", + "contractName": "AaveV3Ethereum_Test_20231023", "payload": "// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {AaveV2EthereumAMMAssets} from 'aave-address-book/AaveV2EthereumAMM.sol'; -import {AaveV2PayloadEthereumAMM} from 'aave-helpers/src/v2-config-engine/AaveV2PayloadEthereumAMM.sol'; +import {AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {RiskStewardsEthereum} from '../../../../scripts/networks/RiskStewardsEthereum.s.sol'; import {EngineFlags} from 'aave-v3-periphery/contracts/v3-config-engine/EngineFlags.sol'; -import {IAaveV2ConfigEngine} from 'aave-helpers/src/v2-config-engine/IAaveV2ConfigEngine.sol'; -import {IV2RateStrategyFactory} from 'aave-helpers/src/v2-config-engine/IV2RateStrategyFactory.sol'; +import {IAaveV3ConfigEngine} from 'aave-v3-periphery/contracts/v3-config-engine/IAaveV3ConfigEngine.sol'; + /** * @title test * @author test - * - Snapshot: test - * - Discussion: test + * - discussion: test + * - deploy-command: make run-script contract=src/contracts/updates/20231023_AaveV3Ethereum_Test/AaveV3Ethereum_Test_20231023.sol:AaveV3Ethereum_Test_20231023 network=mainnet broadcast=false */ -contract AaveV2EthereumAMM_Test_20231023 is AaveV2PayloadEthereumAMM { +contract AaveV3Ethereum_Test_20231023 is RiskStewardsEthereum { + function name() public pure override returns (string memory) { + return 'AaveV3Ethereum_Test_20231023'; + } + function rateStrategiesUpdates() public pure override - returns (IAaveV2ConfigEngine.RateStrategyUpdate[] memory) + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) { - IAaveV2ConfigEngine.RateStrategyUpdate[] - memory rateStrategies = new IAaveV2ConfigEngine.RateStrategyUpdate[](5); - rateStrategies[0] = IAaveV2ConfigEngine.RateStrategyUpdate({ - asset: AaveV2EthereumAMMAssets.WETH_UNDERLYING, - params: IV2RateStrategyFactory.RateStrategyParams({ - optimalUtilizationRate: EngineFlags.KEEP_CURRENT, - baseVariableBorrowRate: _bpsToRay(6_00), + IAaveV3ConfigEngine.RateStrategyUpdate[] + memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](5); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumAssets.WETH_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: 6_00, variableRateSlope1: EngineFlags.KEEP_CURRENT, - variableRateSlope2: EngineFlags.KEEP_CURRENT, - stableRateSlope1: EngineFlags.KEEP_CURRENT, - stableRateSlope2: EngineFlags.KEEP_CURRENT + variableRateSlope2: EngineFlags.KEEP_CURRENT }) }); - rateStrategies[1] = IAaveV2ConfigEngine.RateStrategyUpdate({ - asset: AaveV2EthereumAMMAssets.DAI_UNDERLYING, - params: IV2RateStrategyFactory.RateStrategyParams({ - optimalUtilizationRate: EngineFlags.KEEP_CURRENT, - baseVariableBorrowRate: _bpsToRay(4_00), - variableRateSlope1: _bpsToRay(10_00), - variableRateSlope2: EngineFlags.KEEP_CURRENT, - stableRateSlope1: EngineFlags.KEEP_CURRENT, - stableRateSlope2: EngineFlags.KEEP_CURRENT + rateStrategies[1] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumAssets.DAI_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: 4_00, + variableRateSlope1: 10_00, + variableRateSlope2: EngineFlags.KEEP_CURRENT }) }); - rateStrategies[2] = IAaveV2ConfigEngine.RateStrategyUpdate({ - asset: AaveV2EthereumAMMAssets.USDC_UNDERLYING, - params: IV2RateStrategyFactory.RateStrategyParams({ - optimalUtilizationRate: EngineFlags.KEEP_CURRENT, - baseVariableBorrowRate: _bpsToRay(4_00), - variableRateSlope1: _bpsToRay(10_00), - variableRateSlope2: EngineFlags.KEEP_CURRENT, - stableRateSlope1: EngineFlags.KEEP_CURRENT, - stableRateSlope2: EngineFlags.KEEP_CURRENT + rateStrategies[2] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumAssets.USDC_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: 4_00, + variableRateSlope1: 10_00, + variableRateSlope2: EngineFlags.KEEP_CURRENT }) }); - rateStrategies[3] = IAaveV2ConfigEngine.RateStrategyUpdate({ - asset: AaveV2EthereumAMMAssets.USDT_UNDERLYING, - params: IV2RateStrategyFactory.RateStrategyParams({ - optimalUtilizationRate: EngineFlags.KEEP_CURRENT, - baseVariableBorrowRate: _bpsToRay(6_00), - variableRateSlope1: _bpsToRay(10_00), - variableRateSlope2: EngineFlags.KEEP_CURRENT, - stableRateSlope1: EngineFlags.KEEP_CURRENT, - stableRateSlope2: EngineFlags.KEEP_CURRENT + rateStrategies[3] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumAssets.USDT_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: 6_00, + variableRateSlope1: 10_00, + variableRateSlope2: EngineFlags.KEEP_CURRENT }) }); - rateStrategies[4] = IAaveV2ConfigEngine.RateStrategyUpdate({ - asset: AaveV2EthereumAMMAssets.WBTC_UNDERLYING, - params: IV2RateStrategyFactory.RateStrategyParams({ - optimalUtilizationRate: EngineFlags.KEEP_CURRENT, - baseVariableBorrowRate: _bpsToRay(5_00), + rateStrategies[4] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumAssets.WBTC_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: 5_00, variableRateSlope1: EngineFlags.KEEP_CURRENT, - variableRateSlope2: EngineFlags.KEEP_CURRENT, - stableRateSlope1: EngineFlags.KEEP_CURRENT, - stableRateSlope2: EngineFlags.KEEP_CURRENT + variableRateSlope2: EngineFlags.KEEP_CURRENT }) }); @@ -189,102 +148,13 @@ contract AaveV2EthereumAMM_Test_20231023 is AaveV2PayloadEthereumAMM { } } ", - "pool": "AaveV2EthereumAMM", - "test": "// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {AaveV2EthereumAMM} from 'aave-address-book/AaveV2EthereumAMM.sol'; - -import 'forge-std/Test.sol'; -import {ProtocolV2TestBase, ReserveConfig} from 'aave-helpers/src/ProtocolV2TestBase.sol'; -import {AaveV2EthereumAMM_Test_20231023} from './AaveV2EthereumAMM_Test_20231023.sol'; - -/** - * @dev Test for AaveV2EthereumAMM_Test_20231023 - * command: FOUNDRY_PROFILE=mainnet forge test --match-path=src/20231023_AaveV2EthereumAMM_Test/AaveV2EthereumAMM_Test_20231023.t.sol -vv - */ -contract AaveV2EthereumAMM_Test_20231023_Test is ProtocolV2TestBase { - AaveV2EthereumAMM_Test_20231023 internal proposal; - - function setUp() public { - vm.createSelectFork(vm.rpcUrl('mainnet'), 42); - proposal = new AaveV2EthereumAMM_Test_20231023(); - } - - /** - * @dev executes the generic test suite including e2e and config snapshots - */ - function test_defaultProposalExecution() public { - defaultTest('AaveV2EthereumAMM_Test_20231023', AaveV2EthereumAMM.POOL, address(proposal)); - } -} -", + "pool": "AaveV3Ethereum", }, ], - "scripts": { - "defaultScript": "// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {GovV3Helpers, IPayloadsControllerCore, PayloadsControllerUtils} from 'aave-helpers/src/GovV3Helpers.sol'; -import {GovernanceV3Ethereum} from 'aave-address-book/GovernanceV3Ethereum.sol'; -import {EthereumScript} from 'solidity-utils/contracts/utils/ScriptUtils.sol'; -import {AaveV2EthereumAMM_Test_20231023} from './AaveV2EthereumAMM_Test_20231023.sol'; - -/** - * @dev Deploy Ethereum - * deploy-command: make deploy-ledger contract=src/20231023_AaveV2EthereumAMM_Test/Test_20231023.s.sol:DeployEthereum chain=mainnet - * verify-command: FOUNDRY_PROFILE=mainnet npx catapulta-verify -b broadcast/Test_20231023.s.sol/1/run-latest.json - */ -contract DeployEthereum is EthereumScript { - function run() external broadcast { - // deploy payloads - address payload0 = GovV3Helpers.deployDeterministic( - type(AaveV2EthereumAMM_Test_20231023).creationCode - ); - - // compose action - IPayloadsControllerCore.ExecutionAction[] - memory actions = new IPayloadsControllerCore.ExecutionAction[](1); - actions[0] = GovV3Helpers.buildAction(payload0); - - // register action at payloadsController - GovV3Helpers.createPayload(actions); - } -} - -/** - * @dev Create Proposal - * command: make deploy-ledger contract=src/20231023_AaveV2EthereumAMM_Test/Test_20231023.s.sol:CreateProposal chain=mainnet - */ -contract CreateProposal is EthereumScript { - function run() external { - // create payloads - PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](1); - - // compose actions for validation - IPayloadsControllerCore.ExecutionAction[] - memory actionsEthereum = new IPayloadsControllerCore.ExecutionAction[](1); - actionsEthereum[0] = GovV3Helpers.buildAction( - type(AaveV2EthereumAMM_Test_20231023).creationCode - ); - payloads[0] = GovV3Helpers.buildMainnetPayload(vm, actionsEthereum); - - // create proposal - vm.startBroadcast(); - GovV3Helpers.createProposal( - vm, - payloads, - GovernanceV3Ethereum.VOTING_PORTAL_ETH_POL, - GovV3Helpers.ipfsHashFile(vm, 'src/20231023_AaveV2EthereumAMM_Test/Test.md') - ); - } -} -", - }, } `; -exports[`feature: rateUpdatesV2 > should return reasonable code 1`] = ` +exports[`feature: rateUpdatesV3 > should return reasonable code 1`] = ` { "code": { "fn": [ @@ -292,64 +162,54 @@ exports[`feature: rateUpdatesV2 > should return reasonable code 1`] = ` public pure override - returns (IAaveV2ConfigEngine.RateStrategyUpdate[] memory) + returns (IAaveV3ConfigEngine.RateStrategyUpdate[] memory) { - IAaveV2ConfigEngine.RateStrategyUpdate[] memory rateStrategies = new IAaveV2ConfigEngine.RateStrategyUpdate[](5); - rateStrategies[0] = IAaveV2ConfigEngine.RateStrategyUpdate({ - asset: AaveV2EthereumAMMAssets.WETH_UNDERLYING, - params: IV2RateStrategyFactory.RateStrategyParams({ - optimalUtilizationRate: EngineFlags.KEEP_CURRENT, - baseVariableBorrowRate: _bpsToRay(6_00), - variableRateSlope1: EngineFlags.KEEP_CURRENT, - variableRateSlope2: EngineFlags.KEEP_CURRENT, - stableRateSlope1: EngineFlags.KEEP_CURRENT, - stableRateSlope2: EngineFlags.KEEP_CURRENT - }) - }); -rateStrategies[1] = IAaveV2ConfigEngine.RateStrategyUpdate({ - asset: AaveV2EthereumAMMAssets.DAI_UNDERLYING, - params: IV2RateStrategyFactory.RateStrategyParams({ - optimalUtilizationRate: EngineFlags.KEEP_CURRENT, - baseVariableBorrowRate: _bpsToRay(4_00), - variableRateSlope1: _bpsToRay(10_00), - variableRateSlope2: EngineFlags.KEEP_CURRENT, - stableRateSlope1: EngineFlags.KEEP_CURRENT, - stableRateSlope2: EngineFlags.KEEP_CURRENT - }) - }); -rateStrategies[2] = IAaveV2ConfigEngine.RateStrategyUpdate({ - asset: AaveV2EthereumAMMAssets.USDC_UNDERLYING, - params: IV2RateStrategyFactory.RateStrategyParams({ - optimalUtilizationRate: EngineFlags.KEEP_CURRENT, - baseVariableBorrowRate: _bpsToRay(4_00), - variableRateSlope1: _bpsToRay(10_00), - variableRateSlope2: EngineFlags.KEEP_CURRENT, - stableRateSlope1: EngineFlags.KEEP_CURRENT, - stableRateSlope2: EngineFlags.KEEP_CURRENT - }) - }); -rateStrategies[3] = IAaveV2ConfigEngine.RateStrategyUpdate({ - asset: AaveV2EthereumAMMAssets.USDT_UNDERLYING, - params: IV2RateStrategyFactory.RateStrategyParams({ - optimalUtilizationRate: EngineFlags.KEEP_CURRENT, - baseVariableBorrowRate: _bpsToRay(6_00), - variableRateSlope1: _bpsToRay(10_00), - variableRateSlope2: EngineFlags.KEEP_CURRENT, - stableRateSlope1: EngineFlags.KEEP_CURRENT, - stableRateSlope2: EngineFlags.KEEP_CURRENT - }) - }); -rateStrategies[4] = IAaveV2ConfigEngine.RateStrategyUpdate({ - asset: AaveV2EthereumAMMAssets.WBTC_UNDERLYING, - params: IV2RateStrategyFactory.RateStrategyParams({ - optimalUtilizationRate: EngineFlags.KEEP_CURRENT, - baseVariableBorrowRate: _bpsToRay(5_00), - variableRateSlope1: EngineFlags.KEEP_CURRENT, - variableRateSlope2: EngineFlags.KEEP_CURRENT, - stableRateSlope1: EngineFlags.KEEP_CURRENT, - stableRateSlope2: EngineFlags.KEEP_CURRENT - }) - }); + IAaveV3ConfigEngine.RateStrategyUpdate[] memory rateStrategies = new IAaveV3ConfigEngine.RateStrategyUpdate[](5); + rateStrategies[0] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumAssets.WETH_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: 6_00, + variableRateSlope1: EngineFlags.KEEP_CURRENT, + variableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); +rateStrategies[1] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumAssets.DAI_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: 4_00, + variableRateSlope1: 10_00, + variableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); +rateStrategies[2] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumAssets.USDC_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: 4_00, + variableRateSlope1: 10_00, + variableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); +rateStrategies[3] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumAssets.USDT_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: 6_00, + variableRateSlope1: 10_00, + variableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); +rateStrategies[4] = IAaveV3ConfigEngine.RateStrategyUpdate({ + asset: AaveV3EthereumAssets.WBTC_UNDERLYING, + params: IAaveV3ConfigEngine.InterestRateInputData({ + optimalUsageRatio: EngineFlags.KEEP_CURRENT, + baseVariableBorrowRate: 5_00, + variableRateSlope1: EngineFlags.KEEP_CURRENT, + variableRateSlope2: EngineFlags.KEEP_CURRENT + }) + }); return rateStrategies; diff --git a/generator/features/__snapshots__/stablePriceCapUpdates.spec.ts.snap b/generator/features/__snapshots__/stablePriceCapUpdates.spec.ts.snap new file mode 100644 index 0000000..c119f9d --- /dev/null +++ b/generator/features/__snapshots__/stablePriceCapUpdates.spec.ts.snap @@ -0,0 +1,85 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`feature: capUpdates > should properly generate files 1`] = ` +{ + "jsonConfig": "import {ConfigFile} from '../../generator/types'; +export const config: ConfigFile = { + rootOptions: { + pools: ['AaveV3Ethereum'], + title: 'test', + shortName: 'Test', + date: '20231023', + author: 'test', + discussion: 'test', + }, + poolOptions: { + AaveV3Ethereum: { + configs: {STABLE_PRICE_CAP_UPDATE: [{asset: 'USDT', priceCap: '108000000'}]}, + cache: {blockNumber: 42}, + }, + }, +}; +", + "payloads": [ + { + "contractName": "AaveV3Ethereum_Test_20231023", + "payload": "// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumAssets} from 'aave-address-book/AaveV3Ethereum.sol'; +import {RiskStewardsEthereum} from '../../../../scripts/networks/RiskStewardsEthereum.s.sol'; +import {IRiskSteward} from '../../../interfaces/IRiskSteward.sol'; + +/** + * @title test + * @author test + * - discussion: test + * - deploy-command: make run-script contract=src/contracts/updates/20231023_AaveV3Ethereum_Test/AaveV3Ethereum_Test_20231023.sol:AaveV3Ethereum_Test_20231023 network=mainnet broadcast=false + */ +contract AaveV3Ethereum_Test_20231023 is RiskStewardsEthereum { + function name() public pure override returns (string memory) { + return 'AaveV3Ethereum_Test_20231023'; + } + + function stablePriceCapsUpdates() + public + pure + override + returns (IRiskSteward.PriceCapStableUpdate[] memory) + { + IRiskSteward.PriceCapStableUpdate[] + memory priceCapUpdates = new IRiskSteward.PriceCapStableUpdate[](1); + + priceCapUpdates[0] = IRiskSteward.PriceCapStableUpdate({ + oracle: AaveV3EthereumAssets.USDT_ORACLE, + priceCap: 108000000 + }); + + return priceCapUpdates; + } +} +", + "pool": "AaveV3Ethereum", + }, + ], +} +`; + +exports[`feature: capUpdates > should return reasonable code 1`] = ` +{ + "code": { + "fn": [ + "function stablePriceCapsUpdates() public pure override returns (IRiskSteward.PriceCapStableUpdate[] memory) { + IRiskSteward.PriceCapStableUpdate[] memory priceCapUpdates = new IRiskSteward.PriceCapStableUpdate[](1); + + priceCapUpdates[0] = IRiskSteward.PriceCapStableUpdate({ + oracle: AaveV3EthereumAssets.USDT_ORACLE, + priceCap: 108000000 + }); + + return priceCapUpdates; + }", + ], + }, +} +`; diff --git a/generator/features/capUpdates.spec.ts b/generator/features/capUpdates.spec.ts new file mode 100644 index 0000000..b0ca9d6 --- /dev/null +++ b/generator/features/capUpdates.spec.ts @@ -0,0 +1,37 @@ +// sum.test.js +import {expect, describe, it} from 'vitest'; +import {MOCK_OPTIONS, capUpdate} from './mocks/configs'; +import {generateFiles} from '../generator'; +import {FEATURE, PoolConfigs} from '../types'; +import {capsUpdates} from './capsUpdates'; + +describe('feature: capUpdates', () => { + it('should return reasonable code', () => { + const output = capsUpdates.build({ + options: MOCK_OPTIONS, + pool: 'AaveV3Ethereum', + cfg: capUpdate, + cache: {blockNumber: 42}, + }); + expect(output).toMatchSnapshot(); + }); + + it('should properly generate files', async () => { + const poolConfigs: PoolConfigs = { + ['AaveV3Ethereum']: { + artifacts: [ + capsUpdates.build({ + options: {...MOCK_OPTIONS, pools: ['AaveV3Ethereum']}, + pool: 'AaveV3Ethereum', + cfg: capUpdate, + cache: {blockNumber: 42}, + }), + ], + configs: {[FEATURE.CAPS_UPDATE]: capUpdate}, + cache: {blockNumber: 42}, + }, + }; + const files = await generateFiles({...MOCK_OPTIONS, pools: ['AaveV3Ethereum']}, poolConfigs); + expect(files).toMatchSnapshot(); + }); +}); diff --git a/generator/features/collateralUpdates.spec.ts b/generator/features/collateralUpdates.spec.ts new file mode 100644 index 0000000..b1e7cc9 --- /dev/null +++ b/generator/features/collateralUpdates.spec.ts @@ -0,0 +1,37 @@ +// sum.test.js +import {expect, describe, it} from 'vitest'; +import {MOCK_OPTIONS, collateralUpdate} from './mocks/configs'; +import {generateFiles} from '../generator'; +import {FEATURE, PoolConfigs} from '../types'; +import {collateralsUpdates} from './collateralsUpdates'; + +describe('feature: collateralUpdates', () => { + it('should return reasonable code', () => { + const output = collateralsUpdates.build({ + options: MOCK_OPTIONS, + pool: 'AaveV3Ethereum', + cfg: collateralUpdate, + cache: {blockNumber: 42}, + }); + expect(output).toMatchSnapshot(); + }); + + it('should properly generate files', async () => { + const poolConfigs: PoolConfigs = { + ['AaveV3Ethereum']: { + artifacts: [ + collateralsUpdates.build({ + options: {...MOCK_OPTIONS, pools: ['AaveV3Ethereum']}, + pool: 'AaveV3Ethereum', + cfg: collateralUpdate, + cache: {blockNumber: 42}, + }), + ], + configs: {[FEATURE.COLLATERALS_UPDATE]: collateralUpdate}, + cache: {blockNumber: 42}, + }, + }; + const files = await generateFiles({...MOCK_OPTIONS, pools: ['AaveV3Ethereum']}, poolConfigs); + expect(files).toMatchSnapshot(); + }); +}); diff --git a/generator/features/lstPriceCapUpdates.spec.ts b/generator/features/lstPriceCapUpdates.spec.ts new file mode 100644 index 0000000..39ec548 --- /dev/null +++ b/generator/features/lstPriceCapUpdates.spec.ts @@ -0,0 +1,37 @@ +// sum.test.js +import {expect, describe, it} from 'vitest'; +import {MOCK_OPTIONS, lstPriceCapUpdate} from './mocks/configs'; +import {generateFiles} from '../generator'; +import {FEATURE, PoolConfigs} from '../types'; +import {lstPriceCapsUpdates} from './lstPriceCapsUpdates'; + +describe('feature: lstPriceCapUpdates', () => { + it('should return reasonable code', () => { + const output = lstPriceCapsUpdates.build({ + options: MOCK_OPTIONS, + pool: 'AaveV3Ethereum', + cfg: lstPriceCapUpdate, + cache: {blockNumber: 42}, + }); + expect(output).toMatchSnapshot(); + }); + + it('should properly generate files', async () => { + const poolConfigs: PoolConfigs = { + ['AaveV3Ethereum']: { + artifacts: [ + lstPriceCapsUpdates.build({ + options: {...MOCK_OPTIONS, pools: ['AaveV3Ethereum']}, + pool: 'AaveV3Ethereum', + cfg: lstPriceCapUpdate, + cache: {blockNumber: 42}, + }), + ], + configs: {[FEATURE.LST_PRICE_CAP_UPDATE]: lstPriceCapUpdate}, + cache: {blockNumber: 42}, + }, + }; + const files = await generateFiles({...MOCK_OPTIONS, pools: ['AaveV3Ethereum']}, poolConfigs); + expect(files).toMatchSnapshot(); + }); +}); diff --git a/generator/features/mocks/configs.ts b/generator/features/mocks/configs.ts index 1266a49..2f3879c 100644 --- a/generator/features/mocks/configs.ts +++ b/generator/features/mocks/configs.ts @@ -1,5 +1,5 @@ import {Options} from '../../types'; -import {EModeCategoryUpdate, Listing, PriceFeedUpdate, RateStrategyUpdate} from '../types'; +import {CapsUpdate, CollateralUpdate, RateStrategyUpdate, LstPriceCapUpdate, StablePriceCapUpdate} from '../types'; export const MOCK_OPTIONS: Options = { pools: ['AaveV3Ethereum'], @@ -8,70 +8,28 @@ export const MOCK_OPTIONS: Options = { date: '20231023', author: 'test', discussion: 'test', - snapshot: 'test', }; -export const assetListingConfig: Listing[] = [ +export const capUpdate: CapsUpdate[] = [ { - assetSymbol: 'PSP', - decimals: 18, - priceFeed: '0x72AFAECF99C9d9C8215fF44C77B94B99C28741e8', - ltv: '40', - liqThreshold: '50', - liqBonus: '5', - debtCeiling: '100000', - liqProtocolFee: '20', - enabledToBorrow: 'ENABLED', - flashloanable: 'ENABLED', - stableRateModeEnabled: 'DISABLED', - borrowableInIsolation: 'DISABLED', - withSiloedBorrowing: 'DISABLED', - reserveFactor: '20', + asset: 'WETH', supplyCap: '10000', - borrowCap: '5000', - rateStrategyParams: { - optimalUtilizationRate: '80', - baseVariableBorrowRate: '0', - variableRateSlope1: '10', - variableRateSlope2: '100', - stableRateSlope1: '10', - stableRateSlope2: '100', - baseStableRateOffset: '1', - stableRateExcessOffset: '0', - optimalStableToTotalDebtRatio: '10', - }, - eModeCategory: 'AaveV3EthereumEModes.NONE', - asset: '0xcAfE001067cDEF266AfB7Eb5A286dCFD277f3dE5', + borrowCap: '5000' }, ]; -export const priceFeedsUpdateConfig: PriceFeedUpdate[] = [ +export const collateralUpdate: CollateralUpdate[] = [ { asset: 'DAI', - priceFeed: '0xae7ab96520de3a18e5e111b5eaab095312d7fe84', - }, -]; - -export const emodeUpdates: EModeCategoryUpdate[] = [ - { - eModeCategory: 2, - ltv: '20_00', - liqThreshold: '30_00', - liqBonus: '5_00', - priceSource: '0x0000000000000000000000000000000000000000', - label: 'label', - }, - { - eModeCategory: 'AaveV3EthereumEModes.ETH_CORRELATED', - ltv: 'EngineFlags.KEEP_CURRENT', - liqThreshold: '50_00', - liqBonus: 'EngineFlags.KEEP_CURRENT', - priceSource: '', - label: '', + ltv: '8500', + liqThreshold: '8800', + liqBonus: '600', + debtCeiling: '', + liqProtocolFee: '1200' }, ]; -export const rateUpdateV2: RateStrategyUpdate[] = [ +export const rateUpdateV3: RateStrategyUpdate[] = [ { asset: 'WETH', params: { @@ -79,8 +37,6 @@ export const rateUpdateV2: RateStrategyUpdate[] = [ baseVariableBorrowRate: '6', variableRateSlope1: '', variableRateSlope2: '', - stableRateSlope1: '', - stableRateSlope2: '', }, }, { @@ -90,8 +46,6 @@ export const rateUpdateV2: RateStrategyUpdate[] = [ baseVariableBorrowRate: '4', variableRateSlope1: '10', variableRateSlope2: '', - stableRateSlope1: '', - stableRateSlope2: '', }, }, { @@ -101,8 +55,6 @@ export const rateUpdateV2: RateStrategyUpdate[] = [ baseVariableBorrowRate: '4', variableRateSlope1: '10', variableRateSlope2: '', - stableRateSlope1: '', - stableRateSlope2: '', }, }, { @@ -112,8 +64,6 @@ export const rateUpdateV2: RateStrategyUpdate[] = [ baseVariableBorrowRate: '6', variableRateSlope1: '10', variableRateSlope2: '', - stableRateSlope1: '', - stableRateSlope2: '', }, }, { @@ -123,8 +73,22 @@ export const rateUpdateV2: RateStrategyUpdate[] = [ baseVariableBorrowRate: '5', variableRateSlope1: '', variableRateSlope2: '', - stableRateSlope1: '', - stableRateSlope2: '', }, }, ]; + +export const lstPriceCapUpdate: LstPriceCapUpdate[] = [ + { + asset: 'wstETH', + snapshotTimestamp: '1723621200', + snapshotRatio: '1177101458282319168', + maxYearlyRatioGrowthPercent: '10.64', + }, +]; + +export const stablePriceCapUpdate: StablePriceCapUpdate[] = [ + { + asset: 'USDT', + priceCap: '108000000' + } +]; diff --git a/generator/features/rateUpdates.spec.ts b/generator/features/rateUpdates.spec.ts index 8ae10e4..1a7313d 100644 --- a/generator/features/rateUpdates.spec.ts +++ b/generator/features/rateUpdates.spec.ts @@ -1,16 +1,16 @@ // sum.test.js import {expect, describe, it} from 'vitest'; -import {MOCK_OPTIONS, rateUpdateV2} from './mocks/configs'; +import {MOCK_OPTIONS, rateUpdateV3, capUpdate} from './mocks/configs'; import {generateFiles} from '../generator'; import {FEATURE, PoolConfigs} from '../types'; -import {rateUpdatesV2} from './rateUpdates'; +import {rateUpdatesV3} from './rateUpdates'; -describe('feature: rateUpdatesV2', () => { +describe('feature: rateUpdatesV3', () => { it('should return reasonable code', () => { - const output = rateUpdatesV2.build({ + const output = rateUpdatesV3.build({ options: MOCK_OPTIONS, - pool: 'AaveV2EthereumAMM', - cfg: rateUpdateV2, + pool: 'AaveV3Ethereum', + cfg: rateUpdateV3, cache: {blockNumber: 42}, }); expect(output).toMatchSnapshot(); @@ -18,20 +18,20 @@ describe('feature: rateUpdatesV2', () => { it('should properly generate files', async () => { const poolConfigs: PoolConfigs = { - ['AaveV2EthereumAMM']: { + ['AaveV3Ethereum']: { artifacts: [ - rateUpdatesV2.build({ - options: {...MOCK_OPTIONS, pools: ['AaveV2EthereumAMM']}, - pool: 'AaveV2EthereumAMM', - cfg: rateUpdateV2, + rateUpdatesV3.build({ + options: {...MOCK_OPTIONS, pools: ['AaveV3Ethereum']}, + pool: 'AaveV3Ethereum', + cfg: rateUpdateV3, cache: {blockNumber: 42}, }), ], - configs: {[FEATURE.RATE_UPDATE_V2]: rateUpdateV2}, + configs: {[FEATURE.RATE_UPDATE_V3]: rateUpdateV3}, cache: {blockNumber: 42}, }, }; - const files = await generateFiles({...MOCK_OPTIONS, pools: ['AaveV2EthereumAMM']}, poolConfigs); + const files = await generateFiles({...MOCK_OPTIONS, pools: ['AaveV3Ethereum']}, poolConfigs); expect(files).toMatchSnapshot(); }); }); diff --git a/generator/features/stablePriceCapUpdates.spec.ts b/generator/features/stablePriceCapUpdates.spec.ts new file mode 100644 index 0000000..de8f539 --- /dev/null +++ b/generator/features/stablePriceCapUpdates.spec.ts @@ -0,0 +1,37 @@ +// sum.test.js +import {expect, describe, it} from 'vitest'; +import {MOCK_OPTIONS, stablePriceCapUpdate} from './mocks/configs'; +import {generateFiles} from '../generator'; +import {FEATURE, PoolConfigs} from '../types'; +import {stablePriceCapsUpdates} from './stablePriceCapsUpdates'; + +describe('feature: capUpdates', () => { + it('should return reasonable code', () => { + const output = stablePriceCapsUpdates.build({ + options: MOCK_OPTIONS, + pool: 'AaveV3Ethereum', + cfg: stablePriceCapUpdate, + cache: {blockNumber: 42}, + }); + expect(output).toMatchSnapshot(); + }); + + it('should properly generate files', async () => { + const poolConfigs: PoolConfigs = { + ['AaveV3Ethereum']: { + artifacts: [ + stablePriceCapsUpdates.build({ + options: {...MOCK_OPTIONS, pools: ['AaveV3Ethereum']}, + pool: 'AaveV3Ethereum', + cfg: stablePriceCapUpdate, + cache: {blockNumber: 42}, + }), + ], + configs: {[FEATURE.STABLE_PRICE_CAP_UPDATE]: stablePriceCapUpdate}, + cache: {blockNumber: 42}, + }, + }; + const files = await generateFiles({...MOCK_OPTIONS, pools: ['AaveV3Ethereum']}, poolConfigs); + expect(files).toMatchSnapshot(); + }); +}); diff --git a/generator/features/types.ts b/generator/features/types.ts index 830fc2e..05e184b 100644 --- a/generator/features/types.ts +++ b/generator/features/types.ts @@ -26,17 +26,12 @@ export interface RateStrategyParams { baseVariableBorrowRate: string; variableRateSlope1: string; variableRateSlope2: string; - optimalStableToTotalDebtRatio?: string; } export interface RateStrategyUpdate extends AssetSelector { params: RateStrategyParams; } -export interface OracleSelector { - oracle: string; -} - export interface LstPriceCapUpdatePartial { snapshotTimestamp: NumberInputValues; snapshotRatio: NumberInputValues; diff --git a/generator/generator.ts b/generator/generator.ts index 60f007a..b76dc20 100644 --- a/generator/generator.ts +++ b/generator/generator.ts @@ -2,7 +2,6 @@ import fs from 'fs'; import path from 'path'; import {generateContractName, generateFolderName} from './common'; import {proposalTemplate} from './templates/proposal.template'; -import {testTemplate} from './templates/test.template'; import {confirm} from '@inquirer/prompts'; import {ConfigFile, Options, PoolConfigs, PoolIdentifier, Files} from './types'; import prettier from 'prettier'; @@ -31,7 +30,6 @@ export async function generateFiles(options: Options, poolConfigs: PoolConfigs): async function createPayload(options: Options, pool: PoolIdentifier) { const contractName = generateContractName(options, pool); - const testCode = testTemplate(options, poolConfigs[pool]!, pool); return { pool, @@ -39,10 +37,6 @@ export async function generateFiles(options: Options, poolConfigs: PoolConfigs): ...prettierSolCfg, filepath: 'foo.sol', }), - test: await prettier.format(testCode, { - ...prettierSolCfg, - filepath: 'foo.sol', - }), contractName: contractName, }; } diff --git a/generator/templates/test.template.ts b/generator/templates/test.template.ts deleted file mode 100644 index d0540af..0000000 --- a/generator/templates/test.template.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { - generateContractName, - generateFolderName, - getChainAlias, - getPoolChain, -} from '../common'; -import {Options, PoolConfig, PoolIdentifier} from '../types'; -import {prefixWithPragma} from '../utils/constants'; -import {prefixWithImports} from '../utils/importsResolver'; - -export const testTemplate = (options: Options, poolConfig: PoolConfig, pool: PoolIdentifier) => { - const folderName = generateFolderName(options); - const chain = getPoolChain(pool); - const contractName = generateContractName(options, pool); - - const testBase = 'ProtocolV3TestBase'; - - const functions = poolConfig.artifacts - .map((artifact) => artifact.test?.fn) - .flat() - .filter((f) => f !== undefined) - .join('\n'); - - let template = ` -import 'forge-std/Test.sol'; -import {${testBase}, ReserveConfig} from 'aave-helpers/${chain === 'ZkSync' ? 'zksync/src/' : 'src/'}${testBase}.sol'; -import {${contractName}} from './${contractName}.sol'; - -/** - * @dev Test for ${contractName} - * command: FOUNDRY_PROFILE=${getChainAlias(chain)} forge test ${chain === 'ZkSync' ? '--zksync --match-path=zksync/src/' : '--match-path=src/'}${folderName}/${contractName}.t.sol -vv - */ -contract ${contractName}_Test is ${testBase} { - ${contractName} internal proposal; - - function setUp() public ${chain === 'ZkSync' ? 'override' : ''} { - vm.createSelectFork(vm.rpcUrl('${getChainAlias(chain)}'), ${poolConfig.cache.blockNumber}); - proposal = new ${contractName}(); - - ${chain === 'ZkSync' ? 'super.setUp();' : ''} - } - - /** - * @dev executes the generic test suite including e2e and config snapshots - */ - function test_defaultProposalExecution() public { - defaultTest('${contractName}', ${pool}.POOL, address(proposal)); - } - - ${functions} -}`; - return prefixWithPragma(prefixWithImports(template)); -}; diff --git a/package.json b/package.json index 5f977a6..d27efd8 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "name": "aave-v3-risk-stewards", "version": "1.0.0", "scripts": { + "test": "vitest generator", "lint": "prettier ./", "lint:fix": "npm run lint -- --write", "generate": "tsx generator/cli" @@ -24,6 +25,7 @@ "devDependencies": { "prettier": "2.8.7", "prettier-plugin-solidity": "1.1.3", + "vitest": "^2.0.4", "@bgd-labs/aave-address-book": "^3.1.1", "@bgd-labs/aave-cli": "^0.16.2", "@bgd-labs/js-utils": "^1.4.2", diff --git a/yarn.lock b/yarn.lock index 0ac356b..cfa7d20 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,6 +7,14 @@ resolved "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz" integrity sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q== +"@ampproject/remapping@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + "@assemblyscript/loader@^0.9.4": version "0.9.4" resolved "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.9.4.tgz" @@ -94,91 +102,181 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@esbuild/aix-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" + integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== + "@esbuild/aix-ppc64@0.23.0": version "0.23.0" resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz#145b74d5e4a5223489cabdc238d8dad902df5259" integrity sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ== +"@esbuild/android-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" + integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== + "@esbuild/android-arm64@0.23.0": version "0.23.0" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz#453bbe079fc8d364d4c5545069e8260228559832" integrity sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ== +"@esbuild/android-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" + integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== + "@esbuild/android-arm@0.23.0": version "0.23.0" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.23.0.tgz#26c806853aa4a4f7e683e519cd9d68e201ebcf99" integrity sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g== +"@esbuild/android-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" + integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== + "@esbuild/android-x64@0.23.0": version "0.23.0" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.23.0.tgz#1e51af9a6ac1f7143769f7ee58df5b274ed202e6" integrity sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ== +"@esbuild/darwin-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" + integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== + "@esbuild/darwin-arm64@0.23.0": version "0.23.0" resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz" integrity sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow== +"@esbuild/darwin-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" + integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== + "@esbuild/darwin-x64@0.23.0": version "0.23.0" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz#30c8f28a7ef4e32fe46501434ebe6b0912e9e86c" integrity sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ== +"@esbuild/freebsd-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" + integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== + "@esbuild/freebsd-arm64@0.23.0": version "0.23.0" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz#30f4fcec8167c08a6e8af9fc14b66152232e7fb4" integrity sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw== +"@esbuild/freebsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" + integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== + "@esbuild/freebsd-x64@0.23.0": version "0.23.0" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz#1003a6668fe1f5d4439e6813e5b09a92981bc79d" integrity sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ== +"@esbuild/linux-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" + integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== + "@esbuild/linux-arm64@0.23.0": version "0.23.0" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz#3b9a56abfb1410bb6c9138790f062587df3e6e3a" integrity sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw== +"@esbuild/linux-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" + integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== + "@esbuild/linux-arm@0.23.0": version "0.23.0" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz#237a8548e3da2c48cd79ae339a588f03d1889aad" integrity sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw== +"@esbuild/linux-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" + integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== + "@esbuild/linux-ia32@0.23.0": version "0.23.0" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz#4269cd19cb2de5de03a7ccfc8855dde3d284a238" integrity sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA== +"@esbuild/linux-loong64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" + integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== + "@esbuild/linux-loong64@0.23.0": version "0.23.0" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz#82b568f5658a52580827cc891cb69d2cb4f86280" integrity sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A== +"@esbuild/linux-mips64el@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" + integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== + "@esbuild/linux-mips64el@0.23.0": version "0.23.0" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz#9a57386c926262ae9861c929a6023ed9d43f73e5" integrity sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w== +"@esbuild/linux-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" + integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== + "@esbuild/linux-ppc64@0.23.0": version "0.23.0" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz#f3a79fd636ba0c82285d227eb20ed8e31b4444f6" integrity sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw== +"@esbuild/linux-riscv64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" + integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== + "@esbuild/linux-riscv64@0.23.0": version "0.23.0" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz#f9d2ef8356ce6ce140f76029680558126b74c780" integrity sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw== +"@esbuild/linux-s390x@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" + integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== + "@esbuild/linux-s390x@0.23.0": version "0.23.0" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz#45390f12e802201f38a0229e216a6aed4351dfe8" integrity sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg== +"@esbuild/linux-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" + integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== + "@esbuild/linux-x64@0.23.0": version "0.23.0" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz#c8409761996e3f6db29abcf9b05bee8d7d80e910" integrity sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ== +"@esbuild/netbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" + integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== + "@esbuild/netbsd-x64@0.23.0": version "0.23.0" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz#ba70db0114380d5f6cfb9003f1d378ce989cd65c" @@ -189,26 +287,51 @@ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz#72fc55f0b189f7a882e3cf23f332370d69dfd5db" integrity sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ== +"@esbuild/openbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" + integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== + "@esbuild/openbsd-x64@0.23.0": version "0.23.0" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz#b6ae7a0911c18fe30da3db1d6d17a497a550e5d8" integrity sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg== +"@esbuild/sunos-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" + integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== + "@esbuild/sunos-x64@0.23.0": version "0.23.0" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz#58f0d5e55b9b21a086bfafaa29f62a3eb3470ad8" integrity sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA== +"@esbuild/win32-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" + integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== + "@esbuild/win32-arm64@0.23.0": version "0.23.0" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz#b858b2432edfad62e945d5c7c9e5ddd0f528ca6d" integrity sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ== +"@esbuild/win32-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" + integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== + "@esbuild/win32-ia32@0.23.0": version "0.23.0" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz#167ef6ca22a476c6c0c014a58b4f43ae4b80dec7" integrity sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA== +"@esbuild/win32-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" + integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== + "@esbuild/win32-x64@0.23.0": version "0.23.0" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz#db44a6a08520b5f25bbe409f34a59f2d4bcc7ced" @@ -715,14 +838,28 @@ dependencies: mute-stream "^1.0.0" -"@jridgewell/resolve-uri@^3.0.3": +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": version "1.5.0" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== "@jridgewell/trace-mapping@0.3.9": @@ -733,6 +870,14 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@jridgewell/trace-mapping@^0.3.24": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@ledgerhq/cryptoassets@^5.27.2": version "5.53.0" resolved "https://registry.npmjs.org/@ledgerhq/cryptoassets/-/cryptoassets-5.53.0.tgz" @@ -908,6 +1053,86 @@ resolved "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== +"@rollup/rollup-android-arm-eabi@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.2.tgz#0412834dc423d1ff7be4cb1fc13a86a0cd262c11" + integrity sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg== + +"@rollup/rollup-android-arm64@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.2.tgz#baf1a014b13654f3b9e835388df9caf8c35389cb" + integrity sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA== + +"@rollup/rollup-darwin-arm64@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.2.tgz#0a2c364e775acdf1172fe3327662eec7c46e55b1" + integrity sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q== + +"@rollup/rollup-darwin-x64@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.2.tgz#a972db75890dfab8df0da228c28993220a468c42" + integrity sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w== + +"@rollup/rollup-linux-arm-gnueabihf@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.2.tgz#1609d0630ef61109dd19a278353e5176d92e30a1" + integrity sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w== + +"@rollup/rollup-linux-arm-musleabihf@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.2.tgz#3c1dca5f160aa2e79e4b20ff6395eab21804f266" + integrity sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w== + +"@rollup/rollup-linux-arm64-gnu@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.2.tgz#c2fe376e8b04eafb52a286668a8df7c761470ac7" + integrity sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw== + +"@rollup/rollup-linux-arm64-musl@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.2.tgz#e62a4235f01e0f66dbba587c087ca6db8008ec80" + integrity sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w== + +"@rollup/rollup-linux-powerpc64le-gnu@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.2.tgz#24b3457e75ee9ae5b1c198bd39eea53222a74e54" + integrity sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ== + +"@rollup/rollup-linux-riscv64-gnu@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.2.tgz#38edfba9620fe2ca8116c97e02bd9f2d606bde09" + integrity sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg== + +"@rollup/rollup-linux-s390x-gnu@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.2.tgz#a3bfb8bc5f1e802f8c76cff4a4be2e9f9ac36a18" + integrity sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ== + +"@rollup/rollup-linux-x64-gnu@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.2.tgz#0dadf34be9199fcdda44b5985a086326344f30ad" + integrity sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw== + +"@rollup/rollup-linux-x64-musl@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.2.tgz#7b7deddce240400eb87f2406a445061b4fed99a8" + integrity sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg== + +"@rollup/rollup-win32-arm64-msvc@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.2.tgz#a0ca0c5149c2cfb26fab32e6ba3f16996fbdb504" + integrity sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ== + +"@rollup/rollup-win32-ia32-msvc@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.2.tgz#aae2886beec3024203dbb5569db3a137bc385f8e" + integrity sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw== + +"@rollup/rollup-win32-x64-msvc@4.21.2": + version "4.21.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz#e4291e3c1bc637083f87936c333cdbcad22af63b" + integrity sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA== + "@safe-global/safe-core-sdk-types@^1.9.2": version "1.10.1" resolved "https://registry.npmjs.org/@safe-global/safe-core-sdk-types/-/safe-core-sdk-types-1.10.1.tgz" @@ -1028,6 +1253,11 @@ dependencies: "@types/node" "*" +"@types/estree@1.0.5", "@types/estree@^1.0.0": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + "@types/long@^4.0.1": version "4.0.2" resolved "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz" @@ -1095,6 +1325,57 @@ resolved "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz" integrity sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g== +"@vitest/expect@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-2.0.5.tgz#f3745a6a2c18acbea4d39f5935e913f40d26fa86" + integrity sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA== + dependencies: + "@vitest/spy" "2.0.5" + "@vitest/utils" "2.0.5" + chai "^5.1.1" + tinyrainbow "^1.2.0" + +"@vitest/pretty-format@2.0.5", "@vitest/pretty-format@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.0.5.tgz#91d2e6d3a7235c742e1a6cc50e7786e2f2979b1e" + integrity sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ== + dependencies: + tinyrainbow "^1.2.0" + +"@vitest/runner@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-2.0.5.tgz#89197e712bb93513537d6876995a4843392b2a84" + integrity sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig== + dependencies: + "@vitest/utils" "2.0.5" + pathe "^1.1.2" + +"@vitest/snapshot@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-2.0.5.tgz#a2346bc5013b73c44670c277c430e0334690a162" + integrity sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew== + dependencies: + "@vitest/pretty-format" "2.0.5" + magic-string "^0.30.10" + pathe "^1.1.2" + +"@vitest/spy@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-2.0.5.tgz#590fc07df84a78b8e9dd976ec2090920084a2b9f" + integrity sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA== + dependencies: + tinyspy "^3.0.0" + +"@vitest/utils@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.0.5.tgz#6f8307a4b6bc6ceb9270007f73c67c915944e926" + integrity sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ== + dependencies: + "@vitest/pretty-format" "2.0.5" + estree-walker "^3.0.3" + loupe "^3.1.1" + tinyrainbow "^1.2.0" + abitype@1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/abitype/-/abitype-1.0.5.tgz" @@ -1188,6 +1469,11 @@ arrify@^1.0.1: resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== +assertion-error@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" + integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== + available-typed-arrays@^1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" @@ -1335,6 +1621,11 @@ bufferutil@^4.0.1: dependencies: node-gyp-build "^4.3.0" +cac@^6.7.14: + version "6.7.14" + resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" + integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== + call-bind@^1.0.2, call-bind@^1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz" @@ -1360,6 +1651,17 @@ camelcase@^5.3.1: resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +chai@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/chai/-/chai-5.1.1.tgz#f035d9792a22b481ead1c65908d14bb62ec1c82c" + integrity sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA== + dependencies: + assertion-error "^2.0.1" + check-error "^2.1.1" + deep-eql "^5.0.1" + loupe "^3.1.0" + pathval "^2.0.0" + chalk@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" @@ -1382,6 +1684,11 @@ chardet@^0.7.0: resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== +check-error@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" + integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== + chownr@^1.1.1: version "1.1.4" resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" @@ -1499,6 +1806,15 @@ cross-fetch@^4.0.0: dependencies: node-fetch "^2.6.12" +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + d@1, d@^1.0.1, d@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/d/-/d-1.0.2.tgz" @@ -1514,9 +1830,9 @@ debug@^2.2.0: dependencies: ms "2.0.0" -debug@^4.3.1: +debug@^4.3.1, debug@^4.3.5: version "4.3.6" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== dependencies: ms "2.1.2" @@ -1541,6 +1857,11 @@ decompress-response@^4.2.0: dependencies: mimic-response "^2.0.0" +deep-eql@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" + integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== + deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" @@ -1674,6 +1995,35 @@ es6-symbol@^3.1.1, es6-symbol@^3.1.3: d "^1.0.2" ext "^1.7.0" +esbuild@^0.21.3: + version "0.21.5" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" + integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== + optionalDependencies: + "@esbuild/aix-ppc64" "0.21.5" + "@esbuild/android-arm" "0.21.5" + "@esbuild/android-arm64" "0.21.5" + "@esbuild/android-x64" "0.21.5" + "@esbuild/darwin-arm64" "0.21.5" + "@esbuild/darwin-x64" "0.21.5" + "@esbuild/freebsd-arm64" "0.21.5" + "@esbuild/freebsd-x64" "0.21.5" + "@esbuild/linux-arm" "0.21.5" + "@esbuild/linux-arm64" "0.21.5" + "@esbuild/linux-ia32" "0.21.5" + "@esbuild/linux-loong64" "0.21.5" + "@esbuild/linux-mips64el" "0.21.5" + "@esbuild/linux-ppc64" "0.21.5" + "@esbuild/linux-riscv64" "0.21.5" + "@esbuild/linux-s390x" "0.21.5" + "@esbuild/linux-x64" "0.21.5" + "@esbuild/netbsd-x64" "0.21.5" + "@esbuild/openbsd-x64" "0.21.5" + "@esbuild/sunos-x64" "0.21.5" + "@esbuild/win32-arm64" "0.21.5" + "@esbuild/win32-ia32" "0.21.5" + "@esbuild/win32-x64" "0.21.5" + esbuild@~0.23.0: version "0.23.0" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz" @@ -1724,6 +2074,13 @@ esprima@^4.0.0: resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== +estree-walker@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + ethereum-bloom-filters@^1.0.6: version "1.2.0" resolved "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.2.0.tgz" @@ -1843,6 +2200,21 @@ evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" +execa@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^8.0.1" + human-signals "^5.0.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^4.1.0" + strip-final-newline "^3.0.0" + expand-template@^2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz" @@ -1908,7 +2280,7 @@ fs-constants@^1.0.0: resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fsevents@~2.3.3: +fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -1932,6 +2304,11 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" +get-func-name@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== + get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz" @@ -1943,6 +2320,11 @@ get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: has-symbols "^1.0.3" hasown "^2.0.0" +get-stream@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" + integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== + get-tsconfig@^4.7.5: version "4.7.6" resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz" @@ -2074,6 +2456,11 @@ http-https@^1.0.0: resolved "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz" integrity sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg== +human-signals@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" + integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== + husky@^8.0.3: version "8.0.3" resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" @@ -2235,6 +2622,11 @@ is-plain-obj@^2.1.0: resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + is-typed-array@^1.1.3: version "1.1.13" resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz" @@ -2252,6 +2644,11 @@ isarray@~1.0.0: resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + isows@1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/isows/-/isows-1.0.4.tgz" @@ -2352,6 +2749,13 @@ loose-envify@^1.0.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" +loupe@^3.1.0, loupe@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.1.1.tgz#71d038d59007d890e3247c5db97c1ec5a92edc54" + integrity sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw== + dependencies: + get-func-name "^2.0.1" + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" @@ -2359,6 +2763,13 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +magic-string@^0.30.10: + version "0.30.11" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.11.tgz#301a6f93b3e8c2cb13ac1a7a673492c0dfd12954" + integrity sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + make-error@^1.1.1: version "1.3.6" resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" @@ -2408,11 +2819,21 @@ merge-options@^3.0.4: dependencies: is-plain-obj "^2.1.0" +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + micro-ftch@^0.3.1: version "0.3.1" resolved "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz" integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + mimic-response@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz" @@ -2518,6 +2939,11 @@ nan@^2.14.0: resolved "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz" integrity sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw== +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + napi-build-utils@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz" @@ -2606,6 +3032,13 @@ normalize-package-data@^3.0.0: semver "^7.3.4" validate-npm-package-license "^3.0.1" +npm-run-path@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" + integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== + dependencies: + path-key "^4.0.0" + npmlog@^4.0.1: version "4.1.2" resolved "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz" @@ -2653,6 +3086,13 @@ once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" @@ -2692,11 +3132,31 @@ path-exists@^4.0.0: resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + path-parse@^1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +pathe@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" + integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== + +pathval@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25" + integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== + pbkdf2@^3.0.17: version "3.1.2" resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz" @@ -2708,9 +3168,9 @@ pbkdf2@^3.0.17: safe-buffer "^5.0.1" sha.js "^2.4.8" -picocolors@^1.0.0: +picocolors@^1.0.0, picocolors@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== possible-typed-array-names@^1.0.0: @@ -2718,6 +3178,15 @@ possible-typed-array-names@^1.0.0: resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz" integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== +postcss@^8.4.41: + version "8.4.41" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.41.tgz#d6104d3ba272d882fe18fc07d15dc2da62fa2681" + integrity sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.1" + source-map-js "^1.2.0" + prebuild-install@^5.3.4: version "5.3.6" resolved "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.6.tgz" @@ -2916,6 +3385,31 @@ rlp@^2.2.4, rlp@^2.2.6: dependencies: bn.js "^5.2.0" +rollup@^4.20.0: + version "4.21.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.21.2.tgz#f41f277a448d6264e923dd1ea179f0a926aaf9b7" + integrity sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw== + dependencies: + "@types/estree" "1.0.5" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.21.2" + "@rollup/rollup-android-arm64" "4.21.2" + "@rollup/rollup-darwin-arm64" "4.21.2" + "@rollup/rollup-darwin-x64" "4.21.2" + "@rollup/rollup-linux-arm-gnueabihf" "4.21.2" + "@rollup/rollup-linux-arm-musleabihf" "4.21.2" + "@rollup/rollup-linux-arm64-gnu" "4.21.2" + "@rollup/rollup-linux-arm64-musl" "4.21.2" + "@rollup/rollup-linux-powerpc64le-gnu" "4.21.2" + "@rollup/rollup-linux-riscv64-gnu" "4.21.2" + "@rollup/rollup-linux-s390x-gnu" "4.21.2" + "@rollup/rollup-linux-x64-gnu" "4.21.2" + "@rollup/rollup-linux-x64-musl" "4.21.2" + "@rollup/rollup-win32-arm64-msvc" "4.21.2" + "@rollup/rollup-win32-ia32-msvc" "4.21.2" + "@rollup/rollup-win32-x64-msvc" "4.21.2" + fsevents "~2.3.2" + run-async@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz" @@ -3012,6 +3506,23 @@ sha.js@^2.4.0, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +siginfo@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" + integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== + signal-exit@^3.0.0: version "3.0.7" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" @@ -3041,6 +3552,11 @@ solidity-comments-extractor@^0.0.7: resolved "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz" integrity sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw== +source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== + sparse-array@^1.3.1: version "1.3.2" resolved "https://registry.npmjs.org/sparse-array/-/sparse-array-1.3.2.tgz" @@ -3082,6 +3598,16 @@ stable@^0.1.8: resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== +stackback@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" + integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== + +std-env@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" + integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== + string-width@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" @@ -3133,6 +3659,11 @@ strip-bom-string@^1.0.0: resolved "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz" integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + strip-hex-prefix@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz" @@ -3192,6 +3723,26 @@ tar-stream@^2.1.4: inherits "^2.0.3" readable-stream "^3.1.1" +tinybench@^2.8.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" + integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== + +tinypool@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.0.1.tgz#c64233c4fac4304e109a64340178760116dbe1fe" + integrity sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA== + +tinyrainbow@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-1.2.0.tgz#5c57d2fc0fb3d1afd78465c33ca885d04f02abb5" + integrity sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ== + +tinyspy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-3.0.0.tgz#cb61644f2713cd84dee184863f4642e06ddf0585" + integrity sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA== + tmp@^0.0.33: version "0.0.33" resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" @@ -3420,6 +3971,53 @@ viem@^2.18.6: webauthn-p256 "0.0.5" ws "8.17.1" +vite-node@2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-2.0.5.tgz#36d909188fc6e3aba3da5fc095b3637d0d18e27b" + integrity sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q== + dependencies: + cac "^6.7.14" + debug "^4.3.5" + pathe "^1.1.2" + tinyrainbow "^1.2.0" + vite "^5.0.0" + +vite@^5.0.0: + version "5.4.2" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.2.tgz#8acb6ec4bfab823cdfc1cb2d6c53ed311bc4e47e" + integrity sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA== + dependencies: + esbuild "^0.21.3" + postcss "^8.4.41" + rollup "^4.20.0" + optionalDependencies: + fsevents "~2.3.3" + +vitest@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-2.0.5.tgz#2f15a532704a7181528e399cc5b754c7f335fd62" + integrity sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA== + dependencies: + "@ampproject/remapping" "^2.3.0" + "@vitest/expect" "2.0.5" + "@vitest/pretty-format" "^2.0.5" + "@vitest/runner" "2.0.5" + "@vitest/snapshot" "2.0.5" + "@vitest/spy" "2.0.5" + "@vitest/utils" "2.0.5" + chai "^5.1.1" + debug "^4.3.5" + execa "^8.0.1" + magic-string "^0.30.10" + pathe "^1.1.2" + std-env "^3.7.0" + tinybench "^2.8.0" + tinypool "^1.0.0" + tinyrainbow "^1.2.0" + vite "^5.0.0" + vite-node "2.0.5" + why-is-node-running "^2.3.0" + web3-core-helpers@1.10.4: version "1.10.4" resolved "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.4.tgz" @@ -3576,6 +4174,21 @@ which-typed-array@^1.1.14, which-typed-array@^1.1.2: gopd "^1.0.1" has-tostringtag "^1.0.2" +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +why-is-node-running@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" + integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== + dependencies: + siginfo "^2.0.0" + stackback "0.0.2" + wide-align@^1.1.0: version "1.1.5" resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz" From c65436a7bdd8757076dcd0ddc105fc06fa9f89c7 Mon Sep 17 00:00:00 2001 From: Harsh Pandey Date: Fri, 30 Aug 2024 23:49:02 +0530 Subject: [PATCH 11/15] chore: some cleanup --- generator/templates/proposal.template.ts | 2 +- generator/templates/script.template.ts | 120 ------------------ generator/templates/zksync.script.template.ts | 97 -------------- 3 files changed, 1 insertion(+), 218 deletions(-) delete mode 100644 generator/templates/script.template.ts delete mode 100644 generator/templates/zksync.script.template.ts diff --git a/generator/templates/proposal.template.ts b/generator/templates/proposal.template.ts index 7b674c9..03b66fe 100644 --- a/generator/templates/proposal.template.ts +++ b/generator/templates/proposal.template.ts @@ -1,4 +1,4 @@ -import {generateContractName, getPoolChain, getVersion, generateFolderName, getChainAlias} from '../common'; +import {generateContractName, getPoolChain, generateFolderName, getChainAlias} from '../common'; import {Options, PoolConfig, PoolIdentifier} from '../types'; import {prefixWithImports} from '../utils/importsResolver'; import {prefixWithPragma} from '../utils/constants'; diff --git a/generator/templates/script.template.ts b/generator/templates/script.template.ts deleted file mode 100644 index 600e50c..0000000 --- a/generator/templates/script.template.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { - CHAIN_TO_CHAIN_ID, - generateContractName, - generateFolderName, - getChainAlias, - getPoolChain, - getVotingPortal, -} from '../common'; -import {Options} from '../types'; -import {prefixWithImports} from '../utils/importsResolver'; -import {prefixWithPragma} from '../utils/constants'; - -export function generateScript(options: Options) { - const folderName = generateFolderName(options); - const fileName = generateContractName(options); - const votingPortal = getVotingPortal(options.votingNetwork); - let template = ''; - const chains = [...new Set(options.pools.map((pool) => getPoolChain(pool)!))]; - - // generate imports - template += `import {${['Ethereum', ...chains.filter((c) => c !== 'Ethereum' && c !== 'ZkSync')] - .map((chain) => `${chain}Script`) - .join(', ')}} from 'solidity-utils/contracts/utils/ScriptUtils.sol';\n`; - template += options.pools - .filter((c) => c !== 'AaveV3ZkSync') - .map((pool) => { - const name = generateContractName(options, pool); - return `import {${name}} from './${name}.sol';`; - }) - .join('\n'); - template += '\n\n'; - - const poolsToChainsMap = options.pools.reduce((acc, pool) => { - const chain = getPoolChain(pool); - const contractName = generateContractName(options, pool); - if (!acc[chain]) acc[chain] = []; - acc[chain].push({contractName, pool}); - return acc; - }, {}); - - // generate chain scripts - template += Object.keys(poolsToChainsMap) - .filter((c) => c !== 'ZkSync') - .map((chain) => { - return `/** - * @dev Deploy ${chain} - * deploy-command: make deploy-ledger contract=src/${folderName}/${fileName}.s.sol:Deploy${chain} chain=${getChainAlias( - chain, - )} - * verify-command: FOUNDRY_PROFILE=${getChainAlias(chain)} npx catapulta-verify -b broadcast/${fileName}.s.sol/${ - CHAIN_TO_CHAIN_ID[chain] - }/run-latest.json - */ - contract Deploy${chain} is ${chain}Script { - function run() external broadcast { - // deploy payloads - ${poolsToChainsMap[chain] - .map( - ({contractName, pool}, ix) => - `address payload${ix} = GovV3Helpers.deployDeterministic(type(${contractName}).creationCode);`, - ) - .join('\n')} - - // compose action - IPayloadsControllerCore.ExecutionAction[] memory actions = new IPayloadsControllerCore.ExecutionAction[](${ - poolsToChainsMap[chain].length - }); - ${poolsToChainsMap[chain] - .map( - ({contractName, pool}, ix) => `actions[${ix}] = GovV3Helpers.buildAction(payload${ix});`, - ) - .join('\n')} - - // register action at payloadsController - GovV3Helpers.createPayload(actions); - } - }`; - }) - .join('\n\n'); - template += '\n\n'; - - // generate proposal creation script - template += `/** - * @dev Create Proposal - * command: make deploy-ledger contract=src/${folderName}/${fileName}.s.sol:CreateProposal chain=mainnet - */ -contract CreateProposal is EthereumScript { - function run() external { - // create payloads - PayloadsControllerUtils.Payload[] memory payloads = new PayloadsControllerUtils.Payload[](${ - Object.keys(poolsToChainsMap).length - }); - - // compose actions for validation - ${Object.keys(poolsToChainsMap) - .map((chain, ix) => { - let template = `IPayloadsControllerCore.ExecutionAction[] memory actions${chain} = new IPayloadsControllerCore.ExecutionAction[](${poolsToChainsMap[chain].length});\n`; - template += poolsToChainsMap[chain] - .map(({contractName, pool}, ix) => { - return pool == 'AaveV3ZkSync' - ? `actions${chain}[${ix}] = GovV3Helpers.buildActionZkSync(vm, '${contractName}');` - : `actions${chain}[${ix}] = GovV3Helpers.buildAction(type(${contractName}).creationCode);`; - }) - .join('\n'); - template += `payloads[${ix}] = GovV3Helpers.build${ - chain == 'Ethereum' ? 'Mainnet' : chain - }Payload(vm, actions${chain});\n`; - return template; - }) - .join('\n')} - - // create proposal - vm.startBroadcast(); - GovV3Helpers.createProposal(vm, payloads, ${votingPortal}, GovV3Helpers.ipfsHashFile(vm, 'src/${folderName}/${ - options.shortName - }.md')); - } -}`; - return prefixWithPragma(prefixWithImports(template)); -} diff --git a/generator/templates/zksync.script.template.ts b/generator/templates/zksync.script.template.ts deleted file mode 100644 index a6bb2a5..0000000 --- a/generator/templates/zksync.script.template.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { - CHAIN_TO_CHAIN_ID, - generateContractName, - generateFolderName, - getChainAlias, - getPoolChain, -} from '../common'; -import {Options} from '../types'; -import {prefixWithImports} from '../utils/importsResolver'; -import {prefixWithPragma} from '../utils/constants'; - -export function generateZkSyncScript(options: Options) { - const folderName = generateFolderName(options); - const fileName = generateContractName(options); - const zkSyncPools = options.pools.filter((c) => c == 'AaveV3ZkSync'); - - const chain = 'ZkSync'; - let template = ''; - - // generate imports - template += `import {ZkSyncScript} from 'aave-helpers/src/ScriptUtils.sol';\n`; - - template += zkSyncPools - .map((pool) => { - const name = generateContractName(options, pool); - return `import {${name}} from './${name}.sol';`; - }) - .join('\n'); - template += '\n\n'; - - const poolsToChainsMap = zkSyncPools.reduce((acc, pool) => { - const chain = getPoolChain(pool); - const contractName = generateContractName(options, pool); - if (!acc[chain]) acc[chain] = []; - acc[chain].push({contractName, pool}); - return acc; - }, {}); - - // generate zksync wrapper contract for deploying payloads - template += ` - ${poolsToChainsMap[chain] - .map( - ({contractName}) => - ` - // @dev wrapper factory contract for deploying the payload - contract Deploy_${contractName} { - address public immutable PAYLOAD; - - constructor() { - PAYLOAD = GovV3Helpers.deployDeterministicZkSync( - type(${contractName}).creationCode - ); - } - }`, - ) - .join('\n')} - `; - template += '\n\n'; - - // generate chain scripts - template += `/** - * @dev Deploy ${chain} - * deploy-command: make deploy-ledger contract=zksync/src/${folderName}/${fileName}.s.sol:Deploy${chain} chain=${getChainAlias( - chain, - )} - * verify-command: FOUNDRY_PROFILE=${getChainAlias(chain)} npx catapulta-verify -b broadcast/${fileName}.s.sol/${ - CHAIN_TO_CHAIN_ID[chain] - }/run-latest.json - */ - contract Deploy${chain} is ${chain}Script { - function run() external broadcast { - // deploy payloads - ${poolsToChainsMap[chain] - .map( - ({contractName, pool}, ix) => - `address payload${ix} = new Deploy_${contractName}().PAYLOAD();`, - ) - .join('\n')} - - // compose action - IPayloadsControllerCore.ExecutionAction[] memory actions = new IPayloadsControllerCore.ExecutionAction[](${ - poolsToChainsMap[chain].length - }); - ${poolsToChainsMap[chain] - .map( - ({contractName, pool}, ix) => `actions[${ix}] = GovV3Helpers.buildAction(payload${ix});`, - ) - .join('\n')} - - // register action at payloadsController - GovV3Helpers.createPayload(actions); - } - }`; - template += '\n\n'; - - return prefixWithPragma(prefixWithImports(template)); -} From 27b00670bfc4bc6a2cdcb85a9aa762cc2791d40f Mon Sep 17 00:00:00 2001 From: Harsh Pandey Date: Tue, 3 Sep 2024 19:13:04 +0530 Subject: [PATCH 12/15] feat: add etherfi contracts --- generator/types.ts | 1 + lib/aave-helpers | 2 +- package.json | 2 +- scripts/deploy/DeployStewards.s.sol | 36 +++++++++++++------ .../networks/RiskStewardsEthereumEtherFi.sol | 11 ++++++ yarn.lock | 8 ++--- 6 files changed, 43 insertions(+), 17 deletions(-) create mode 100644 scripts/networks/RiskStewardsEthereumEtherFi.sol diff --git a/generator/types.ts b/generator/types.ts index 85ddb7a..052d532 100644 --- a/generator/types.ts +++ b/generator/types.ts @@ -10,6 +10,7 @@ import { export const V3_POOLS = [ 'AaveV3Ethereum', 'AaveV3EthereumLido', + 'AaveV3EthereumEtherFi', 'AaveV3Polygon', 'AaveV3Avalanche', 'AaveV3Optimism', diff --git a/lib/aave-helpers b/lib/aave-helpers index ec361cc..b10d123 160000 --- a/lib/aave-helpers +++ b/lib/aave-helpers @@ -1 +1 @@ -Subproject commit ec361cce9c7ec45c5de71393c1ec941f02a91186 +Subproject commit b10d123434d124db02dd9d2048c9a56b09d2e2e1 diff --git a/package.json b/package.json index d27efd8..0bf8b22 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "prettier": "2.8.7", "prettier-plugin-solidity": "1.1.3", "vitest": "^2.0.4", - "@bgd-labs/aave-address-book": "^3.1.1", + "@bgd-labs/aave-address-book": "^3.2.1", "@bgd-labs/aave-cli": "^0.16.2", "@bgd-labs/js-utils": "^1.4.2", "@inquirer/prompts": "^3.3.0", diff --git a/scripts/deploy/DeployStewards.s.sol b/scripts/deploy/DeployStewards.s.sol index 8b9f823..14d38ff 100644 --- a/scripts/deploy/DeployStewards.s.sol +++ b/scripts/deploy/DeployStewards.s.sol @@ -43,7 +43,7 @@ library DeployRiskStewards { } } -// make deploy-ledger contract=scripts/DeployStewards.s.sol:DeployEthereum chain=mainnet +// make deploy-ledger contract=scripts/deploy/DeployStewards.s.sol:DeployEthereum chain=mainnet contract DeployEthereum is EthereumScript { function run() external { vm.startBroadcast(); @@ -57,7 +57,7 @@ contract DeployEthereum is EthereumScript { } } -// make deploy-ledger contract=scripts/DeployStewards.s.sol:DeployEthereumLido chain=mainnet +// make deploy-ledger contract=scripts/deploy/DeployStewards.s.sol:DeployEthereumLido chain=mainnet contract DeployEthereumLido is EthereumScript { function run() external { vm.startBroadcast(); @@ -71,7 +71,21 @@ contract DeployEthereumLido is EthereumScript { } } -// make deploy-ledger contract=scripts/DeployStewards.s.sol:DeployPolygon chain=polygon +// make deploy-ledger contract=scripts/deploy/DeployStewards.s.sol:DeployEthereumEtherFi chain=mainnet +contract DeployEthereumEtherFi is EthereumScript { + function run() external { + vm.startBroadcast(); + DeployRiskStewards._deployRiskStewards( + address(AaveV3EthereumEtherFi.AAVE_PROTOCOL_DATA_PROVIDER), + AaveV3EthereumEtherFi.CONFIG_ENGINE, + 0x47c71dFEB55Ebaa431Ae3fbF99Ea50e0D3d30fA8, // eth-risk-council + GovernanceV3Ethereum.EXECUTOR_LVL_1 + ); + vm.stopBroadcast(); + } +} + +// make deploy-ledger contract=scripts/deploy/DeployStewards.s.sol:DeployPolygon chain=polygon contract DeployPolygon is PolygonScript { function run() external { vm.startBroadcast(); @@ -85,7 +99,7 @@ contract DeployPolygon is PolygonScript { } } -// make deploy-ledger contract=scripts/DeployStewards.s.sol:DeployArbitrum chain=arbitrum +// make deploy-ledger contract=scripts/deploy/DeployStewards.s.sol:DeployArbitrum chain=arbitrum contract DeployArbitrum is ArbitrumScript { function run() external { vm.startBroadcast(); @@ -99,7 +113,7 @@ contract DeployArbitrum is ArbitrumScript { } } -// make deploy-ledger contract=scripts/DeployStewards.s.sol:DeployOptimism chain=optimism +// make deploy-ledger contract=scripts/deploy/DeployStewards.s.sol:DeployOptimism chain=optimism contract DeployOptimism is OptimismScript { function run() external { vm.startBroadcast(); @@ -113,7 +127,7 @@ contract DeployOptimism is OptimismScript { } } -// make deploy-ledger contract=scripts/DeployStewards.s.sol:DeployAvalanche chain=avalanche +// make deploy-ledger contract=scripts/deploy/DeployStewards.s.sol:DeployAvalanche chain=avalanche contract DeployAvalanche is AvalancheScript { function run() external { vm.startBroadcast(); @@ -127,7 +141,7 @@ contract DeployAvalanche is AvalancheScript { } } -// make deploy-ledger contract=scripts/DeployStewards.s.sol:DeployScroll chain=scroll +// make deploy-ledger contract=scripts/deploy/DeployStewards.s.sol:DeployScroll chain=scroll contract DeployScroll is ScrollScript { function run() external { vm.startBroadcast(); @@ -141,7 +155,7 @@ contract DeployScroll is ScrollScript { } } -// make deploy-ledger contract=scripts/DeployStewards.s.sol:DeployGnosis chain=gnosis +// make deploy-ledger contract=scripts/deploy/DeployStewards.s.sol:DeployGnosis chain=gnosis contract DeployGnosis is GnosisScript { function run() external { vm.startBroadcast(); @@ -155,7 +169,7 @@ contract DeployGnosis is GnosisScript { } } -// make deploy-ledger contract=scripts/DeployStewards.s.sol:DeployBNB chain=bnb +// make deploy-ledger contract=scripts/deploy/DeployStewards.s.sol:DeployBNB chain=bnb contract DeployBNB is BNBScript { function run() external { vm.startBroadcast(); @@ -169,7 +183,7 @@ contract DeployBNB is BNBScript { } } -// make deploy-ledger contract=scripts/DeployStewards.s.sol:DeployBase chain=base +// make deploy-ledger contract=scripts/deploy/DeployStewards.s.sol:DeployBase chain=base contract DeployBase is BaseScript { function run() external { vm.startBroadcast(); @@ -183,7 +197,7 @@ contract DeployBase is BaseScript { } } -// make deploy-ledger contract=scripts/DeployStewards.s.sol:DeployMetis chain=metis +// make deploy-ledger contract=scripts/deploy/DeployStewards.s.sol:DeployMetis chain=metis contract DeployMetis is MetisScript { function run() external { vm.startBroadcast(); diff --git a/scripts/networks/RiskStewardsEthereumEtherFi.sol b/scripts/networks/RiskStewardsEthereumEtherFi.sol new file mode 100644 index 0000000..d8e6844 --- /dev/null +++ b/scripts/networks/RiskStewardsEthereumEtherFi.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {AaveV3EthereumEtherFi} from 'aave-address-book/AaveV3EthereumEtherFi.sol'; +import {RiskStewardsBase} from '../RiskStewardsBase.s.sol'; + +abstract contract RiskStewardsEthereumEtherFi is RiskStewardsBase { + constructor() + RiskStewardsBase(address(AaveV3EthereumEtherFi.POOL), AaveV3EthereumEtherFi.RISK_STEWARD) + {} +} diff --git a/yarn.lock b/yarn.lock index cfa7d20..89607bf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -48,10 +48,10 @@ resolved "https://registry.npmjs.org/@bgd-labs/aave-address-book/-/aave-address-book-3.1.0.tgz" integrity sha512-1wy6m5asQhDG13xhm+ZAhwsTy1CBhow0/kyQIaVFcfar5PKJBnZr8ZVw7iA+AHD2LTRyoviVO5iSN24kWUHf2Q== -"@bgd-labs/aave-address-book@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@bgd-labs/aave-address-book/-/aave-address-book-3.1.1.tgz#46e528f5b86dff0a26b17fd7573e2abf4c2c1c44" - integrity sha512-H3oQFMCgnL0BsQuSTAaj9M3zBm1uK3Uk6qfPH29ktLxhipE4UVqglhC/ZQVMT2wlgf1bMBjmsvwgTDRDOwXuFQ== +"@bgd-labs/aave-address-book@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@bgd-labs/aave-address-book/-/aave-address-book-3.2.1.tgz#9ecdb92303170e754e048d25f7d6cd27312c530b" + integrity sha512-IlXHWYAhcgbiteTU50I6v8Awl7PBAHfXGz2IyjR5MPXy4xvW4UXYKbCRUtOCFxY/sdLtu/Gb+GgypyF76sd4Qg== "@bgd-labs/aave-cli@^0.16.2": version "0.16.2" From 0c818ce3896ce72ad1e54ab432d370a79c21534f Mon Sep 17 00:00:00 2001 From: Harsh Pandey Date: Fri, 20 Sep 2024 12:31:02 +0530 Subject: [PATCH 13/15] fix: solc --- foundry.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/foundry.toml b/foundry.toml index 3346c5f..640a1df 100644 --- a/foundry.toml +++ b/foundry.toml @@ -25,7 +25,7 @@ evm_version = 'paris' compile = true fallback_oz = true mode = '3' -zksolc = '1.4.1' +zksolc = '1.5.3' [rpc_endpoints] mainnet = "${RPC_MAINNET}" From ed5962713fae5c6bab3788177aea70a92025416e Mon Sep 17 00:00:00 2001 From: Harsh Pandey Date: Fri, 20 Sep 2024 13:34:06 +0530 Subject: [PATCH 14/15] fix: certora rules remappings --- certora/confs/rules.conf | 23 +++++++++-------------- certora/confs/sanity.conf | 24 +++++++++--------------- 2 files changed, 18 insertions(+), 29 deletions(-) diff --git a/certora/confs/rules.conf b/certora/confs/rules.conf index efa13ae..1643448 100644 --- a/certora/confs/rules.conf +++ b/certora/confs/rules.conf @@ -7,21 +7,15 @@ "RiskSteward:CONFIG_ENGINE=AaveV3ConfigEngine", ], "packages": [ - "ds-test=lib/protocol-v3.1-upgrade/lib/aave-helpers/lib/forge-std/lib/ds-test/src", - "forge-std=lib/protocol-v3.1-upgrade/lib/aave-helpers/lib/forge-std/src", - "aave-v3-origin=lib/protocol-v3.1-upgrade/lib/aave-v3-origin/src", - "aave-helpers=lib/protocol-v3.1-upgrade/lib/aave-helpers/src", - "aave-address-book=lib/protocol-v3.1-upgrade/lib/aave-helpers/lib/aave-address-book/src", - "solidity-utils=lib/protocol-v3.1-upgrade/lib/aave-helpers/lib/solidity-utils/src", - "lib/protocol-v3.1-upgrade/lib/aave-helpers/lib/aave-address-book:aave-v3-core=lib/protocol-v3.1-upgrade/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-core", - "lib/aave-helpers/lib/aave-address-book:aave-v3-core=lib/protocol-v3.1-upgrade/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-core", + "aave-helpers=lib/aave-helpers", + "forge-std=lib/aave-helpers/lib/forge-std/src", + "aave-address-book=lib/aave-helpers/lib/aave-address-book/src", + "solidity-utils=lib/aave-helpers/lib/solidity-utils/src", + "aave-v3-origin=lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src", + "aave-v3-core=lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/core", + "aave-v3-periphery=lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/periphery", "aave-capo=lib/aave-capo/src", - "lib/aave-capo:cl-synchronicity-price-adapter=lib/aave-capo/lib/cl-synchronicity-price-adapter/src", - "@aave/core-v3=lib/protocol-v3.1-upgrade/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-core", - "@aave/periphery-v3=lib/protocol-v3.1-upgrade/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-periphery", - "aave-v3-core=lib/protocol-v3.1-upgrade/lib/aave-v3-origin/src/core", - "aave-v3-periphery=lib/protocol-v3.1-upgrade/lib/aave-v3-origin/src/periphery", - "protocol-v3.1-upgrade=lib/protocol-v3.1-upgrade" + "lib/aave-capo:cl-synchronicity-price-adapter=lib/aave-capo/lib/cl-synchronicity-price-adapter/src" ], "optimistic_loop": true, "loop_iter": "2", @@ -33,3 +27,4 @@ "cache" :"none", "msg": "RISK-STEWARD::rules" } + diff --git a/certora/confs/sanity.conf b/certora/confs/sanity.conf index 044779a..fe4c17c 100644 --- a/certora/confs/sanity.conf +++ b/certora/confs/sanity.conf @@ -3,21 +3,15 @@ "certora/munged/src/contracts/RiskSteward.sol", ], "packages": [ - "ds-test=lib/protocol-v3.1-upgrade/lib/aave-helpers/lib/forge-std/lib/ds-test/src", - "forge-std=lib/protocol-v3.1-upgrade/lib/aave-helpers/lib/forge-std/src", - "aave-v3-origin=lib/protocol-v3.1-upgrade/lib/aave-v3-origin/src", - "aave-helpers=lib/protocol-v3.1-upgrade/lib/aave-helpers/src", - "aave-address-book=lib/protocol-v3.1-upgrade/lib/aave-helpers/lib/aave-address-book/src", - "solidity-utils=lib/protocol-v3.1-upgrade/lib/aave-helpers/lib/solidity-utils/src", - "lib/protocol-v3.1-upgrade/lib/aave-helpers/lib/aave-address-book:aave-v3-core=lib/protocol-v3.1-upgrade/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-core", - "lib/aave-helpers/lib/aave-address-book:aave-v3-core=lib/protocol-v3.1-upgrade/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-core", + "aave-helpers=lib/aave-helpers", + "forge-std=lib/aave-helpers/lib/forge-std/src", + "aave-address-book=lib/aave-helpers/lib/aave-address-book/src", + "solidity-utils=lib/aave-helpers/lib/solidity-utils/src", + "aave-v3-origin=lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src", + "aave-v3-core=lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/core", + "aave-v3-periphery=lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/periphery", "aave-capo=lib/aave-capo/src", - "lib/aave-capo:cl-synchronicity-price-adapter=lib/aave-capo/lib/cl-synchronicity-price-adapter/src", - "@aave/core-v3=lib/protocol-v3.1-upgrade/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-core", - "@aave/periphery-v3=lib/protocol-v3.1-upgrade/lib/aave-helpers/lib/aave-address-book/lib/aave-v3-periphery", - "aave-v3-core=lib/protocol-v3.1-upgrade/lib/aave-v3-origin/src/core", - "aave-v3-periphery=lib/protocol-v3.1-upgrade/lib/aave-v3-origin/src/periphery", - "protocol-v3.1-upgrade=lib/protocol-v3.1-upgrade" + "lib/aave-capo:cl-synchronicity-price-adapter=lib/aave-capo/lib/cl-synchronicity-price-adapter/src" ], "optimistic_loop": true, "prover_args": ["-depth 15","-mediumTimeout 1000"], @@ -26,4 +20,4 @@ "verify": "RiskSteward:certora/specs/sanity.spec", "cache" :"none", "msg": "RISK-STEWARD::sanity" -} \ No newline at end of file +} From bfc6686a2c280fd1ecb153dc524ae16062983fde Mon Sep 17 00:00:00 2001 From: Harsh Pandey Date: Fri, 20 Sep 2024 13:40:56 +0530 Subject: [PATCH 15/15] fix: certora rule file path --- certora/confs/rules.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/certora/confs/rules.conf b/certora/confs/rules.conf index 1643448..5b08713 100644 --- a/certora/confs/rules.conf +++ b/certora/confs/rules.conf @@ -1,7 +1,7 @@ { "files": [ "certora/munged/src/contracts/RiskSteward.sol", - "lib/protocol-v3.1-upgrade/lib/aave-v3-origin/src/periphery/contracts/v3-config-engine/AaveV3ConfigEngine.sol", + "lib/aave-helpers/lib/aave-address-book/lib/aave-v3-origin/src/periphery/contracts/v3-config-engine/AaveV3ConfigEngine.sol" ], "link": [ "RiskSteward:CONFIG_ENGINE=AaveV3ConfigEngine",