From 1692be4606e91d29047396035bc3ab8335bdcbbe Mon Sep 17 00:00:00 2001 From: Chetan Phirke Date: Thu, 26 Oct 2023 17:35:18 +0800 Subject: [PATCH 01/61] Update release version to v9.3.0rc0 --- VERSION | 6 +++--- src/libUtils/SWInfo.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/VERSION b/VERSION index fc8f46d201..8d73995227 100644 --- a/VERSION +++ b/VERSION @@ -1,9 +1,9 @@ === [Zilliqa]Major Version === -0 +9 === [Zilliqa]Minor Version === -0 +3 === [Zilliqa]Fix Version === -0 +0rc0 === [Zilliqa] Expected DS Epoch=== 0 === [Scilla] Expected DS Epoch=== diff --git a/src/libUtils/SWInfo.h b/src/libUtils/SWInfo.h index 78b374edcb..b54b2937ea 100644 --- a/src/libUtils/SWInfo.h +++ b/src/libUtils/SWInfo.h @@ -22,7 +22,7 @@ #include #include "common/Serializable.h" -const std::string VERSION_TAG = "v0.0.0"; +const std::string VERSION_TAG = "v9.3.0rc0"; const std::string ZILLIQA_BRAND = "Copyright (C) Zilliqa. Version " + VERSION_TAG + ". "; From 5eec446606bfef523473cb3972e5b0c9d7518259 Mon Sep 17 00:00:00 2001 From: chetan-zilliqa <66236813+chetan-zilliqa@users.noreply.github.com> Date: Mon, 30 Oct 2023 12:58:20 +0530 Subject: [PATCH 02/61] Tweak constants for blocktime and txn distribution (#3838) --- constants.xml | 2 +- constants_local.xml | 4 ++-- src/common/Constants.cpp | 4 ++-- src/libData/AccountStore/AccountStoreSC.cpp | 3 --- src/libDirectoryService/FinalBlockPreProcessing.cpp | 4 ++-- src/libLookup/Lookup.cpp | 2 +- src/libNode/FinalBlockProcessing.cpp | 2 +- 7 files changed, 9 insertions(+), 12 deletions(-) diff --git a/constants.xml b/constants.xml index 298851d521..9eae455481 100644 --- a/constants.xml +++ b/constants.xml @@ -83,7 +83,7 @@ 2000 10 - 3000 + 2000 3000 500 180 diff --git a/constants_local.xml b/constants_local.xml index e887df4f1e..ad0d50a6c4 100644 --- a/constants_local.xml +++ b/constants_local.xml @@ -81,7 +81,7 @@ 2000 10 - 3000 + 2000 3000 1000 90 @@ -90,7 +90,7 @@ 30 30 5 - 15000 + 6000 7000 55 5 diff --git a/src/common/Constants.cpp b/src/common/Constants.cpp index f221ace85f..1e7f1c082b 100644 --- a/src/common/Constants.cpp +++ b/src/common/Constants.cpp @@ -263,7 +263,7 @@ const unsigned int DELAY_FIRSTXNEPOCH_IN_MS{ const unsigned int FETCHING_MISSING_DATA_TIMEOUT{ ReadConstantNumeric("FETCHING_MISSING_DATA_TIMEOUT", "node.epoch_timing.")}; const unsigned int DS_ANNOUNCEMENT_DELAY_IN_MS{ - ReadConstantNumeric("DS_ANNOUNCEMENT_DELAY_IN_MS", "node.epoch_timing.")}; + ReadConstantNumeric("DS_ANNOUNCEMENT_DELAY_IN_MS", "node.epoch_timing.", 2000)}; const unsigned int SHARD_ANNOUNCEMENT_DELAY_IN_MS{ReadConstantNumeric( "SHARD_ANNOUNCEMENT_DELAY_IN_MS", "node.epoch_timing.")}; const unsigned int MICROBLOCK_TIMEOUT{ @@ -279,7 +279,7 @@ const unsigned int POWPACKETSUBMISSION_WINDOW_IN_SECONDS{ReadConstantNumeric( const unsigned int RECOVERY_SYNC_TIMEOUT{ ReadConstantNumeric("RECOVERY_SYNC_TIMEOUT", "node.epoch_timing.")}; const unsigned int TX_DISTRIBUTE_TIME_IN_MS{ - ReadConstantNumeric("TX_DISTRIBUTE_TIME_IN_MS", "node.epoch_timing.")}; + ReadConstantNumeric("TX_DISTRIBUTE_TIME_IN_MS", "node.epoch_timing.",6000)}; const unsigned int EXTRA_TX_DISTRIBUTE_TIME_IN_MS{ReadConstantNumeric( "EXTRA_TX_DISTRIBUTE_TIME_IN_MS", "node.epoch_timing.",7000)}; const unsigned int DS_TX_PROCESSING_TIMEOUT{ diff --git a/src/libData/AccountStore/AccountStoreSC.cpp b/src/libData/AccountStore/AccountStoreSC.cpp index cac9b9a919..8419141fa4 100644 --- a/src/libData/AccountStore/AccountStoreSC.cpp +++ b/src/libData/AccountStore/AccountStoreSC.cpp @@ -1676,9 +1676,6 @@ bool AccountStoreSC::TransferBalanceAtomic(const Address &from, const Address &to, const uint128_t &delta) { // LOG_MARKER(); - LOG_GENERAL(WARNING, - "AccountStoreSC::TransferBalanceAtomicTransferBalanceAtomic from " - << from << ", to: " << to << ", value: " << delta); return m_accountStoreAtomic->TransferBalance(from, to, delta); } diff --git a/src/libDirectoryService/FinalBlockPreProcessing.cpp b/src/libDirectoryService/FinalBlockPreProcessing.cpp index 603a2d7d3a..851a5778ae 100644 --- a/src/libDirectoryService/FinalBlockPreProcessing.cpp +++ b/src/libDirectoryService/FinalBlockPreProcessing.cpp @@ -236,7 +236,7 @@ bool DirectoryService::RunConsensusOnFinalBlockWhenDSPrimary() { m_mediator.m_node->m_myshardId == DEFAULT_SHARD_ID && !m_mediator.GetIsVacuousEpoch()) { std::this_thread::sleep_for( - chrono::milliseconds(EXTRA_TX_DISTRIBUTE_TIME_IN_MS)); + chrono::milliseconds(TX_DISTRIBUTE_TIME_IN_MS * 2)); } m_mediator.m_node->m_txn_distribute_window_open = false; @@ -1187,7 +1187,7 @@ bool DirectoryService::RunConsensusOnFinalBlockWhenDSBackup() { m_mediator.m_node->m_myshardId == DEFAULT_SHARD_ID && !m_mediator.GetIsVacuousEpoch()) { std::this_thread::sleep_for( - chrono::milliseconds(EXTRA_TX_DISTRIBUTE_TIME_IN_MS)); + chrono::milliseconds(TX_DISTRIBUTE_TIME_IN_MS * 2)); } m_mediator.m_node->m_txn_distribute_window_open = false; diff --git a/src/libLookup/Lookup.cpp b/src/libLookup/Lookup.cpp index ff65e09ec8..b540b70aa9 100644 --- a/src/libLookup/Lookup.cpp +++ b/src/libLookup/Lookup.cpp @@ -5520,7 +5520,7 @@ bool Lookup::ProcessForwardTxn(const zbytes& message, unsigned int offset, return false; } std::this_thread::sleep_for( - chrono::milliseconds(EXTRA_TX_DISTRIBUTE_TIME_IN_MS)); + chrono::milliseconds(TX_DISTRIBUTE_TIME_IN_MS)); SenderTxnBatchThread(std::move(transactions)); } diff --git a/src/libNode/FinalBlockProcessing.cpp b/src/libNode/FinalBlockProcessing.cpp index f40d2ab45e..031f9995d8 100644 --- a/src/libNode/FinalBlockProcessing.cpp +++ b/src/libNode/FinalBlockProcessing.cpp @@ -878,7 +878,7 @@ bool Node::ProcessFinalBlockCore(uint64_t& dsBlockNumber, auto extra_time = (m_mediator.m_currentEpochNum % NUM_FINAL_BLOCK_PER_POW != 0) ? 0 - : EXTRA_TX_DISTRIBUTE_TIME_IN_MS; + : (TX_DISTRIBUTE_TIME_IN_MS * 2); if (!VerifyTimestamp(txBlock.GetTimestamp(), CONSENSUS_OBJECT_TIMEOUT + MICROBLOCK_TIMEOUT + (TX_DISTRIBUTE_TIME_IN_MS + extra_time + From 30d9bc92f8a9d7764514de91976cca196418f213 Mon Sep 17 00:00:00 2001 From: chetan-zilliqa <66236813+chetan-zilliqa@users.noreply.github.com> Date: Mon, 30 Oct 2023 13:01:29 +0530 Subject: [PATCH 03/61] (feat) ZIL-5423: Deployment instructions for reward control contracts. (#3823) (#3840) Co-authored-by: Richard Watts <108257153+rrw-zilliqa@users.noreply.github.com> --- ...ng_reward_control.md => reward_control.md} | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) rename docs/{testing_reward_control.md => reward_control.md} (77%) diff --git a/docs/testing_reward_control.md b/docs/reward_control.md similarity index 77% rename from docs/testing_reward_control.md rename to docs/reward_control.md index 49502f7a08..4e6b7de924 100644 --- a/docs/testing_reward_control.md +++ b/docs/reward_control.md @@ -1,4 +1,18 @@ -# Testing reward control +# Reward control + +The reward control contract manages rewards on chain - see ZIP-24 for details. + +## Deploying in production + +In production: + + * Clone `zilliqa-developer`. + * Deploy the contracts in `zilliqa-developer/contracts/reward_control` + * Use the IDE (or other tool) to change ownership of the multisig to the custodian addresses (available on the wiki if you're in Zilliqa) + * List the address of the reward contract (*NOT* the multisig) in `constants.xml` + * You're good to go. + +## Testing reward control Zilliqa 1 now comes with built-in reward control. It works like this: @@ -39,6 +53,9 @@ work. ## Testing diagnostic file output +Turn `ENABLE_REWARD_DEBUG_FILE` on; observe that output is generated. + +Turn `ENABLE_REWARD_DEBUG_FILE` off; observe that it isn't any longer. ## Upgrades From e540aa839d2c6931a4169cd678b2544fe25d7c93 Mon Sep 17 00:00:00 2001 From: chetan-zilliqa <66236813+chetan-zilliqa@users.noreply.github.com> Date: Mon, 30 Oct 2023 13:30:26 +0530 Subject: [PATCH 04/61] Update release version to v9.3.0rc1 (#3841) --- VERSION | 2 +- src/libUtils/SWInfo.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 8d73995227..8ffe3d162d 100644 --- a/VERSION +++ b/VERSION @@ -3,7 +3,7 @@ === [Zilliqa]Minor Version === 3 === [Zilliqa]Fix Version === -0rc0 +0rc1 === [Zilliqa] Expected DS Epoch=== 0 === [Scilla] Expected DS Epoch=== diff --git a/src/libUtils/SWInfo.h b/src/libUtils/SWInfo.h index b54b2937ea..5ff15b88d8 100644 --- a/src/libUtils/SWInfo.h +++ b/src/libUtils/SWInfo.h @@ -22,7 +22,7 @@ #include #include "common/Serializable.h" -const std::string VERSION_TAG = "v9.3.0rc0"; +const std::string VERSION_TAG = "v9.3.0rc1"; const std::string ZILLIQA_BRAND = "Copyright (C) Zilliqa. Version " + VERSION_TAG + ". "; From a494e09066d2c6800d5a713b125d97ee79e728a9 Mon Sep 17 00:00:00 2001 From: chetan-zilliqa <66236813+chetan-zilliqa@users.noreply.github.com> Date: Mon, 30 Oct 2023 14:17:53 +0530 Subject: [PATCH 05/61] [release/v9.3] Merge master to release/v9.3 (#3843) * (feat) ZIL-5423: Deployment instructions for reward control contracts. (#3823) * Tweak constants for blocktime and txn distribution (#3839) * Fixing double enter into consensus in case gossip arrives early (#3842) Co-authored-by: bzawisto * Update release version to v9.3.0rc0 * Update release version to v9.3.0rc1 (#3841) --------- Co-authored-by: Richard Watts <108257153+rrw-zilliqa@users.noreply.github.com> Co-authored-by: Bartosz Zawistowski <39065214+bzawisto@users.noreply.github.com> Co-authored-by: bzawisto --- src/libDirectoryService/DSBlockPostProcessing.cpp | 1 + src/libDirectoryService/FinalBlockPostProcessing.cpp | 4 ++-- src/libDirectoryService/FinalBlockPreProcessing.cpp | 5 +++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/libDirectoryService/DSBlockPostProcessing.cpp b/src/libDirectoryService/DSBlockPostProcessing.cpp index d0cbb1d87b..34b575bd2f 100644 --- a/src/libDirectoryService/DSBlockPostProcessing.cpp +++ b/src/libDirectoryService/DSBlockPostProcessing.cpp @@ -433,6 +433,7 @@ void DirectoryService::StartNextTxEpoch() { LOG_GENERAL( INFO, "No other shards. So no other microblocks expected to be received"); + SetState(FINALBLOCK_CONSENSUS_PREP); RunConsensusOnFinalBlock(); } } diff --git a/src/libDirectoryService/FinalBlockPostProcessing.cpp b/src/libDirectoryService/FinalBlockPostProcessing.cpp index 17be3241e2..d6baf050b1 100644 --- a/src/libDirectoryService/FinalBlockPostProcessing.cpp +++ b/src/libDirectoryService/FinalBlockPostProcessing.cpp @@ -30,11 +30,11 @@ #include "libNetwork/Guard.h" #include "libNode/Node.h" #include "libPersistence/ContractStorage.h" +#include "libScilla/ScillaClient.h" #include "libUtils/CommonUtils.h" #include "libUtils/DataConversion.h" #include "libUtils/DetachedFunction.h" #include "libUtils/Logger.h" -#include "libScilla/ScillaClient.h" using namespace std; using namespace boost::multiprecision; @@ -358,7 +358,7 @@ void DirectoryService::ProcessFinalBlockConsensusWhenDone() { m_mediator.m_node->CommitTxnPacketBuffer(); }; DetachedFunction(1, func1); - + SetState(FINALBLOCK_CONSENSUS_PREP); RunConsensusOnFinalBlock(); } } diff --git a/src/libDirectoryService/FinalBlockPreProcessing.cpp b/src/libDirectoryService/FinalBlockPreProcessing.cpp index 851a5778ae..4cff39d601 100644 --- a/src/libDirectoryService/FinalBlockPreProcessing.cpp +++ b/src/libDirectoryService/FinalBlockPreProcessing.cpp @@ -1338,8 +1338,9 @@ void DirectoryService::RunConsensusOnFinalBlock() { RejoinAsDS(); } - if (m_state != FINALBLOCK_CONSENSUS_PREP) { - SetState(FINALBLOCK_CONSENSUS_PREP); + // We've been already here, don't do the same thing again in this round + if (m_mediator.m_node->m_txn_distribute_window_open) { + return; } m_mediator.m_node->m_txn_distribute_window_open = true; From 516cee45be7d9c1026e29b5d66b765d90e4439ae Mon Sep 17 00:00:00 2001 From: chetan-zilliqa <66236813+chetan-zilliqa@users.noreply.github.com> Date: Mon, 30 Oct 2023 14:30:44 +0530 Subject: [PATCH 06/61] Update release version to v9.3.0rc2 (#3844) --- VERSION | 2 +- src/libUtils/SWInfo.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 8ffe3d162d..2a38579f35 100644 --- a/VERSION +++ b/VERSION @@ -3,7 +3,7 @@ === [Zilliqa]Minor Version === 3 === [Zilliqa]Fix Version === -0rc1 +0rc2 === [Zilliqa] Expected DS Epoch=== 0 === [Scilla] Expected DS Epoch=== diff --git a/src/libUtils/SWInfo.h b/src/libUtils/SWInfo.h index 5ff15b88d8..0bf525cdfe 100644 --- a/src/libUtils/SWInfo.h +++ b/src/libUtils/SWInfo.h @@ -22,7 +22,7 @@ #include #include "common/Serializable.h" -const std::string VERSION_TAG = "v9.3.0rc1"; +const std::string VERSION_TAG = "v9.3.0rc2"; const std::string ZILLIQA_BRAND = "Copyright (C) Zilliqa. Version " + VERSION_TAG + ". "; From 703127cf0228c904bb7a1636ef5203b0e7009b87 Mon Sep 17 00:00:00 2001 From: Yaron Date: Mon, 30 Oct 2023 18:32:18 +0200 Subject: [PATCH 07/61] [master] ZIL-5406: add support for a cdn (#3848) * Make the bucket name in localdev.py configurable. * Update download & upload scripts to use a CDN. --- scripts/download_incr_DB.py | 3 +++ scripts/download_static_DB.py | 2 ++ scripts/localdev.py | 29 ++++++++++++++++------------- scripts/upload_incr_DB.py | 9 ++++++--- 4 files changed, 27 insertions(+), 16 deletions(-) diff --git a/scripts/download_incr_DB.py b/scripts/download_incr_DB.py index 082dd94e92..32eee6aedf 100644 --- a/scripts/download_incr_DB.py +++ b/scripts/download_incr_DB.py @@ -37,6 +37,7 @@ BUCKET_NAME='BUCKET_NAME' TESTNET_NAME= 'TEST_NET_NAME' AWS_ENDPOINT_URL=os.getenv("AWS_ENDPOINT_URL") +CDN_ENDPOINT_URL=os.getenv("CDN_ENDPOINT_URL") CHUNK_SIZE = 4096 EXPEC_LEN = 2 MAX_WORKER_JOBS = 50 @@ -60,6 +61,8 @@ def isGCP(): return AWS_ENDPOINT_URL and '.googleapis.com' in AWS_ENDPOINT_URL def getURL(): + if CDN_ENDPOINT_URL: + return f"{CDN_ENDPOINT_URL}" if isGCP(): return "http://"+BUCKET_NAME+".storage.googleapis.com" elif AWS_ENDPOINT_URL: diff --git a/scripts/download_static_DB.py b/scripts/download_static_DB.py index 0295617086..fe63ff7e8e 100644 --- a/scripts/download_static_DB.py +++ b/scripts/download_static_DB.py @@ -48,6 +48,8 @@ def isGCP(): return AWS_ENDPOINT_URL and '.googleapis.com' in AWS_ENDPOINT_URL def getURL(): + if CDN_ENDPOINT_URL: + return f"{CDN_ENDPOINT_URL}" if isGCP(): return "http://"+BUCKET_NAME+".storage.googleapis.com" elif AWS_ENDPOINT_URL: diff --git a/scripts/localdev.py b/scripts/localdev.py index f53a6788a3..36354c925d 100755 --- a/scripts/localdev.py +++ b/scripts/localdev.py @@ -343,7 +343,7 @@ def wait_for_helm_pod(config, pod_partial_name): return pod_name -def localstack_up(config): +def localstack_up(config, bucket_name): """ Let helm deploy localstack """ run_or_die(config, ["helm", "upgrade", "--install", "localstack", "localstack/localstack"]) localstack_pod_name = wait_for_helm_pod(config, "localstack-") @@ -351,7 +351,6 @@ def localstack_up(config): # Port forward localstack so we can talk to it run_or_die(config, ["kubectl", "port-forward", "deployment/localstack", "4566:4566"], in_background=True) - bucket_name = 'zilliqa-devnet' run_or_die(config, ['kubectl', 'exec', '-it', localstack_pod_name, '--', 'awslocal', 's3', 'mb', f's3://{bucket_name}']) run_or_die(config, ['kubectl', 'exec', '-it', localstack_pod_name, '--', 'awslocal', 's3', 'mb', f's3://tempo']) @@ -427,6 +426,10 @@ def prometheus_up(config, testnet_name, count = 8): ips.append(pod_ip) if len(ips) != count: + # If for some reason you see the following line repeating indefinitely when + # bringing up a devnet, it's most likely because the count is incorrect either + # due to a change in write_testnet_configuration or in the testnet repo (perhaps + # someone added/removed pods?). print(f"Waiting for all pods to be assigned an IP...") time.sleep(2) else: @@ -507,12 +510,13 @@ def tempo_down(config): default=True, show_default=True, help="Use isolated_server_accounts.json to create accounts when zilliqa is up") +@click.option("--bucket-name", help="The name of the bucket", default="zilliqa-devnet") @click.option("--persistence", help="A persistence directory to start the network with. Has no effect without also passing `--key-file`.") @click.option("--key-file", help="A `.tar.gz` generated by `./testnet.sh back-up auto` containing the keys used to start this network. Has no effect without also passing `--persistence`.") @click.option("--monitoring", help="Start monitoring - when set to false, skips grafana, prometheus, and tempo", default=True,show_default=True) @click.option("--desk", is_flag=True, default=False, help="use a small testnet configuration") @click.option("--chain-id", help="Set the chain id", default=None) -def up_cmd(ctx, driver, zilliqa_image, testnet_name, isolated_server_accounts, persistence, key_file, monitoring, chain_id, desk): +def up_cmd(ctx, driver, zilliqa_image, testnet_name, isolated_server_accounts, bucket_name, persistence, key_file, monitoring, chain_id, desk): """ Build Zilliqa (via a process equivalent to the build-zilliqa & build-scilla commands), write configuration files for a testnet named localdev, run `localdev/config.sh up`, and start a proxy to allow the user to monitor traffic @@ -524,15 +528,15 @@ def up_cmd(ctx, driver, zilliqa_image, testnet_name, isolated_server_accounts, p else: adjust_config(config, driver) - up(config, zilliqa_image, testnet_name, isolated_server_accounts, persistence, key_file, monitoring, chain_id = chain_id,desk=desk) + up(config, zilliqa_image, testnet_name, isolated_server_accounts, bucket_name, persistence, key_file, monitoring, chain_id = chain_id, desk=desk) -def up(config, zilliqa_image, testnet_name, isolated_server_accounts, persistence, key_file, monitoring, chain_id, desk): +def up(config, zilliqa_image, testnet_name, isolated_server_accounts, bucket_name, persistence, key_file, monitoring, chain_id, desk): minikube = get_minikube_ip(config) - write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_server_accounts, persistence, key_file, chain_id, desk) - localstack_up(config) + write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_server_accounts, bucket_name, persistence, key_file, chain_id, desk) + localstack_up(config, bucket_name) if monitoring: grafana_up(config, testnet_name) - start_testnet(config, testnet_name, persistence) + start_testnet(config, testnet_name, persistence, bucket_name) if monitoring: prometheus_up(config, testnet_name) tempo_up(config, testnet_name) @@ -657,7 +661,7 @@ def isolated(config, enable_evm = True, block_time_ms = None, chain_id = None): # except: # pass -def start_testnet(config, testnet_name, persistence): +def start_testnet(config, testnet_name, persistence, bucket_name): run_or_die(config, ["./testnet.sh", "up"], in_dir=os.path.join(TESTNET_DIR, testnet_name)) if persistence is not None: @@ -675,7 +679,6 @@ def aws(cmd): # Copy persistence to S3 in localstack. Each of the subdirectories in S3 are meant to contain only a subset of # persistence, but we choose to just copy everything into everywhere. - bucket_name = "zilliqa-devnet" aws(["s3", "sync", f"{persistence}/", f"s3://{bucket_name}/blockchain-data/{testnet_name}/"]) aws(["s3", "sync", f"{persistence}/", f"s3://{bucket_name}/incremental/localdev/persistence/"]) aws(["s3", "cp", f"_{testnet_name}/.currentTxBlk", f"s3://{bucket_name}/incremental/{testnet_name}/"]) @@ -731,7 +734,7 @@ def stop_testnet(config, testnet_name): # tediously, testnet.sh has a habit of returning non-zero error codes when eg. the testnet has already been destroyed :-( run_or_die(config, ["sh", "-c", "echo localdev | ./testnet.sh down"], in_dir=os.path.join(TESTNET_DIR, testnet_name), allow_failure = True) -def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_server_accounts, persistence, key_file, chain_id,desk): +def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_server_accounts, bucket_name, persistence, key_file, chain_id, desk): instance_dir = os.path.join(TESTNET_DIR, testnet_name) minikube_ip = get_minikube_ip(config) @@ -752,6 +755,7 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se "--host-network", "false", "--https", "localdomain", "--seed-multiplier", "true", + "--bucket", bucket_name, "--localstack", "true"] else: cmd = ["./bootstrap.py", testnet_name, "--clusters", "minikube", "--constants-from-file", @@ -767,14 +771,13 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se "--host-network", "false", "--https", "localdomain", "--seed-multiplier", "true", + "--bucket", bucket_name, "--localstack", "true"] cmd = cmd + ([ "--isolated-server-accounts", os.path.join(ZILLIQA_DIR, "isolated-server-accounts.json") ] if isolated_server_accounts else []) cmd = cmd + [ "-f" ] if persistence is not None and key_file is not None: - bucket_name = "zilliqa-devnet" cmd.extend([ - "--bucket", bucket_name, "--recover-from-s3", f"s3://{bucket_name}/persistence/{testnet_name}-persistence.tar.gz", "--recover-key-files", key_file, ]) diff --git a/scripts/upload_incr_DB.py b/scripts/upload_incr_DB.py index d1426cd9d3..ac2e35e3b2 100755 --- a/scripts/upload_incr_DB.py +++ b/scripts/upload_incr_DB.py @@ -42,6 +42,7 @@ AWS_BLOCKCHAINDATA_FOLDERNAME= "blockchain-data/"+TESTNET_NAME+"/" SYNC_INTERVAL = 1 AWS_ENDPOINT_URL=os.getenv("AWS_ENDPOINT_URL") +CDN_ENDPOINT_URL=os.getenv("CDN_ENDPOINT_URL") FORMATTER = logging.Formatter( "[%(asctime)s %(levelname)-6s %(filename)s:%(lineno)s] %(message)s" @@ -57,7 +58,9 @@ def isGCP(): return AWS_ENDPOINT_URL and '.googleapis.com' in AWS_ENDPOINT_URL -def awsS3Url(): +def getURL(): + if CDN_ENDPOINT_URL: + return f"{CDN_ENDPOINT_URL}" if isGCP(): return "http://"+BUCKET_NAME+".storage.googleapis.com" elif AWS_ENDPOINT_URL: @@ -97,7 +100,7 @@ def getBucketString(subFolder): return "s3://"+BUCKET_NAME+"/"+subFolder+"/"+TESTNET_NAME def CreateTempPersistence(): - static_folders = GetStaticFoldersFromS3(awsS3Url(), AWS_BLOCKCHAINDATA_FOLDERNAME) + static_folders = GetStaticFoldersFromS3(getURL(), AWS_BLOCKCHAINDATA_FOLDERNAME) exclusion_string = ' '.join(['--exclude ' + s for s in static_folders]) bashCommand = "rsync --recursive --inplace --delete -a " + exclusion_string + " persistence temp" logging.info("Command = " + bashCommand) @@ -134,7 +137,7 @@ def SetCurrentTxBlkNum(txBlkNum): def SetLock(): Path(".lock").touch() - bashCommand = awsCli() + " s3 cp .lock "+getBucketString(PERSISTENCE_SNAPSHOT_NAME)+"/.lock" + bashCommand = awsCli() + " s3 cp .lock "+getBucketString(PERSISTENCE_SNAPSHOT_NAME)+"/.lock"+' --metadata "cache-control=no-store"' process = subprocess.Popen(bashCommand, universal_newlines=True, shell=True,stdout=subprocess.PIPE, stderr=subprocess.STDOUT) output, error = process.communicate() logging.info("[" + str(datetime.datetime.now()) + "] SetLock for uploading process") From 71624c110a6174ab3e11950de358af8fe684cfde Mon Sep 17 00:00:00 2001 From: Yaron Date: Mon, 30 Oct 2023 19:34:19 +0200 Subject: [PATCH 08/61] Update version to v9.3.0rc3. --- VERSION | 2 +- src/libUtils/SWInfo.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 2a38579f35..e2de427cec 100644 --- a/VERSION +++ b/VERSION @@ -3,7 +3,7 @@ === [Zilliqa]Minor Version === 3 === [Zilliqa]Fix Version === -0rc2 +0rc3 === [Zilliqa] Expected DS Epoch=== 0 === [Scilla] Expected DS Epoch=== diff --git a/src/libUtils/SWInfo.h b/src/libUtils/SWInfo.h index 0bf525cdfe..f147fdefd9 100644 --- a/src/libUtils/SWInfo.h +++ b/src/libUtils/SWInfo.h @@ -22,7 +22,7 @@ #include #include "common/Serializable.h" -const std::string VERSION_TAG = "v9.3.0rc2"; +const std::string VERSION_TAG = "v9.3.0rc3"; const std::string ZILLIQA_BRAND = "Copyright (C) Zilliqa. Version " + VERSION_TAG + ". "; From b06a536c58f5316e9ae8f387529c4642b0410d7d Mon Sep 17 00:00:00 2001 From: Mauro Medda Date: Tue, 31 Oct 2023 13:25:45 +0100 Subject: [PATCH 09/61] [release/v9.3] release v9.3.0rc4 preparation (#3853) * (feat) ZIL-5423: Deployment instructions for reward control contracts. (#3823) * Tweak constants for blocktime and txn distribution (#3839) * Fixing double enter into consensus in case gossip arrives early (#3842) Co-authored-by: bzawisto * [master] Zil 5450 network native tests improve (#3845) * chore: update response stats for debugging * Add logs when txn forwarding happens * Fix for mismatch in txn pool data * Some helpful addons * Fixing cosig retrieval * Fixes * Remove unnecessary logging * Adding more logging * More logs * Followup investigation * Another one * Hard revert * Close socket * Save the changes that have been tested and verified * Save the changes that have been tested and verified * Save the changes that have been tested and verified * Save the changes that have been tested and verified * Save the changes that have been tested and verified * Save the changes that have been tested and verified * updates and experiment Renamed branch to help ci * updates and experiment Renamed branch to help ci --------- Co-authored-by: Chetan Phirke Co-authored-by: bzawisto * [master] ZIL-5406: add support for a cdn (#3848) * Make the bucket name in localdev.py configurable. * Update download & upload scripts to use a CDN. * Fixes to the scripts and startups - does not touch cpp files. (#3849) * Fix CI issue regarding installing nodejs (#3852) * feat: update Zilliqa SW version * Adding more helpful logs and remove unneeded peer check (#3846) Co-authored-by: bzawisto --------- Co-authored-by: Richard Watts <108257153+rrw-zilliqa@users.noreply.github.com> Co-authored-by: chetan-zilliqa <66236813+chetan-zilliqa@users.noreply.github.com> Co-authored-by: Bartosz Zawistowski <39065214+bzawisto@users.noreply.github.com> Co-authored-by: bzawisto Co-authored-by: Stephen White <93026204+Steve-White-UK@users.noreply.github.com> Co-authored-by: Chetan Phirke Co-authored-by: Yaron Co-authored-by: Saeed Dadkhah --- VERSION | 2 +- constants.xml.native.tests | 523 -------------- scripts/integration_test_js.sh | 3 +- src/libCps/CpsExecutor.cpp | 33 +- src/libNetwork/P2PServer.cpp | 68 +- src/libNetwork/SendJobs.cpp | 22 +- src/libNode/FinalBlockProcessing.cpp | 7 - src/libNode/MicroBlockPreProcessing.cpp | 84 ++- src/libScilla/UnixDomainSocketServer.cpp | 6 + src/libServer/APIServerImpl.cpp | 8 +- src/libServer/LocalAPIServer.cpp | 10 +- src/libUtils/SWInfo.h | 2 +- tests/CMakeLists.txt | 8 +- tests/Network/README | 1 + tests/Node/pre_run.sh | 15 +- tests/Node/pre_run_guard.sh | 6 - tests/Node/test_node_NAT.sh | 6 - tests/Node/test_node_late.sh | 7 +- tests/Node/test_node_lookup.sh | 9 +- tests/Node/test_node_rejoindsguardnode2.sh | 7 +- tests/Node/test_node_seedpub.sh | 21 + tests/Node/test_node_server.sh | 7 +- tests/Node/test_node_simple.sh | 9 +- tests/Node/test_node_validateBackupDB.sh | 7 +- tests/Zilliqa/daemon_restart_local.py | 2 +- tests/Zilliqa/test_zilliqa_NAT.py | 21 +- tests/Zilliqa/test_zilliqa_late.py | 8 +- tests/Zilliqa/test_zilliqa_local.py | 751 ++++++++++++--------- tests/Zilliqa/test_zilliqa_lookup.py | 293 ++++---- tests/Zilliqa/test_zilliqa_seedpub.py | 214 ++++++ tests/native/CMakeLists.txt | 2 + tests/native/prepare_constants.py | 90 +++ tests/native/start_native.sh | 29 + 33 files changed, 1155 insertions(+), 1126 deletions(-) delete mode 100644 constants.xml.native.tests create mode 100644 tests/Network/README create mode 100755 tests/Node/test_node_seedpub.sh create mode 100755 tests/Zilliqa/test_zilliqa_seedpub.py create mode 100644 tests/native/CMakeLists.txt create mode 100644 tests/native/prepare_constants.py create mode 100755 tests/native/start_native.sh diff --git a/VERSION b/VERSION index e2de427cec..79a4810bd0 100644 --- a/VERSION +++ b/VERSION @@ -3,7 +3,7 @@ === [Zilliqa]Minor Version === 3 === [Zilliqa]Fix Version === -0rc3 +0rc4 === [Zilliqa] Expected DS Epoch=== 0 === [Scilla] Expected DS Epoch=== diff --git a/constants.xml.native.tests b/constants.xml.native.tests deleted file mode 100644 index 099b921b58..0000000000 --- a/constants.xml.native.tests +++ /dev/null @@ -1,523 +0,0 @@ - - - - - 1 - false - false - 25 - 1 - 3 - - 03B70CF2ABEAE4E86DAEF1A36243E44CD61138B89055099C0D220B58FB86FF588A - - . - 250000 - true - 200 - false - 0 - 15 - 15360 - true - - - 1 - 1 - 2 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - - - false - false - true - 5 - 100000 - 5 - 10 - false - 33135 - 20 - 2 - - - - txn - 27017 - false - - 1000 - 10000 - - - 0.667 - 10 - 10 - 20 - 2 - 1 - 80 - 1000 - - - true - 10 - 10 - 3 - 5 - 5 - 10 - 5 - - - false - 1 - - - - 2000 - 10 - 500 - 3000 - 500 - 180 - 80 - 500 - 60 - 20 - 5 - 3500 - 1000 - 55 - 5 - 3 - 5 - 5 - 10 - 3 - 3 - 12 - 10 - 1 - - - 21000 - 500000 - 400000 - 50 - 10 - 50 - 80 - 10 - 70 - 2000000000 - 2 - 10 - 5 - 15 - 10 - 5 - 127.0.0.1 - - - false - false - true - - 2 - 3 - 6 - - 10 - 10 - 1000 - 0 - 18 - true - true - - - - 0 - - 128 - 8192 - 0 - - - 128 - 8192 - 2 - 4 - - - - false - false - - 300 - 0.334 - 200 - - - 10 - - - - 4201 - 5 - - 4301 - 127.0.0.1 - true - /tmp/zilliqa.sock - /tmp/scilla-server.sock - scilla-server - false - 4401 - - false - 4501 - false - 2500 - 3 - 1000 - true - - 60 - - 0 - true - /home/stephen/dev/Zilliqa/evm-ds/target/release/evm-ds - /tmp/evm-server.sock - /usr/local/etc/log4rs.yml - - 1000000 - - 59 - - true - - true - - - - 200 - 5 - - 0.05 - - 3 - - 50 - 10 - 10 - - - 60 - 600 - 3 - 600 - 200 - 3 - 128 - 1 - 128 - 5000000 - 0 - 10000000 - 5 - 100 - 20 - 5 - 5 - - - true - false - false - http://127.0.0.1:4202/api - 15000 - 5 - - 5 - - false - 4202 - 5 - 3 - 8 - 32 - 2 - 1000 - - 99 - - 5 - 4 - - 1800 - - 1900 - 4 - 5 - - 120 - 10 - 2 - 3 - 360 - 5 - false - - - - 0 - 40 - 5 - true - 30 - 5 - false - 1 - 2 - 5 - 1 - - - true - /home/stephen/dev/scilla - bin/scilla-checker - bin/scilla-runner - scilla_files - _build - src/stdlib - init.json - input_state.json - input_blockchain.json - input_message.json - output.json - input - .scilla - .scillib - scilla_libs - false - false - false - 1500 - 10 - - - false - 100 - false - false - 0 - 0 - - - - 8400000000000000000000 - 176000000000000000 - 12600000000000000000000 - 20 - 40 - 76800 - 20 - 100 - 300 - 3600 - 50 - 0 - 1 - 1572864 - 1024 - 2000000 - true - 0 - 10 - 5 - xxxxxxxxxxx - txnsbackup - false - false - 0.000001 - 3 - - - - localhost - 8090 - - PROMETHEUS - 1000 - 500 - https://opentelemetry.io/schemas/1.2.0 - 1.2.0 - - NONE - - - - - 0.0.0.0 - 4318 - - OTLPHTTP - - NONE - - - - - localhost - 8090 - - NONE - - - - - - 175334 - 0 - - - 175637 - 0 - - - 175637 - 1 - - - 175637 - 2 - - - 175701 - 0 - - - 175701 - 1 - - - false - - - 1664279 - 0 - - - - - 10 - 15 - 10 - 600 - - - - - cc02a3c906612cc5bdb087a30e6093c9f0aa04fc - - - - - - ee06b3c906612cc5bdb087a30e6093c9f0aa04fd - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/scripts/integration_test_js.sh b/scripts/integration_test_js.sh index 363b739226..0ed996cc88 100755 --- a/scripts/integration_test_js.sh +++ b/scripts/integration_test_js.sh @@ -49,7 +49,8 @@ else curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | gpg --dearmor | tee /usr/share/keyrings/nodesource.gpg >/dev/null ## Creating apt sources list file for the NodeSource Node.js 14.x repo... - NODE_MAJOR=20 + NODE_MAJOR=18 + echo Installing node echo "deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x jammy main" > /etc/apt/sources.list.d/nodesource.list echo "deb-src [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x jammy main" >> /etc/apt/sources.list.d/nodesource.list diff --git a/src/libCps/CpsExecutor.cpp b/src/libCps/CpsExecutor.cpp index 6a003ee454..e45c16b96e 100644 --- a/src/libCps/CpsExecutor.cpp +++ b/src/libCps/CpsExecutor.cpp @@ -68,6 +68,8 @@ CpsExecuteResult CpsExecutor::PreValidateScillaRun( context.amount.convert_to()) if (!mAccountStore.AccountExistsAtomic(context.origin)) { + LOG_GENERAL(WARNING, + "It looks the sender doesn't exist in atomic account store"); return {TxnStatus::INVALID_FROM_ACCOUNT, false, {}}; } const auto owned = mAccountStore.GetBalanceForAccountAtomic(context.origin); @@ -116,6 +118,9 @@ CpsExecuteResult CpsExecutor::RunFromScilla( if (!mAccountStore.TransferBalanceAtomic( clientContext.origin, clientContext.recipient, Amount::fromQa(clientContext.amount))) { + LOG_GENERAL(WARNING, + "Insufficient funds to transfer from sender to recipient in " + "non-contract call"); mAccountStore.IncreaseNonceForAccount(cpsCtx.origSender); return {TxnStatus::INSUFFICIENT_BALANCE, false, {}}; } @@ -157,8 +162,12 @@ CpsExecuteResult CpsExecutor::RunFromScilla( const auto gasRemainedCore = GetRemainedGasCore(execResult); const bool isFailure = !m_queue.empty() || !execResult.isSuccess; + + LOG_GENERAL(INFO, "Scilla CPS run is completed with status: " + << (isFailure ? "failure" : "success")); span.SetAttribute("Failure", isFailure); if (isFailure) { + LOG_GENERAL(INFO, "TxnStatus for failed run: " << execResult.txnStatus); mAccountStore.RevertContractStorageState(); mAccountStore.DiscardAtomics(); mTxReceipt.RemoveAllTransitions(); @@ -207,13 +216,19 @@ CpsExecuteResult CpsExecutor::RunFromEvm(EvmProcessContext& clientContext) { mTxReceipt.AddError(RUNNER_FAILED); mTxReceipt.SetCumGas(0); mTxReceipt.update(); - mAccountStore.IncreaseNonceForAccount(ProtoToAddress(clientContext.GetEvmArgs().origin())); - LOG_GENERAL(WARNING, "RunFromEvm: Precondition for running transaction failed"); + mAccountStore.IncreaseNonceForAccount( + ProtoToAddress(clientContext.GetEvmArgs().origin())); + LOG_GENERAL(WARNING, + "RunFromEvm: Precondition for running transaction failed"); return preValidateResult; } - LOG_GENERAL(WARNING, "CpsExecutor::RunFromEvm(): From " << ProtoToAddress(clientContext.GetEvmArgs().origin()).hex() - << " , to: " << ProtoToAddress(clientContext.GetEvmArgs().address()).hex()); + LOG_GENERAL( + WARNING, + "CpsExecutor::RunFromEvm(): From " + << ProtoToAddress(clientContext.GetEvmArgs().origin()).hex() + << " , to: " + << ProtoToAddress(clientContext.GetEvmArgs().address()).hex()); TakeGasFromAccount(clientContext); @@ -226,9 +241,7 @@ CpsExecuteResult CpsExecutor::RunFromEvm(EvmProcessContext& clientContext) { CpsUtils::FromEvmContext(clientContext)}; const auto destAddress = ProtoToAddress(clientContext.GetEvmArgs().address()); const auto runType = - IsNullAddress(destAddress) - ? CpsRun::Create - : CpsRun::Call; + IsNullAddress(destAddress) ? CpsRun::Create : CpsRun::Call; auto evmRun = std::make_shared(clientContext.GetEvmArgs(), *this, cpsCtx, runType); this->TxTraceClear(); @@ -236,7 +249,6 @@ CpsExecuteResult CpsExecutor::RunFromEvm(EvmProcessContext& clientContext) { auto runResult = processLoop(cpsCtx); TRACE_EVENT("EvmCpsRun", "processLoop", "completed"); - LOG_GENERAL(INFO, "Process loop completed"); // right. There is a long and tedious discussion about this in slack // https://zilliqa-team.slack.com/archives/C042YP854RZ/p1682094771583839 @@ -257,6 +269,9 @@ CpsExecuteResult CpsExecutor::RunFromEvm(EvmProcessContext& clientContext) { const bool isEstimate = !clientContext.GetCommit(); const bool isEthCall = cpsCtx.isStatic; + LOG_GENERAL(INFO, "Evm CPS run is completed with status: " + << (isFailure ? "failure" : "success")); + span.SetAttribute("Estimate", isEstimate); span.SetAttribute("EthCall", isEthCall); span.SetAttribute("Failure", isFailure); @@ -272,7 +287,7 @@ CpsExecuteResult CpsExecutor::RunFromEvm(EvmProcessContext& clientContext) { // This will get converted back up again before we report it. mTxReceipt.SetCumGas(usedGasCore); if (isFailure) { - LOG_GENERAL(INFO, "Call failed"); + LOG_GENERAL(INFO, "TxnStatus for failed run: " << runResult.txnStatus); if (std::holds_alternative(runResult.result)) { auto const& result = std::get(runResult.result); LOG_GENERAL(INFO, EvmUtils::ExitReasonString(result.exit_reason())); diff --git a/src/libNetwork/P2PServer.cpp b/src/libNetwork/P2PServer.cpp index 7ac23be6f0..e9173e038e 100644 --- a/src/libNetwork/P2PServer.cpp +++ b/src/libNetwork/P2PServer.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include "Blacklist.h" #include "libUtils/Logger.h" @@ -202,9 +203,10 @@ std::shared_ptr P2PServer::CreateAndStart(AsioContext& asio, throw std::runtime_error(error_msg); } -P2PServerConnection::P2PServerConnection( - std::weak_ptr owner, uint64_t this_id, Peer&& remote_peer, - TcpSocket socket, size_t max_message_size) +P2PServerConnection::P2PServerConnection(std::weak_ptr owner, + uint64_t this_id, Peer&& remote_peer, + TcpSocket socket, + size_t max_message_size) : m_owner(std::move(owner)), m_id(this_id), m_remotePeer(std::move(remote_peer)), @@ -229,6 +231,9 @@ void P2PServerConnection::ReadNextMessage() { if (!ec) { assert(n == HDR_LEN); } + if (ec) { + // LOG_GENERAL(WARNING, "Got error code: " << ec.message()); + } if (ec != OPERATION_ABORTED) { self->OnHeaderRead(ec); } @@ -237,10 +242,9 @@ void P2PServerConnection::ReadNextMessage() { void P2PServerConnection::OnHeaderRead(const ErrorCode& ec) { if (ec) { - if (ec != END_OF_FILE) { - LOG_GENERAL(INFO, - "Peer " << m_remotePeer << " read error: " << ec.message()); - } + LOG_GENERAL(INFO, + "Peer " << m_remotePeer << " read error: " << ec.message()); + CloseSocket(); OnConnectionClosed(); return; } @@ -254,7 +258,9 @@ void P2PServerConnection::OnHeaderRead(const ErrorCode& ec) { << " Adding sending node " << m_remotePeer.GetPrintableIPAddress() << " as strictly blacklisted"); - Blacklist::GetInstance().Add({m_remotePeer.GetIpAddress(),m_remotePeer.GetListenPortHost(),m_remotePeer.GetNodeIndentifier()}); + Blacklist::GetInstance().Add({m_remotePeer.GetIpAddress(), + m_remotePeer.GetListenPortHost(), + m_remotePeer.GetNodeIndentifier()}); CloseSocket(); OnConnectionClosed(); @@ -269,6 +275,9 @@ void P2PServerConnection::OnHeaderRead(const ErrorCode& ec) { if (!ec) { assert(n == self->m_readBuffer.size() - HDR_LEN); } + if (ec) { + // LOG_GENERAL(WARNING, "Got error code: " << ec.message()); + } if (ec != OPERATION_ABORTED) { self->OnBodyRead(ec); } @@ -278,17 +287,19 @@ void P2PServerConnection::OnHeaderRead(const ErrorCode& ec) { void P2PServerConnection::OnBodyRead(const ErrorCode& ec) { if (ec) { LOG_GENERAL(INFO, "Read error: " << ec.message()); + CloseSocket(); OnConnectionClosed(); return; } - ReadMessageResult result; auto state = TryReadMessage(m_readBuffer.data(), m_readBuffer.size(), result); if (state != ReadState::SUCCESS) { LOG_GENERAL(WARNING, "Message deserialize error: blacklisting " << m_remotePeer.GetPrintableIPAddress()); - Blacklist::GetInstance().Add({m_remotePeer.GetIpAddress(),m_remotePeer.GetListenPortHost(),m_remotePeer.GetNodeIndentifier()}); + Blacklist::GetInstance().Add({m_remotePeer.GetIpAddress(), + m_remotePeer.GetListenPortHost(), + m_remotePeer.GetNodeIndentifier()}); CloseSocket(); OnConnectionClosed(); @@ -298,6 +309,7 @@ void P2PServerConnection::OnBodyRead(const ErrorCode& ec) { auto owner = m_owner.lock(); if (!owner || !owner->OnMessage(m_id, m_remotePeer, result)) { CloseSocket(); + OnConnectionClosed(); return; } @@ -311,8 +323,44 @@ void P2PServerConnection::Close() { void P2PServerConnection::CloseSocket() { ErrorCode ec; + // both close and shutdown should be none blocking calls certainly on current linux + // shutdown marks the socket as blocked for both read and write + // shutdown tells the OS to begin the graceful closedown of the TCP connection. + // close() is a blocking call that waits for the OS to complete the closedown. + // close also frees the OS resources from the program so should be called even if + // an error condition is encountered m_socket.shutdown(boost::asio::socket_base::shutdown_both, ec); + if (ec) { + m_socket.close(ec); + if (ec) { + LOG_GENERAL(INFO, "Informational, not an issue - Error closing socket: " << ec.message()); + } + return; + } + size_t unread = m_socket.available(ec); + if (ec) { + m_socket.close(ec); + return; + } + // On Linux, the close() function for sockets does not necessarily wait + // for the operating system to complete the operation before returning. + // It typically marks the socket as closed and releases any resources + // associated with it immediately. However, this does not guarantee that all + // pending data has been sent or received. It is important to handle any + // necessary error checking and ensure all data transmission is complete + // before calling close() on a socket. + if (unread > 0) { + do { + boost::container::small_vector buf; + buf.resize(unread); + m_socket.read_some(boost::asio::mutable_buffer(buf.data(), unread), ec); + LOG_GENERAL(INFO, "Draining remaining IO before close" << m_remotePeer.GetPrintableIPAddress()); + } while (!ec && (unread = m_socket.available(ec)) > 0); + } m_socket.close(ec); + if (ec) { + LOG_GENERAL(INFO, "Informational, not an issue - Error closing socket: " << ec.message()); + } } void P2PServerConnection::OnConnectionClosed() { diff --git a/src/libNetwork/SendJobs.cpp b/src/libNetwork/SendJobs.cpp index 3eeff91fa7..b55bfd21f8 100644 --- a/src/libNetwork/SendJobs.cpp +++ b/src/libNetwork/SendJobs.cpp @@ -215,6 +215,8 @@ class GracefulCloseImpl LOG_GENERAL(DEBUG, "Expected EOF, got ec=" << ec.message() << " n=" << n); } + ErrorCode ignored; + self->m_socket.close(ignored); }); } }; @@ -226,10 +228,12 @@ void CloseGracefully(Socket&& socket) { } socket.shutdown(boost::asio::socket_base::shutdown_both, ec); if (ec) { + socket.close(ec); return; } size_t unread = socket.available(ec); if (ec) { + socket.close(ec); return; } if (unread > 0) { @@ -239,6 +243,8 @@ void CloseGracefully(Socket&& socket) { } if (!ec) { std::make_shared(std::move(socket))->Close(); + } else { + socket.close(ec); } } @@ -378,6 +384,9 @@ class PeerSendQueue : public std::enable_shared_from_this { boost::asio::async_write( m_socket, boost::asio::const_buffer(msg.data.get(), msg.size), [self = shared_from_this()](const ErrorCode& ec, size_t) { + if (ec) { + // LOG_GENERAL(WARNING, "Got error code: " << ec.message()); + } if (ec != OPERATION_ABORTED) { self->OnWritten(ec); } @@ -385,6 +394,11 @@ class PeerSendQueue : public std::enable_shared_from_this { } void OnWritten(const ErrorCode& ec) { + if (!ec && !m_closed) { + // LOG_GENERAL(INFO, "Successfully sent message to: " + // << m_peer.GetPrintableIPAddress() + // << " with size: " << m_queue.front().msg.size); + } if (m_closed) { return; } @@ -415,11 +429,12 @@ class PeerSendQueue : public std::enable_shared_from_this { return; } - WaitTimer(m_timer, Milliseconds{RECONNECT_INTERVAL_IN_MS}, [this]() { Reconnect(); }); + WaitTimer(m_timer, Milliseconds{RECONNECT_INTERVAL_IN_MS}, + [this]() { Reconnect(); }); } void Reconnect() { - LOG_GENERAL(DEBUG, "Peer " << m_peer << " reconnects"); + LOG_GENERAL(INFO, "Peer " << m_peer << " reconnects"); CloseGracefully(std::move(m_socket)); m_socket = Socket(m_asioContext); Connect(); @@ -493,7 +508,8 @@ class SendJobsImpl : public SendJobs, return; } - LOG_GENERAL(DEBUG, "Enqueueing message, size=" << message.size); + LOG_GENERAL(DEBUG, "Enqueueing message, size=" << message.size + << " peer = " << peer); // this fn enqueues the lambda to be executed on WorkerThread with // sequential guarantees for messages from every calling thread diff --git a/src/libNode/FinalBlockProcessing.cpp b/src/libNode/FinalBlockProcessing.cpp index 031f9995d8..8bdd88724d 100644 --- a/src/libNode/FinalBlockProcessing.cpp +++ b/src/libNode/FinalBlockProcessing.cpp @@ -1664,13 +1664,6 @@ bool Node::ProcessMBnForwardTransaction( bool Node::AddPendingTxn(const HashCodeMap& pendingTxns, const PubKey& pubkey, uint32_t shardId, const zbytes& txnListHash) { - { - lock_guard g(m_mediator.m_ds->m_mutexShards); - if (!Lookup::VerifySenderNode(m_mediator.m_ds->m_shards, pubkey)) { - LOG_GENERAL(WARNING, "Could not find PubKey in shard " << shardId); - return false; - } - } { // DS Committee lock_guard g(m_mediator.m_mutexDSCommittee); diff --git a/src/libNode/MicroBlockPreProcessing.cpp b/src/libNode/MicroBlockPreProcessing.cpp index cfa379e8d6..13028fe134 100644 --- a/src/libNode/MicroBlockPreProcessing.cpp +++ b/src/libNode/MicroBlockPreProcessing.cpp @@ -92,7 +92,8 @@ bool Node::ComposeMicroBlock(const uint64_t& microblock_gas_limit) { uint128_t rewards = 0; if (m_mediator.GetIsVacuousEpoch() && m_mediator.m_ds->m_mode != DirectoryService::IDLE) { - RewardControlContractState control_state = RewardControlContractState::GetCurrentRewards(); + RewardControlContractState control_state = + RewardControlContractState::GetCurrentRewards(); rewards = control_state.coinbase_reward_per_ds; } else { rewards = m_txnFees; @@ -438,35 +439,37 @@ void Node::ProcessTransactionWhenShardLeader( break; } - Transaction t; - TransactionReceipt tr; + Transaction txn; + TransactionReceipt txnReceipt; // check m_addrNonceTxnMap contains any txn meets right nonce, // if contains, process it - if (findOneFromAddrNonceTxnMap(t, t_addrNonceTxnMap)) { + if (findOneFromAddrNonceTxnMap(txn, t_addrNonceTxnMap)) { count_addrNonceTxnMap++; // check whether m_createdTransaction have transaction with same Addr and // nonce if has and with larger gasPrice then replace with that one. // (*optional step) - t_createdTxns.findSameNonceButHigherGas(t); + t_createdTxns.findSameNonceButHigherGas(txn); - if (m_gasUsedTotal + t.GetGasLimitZil() > microblock_gas_limit) { - LOG_GENERAL(WARNING, "Gas limit exceeded = " << t.GetTranID()); + if (m_gasUsedTotal + txn.GetGasLimitZil() > microblock_gas_limit) { + LOG_GENERAL(WARNING, "Gas limit exceeded = " << txn.GetTranID()); LOG_GENERAL(WARNING, "m_gasUsedTotal = " << m_gasUsedTotal); - LOG_GENERAL(WARNING, "t.GetGasLimitZil = " << t.GetGasLimitZil()); - gasLimitExceededTxnBuffer.emplace_back(t); + LOG_GENERAL(WARNING, + "t.GetGasLimitZil = " << txn.GetGasLimitZil()); + gasLimitExceededTxnBuffer.emplace_back(txn); continue; } TxnStatus error_code; - if (m_mediator.m_validator->CheckCreatedTransaction(t, tr, error_code)) { - if (!SafeMath::add(m_gasUsedTotal, tr.GetCumGas(), + if (m_mediator.m_validator->CheckCreatedTransaction(txn, txnReceipt, + error_code)) { + if (!SafeMath::add(m_gasUsedTotal, txnReceipt.GetCumGas(), m_gasUsedTotal)) { LOG_GENERAL(WARNING, "m_gasUsedTotal addition unsafe!"); break; } uint128_t txnFee; - if (!SafeMath::mul(tr.GetCumGas(), t.GetGasPriceQa(), - txnFee)) { + if (!SafeMath::mul(txnReceipt.GetCumGas(), + txn.GetGasPriceQa(), txnFee)) { LOG_GENERAL(WARNING, "txnFee multiplication unsafe!"); continue; } @@ -474,74 +477,77 @@ void Node::ProcessTransactionWhenShardLeader( LOG_GENERAL(WARNING, "m_txnFees addition unsafe!"); break; } - appendOne(t, tr); + appendOne(txn, txnReceipt); continue; } else { - droppedTxns.emplace_back(t.GetTranID(), error_code); + LOG_GENERAL(WARNING, + "Adding to dropped Txns failed transaction with id: " + << txn.GetTranID()); + droppedTxns.emplace_back(txn.GetTranID(), error_code); } } // if no txn in u_map meet right nonce process new come-in transactions - else if (t_createdTxns.findOne(t)) { + else if (t_createdTxns.findOne(txn)) { count_createdTxns++; // LOG_GENERAL(INFO, "findOneFromCreated"); - Address senderAddr = t.GetSenderAddr(); + Address senderAddr = txn.GetSenderAddr(); // check nonce, if nonce larger than expected, put it into // m_addrNonceTxnMap - if (t.GetNonce() > + if (txn.GetNonce() > AccountStore::GetInstance().GetNonceTemp(senderAddr) + 1) { LOG_GENERAL( INFO, "High nonce: " - << t.GetNonce() << " cur sender " << senderAddr.hex() + << txn.GetNonce() << " cur sender " << senderAddr.hex() << " nonce: " << AccountStore::GetInstance().GetNonceTemp(senderAddr)); auto it1 = t_addrNonceTxnMap.find(senderAddr); if (it1 != t_addrNonceTxnMap.end()) { - auto it2 = it1->second.find(t.GetNonce()); + auto it2 = it1->second.find(txn.GetNonce()); if (it2 != it1->second.end()) { // found the txn with same addr and same nonce // then compare the gasprice and remains the higher one - if (t.GetGasPriceQa() > it2->second.GetGasPriceQa()) { - it2->second = t; + if (txn.GetGasPriceQa() > it2->second.GetGasPriceQa()) { + it2->second = txn; } continue; } } - t_addrNonceTxnMap[senderAddr].insert({t.GetNonce(), t}); + t_addrNonceTxnMap[senderAddr].insert({txn.GetNonce(), txn}); } // if nonce too small, ignore it - else if (t.GetNonce() < + else if (txn.GetNonce() < AccountStore::GetInstance().GetNonceTemp(senderAddr) + 1) { LOG_GENERAL( INFO, "Nonce too small" << " Expected " << AccountStore::GetInstance().GetNonceTemp(senderAddr) + 1 - << " Found " << t.GetNonce() << " for " << t.GetTranID()); - droppedTxns.emplace_back(t.GetTranID(), TxnStatus::NONCE_TOO_LOW); + << " Found " << txn.GetNonce() << " for " << txn.GetTranID()); + droppedTxns.emplace_back(txn.GetTranID(), TxnStatus::NONCE_TOO_LOW); } // if nonce correct, process it else { - if (m_gasUsedTotal + t.GetGasLimitZil() > microblock_gas_limit) { - LOG_GENERAL(WARNING, "Gas limit exceeded = " << t.GetTranID()); + if (m_gasUsedTotal + txn.GetGasLimitZil() > microblock_gas_limit) { + LOG_GENERAL(WARNING, "Gas limit exceeded = " << txn.GetTranID()); LOG_GENERAL(WARNING, "m_gasUsedTotal = " << m_gasUsedTotal); LOG_GENERAL(WARNING, - "t.GetGasLimitZil = " << t.GetGasLimitZil()); - gasLimitExceededTxnBuffer.emplace_back(t); + "t.GetGasLimitZil = " << txn.GetGasLimitZil()); + gasLimitExceededTxnBuffer.emplace_back(txn); continue; } TxnStatus error_code; - if (m_mediator.m_validator->CheckCreatedTransaction(t, tr, + if (m_mediator.m_validator->CheckCreatedTransaction(txn, txnReceipt, error_code)) { - if (!SafeMath::add(m_gasUsedTotal, tr.GetCumGas(), + if (!SafeMath::add(m_gasUsedTotal, txnReceipt.GetCumGas(), m_gasUsedTotal)) { LOG_GENERAL(WARNING, "m_gasUsedTotal addition unsafe!"); break; } uint128_t txnFee; - if (!SafeMath::mul(tr.GetCumGas(), t.GetGasPriceQa(), - txnFee)) { + if (!SafeMath::mul(txnReceipt.GetCumGas(), + txn.GetGasPriceQa(), txnFee)) { LOG_GENERAL(WARNING, "txnFee multiplication unsafe!"); continue; } @@ -549,9 +555,12 @@ void Node::ProcessTransactionWhenShardLeader( LOG_GENERAL(WARNING, "m_txnFees addition unsafe!"); break; } - appendOne(t, tr); + appendOne(txn, txnReceipt); } else { - droppedTxns.emplace_back(t.GetTranID(), error_code); + LOG_GENERAL(WARNING, + "Adding to dropped Txns failed transaction with id: " + << txn.GetTranID()); + droppedTxns.emplace_back(txn.GetTranID(), error_code); } } } else { @@ -1366,7 +1375,8 @@ bool Node::CheckMicroBlockHashes(zbytes& errorMsg) { if (m_mediator.GetIsVacuousEpoch() && m_mediator.m_ds->m_mode != DirectoryService::IDLE) { // Check COINBASE_REWARD_PER_DS - RewardControlContractState reward_state = RewardControlContractState::GetCurrentRewards(); + RewardControlContractState reward_state = + RewardControlContractState::GetCurrentRewards(); uint128_t rewards = reward_state.coinbase_reward_per_ds; if (rewards != m_microblock->GetHeader().GetRewards()) { diff --git a/src/libScilla/UnixDomainSocketServer.cpp b/src/libScilla/UnixDomainSocketServer.cpp index 194e8cc38c..0d51051630 100644 --- a/src/libScilla/UnixDomainSocketServer.cpp +++ b/src/libScilla/UnixDomainSocketServer.cpp @@ -96,10 +96,12 @@ void UnixDomainSocketServer::WorkerThread() { boost::system::error_code ec; m_acceptor->accept(socket, ec); if (ec && m_started) { + socket.close(ec); throw std::runtime_error(ec.message()); } if (!m_started) { + socket.close(ec); break; } @@ -115,6 +117,7 @@ void UnixDomainSocketServer::WorkerThread() { } if (!m_started) { + socket.close(ec); break; } @@ -130,6 +133,7 @@ void UnixDomainSocketServer::WorkerThread() { } if (!m_started) { + socket.close(ec); break; } @@ -147,6 +151,7 @@ void UnixDomainSocketServer::WorkerThread() { if (ec) { LOG_GENERAL(WARNING, "Write to " << m_path << " failed: " << ec.message()); + socket.close(ec); continue; } @@ -154,6 +159,7 @@ void UnixDomainSocketServer::WorkerThread() { boost::asio::local::stream_protocol::socket::shutdown_both, ec); if (ec) { LOG_GENERAL(WARNING, "Shutdown failed: " << ec.message()); + socket.close(ec); continue; } } diff --git a/src/libServer/APIServerImpl.cpp b/src/libServer/APIServerImpl.cpp index 42f51594b6..95817d5b63 100644 --- a/src/libServer/APIServerImpl.cpp +++ b/src/libServer/APIServerImpl.cpp @@ -93,6 +93,8 @@ class APIServerImpl::Connection if (!owner) { // server is closed m_stream.socket().shutdown(tcp::socket::shutdown_both, ec); + m_stream.socket().close(ec); + OnClosed(); return; } @@ -101,6 +103,8 @@ class APIServerImpl::Connection LOG_GENERAL(DEBUG, "Read error: " << ec.message()); m_stream.socket().shutdown(tcp::socket::shutdown_both, ec); } + m_stream.socket().shutdown(tcp::socket::shutdown_both, ec); + m_stream.socket().close(ec); OnClosed(); return; } @@ -205,6 +209,8 @@ class APIServerImpl::Connection if (sz == 0 && m_owner.expired()) { beast::error_code ec; m_stream.socket().shutdown(tcp::socket::shutdown_both, ec); + m_stream.socket().close(ec); + OnClosed(); return; } @@ -346,7 +352,7 @@ bool APIServerImpl::DoListen() { #define CHECK_EC() \ if (ec) { \ - LOG_GENERAL(FATAL, "Cannot start API server: " << ec.message()); \ + LOG_GENERAL(FATAL, "Cannot start API server: " << ec.message() << " port " << m_options.port); \ return false; \ } diff --git a/src/libServer/LocalAPIServer.cpp b/src/libServer/LocalAPIServer.cpp index 23e6244a9b..6b1f5afafb 100644 --- a/src/libServer/LocalAPIServer.cpp +++ b/src/libServer/LocalAPIServer.cpp @@ -46,7 +46,7 @@ bool LocalAPIServer::StartListening() { #define CHECK_EC() \ if (ec) { \ - LOG_GENERAL(WARNING, "Cannot start API server: " << ec.message()); \ + LOG_GENERAL(WARNING, "Cannot start API server: " << ec.message() << " port =" << m_port); \ return false; \ } @@ -117,10 +117,12 @@ void LocalAPIServer::WorkerThread() { boost::system::error_code ec; m_acceptor->accept(socket, ec); if (ec && m_started) { + socket.close(ec); throw std::runtime_error(ec.message()); } if (!m_started) { + socket.close(ec); break; } @@ -131,10 +133,12 @@ void LocalAPIServer::WorkerThread() { DEFAULT_DELIMITER_CHAR, ec); if (ec || n <= 1) { LOG_GENERAL(WARNING, "Read (" << m_ip << ") failed: " << ec.message()); + socket.close(ec); continue; } if (!m_started) { + socket.close(ec); break; } @@ -150,6 +154,7 @@ void LocalAPIServer::WorkerThread() { } if (!m_started) { + socket.close(ec); break; } @@ -166,6 +171,7 @@ void LocalAPIServer::WorkerThread() { boost::asio::write(socket, boost::asio::buffer(response), ec); if (ec) { LOG_GENERAL(WARNING, "Write (" << m_ip << ") failed: " << ec.message()); + socket.close(ec); continue; } @@ -173,8 +179,8 @@ void LocalAPIServer::WorkerThread() { boost::asio::local::stream_protocol::socket::shutdown_both, ec); if (ec) { LOG_GENERAL(WARNING, "Shutdown failed: " << ec.message()); - continue; } + socket.close(ec); } } catch (const std::exception& e) { LOG_GENERAL(WARNING, "Listening to " << m_ip << " failed: " << e.what()); diff --git a/src/libUtils/SWInfo.h b/src/libUtils/SWInfo.h index f147fdefd9..b36bb982dd 100644 --- a/src/libUtils/SWInfo.h +++ b/src/libUtils/SWInfo.h @@ -22,7 +22,7 @@ #include #include "common/Serializable.h" -const std::string VERSION_TAG = "v9.3.0rc3"; +const std::string VERSION_TAG = "v9.3.0rc4"; const std::string ZILLIQA_BRAND = "Copyright (C) Zilliqa. Version " + VERSION_TAG + ". "; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 7e9c5cd25d..4973ad389d 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -21,11 +21,15 @@ add_subdirectory (Server) add_subdirectory (EvmFiltersAPI) add_subdirectory (EthRpcMethods) add_subdirectory (Utils) -#add_subdirectory (Zilliqa) +add_subdirectory (Zilliqa) +add_subdirectory (native) #add_subdirectory (RemoteStorageDB) Works only if you have a local mongo server running file(COPY ${CMAKE_SOURCE_DIR}/constants_local.xml DESTINATION ${CMAKE_BINARY_DIR}) -#FIXME: constants.xml is not used for local_run, thus shouldn't be copied # presently, it's a workaround to silence the error thrown by tests_zilliqa_local.py file(COPY ${CMAKE_SOURCE_DIR}/constants.xml DESTINATION ${CMAKE_BINARY_DIR}) file(COPY Node DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) +file(COPY ${CMAKE_SOURCE_DIR}/tests/Zilliqa/test_zilliqa_local.py DESTINATION ${CMAKE_SOURCE_DIR}/build/tests/zilliqa) +file(COPY ${CMAKE_SOURCE_DIR}/tests/Zilliqa/test_zilliqa_lookup.py DESTINATION ${CMAKE_SOURCE_DIR}/build/tests/zilliqa) +file(COPY ${CMAKE_SOURCE_DIR}/tests/Zilliqa/test_zilliqa_seedpub.py DESTINATION ${CMAKE_SOURCE_DIR}/build/tests/zilliqa) +file(COPY ${CMAKE_SOURCE_DIR}/tests/Zilliqa/test_zilliqa_late.py DESTINATION ${CMAKE_SOURCE_DIR}/build/tests/zilliqa) \ No newline at end of file diff --git a/tests/Network/README b/tests/Network/README new file mode 100644 index 0000000000..fba58e3907 --- /dev/null +++ b/tests/Network/README @@ -0,0 +1 @@ +This will be the instructions of how to run native. \ No newline at end of file diff --git a/tests/Node/pre_run.sh b/tests/Node/pre_run.sh index b61b4fbeee..19ff696de8 100755 --- a/tests/Node/pre_run.sh +++ b/tests/Node/pre_run.sh @@ -18,23 +18,18 @@ rm -rf local_run/node* -sudo sysctl net.core.somaxconn=102400; -sudo sysctl net.core.netdev_max_backlog=65536; -sudo sysctl net.ipv4.tcp_tw_reuse=1; -sudo sysctl -w net.ipv4.tcp_rmem='65536 873800 1534217728'; -sudo sysctl -w net.ipv4.tcp_wmem='65536 873800 1534217728'; -sudo sysctl -w net.ipv4.tcp_mem='65536 873800 1534217728'; ulimit -n 65535; ulimit -Sc unlimited; ulimit -Hc unlimited; ulimit -s unlimited; -python tests/Zilliqa/test_zilliqa_local.py stop -python tests/Zilliqa/test_zilliqa_local.py setup 10 -python tests/Zilliqa/test_zilliqa_local.py prestart 5 +python tests/zilliqa/test_zilliqa_local.py stop +python tests/zilliqa/test_zilliqa_local.py setup 10 +python tests/zilliqa/test_zilliqa_local.py prestart 5 # clean up persistence storage rm -rf lookup_local_run/node* -python tests/Zilliqa/test_zilliqa_lookup.py setup 1 +python tests/zilliqa/test_zilliqa_lookup.py setup 1 +#python tests/zilliqa/test_zilliqa_seedpub.py setup 1 diff --git a/tests/Node/pre_run_guard.sh b/tests/Node/pre_run_guard.sh index d51b3d11ca..61168a18ee 100755 --- a/tests/Node/pre_run_guard.sh +++ b/tests/Node/pre_run_guard.sh @@ -18,12 +18,6 @@ rm -rf local_run/node* -sudo sysctl net.core.somaxconn=102400; -sudo sysctl net.core.netdev_max_backlog=65536; -sudo sysctl net.ipv4.tcp_tw_reuse=1; -sudo sysctl -w net.ipv4.tcp_rmem='65536 873800 1534217728'; -sudo sysctl -w net.ipv4.tcp_wmem='65536 873800 1534217728'; -sudo sysctl -w net.ipv4.tcp_mem='65536 873800 1534217728'; ulimit -n 65535; ulimit -Sc unlimited; ulimit -Hc unlimited; diff --git a/tests/Node/test_node_NAT.sh b/tests/Node/test_node_NAT.sh index 54a74543be..af817303e8 100755 --- a/tests/Node/test_node_NAT.sh +++ b/tests/Node/test_node_NAT.sh @@ -14,12 +14,6 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -sudo sysctl net.core.somaxconn=102400; -sudo sysctl net.core.netdev_max_backlog=65536; -sudo sysctl net.ipv4.tcp_tw_reuse=1; -sudo sysctl -w net.ipv4.tcp_rmem='65536 873800 1534217728'; -sudo sysctl -w net.ipv4.tcp_wmem='65536 873800 1534217728'; -sudo sysctl -w net.ipv4.tcp_mem='65536 873800 1534217728'; python tests/Zilliqa/test_zilliqa_NAT.py setup 5 python tests/Zilliqa/test_zilliqa_NAT.py start diff --git a/tests/Node/test_node_late.sh b/tests/Node/test_node_late.sh index a9d73e9504..2766228679 100755 --- a/tests/Node/test_node_late.sh +++ b/tests/Node/test_node_late.sh @@ -14,12 +14,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -sudo sysctl net.core.somaxconn=102400; -sudo sysctl net.core.netdev_max_backlog=65536; -sudo sysctl net.ipv4.tcp_tw_reuse=1; -sudo sysctl -w net.ipv4.tcp_rmem='65536 873800 1534217728'; -sudo sysctl -w net.ipv4.tcp_wmem='65536 873800 1534217728'; -sudo sysctl -w net.ipv4.tcp_mem='65536 873800 1534217728'; + python tests/Zilliqa/test_zilliqa_late.py setup 5 python tests/Zilliqa/test_zilliqa_late.py start diff --git a/tests/Node/test_node_lookup.sh b/tests/Node/test_node_lookup.sh index d6943cbc11..c00a86094a 100755 --- a/tests/Node/test_node_lookup.sh +++ b/tests/Node/test_node_lookup.sh @@ -14,13 +14,8 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -sudo sysctl net.core.somaxconn=102400; -sudo sysctl net.core.netdev_max_backlog=65536; -sudo sysctl net.ipv4.tcp_tw_reuse=1; -sudo sysctl -w net.ipv4.tcp_rmem='65536 873800 1534217728'; -sudo sysctl -w net.ipv4.tcp_wmem='65536 873800 1534217728'; -sudo sysctl -w net.ipv4.tcp_mem='65536 873800 1534217728'; -python tests/Zilliqa/test_zilliqa_lookup.py start + +python tests/zilliqa/test_zilliqa_lookup.py start echo "end" diff --git a/tests/Node/test_node_rejoindsguardnode2.sh b/tests/Node/test_node_rejoindsguardnode2.sh index eefe780b4e..e6b4f9359b 100755 --- a/tests/Node/test_node_rejoindsguardnode2.sh +++ b/tests/Node/test_node_rejoindsguardnode2.sh @@ -14,12 +14,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -sudo sysctl net.core.somaxconn=102400; -sudo sysctl net.core.netdev_max_backlog=65536; -sudo sysctl net.ipv4.tcp_tw_reuse=1; -sudo sysctl -w net.ipv4.tcp_rmem='65536 873800 1534217728'; -sudo sysctl -w net.ipv4.tcp_wmem='65536 873800 1534217728'; -sudo sysctl -w net.ipv4.tcp_mem='65536 873800 1534217728'; + python tests/Zilliqa/test_zilliqa_local.py setupdsguard2 1 python tests/Zilliqa/test_zilliqa_local.py rejoindsguard2 diff --git a/tests/Node/test_node_seedpub.sh b/tests/Node/test_node_seedpub.sh new file mode 100755 index 0000000000..e41bf08152 --- /dev/null +++ b/tests/Node/test_node_seedpub.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# Copyright (C) 2019 Zilliqa +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + + +python tests/zilliqa/test_zilliqa_seedpub.py start + +echo "end" diff --git a/tests/Node/test_node_server.sh b/tests/Node/test_node_server.sh index f627f524c5..cc8618396b 100755 --- a/tests/Node/test_node_server.sh +++ b/tests/Node/test_node_server.sh @@ -15,12 +15,7 @@ # along with this program. If not, see . # This script will run 20 DS and 60 nodes. This script should be run on a high performance machine. -sudo sysctl net.core.somaxconn=102400; -sudo sysctl net.core.netdev_max_backlog=65536; -sudo sysctl net.ipv4.tcp_tw_reuse=1; -sudo sysctl -w net.ipv4.tcp_rmem='65536 873800 1534217728'; -sudo sysctl -w net.ipv4.tcp_wmem='65536 873800 1534217728'; -sudo sysctl -w net.ipv4.tcp_mem='65536 873800 1534217728'; + python tests/Zilliqa/test_zilliqa_local.py stop python tests/Zilliqa/test_zilliqa_local.py clean diff --git a/tests/Node/test_node_simple.sh b/tests/Node/test_node_simple.sh index c983f6bc45..6c8da5db52 100755 --- a/tests/Node/test_node_simple.sh +++ b/tests/Node/test_node_simple.sh @@ -15,18 +15,13 @@ # along with this program. If not, see . -sudo sysctl net.core.somaxconn=102400; -sudo sysctl net.core.netdev_max_backlog=65536; -sudo sysctl net.ipv4.tcp_tw_reuse=1; -sudo sysctl -w net.ipv4.tcp_rmem='65536 873800 1534217728'; -sudo sysctl -w net.ipv4.tcp_wmem='65536 873800 1534217728'; -sudo sysctl -w net.ipv4.tcp_mem='65536 873800 1534217728'; + ulimit -n 65535; ulimit -Sc unlimited; ulimit -Hc unlimited; ulimit -s unlimited; -python tests/Zilliqa/test_zilliqa_local.py start 5 +python tests/zilliqa/test_zilliqa_local.py start 5 sleep 40 echo "starting..." diff --git a/tests/Node/test_node_validateBackupDB.sh b/tests/Node/test_node_validateBackupDB.sh index af23366d45..59ede3b33f 100755 --- a/tests/Node/test_node_validateBackupDB.sh +++ b/tests/Node/test_node_validateBackupDB.sh @@ -15,12 +15,7 @@ # along with this program. If not, see . -sudo sysctl net.core.somaxconn=102400; -sudo sysctl net.core.netdev_max_backlog=65536; -sudo sysctl net.ipv4.tcp_tw_reuse=1; -sudo sysctl -w net.ipv4.tcp_rmem='65536 873800 1534217728'; -sudo sysctl -w net.ipv4.tcp_wmem='65536 873800 1534217728'; -sudo sysctl -w net.ipv4.tcp_mem='65536 873800 1534217728'; + ulimit -n 65535; ulimit -Sc unlimited; ulimit -Hc unlimited; diff --git a/tests/Zilliqa/daemon_restart_local.py b/tests/Zilliqa/daemon_restart_local.py index 30ee039b48..9458e0a88f 100755 --- a/tests/Zilliqa/daemon_restart_local.py +++ b/tests/Zilliqa/daemon_restart_local.py @@ -66,7 +66,7 @@ def run_restart(pubKey, privKey, port, typ, path, name): for x in range(0, 1): keypair = keypairs[x].split(" ") - os.system('cd ' + path + '; ulimit -n 65535; ulimit -Sc unlimited; ulimit -Hc unlimited; $(pwd)/' + name + ' --privk ' + keypair[0] + ' --pubk ' + keypair[1] + ' --address ' + nodeIP + ' --port ' + port + ' --synctype ' + typ + ' --recovery >> ./error_log_zilliqa 2>&1 &') + os.system('cd ' + path + '; ulimit -n 65535; ulimit -Sc unlimited; ulimit -Hc unlimited; $(pwd)/' + name + ' --privk ' + keypair[0] + ' --pubk ' + keypair[1] + ' --address ' + nodeIP + ' --port ' + port + ' --synctype ' + typ + ' --recovery '+ ' --identity normal-' + str(x) + ' >> ./error_log_zilliqa 2>&1 &') if __name__ == "__main__": main() diff --git a/tests/Zilliqa/test_zilliqa_NAT.py b/tests/Zilliqa/test_zilliqa_NAT.py index eb7df339e6..65532131b9 100755 --- a/tests/Zilliqa/test_zilliqa_NAT.py +++ b/tests/Zilliqa/test_zilliqa_NAT.py @@ -68,7 +68,7 @@ def run_setup(numnodes, printnodes): for x in range(0, numnodes): testsubdir = LOCAL_RUN_FOLDER + 'node_' + str(x+1).zfill(4) os.makedirs(testsubdir) - shutil.copyfile('./tests/Zilliqa/zilliqa', testsubdir + '/latezilliqa') + shutil.copyfile('./bin/zilliqa', testsubdir + '/latezilliqa') st = os.stat(testsubdir + '/latezilliqa') os.chmod(testsubdir + '/latezilliqa', st.st_mode | stat.S_IEXEC) @@ -84,9 +84,22 @@ def run_start(): count = len(testfolders_list) keypairs = [] + dev_root = os.getenv("DEV_TREE_ROOT") + if dev_root is None: + print("DEV_TREE_ROOT is not set") + return + + dev_root += "/Zilliqa" + fp = dev_root + "/" + "constants.xml" + + if not os.path.exists(fp): + print( fp +" not found") + return + + # Generate keypairs (sort by public key) for x in range(0, count): - process = Popen(["./tests/Zilliqa/genkeypair"], stdout=PIPE, universal_newlines=True) + process = Popen(["./bin/genkeypair"], stdout=PIPE, universal_newlines=True) (output, err) = process.communicate() exit_code = process.wait() keypairs.append(output.strip()) @@ -97,7 +110,7 @@ def run_start(): for x in range(0, count): keys_file.write(keypairs[x] + '\n') shutil.copyfile('dsnodes.xml', LOCAL_RUN_FOLDER + testfolders_list[x] + '/dsnodes.xml') - shutil.copyfile('constants_local.xml', LOCAL_RUN_FOLDER + testfolders_list[x] + '/constants.xml') + shutil.copyfile(fp, LOCAL_RUN_FOLDER + testfolders_list[x] + '/constants.xml') keys_file.close() @@ -105,7 +118,7 @@ def run_start(): for x in range(0, count): keypair = keypairs[x].split(" ") os.system('cd ' + LOCAL_RUN_FOLDER + testfolders_list[x] + '; echo \"' + keypair[0] + ' ' + keypair[1] + '\" > mykey.txt' + '; ulimit -n 65535; ulimit -Sc unlimited; ulimit -Hc unlimited; ./latezilliqa ' + keypair[1] + ' ' + keypair[0] + ' ' + 'NAT' + ' ' + str(NODE_LISTEN_PORT + x) + ' 0 1 0 > ./error_log_zilliqa 2>&1 &') - os.system('cd ' + LOCAL_RUN_FOLDER + testfolders_list[x] + '; echo \"' + keypair[0] + ' ' + keypair[1] + '\" > mykey.txt' + '; ulimit -n 65535; ulimit -Sc unlimited; ulimit -Hc unlimited; ./latezilliqa ' + ' --privk ' + keypair[1] + ' --pubk ' + keypair[0] + ' --address ' + 'NAT' + ' --port ' + str(NODE_LISTEN_PORT + x) + '--synctype 1 ' + '> ./error_log_zilliqa 2>&1 &') + os.system('cd ' + LOCAL_RUN_FOLDER + testfolders_list[x] + '; echo \"' + keypair[0] + ' ' + keypair[1] + '\" > mykey.txt' + '; ulimit -n 65535; ulimit -Sc unlimited; ulimit -Hc unlimited; ./latezilliqa ' + ' --privk ' + keypair[1] + ' --pubk ' + keypair[0] + ' --address ' + 'NAT' + ' --port ' + str(NODE_LISTEN_PORT + x) + '--synctype 1 ' + ' --identity normal-' + str(x) + ' > ./error_log_zilliqa 2>&1 &') if __name__ == "__main__": diff --git a/tests/Zilliqa/test_zilliqa_late.py b/tests/Zilliqa/test_zilliqa_late.py index 5fac33ac8c..9cf493cf41 100755 --- a/tests/Zilliqa/test_zilliqa_late.py +++ b/tests/Zilliqa/test_zilliqa_late.py @@ -67,7 +67,7 @@ def run_setup(numnodes, printnodes): for x in range(0, numnodes): testsubdir = LOCAL_RUN_FOLDER + 'node_' + str(x+1).zfill(4) os.makedirs(testsubdir) - shutil.copyfile('./tests/Zilliqa/zilliqa', testsubdir + '/latezilliqa') + shutil.copyfile('./bin/zilliqa', testsubdir + '/latezilliqa') st = os.stat(testsubdir + '/latezilliqa') os.chmod(testsubdir + '/latezilliqa', st.st_mode | stat.S_IEXEC) @@ -85,7 +85,7 @@ def run_start(): # Generate keypairs (sort by public key) for x in range(0, count): - process = Popen(["./tests/Zilliqa/genkeypair"], stdout=PIPE, universal_newlines=True) + process = Popen(["./bin/genkeypair"], stdout=PIPE, universal_newlines=True) (output, err) = process.communicate() exit_code = process.wait() keypairs.append(output.strip()) @@ -95,14 +95,14 @@ def run_start(): keys_file = open(LOCAL_RUN_FOLDER + 'keys.txt', "w") for x in range(0, count): keys_file.write(keypairs[x] + '\n') - shutil.copyfile('constants_local.xml', LOCAL_RUN_FOLDER + testfolders_list[x] + '/constants.xml') + shutil.copyfile('constants.xml', LOCAL_RUN_FOLDER + testfolders_list[x] + '/constants.xml') shutil.copyfile('dsnodes.xml', LOCAL_RUN_FOLDER + testfolders_list[x] + '/dsnodes.xml') keys_file.close() # Launch node zilliqa process for x in range(0, count): keypair = keypairs[x].split(" ") - os.system('cd ' + LOCAL_RUN_FOLDER + testfolders_list[x] + '; echo \"' + keypair[0] + ' ' + keypair[1] + '\" > mykey.txt' + '; ulimit -n 65535; ulimit -Sc unlimited; ulimit -Hc unlimited; $(pwd)/latezilliqa' + ' --privk ' + keypair[1] + ' --pubk ' + keypair[0] + ' --address ' + '127.0.0.1' + ' --port ' + str(NODE_LISTEN_PORT + x) + ' --synctype 1 ' + '> ./error_log_zilliqa 2>&1 &') + os.system('cd ' + LOCAL_RUN_FOLDER + testfolders_list[x] + '; echo \"' + keypair[0] + ' ' + keypair[1] + '\" > mykey.txt' + '; ulimit -n 65535; ulimit -Sc unlimited; ulimit -Hc unlimited; $(pwd)/latezilliqa' + ' --privk ' + keypair[1] + ' --pubk ' + keypair[0] + ' --address ' + '127.0.0.1' + ' --port ' + str(NODE_LISTEN_PORT + x) + ' --synctype 1 ' + ' --identity normal-' + str(x) + ' > ./error_log_zilliqa 2>&1 &') if __name__ == "__main__": main() diff --git a/tests/Zilliqa/test_zilliqa_local.py b/tests/Zilliqa/test_zilliqa_local.py index 58e5f40c7e..77e7f5d17e 100755 --- a/tests/Zilliqa/test_zilliqa_local.py +++ b/tests/Zilliqa/test_zilliqa_local.py @@ -19,393 +19,490 @@ import sys import shutil import stat -import time +import time from subprocess import Popen, PIPE import xml.etree.cElementTree as ET NODE_LISTEN_PORT = 5001 +NODE_LOOKUP_PORT = 23456 STATUS_SERVER_LISTEN_PORT = 4301 LOCAL_RUN_FOLDER = './local_run/' REJOIN_DS_GUARD_RUN_FOLDER = './dsguard_rejoin_local_run/' + def print_usage(): - print ("Testing multiple Zilliqa nodes in local machine\n" - "===============================================\n" - "Usage:\n\tpython " + sys.argv[0] + " [command] [command parameters]\n" - "Available commands:\n" - "\tTest Execution:\n" - "\t\tsetup [num-nodes] - Set up the nodes\n" - "\t\tsetupdsguard2 [num-nodes] - Start ds guard 2 executable and folder\n" - "\t\tstart [num-nodes] - Start node processes\n" - "\t\trejoindsguard2 - Start ds guard 2 and rejoin the network\n" - "\t\tvalidateBackupDB - Validate DB correctness\n" - "\t\tconnect - Connect everyone\n" - "\t\tconnect [num-nodes] - Connect first num-nodes nodes\n" - "\t\tstop - Stop node processes\n" - "\t\tclean - Remove test output files (e.g., logs)\n" - "\t\tsendcmd [nodenum] [hex msg] - Send hex msg to port\n" - "\t\tsendcmdrandom [nodenum] [msgsize] - Send msg to port\n" - "\t\tstartpow [nodenum] [ds count] [blocknum] [diff] [rand1] [rand2] - Send STARTPOW to node\n" - "\t\tcreatetx [nodenum] [from] [to] [amount] - Send CREATETRANSACTION to node\n" - "\t\tdelete - Delete the set-up nodes\n") + print("Testing multiple Zilliqa nodes in local machine\n" + "===============================================\n" + "Usage:\n\tpython " + sys.argv[0] + " [command] [command parameters]\n" + "Available commands:\n" + "\tTest Execution:\n" + "\t\tsetup [num-nodes] - Set up the nodes\n" + "\t\tsetupdsguard2 [num-nodes] - Start ds guard 2 executable and folder\n" + "\t\tstart [num-nodes] - Start node processes\n" + "\t\trejoindsguard2 - Start ds guard 2 and rejoin the network\n" + "\t\tvalidateBackupDB - Validate DB correctness\n" + "\t\tconnect - Connect everyone\n" + "\t\tconnect [num-nodes] - Connect first num-nodes nodes\n" + "\t\tstop - Stop node processes\n" + "\t\tclean - Remove test output files (e.g., logs)\n" + "\t\tsendcmd [nodenum] [hex msg] - Send hex msg to port\n" + "\t\tsendcmdrandom [nodenum] [msgsize] - Send msg to port\n" + "\t\tstartpow [nodenum] [ds count] [blocknum] [diff] [rand1] [rand2] - Send STARTPOW to node\n" + "\t\tcreatetx [nodenum] [from] [to] [amount] - Send CREATETRANSACTION to node\n" + "\t\tdelete - Delete the set-up nodes\n") + def main(): - numargs = len(sys.argv) - if (numargs < 2): - print_usage() - else: - command = sys.argv[1] - if (command == 'setup'): - print_usage() if (numargs != 3) else run_setup(numnodes=int(sys.argv[2]), printnodes=True) - elif (command == 'setupdsguard2'): - print_usage() if (numargs != 3) else run_setup_dsguard(numnodes=int(sys.argv[2]), printnodes=True) - elif(command == 'prestart'): - print_usage() if (numargs != 3) else run_prestart(numdsnodes=int(sys.argv[2])) - elif(command == 'prestartguard'): - print_usage() if (numargs != 3) else run_prestart(numdsnodes=int(sys.argv[2]), guard_mode=True) - elif (command == 'start'): - print_usage() if (numargs != 3) else run_start(numdsnodes=int(sys.argv[2])) - elif (command == 'rejoindsguard2'): - print_usage() if (numargs != 2) else run_start_dsguard2() - elif (command == 'validateBackupDB'): - print_usage() if (numargs != 2) else run_start_validateBackupDB() - elif (command == 'connect'): - if (numargs == 2): - run_connect(numnodes=0) - elif (numargs == 3): - run_connect(numnodes=int(sys.argv[2])) - else: - print_usage() - elif (command == 'stop'): - print_usage() if (numargs != 2) else run_stop() - elif (command == 'clean'): - print_usage() if (numargs != 2) else run_clean() - elif (command == 'sendcmd'): - print_usage() if (numargs != 4) else run_sendcmd(nodenum=int(sys.argv[2]), msg=sys.argv[3]) - elif (command == 'sendcmdrandom'): - print_usage() if (numargs != 4) else run_sendcmdrandom(nodenum=int(sys.argv[2]), msg_size=sys.argv[3]) - elif (command == 'startpow'): - print_usage() if (numargs != 9) else run_startpow(nodenum=int(sys.argv[2]), dscount=int(sys.argv[3]), blocknum=sys.argv[4], dsdiff=sys.argv[5], diff=sys.argv[6], rand1=sys.argv[7], rand2=sys.argv[8]) - elif (command == 'createtx'): - print_usage() if (numargs != 6) else run_createtx(nodenum=int(sys.argv[2]), fromnode=int(sys.argv[3]), tonode=int(sys.argv[4]), amount=int(sys.argv[5])) - elif (command == 'delete'): - print_usage() if (numargs != 2) else run_delete() - else: - print_usage() + numargs = len(sys.argv) + if (numargs < 2): + print_usage() + else: + command = sys.argv[1] + if (command == 'setup'): + print_usage() if (numargs != 3) else run_setup(numnodes=int(sys.argv[2]), printnodes=True) + elif (command == 'setupdsguard2'): + print_usage() if (numargs != 3) else run_setup_dsguard(numnodes=int(sys.argv[2]), printnodes=True) + elif (command == 'prestart'): + print_usage() if (numargs != 3) else run_prestart(numdsnodes=int(sys.argv[2])) + elif (command == 'prestartguard'): + print_usage() if (numargs != 3) else run_prestart(numdsnodes=int(sys.argv[2]), guard_mode=True) + elif (command == 'start'): + print_usage() if (numargs != 3) else run_start(numdsnodes=int(sys.argv[2])) + elif (command == 'rejoindsguard2'): + print_usage() if (numargs != 2) else run_start_dsguard2() + elif (command == 'validateBackupDB'): + print_usage() if (numargs != 2) else run_start_validateBackupDB() + elif (command == 'connect'): + if (numargs == 2): + run_connect(numnodes=0) + elif (numargs == 3): + run_connect(numnodes=int(sys.argv[2])) + else: + print_usage() + elif (command == 'stop'): + print_usage() if (numargs != 2) else run_stop() + elif (command == 'clean'): + print_usage() if (numargs != 2) else run_clean() + elif (command == 'sendcmd'): + print_usage() if (numargs != 4) else run_sendcmd(nodenum=int(sys.argv[2]), msg=sys.argv[3]) + elif (command == 'sendcmdrandom'): + print_usage() if (numargs != 4) else run_sendcmdrandom(nodenum=int(sys.argv[2]), msg_size=sys.argv[3]) + elif (command == 'startpow'): + print_usage() if (numargs != 9) else run_startpow(nodenum=int(sys.argv[2]), dscount=int(sys.argv[3]), + blocknum=sys.argv[4], dsdiff=sys.argv[5], + diff=sys.argv[6], rand1=sys.argv[7], rand2=sys.argv[8]) + elif (command == 'createtx'): + print_usage() if (numargs != 6) else run_createtx(nodenum=int(sys.argv[2]), fromnode=int(sys.argv[3]), + tonode=int(sys.argv[4]), amount=int(sys.argv[5])) + elif (command == 'delete'): + print_usage() if (numargs != 2) else run_delete() + else: + print_usage() + # ================ # Helper Functions # ================ def get_immediate_subdirectories(a_dir): - subdirs = [name for name in os.listdir(a_dir) if os.path.isdir(os.path.join(a_dir, name))] - subdirs.sort() - return subdirs + subdirs = [name for name in os.listdir(a_dir) if os.path.isdir(os.path.join(a_dir, name))] + subdirs.sort() + return subdirs + # ======================== # Test Execution Functions # ======================== def run_setup(numnodes, printnodes): - if os.path.exists(LOCAL_RUN_FOLDER) != True : - # shutil.rmtree(LOCAL_RUN_FOLDER) - os.makedirs(LOCAL_RUN_FOLDER) - for x in range(0, numnodes): - testsubdir = LOCAL_RUN_FOLDER + 'node_' + str(x+1).zfill(4) - if os.path.exists(testsubdir) != True : - os.makedirs(testsubdir) - shutil.copyfile('./tests/Zilliqa/zilliqa', testsubdir + '/zilliqa') - shutil.copyfile('./tests/Zilliqa/sendcmd', testsubdir + '/sendcmd') - - st = os.stat(testsubdir + '/zilliqa') - os.chmod(testsubdir + '/zilliqa', st.st_mode | stat.S_IEXEC) - st = os.stat(testsubdir + '/sendcmd') - os.chmod(testsubdir + '/sendcmd', st.st_mode | stat.S_IEXEC) - - if printnodes: - testfolders_list = get_immediate_subdirectories(LOCAL_RUN_FOLDER) - count = len(testfolders_list) - for x in range(0, count): - print ('[Node ' + str(x + 1).ljust(3) + '] [Port ' + str(NODE_LISTEN_PORT + x) - + '] [Status Server Port '+ str(STATUS_SERVER_LISTEN_PORT + x) - + '] ' + LOCAL_RUN_FOLDER + testfolders_list[x]) + if os.path.exists(LOCAL_RUN_FOLDER) != True: + # shutil.rmtree(LOCAL_RUN_FOLDER) + os.makedirs(LOCAL_RUN_FOLDER) + for x in range(0, numnodes): + testsubdir = LOCAL_RUN_FOLDER + 'node_' + str(x + 1).zfill(4) + if os.path.exists(testsubdir) != True: + os.makedirs(testsubdir) + shutil.copyfile('./bin/zilliqa', testsubdir + '/zilliqa') + shutil.copyfile('./bin/sendcmd', testsubdir + '/sendcmd') + ''' + We probably need to configure the S3 settings for download too + ''' + shutil.copyfile('../scripts/download_incr_DB.py', testsubdir + '/download_incr_DB.py') + shutil.copyfile('../scripts/download_static_DB.py', testsubdir + '/download_static_DB.py') + shutil.copyfile('../scripts/upload_incr_DB.py', testsubdir + '/upload_incr_DB.py') + shutil.copyfile('../scripts/auto_backup.py', testsubdir + '/auto_backup.py') + + st = os.stat(testsubdir + '/zilliqa') + os.chmod(testsubdir + '/zilliqa', st.st_mode | stat.S_IEXEC) + st = os.stat(testsubdir + '/sendcmd') + os.chmod(testsubdir + '/sendcmd', st.st_mode | stat.S_IEXEC) + + if printnodes: + testfolders_list = get_immediate_subdirectories(LOCAL_RUN_FOLDER) + count = len(testfolders_list) + for x in range(0, count): + print('[Node ' + str(x + 1).ljust(3) + '] [Port ' + str(NODE_LISTEN_PORT + x) + + '] [Status Server Port ' + str(STATUS_SERVER_LISTEN_PORT + x) + + '] ' + LOCAL_RUN_FOLDER + testfolders_list[x]) + def run_setup_dsguard(numnodes, printnodes): - if (os.path.exists(REJOIN_DS_GUARD_RUN_FOLDER)): - shutil.rmtree(REJOIN_DS_GUARD_RUN_FOLDER) - os.makedirs(REJOIN_DS_GUARD_RUN_FOLDER) - for x in range(0, numnodes): - testsubdir = REJOIN_DS_GUARD_RUN_FOLDER + 'node_' + str(x+1).zfill(4) - os.makedirs(testsubdir) - shutil.copyfile('./tests/Zilliqa/zilliqa', testsubdir + '/zilliqa_ds_guard_rejoin') - - st = os.stat(testsubdir + '/zilliqa_ds_guard_rejoin') - os.chmod(testsubdir + '/zilliqa_ds_guard_rejoin', st.st_mode | stat.S_IEXEC) - - if printnodes: - testfolders_list = get_immediate_subdirectories(REJOIN_DS_GUARD_RUN_FOLDER) - count = len(testfolders_list) - for x in range(0, count): - print ('[Node ' + str(x + 1).ljust(3) + '] [Port ' + str(7001) + '] ' + REJOIN_DS_GUARD_RUN_FOLDER + testfolders_list[x]) + if (os.path.exists(REJOIN_DS_GUARD_RUN_FOLDER)): + shutil.rmtree(REJOIN_DS_GUARD_RUN_FOLDER) + os.makedirs(REJOIN_DS_GUARD_RUN_FOLDER) + for x in range(0, numnodes): + testsubdir = REJOIN_DS_GUARD_RUN_FOLDER + 'node_' + str(x + 1).zfill(4) + os.makedirs(testsubdir) + shutil.copyfile('./bin/zilliqa', testsubdir + '/zilliqa_ds_guard_rejoin') + + st = os.stat(testsubdir + '/zilliqa_ds_guard_rejoin') + os.chmod(testsubdir + '/zilliqa_ds_guard_rejoin', st.st_mode | stat.S_IEXEC) + + if printnodes: + testfolders_list = get_immediate_subdirectories(REJOIN_DS_GUARD_RUN_FOLDER) + count = len(testfolders_list) + for x in range(0, count): + print('[Node ' + str(x + 1).ljust(3) + '] [Port ' + str(7001) + '] ' + REJOIN_DS_GUARD_RUN_FOLDER + + testfolders_list[x]) + def run_prestart(numdsnodes, guard_mode=False): - testfolders_list = get_immediate_subdirectories(LOCAL_RUN_FOLDER) - count = len(testfolders_list) - keypairs = [] - - # Generate keypairs (sort by public key) - for x in range(0, count): - process = Popen(["./tests/Zilliqa/genkeypair"], stdout=PIPE, universal_newlines=True) - (output, err) = process.communicate() - exit_code = process.wait() - keypairs.append(output.strip()) - keypairs.sort() - - # Use pre generated key for guard mode in local testing - # These keys are non critical and are only used for testing purposes - if guard_mode == True: - keypairs = ["02028CC4DEC0A756B42BD54905237B4E22FCC69D88CFEAA3797AEECF01D6A69E85 55009317F8B1FC7889EDF83742F684FB700EE8F970F7EDB8BDD6286A0F0A4CF1", - "021D99F2E5ACBA39ED5ACC5DCA5EE2ADDE780FFD998E1DBF440FE364C3BE360A7B 50C26000FCC08867FC3B9C03385015179E4B63282CB356014233BB1877FCDBDD", - "025C8ACD69AE4075D3F02CE07641329CEFAF6C1B24BE64187D2ECDBDD55CF934A2 67E57D32E7EF421B704C23B05A7600A56808F2910FC2944CD7C7F87684CF0F49", - "025EA8FFF868B64D5722F16FB07FB93CBFF38C5381F975CA5D0A728AEA19DBC6BC BE0CE7A97F90D433D58C873A9334819FDBF2646E08F61B470ACF996C082F0BB7", - "0268B2A0B5FFE2ADE7A38DF9A878281A8BFFA4F8EE18A20EE53F5ABA3BDDC6BF00 A351988F0776D25CE203EC21BDBAF4402E98A2A9A724C28A8E4FEC81F030AF55", - "027612A13BFA87AB22C0B3166B14873C7BEB77F0A27970BB0D1788EAA5F1BB885A 9C0A58E554511887E39E1E9BC25874B921A13FAFBB7DD4D57C8EBE6D72938C7D", - "028ED45F00C33680BFDBBADD8DDC98627BF18E7B49E83420C00DE9C9752FE8F33D 33DB54623E8AFDFE735E1D73C62F68C924811DD5CD3300FE5203B580E330A373", - "02B006BEAAFABFB738822EB4DFE3C0872A426173FF4C154D083A9C0EC5EB78A0C6 51D0976A2A9E72198D78BF229E8AB34DD9AE9E093CB1B71B4853C6839130CB6B", - "02B5D018B064A26998AD4553BD5D394E898043A9C5A4E414C9EA71F1B26E1CEF3F 13A8B01932B072D1225BDD550C5D4048F664D3AE2476F24FD1EFF123573563F5", - "02C28CDFC2CE6CE00DC38F5DBE565034BE50D382CB63FC260DA91E6828F806AAB6 C106836B85D5498112A13081A60326988012F6B0ED39480E3AB5683C69E04CB7", - "02E1626300DA30EFC798DEB27ED546BB2B4D1D8771E0907B1DAD3A0AD3BE1381CD 3016CB647ABBD35B85939FC716155777DCC41AEB54D5498A0A99BCE74A2BF119", - "02F650040BC0F3158B5D1A870EFC0ABE84FF02A4021A222FC49F9AD070ACFA2DA7 797FD9258980F9669A86E006A679815D15BD899B607454C3EDF284846F13E7E7", - "030DFD4A0CFD68016DF6EFC4A6BF0B67BA42ABEAF8D9AD65C25E97B9DA90CA4DB1 50481C07CA036990945EBE3A0B7D71FFCCF27CFF4B1DA03B1C8FB3660DA89552", - "03129EAEF8A136355FB1485941A593B4BEC4DFC5504D1114138A6D92332005DC59 CC3927D2C18849E6CFA3EE6D9322718961D2F035A1359AD1F37EEF527B5FBB15", - "037D49C420B04B9862BC1F0660544FF27F1D81EA0E5E7C161F1647FBF239F8780E EB4D499149C3582AD84CCB28E697EB0BCAF331CD7CBE43D5672C21BB9C17A477", - "03A6738E9081002097DDC71E3B72F9BBA2C0482034B8E80512D1B2DA5FFFFCBF8E 1430F36192D10C8ABCD9A22B036788C13F17830E807FEC7073B5E14E4B171265", - "03C58CD6B4C6A0E4FEC1D989D3218B67AFC82149039E174074C5FDFE58CB427028 38EB4FB242BCD8D4BBD9114307F9B7F1F90D8DB7DE0AEC356691BEC98642C062", - "03D616566DE986ADAC0E51BAF8147155993D56CCE4834607CFDDF832C3CAFD00F7 B459705C716E12044AB8263F812A9E9153269DD1449FA3B40EAA489F844BF839", - "03E4DA9E02B0830C98E99737FE63B34D068D086184583449C583A68F4DBA79BE64 7541CE8176B260B4A6D28578D2433D17A7948F3810E464C5288E86E7DCDC71AE", - "03FB81D476B3CF161AFD1AE0B861ECC907111AB891DF82028DD3D3085E2460A574 224B31816F0B529F21B14D9F04C42E7F277A024758A57BB6E1B3DEBF39A38E72"] - - nodes = ET.Element("nodes") - dsnodes = ET.Element("dsnodes"); - - # Store sorted keys list in text file - keys_file = open(LOCAL_RUN_FOLDER + 'keys.txt', "w") - for x in range(0, count): - keys_file.write(keypairs[x] + '\n') - keypair = keypairs[x].split(" ") - - if (x < numdsnodes): - ET.SubElement(dsnodes, "pubk").text = keypair[0]; - peer = ET.SubElement(nodes, "peer") - ET.SubElement(peer, "pubk").text = keypair[0] - ET.SubElement(peer, "ip").text = '127.0.0.1' - ET.SubElement(peer, "port").text = str(NODE_LISTEN_PORT + x) - keys_file.close() - - #Create dsnodes file - dsTree = ET.ElementTree(dsnodes) - dsTree.write("dsnodes.xml") - dsnodes.clear() - - # Create config_normal.xml with pubkey and IP info of all DS nodes - tree = ET.ElementTree(nodes) - tree.write("config_normal.xml") - - # Clear the element tree - nodes.clear() - - # ds_whitelist.xml generation - keys_file = open(LOCAL_RUN_FOLDER + 'keys.txt', "w") - for x in range(0, count): - keys_file.write(keypairs[x] + '\n') - keypair = keypairs[x].split(" ") - peer = ET.SubElement(nodes, "peer") - ET.SubElement(peer, "pubk").text = keypair[0] - ET.SubElement(peer, "ip").text = '127.0.0.1' - ET.SubElement(peer, "port").text = str(NODE_LISTEN_PORT + x) - keys_file.close() - - # Create ds_whitelist.xml with pubkey and IP info of all DS nodes - tree = ET.ElementTree(nodes) - tree.write("ds_whitelist.xml") - - # clear from ds_whitelist - nodes.clear() - - address_nodes = ET.Element("address") - # shard_whitelist.xml generation - keys_file = open(LOCAL_RUN_FOLDER + 'keys.txt', "w") - for x in range(0, count): - keys_file.write(keypairs[x] + '\n') - keypair = keypairs[x].split(" ") - ET.SubElement(address_nodes, "pubk").text = keypair[0] - keys_file.close() - - # Create shard_whitelist.xml with pubkey - tree = ET.ElementTree(address_nodes) - tree.write("shard_whitelist.xml") + testfolders_list = get_immediate_subdirectories(LOCAL_RUN_FOLDER) + count = len(testfolders_list) + keypairs = [] + + # Generate keypairs (sort by public key) + for x in range(0, count): + process = Popen(["./bin/genkeypair"], stdout=PIPE, universal_newlines=True) + (output, err) = process.communicate() + exit_code = process.wait() + keypairs.append(output.strip()) + keypairs.sort() + + # Use pre generated key for guard mode in local testing + # These keys are non critical and are only used for testing purposes + if guard_mode == True: + keypairs = [ + "02028CC4DEC0A756B42BD54905237B4E22FCC69D88CFEAA3797AEECF01D6A69E85 55009317F8B1FC7889EDF83742F684FB700EE8F970F7EDB8BDD6286A0F0A4CF1", + "021D99F2E5ACBA39ED5ACC5DCA5EE2ADDE780FFD998E1DBF440FE364C3BE360A7B 50C26000FCC08867FC3B9C03385015179E4B63282CB356014233BB1877FCDBDD", + "025C8ACD69AE4075D3F02CE07641329CEFAF6C1B24BE64187D2ECDBDD55CF934A2 67E57D32E7EF421B704C23B05A7600A56808F2910FC2944CD7C7F87684CF0F49", + "025EA8FFF868B64D5722F16FB07FB93CBFF38C5381F975CA5D0A728AEA19DBC6BC BE0CE7A97F90D433D58C873A9334819FDBF2646E08F61B470ACF996C082F0BB7", + "0268B2A0B5FFE2ADE7A38DF9A878281A8BFFA4F8EE18A20EE53F5ABA3BDDC6BF00 A351988F0776D25CE203EC21BDBAF4402E98A2A9A724C28A8E4FEC81F030AF55", + "027612A13BFA87AB22C0B3166B14873C7BEB77F0A27970BB0D1788EAA5F1BB885A 9C0A58E554511887E39E1E9BC25874B921A13FAFBB7DD4D57C8EBE6D72938C7D", + "028ED45F00C33680BFDBBADD8DDC98627BF18E7B49E83420C00DE9C9752FE8F33D 33DB54623E8AFDFE735E1D73C62F68C924811DD5CD3300FE5203B580E330A373", + "02B006BEAAFABFB738822EB4DFE3C0872A426173FF4C154D083A9C0EC5EB78A0C6 51D0976A2A9E72198D78BF229E8AB34DD9AE9E093CB1B71B4853C6839130CB6B", + "02B5D018B064A26998AD4553BD5D394E898043A9C5A4E414C9EA71F1B26E1CEF3F 13A8B01932B072D1225BDD550C5D4048F664D3AE2476F24FD1EFF123573563F5", + "02C28CDFC2CE6CE00DC38F5DBE565034BE50D382CB63FC260DA91E6828F806AAB6 C106836B85D5498112A13081A60326988012F6B0ED39480E3AB5683C69E04CB7", + "02E1626300DA30EFC798DEB27ED546BB2B4D1D8771E0907B1DAD3A0AD3BE1381CD 3016CB647ABBD35B85939FC716155777DCC41AEB54D5498A0A99BCE74A2BF119", + "02F650040BC0F3158B5D1A870EFC0ABE84FF02A4021A222FC49F9AD070ACFA2DA7 797FD9258980F9669A86E006A679815D15BD899B607454C3EDF284846F13E7E7", + "030DFD4A0CFD68016DF6EFC4A6BF0B67BA42ABEAF8D9AD65C25E97B9DA90CA4DB1 50481C07CA036990945EBE3A0B7D71FFCCF27CFF4B1DA03B1C8FB3660DA89552", + "03129EAEF8A136355FB1485941A593B4BEC4DFC5504D1114138A6D92332005DC59 CC3927D2C18849E6CFA3EE6D9322718961D2F035A1359AD1F37EEF527B5FBB15", + "037D49C420B04B9862BC1F0660544FF27F1D81EA0E5E7C161F1647FBF239F8780E EB4D499149C3582AD84CCB28E697EB0BCAF331CD7CBE43D5672C21BB9C17A477", + "03A6738E9081002097DDC71E3B72F9BBA2C0482034B8E80512D1B2DA5FFFFCBF8E 1430F36192D10C8ABCD9A22B036788C13F17830E807FEC7073B5E14E4B171265", + "03C58CD6B4C6A0E4FEC1D989D3218B67AFC82149039E174074C5FDFE58CB427028 38EB4FB242BCD8D4BBD9114307F9B7F1F90D8DB7DE0AEC356691BEC98642C062", + "03D616566DE986ADAC0E51BAF8147155993D56CCE4834607CFDDF832C3CAFD00F7 B459705C716E12044AB8263F812A9E9153269DD1449FA3B40EAA489F844BF839", + "03E4DA9E02B0830C98E99737FE63B34D068D086184583449C583A68F4DBA79BE64 7541CE8176B260B4A6D28578D2433D17A7948F3810E464C5288E86E7DCDC71AE", + "03FB81D476B3CF161AFD1AE0B861ECC907111AB891DF82028DD3D3085E2460A574 224B31816F0B529F21B14D9F04C42E7F277A024758A57BB6E1B3DEBF39A38E72"] + + nodes = ET.Element("nodes") + dsnodes = ET.Element("dsnodes"); + + # Store sorted keys list in text file + keys_file = open(LOCAL_RUN_FOLDER + 'normal_keys.txt', "w") + for x in range(0, count): + keys_file.write(keypairs[x] + '\n') + keypair = keypairs[x].split(" ") + + if (x < numdsnodes): + ET.SubElement(dsnodes, "pubk").text = keypair[0]; + peer = ET.SubElement(nodes, "peer") + ET.SubElement(peer, "pubk").text = keypair[0] + ET.SubElement(peer, "ip").text = '127.0.0.1' + ET.SubElement(peer, "port").text = str(NODE_LISTEN_PORT + x) + keys_file.close() + + # Create dsnodes file + dsTree = ET.ElementTree(dsnodes) + dsTree.write("dsnodes.xml") + dsnodes.clear() + + # Create config_normal.xml with pubkey and IP info of all DS nodes + tree = ET.ElementTree(nodes) + tree.write("config_normal.xml") + + # Clear the element tree + nodes.clear() + + # ds_whitelist.xml generation + keys_file = open(LOCAL_RUN_FOLDER + 'normal_keys.txt', "w") + for x in range(0, count): + keys_file.write(keypairs[x] + '\n') + keypair = keypairs[x].split(" ") + peer = ET.SubElement(nodes, "peer") + ET.SubElement(peer, "pubk").text = keypair[0] + ET.SubElement(peer, "ip").text = '127.0.0.1' + ET.SubElement(peer, "port").text = str(NODE_LISTEN_PORT + x) + keys_file.close() + + # Create ds_whitelist.xml with pubkey and IP info of all DS nodes + tree = ET.ElementTree(nodes) + tree.write("ds_whitelist.xml") + + # clear from ds_whitelist + nodes.clear() + + address_nodes = ET.Element("address") + # shard_whitelist.xml generation + keys_file = open(LOCAL_RUN_FOLDER + 'normal_keys.txt', "w") + for x in range(0, count): + keys_file.write(keypairs[x] + '\n') + keypair = keypairs[x].split(" ") + ET.SubElement(address_nodes, "pubk").text = keypair[0] + keys_file.close() + + # Create shard_whitelist.xml with pubkey + tree = ET.ElementTree(address_nodes) + tree.write("shard_whitelist.xml") + def run_start(numdsnodes): + testfolders_list = get_immediate_subdirectories(LOCAL_RUN_FOLDER) + count = len(testfolders_list) + + fp = "constants.xml" + + if not os.path.exists(fp): + print( fp +" not found") + return + + # Load the keypairs + keypairs = [] + with open(LOCAL_RUN_FOLDER + 'normal_keys.txt', "r") as f: + keypairs = f.readlines() + keypairs = [x.strip() for x in keypairs] + + # Launch node Zilliqa process + for x in range(0, count): + keypair = keypairs[x].split(" ") + shutil.copyfile('ds_whitelist.xml', LOCAL_RUN_FOLDER + testfolders_list[x] + '/ds_whitelist.xml') + shutil.copyfile('shard_whitelist.xml', LOCAL_RUN_FOLDER + testfolders_list[x] + '/shard_whitelist.xml') + shutil.copyfile(fp, LOCAL_RUN_FOLDER + testfolders_list[x] + '/constants.xml') + ipc_path = "/tmp/zilliqa" + str(NODE_LISTEN_PORT + x) + ".sock" + status_server_port = str(STATUS_SERVER_LISTEN_PORT + x) + + '''patch_lookup_pubkey(LOCAL_RUN_FOLDER + testfolders_list[x] + '/dsnodes.xml', keypairs)''' + '''patch_seed_pubkey(LOCAL_RUN_FOLDER + testfolders_list[x] + '/dsnodes.xml', keypairs)''' + + patch_param_in_xml(LOCAL_RUN_FOLDER + testfolders_list[x] + '/constants.xml', ipc_path, status_server_port) + + shutil.copyfile('dsnodes.xml', LOCAL_RUN_FOLDER + testfolders_list[x] + '/dsnodes.xml') + + if (x < numdsnodes): + shutil.copyfile('config_normal.xml', LOCAL_RUN_FOLDER + testfolders_list[x] + '/config.xml') + os.system('cd ' + LOCAL_RUN_FOLDER + testfolders_list[x] + '; echo \"' + keypair[0] + ' ' + keypair[ + 1] + '\" > mykey.txt' + '; ulimit -n 65535; ulimit -Sc unlimited; ulimit -Hc unlimited; $(pwd)/zilliqa ' + ' --privk ' + + keypair[1] + ' --pubk ' + keypair[0] + ' --address ' + '127.0.0.1' + ' --port ' + str( + NODE_LISTEN_PORT + x) + ' --identity normal-' + str(x) + ' > ./error_log_zilliqa 2>&1 &') + else: + os.system('cd ' + LOCAL_RUN_FOLDER + testfolders_list[x] + '; echo \"' + keypair[0] + ' ' + keypair[ + 1] + '\" > mykey.txt' + '; ulimit -n 65535; ulimit -Sc unlimited; ulimit -Hc unlimited; $(pwd)/zilliqa ' + ' --privk ' + + keypair[1] + ' --pubk ' + keypair[0] + ' --address ' + '127.0.0.1' + ' --port ' + str( + NODE_LISTEN_PORT + x) + ' --identity normal-' + str(x) + ' > ./error_log_zilliqa 2>&1 &') + + - testfolders_list = get_immediate_subdirectories(LOCAL_RUN_FOLDER) - count = len(testfolders_list) - - # Load the keypairs - keypairs = [] - with open(LOCAL_RUN_FOLDER + 'keys.txt', "r") as f: - keypairs = f.readlines() - keypairs = [x.strip() for x in keypairs] - - # Launch node Zilliqa process - for x in range(0, count): - keypair = keypairs[x].split(" ") - shutil.copyfile('ds_whitelist.xml', LOCAL_RUN_FOLDER + testfolders_list[x] + '/ds_whitelist.xml') - shutil.copyfile('shard_whitelist.xml', LOCAL_RUN_FOLDER + testfolders_list[x] + '/shard_whitelist.xml') - shutil.copyfile('constants_local.xml', LOCAL_RUN_FOLDER + testfolders_list[x] + '/constants.xml') - ipc_path = "/tmp/zilliqa" + str(NODE_LISTEN_PORT + x) + ".sock" - status_server_port = str(STATUS_SERVER_LISTEN_PORT + x) - patch_param_in_xml(LOCAL_RUN_FOLDER + testfolders_list[x] + '/constants.xml', ipc_path, status_server_port) - - shutil.copyfile('dsnodes.xml', LOCAL_RUN_FOLDER + testfolders_list[x] + '/dsnodes.xml') - - if (x < numdsnodes): - shutil.copyfile('config_normal.xml', LOCAL_RUN_FOLDER + testfolders_list[x] + '/config.xml') - os.system('cd ' + LOCAL_RUN_FOLDER + testfolders_list[x] + '; echo \"' + keypair[0] + ' ' + keypair[1] + '\" > mykey.txt' + '; ulimit -n 65535; ulimit -Sc unlimited; ulimit -Hc unlimited; $(pwd)/zilliqa ' + ' --privk ' + keypair[1] + ' --pubk ' + keypair[0] + ' --address ' + '127.0.0.1' + ' --port ' + str(NODE_LISTEN_PORT + x) + ' > ./error_log_zilliqa 2>&1 &') - else: - os.system('cd ' + LOCAL_RUN_FOLDER + testfolders_list[x] + '; echo \"' + keypair[0] + ' ' + keypair[1] + '\" > mykey.txt' + '; ulimit -n 65535; ulimit -Sc unlimited; ulimit -Hc unlimited; $(pwd)/zilliqa ' + ' --privk ' + keypair[1] + ' --pubk ' + keypair[0] + ' --address ' + '127.0.0.1' + ' --port ' + str(NODE_LISTEN_PORT + x) + ' > ./error_log_zilliqa 2>&1 &') def patch_param_in_xml(filepath, ipc_path, status_server_port): - root = ET.parse(filepath).getroot() - td = root.find('jsonrpc') - td.find('SCILLA_IPC_SOCKET_PATH').text = ipc_path - td.find('STATUS_RPC_PORT').text = status_server_port + root = ET.parse(filepath).getroot() + + td = root.find('jsonrpc') + ''' TODO will need extending for other params''' + td.find('SCILLA_IPC_SOCKET_PATH').text = ipc_path + td.find('STATUS_RPC_PORT').text = status_server_port + + tree = ET.ElementTree(root) + tree.write(filepath) + + +def patch_lookup_pubkey(filepath, keypairs): + root = ET.parse(filepath).getroot() + td = root.find('lookups') + if td: + root.remove(td) + root.append(ET.Element('lookups')) + td = root.find('lookups') + p = ET.SubElement(td, "peer") + ET.SubElement(p, "pubkey").text = keypairs[0].split(" ")[0] + ET.SubElement(p, "ip").text = '127.0.0.1' + ET.SubElement(p, "port").text = str(NODE_LISTEN_PORT) + ET.SubElement(p, "hostname").text = None + + tree = ET.ElementTree(root) + tree.write(filepath) + + +def patch_seed_pubkey(filepath, keypairs): + root = ET.parse(filepath).getroot() + td = root.find('upper_seed') + if td: + root.remove(td) + root.append(ET.Element('upper_seed')) + td = root.find('upper_seed') + p = ET.SubElement(td, "peer") + ET.SubElement(p, "pubkey").text = keypairs[0].split(" ")[0] + ET.SubElement(p, "ip").text = '127.0.0.1' + ET.SubElement(p, "port").text = str(NODE_LISTEN_PORT) + ET.SubElement(p, "hostname").text = None + + tree = ET.ElementTree(root) + tree.write(filepath) - tree = ET.ElementTree(root) - tree.write(filepath) # To rejoin ds guard index 2 def run_start_dsguard2(): - testfolders_list = get_immediate_subdirectories(REJOIN_DS_GUARD_RUN_FOLDER) - count = len(testfolders_list) + testfolders_list = get_immediate_subdirectories(REJOIN_DS_GUARD_RUN_FOLDER) + count = len(testfolders_list) + + for x in range(0, count): + shutil.copyfile('dsnodes.xml', REJOIN_DS_GUARD_RUN_FOLDER + testfolders_list[x] + '/dsnodes.xml') + shutil.copyfile('constants.xml', REJOIN_DS_GUARD_RUN_FOLDER + testfolders_list[x] + '/constants.xml') - for x in range(0, count): - shutil.copyfile('dsnodes.xml', REJOIN_DS_GUARD_RUN_FOLDER + testfolders_list[x] + '/dsnodes.xml') - shutil.copyfile('constants_local.xml', REJOIN_DS_GUARD_RUN_FOLDER + testfolders_list[x] + '/constants.xml') + # These keys are non critical and are only used for testing purposes + keypairs = "021D99F2E5ACBA39ED5ACC5DCA5EE2ADDE780FFD998E1DBF440FE364C3BE360A7B 50C26000FCC08867FC3B9C03385015179E4B63282CB356014233BB1877FCDBDD" - # These keys are non critical and are only used for testing purposes - keypairs = "021D99F2E5ACBA39ED5ACC5DCA5EE2ADDE780FFD998E1DBF440FE364C3BE360A7B 50C26000FCC08867FC3B9C03385015179E4B63282CB356014233BB1877FCDBDD" + # Launch node zilliqa process + keypair = keypairs.split(" ") + os.system('cd ' + REJOIN_DS_GUARD_RUN_FOLDER + testfolders_list[x] + '; echo \"' + keypair[0] + ' ' + keypair[ + 1] + '\" > mykey.txt' + '; ulimit -n 65535; ulimit -Sc unlimited; ulimit -Hc unlimited; ./zilliqa_ds_guard_rejoin ' + + keypair[1] + ' ' + keypair[0] + ' ' + '127.0.0.1' + ' ' + str( + 7001) + ' 0 7 0 > ./error_log_zilliqa 2>&1 &') + print("Running and rejoining ds guard at port " + str(7001)) - # Launch node zilliqa process - keypair = keypairs.split(" ") - os.system('cd ' + REJOIN_DS_GUARD_RUN_FOLDER + testfolders_list[x] + '; echo \"' + keypair[0] + ' ' + keypair[1] + '\" > mykey.txt' + '; ulimit -n 65535; ulimit -Sc unlimited; ulimit -Hc unlimited; ./zilliqa_ds_guard_rejoin ' + keypair[1] + ' ' + keypair[0] + ' ' + '127.0.0.1' + ' ' + str(7001) + ' 0 7 0 > ./error_log_zilliqa 2>&1 &') - print("Running and rejoining ds guard at port "+ str(7001)) # To validate the correctness of backup persistence def run_start_validateBackupDB(): - testfolders_list = get_immediate_subdirectories(LOCAL_RUN_FOLDER) - count = len(testfolders_list) - - # Load the keypairs - keypairs = [] - with open(LOCAL_RUN_FOLDER + 'keys.txt', "r") as f: - keypairs = f.readlines() - keypairs = [x.strip() for x in keypairs] - - # Launch node Zilliqa process - keypair = keypairs[0].split(" ") - shutil.copyfile('ds_whitelist.xml', LOCAL_RUN_FOLDER + testfolders_list[0] + '/ds_whitelist.xml') - shutil.copyfile('shard_whitelist.xml', LOCAL_RUN_FOLDER + testfolders_list[0] + '/shard_whitelist.xml') - shutil.copyfile('constants_local.xml', LOCAL_RUN_FOLDER + testfolders_list[0] + '/constants.xml') - shutil.copyfile('dsnodes.xml', LOCAL_RUN_FOLDER + testfolders_list[0] + '/dsnodes.xml') - shutil.copyfile('config_normal.xml', LOCAL_RUN_FOLDER + testfolders_list[0] + '/config.xml') - os.system('cd ' + LOCAL_RUN_FOLDER + testfolders_list[0] + '; echo \"' + keypair[0] + ' ' + keypair[1] + '\" > mykey.txt' + '; ulimit -n 65535; ulimit -Sc unlimited; ulimit -Hc unlimited; $(pwd)/zilliqa ' + ' --privk ' + keypair[1] + ' --pubk ' + keypair[0] + ' --address ' + '127.0.0.1' + ' --port ' + str(NODE_LISTEN_PORT + 0) + ' --synctype 5 --recovery 1 > ./error_log_zilliqa 2>&1 &') + testfolders_list = get_immediate_subdirectories(LOCAL_RUN_FOLDER) + count = len(testfolders_list) + + # Load the keypairs + keypairs = [] + with open(LOCAL_RUN_FOLDER + 'normal_keys.txt', "r") as f: + keypairs = f.readlines() + keypairs = [x.strip() for x in keypairs] + + # Launch node Zilliqa process + keypair = keypairs[0].split(" ") + shutil.copyfile('ds_whitelist.xml', LOCAL_RUN_FOLDER + testfolders_list[0] + '/ds_whitelist.xml') + shutil.copyfile('shard_whitelist.xml', LOCAL_RUN_FOLDER + testfolders_list[0] + '/shard_whitelist.xml') + shutil.copyfile('constants.xml', LOCAL_RUN_FOLDER + testfolders_list[0] + '/constants.xml') + shutil.copyfile('dsnodes.xml', LOCAL_RUN_FOLDER + testfolders_list[0] + '/dsnodes.xml') + shutil.copyfile('config_normal.xml', LOCAL_RUN_FOLDER + testfolders_list[0] + '/config.xml') + os.system('cd ' + LOCAL_RUN_FOLDER + testfolders_list[0] + '; echo \"' + keypair[0] + ' ' + keypair[ + 1] + '\" > mykey.txt' + '; ulimit -n 65535; ulimit -Sc unlimited; ulimit -Hc unlimited; $(pwd)/zilliqa ' + ' --privk ' + + keypair[1] + ' --pubk ' + keypair[0] + ' --address ' + '127.0.0.1' + ' --port ' + str( + NODE_LISTEN_PORT + 0) + ' --synctype 5 --recovery 1 '+ ' --identity normal-' + str(x) + '> ./error_log_zilliqa 2>&1 &') + def run_connect(numnodes): - testfolders_list = get_immediate_subdirectories(LOCAL_RUN_FOLDER) - count = len(testfolders_list) - if ((numnodes == 0) or (numnodes > count)): - numnodes = count - - # Load the keypairs - keypairs = [] - with open(LOCAL_RUN_FOLDER + 'keys.txt', "r") as f: - keypairs = f.readlines() - keypairs = [x.strip() for x in keypairs] - - # Connect nodes (exchange hello messages) - edges = set() - for x in range(0, numnodes): - connect_cmd = 'cd ' + LOCAL_RUN_FOLDER + testfolders_list[x] + '; ulimit -Sc unlimited; ulimit -Hc unlimited; ./sendcmd' + ' --port ' + str(NODE_LISTEN_PORT + x) + ' --cmd ' + 'addpeers' - has_peers_to_connect = False - for y in range(x + 1, numnodes): - index = y - if ((x + 1, index + 1) in edges): - continue - elif ((index + 1, x + 1) in edges): - continue - elif (x == index): - continue - else: - has_peers_to_connect = True - keypair = keypairs[index].split(" ") - print ('connecting node ' + str(x + 1) + ' (port ' + str(NODE_LISTEN_PORT + x) + ') to node ' + str(index + 1) + ' (' + str(NODE_LISTEN_PORT + index) + ')') - connect_cmd = connect_cmd + ' --cmdarg ' + keypair[0] + ' --cmdarg ' + '127.0.0.1' + ' --cmdarg ' + str(NODE_LISTEN_PORT + index) - if (x < index): - edges.add((x + 1, index + 1)) - else: - edges.add((index + 1, x + 1)) - if has_peers_to_connect: - os.system(connect_cmd + ' &') - time.sleep(1) - - print ('Total num of edges connected: ' + str(len(edges))) + testfolders_list = get_immediate_subdirectories(LOCAL_RUN_FOLDER) + count = len(testfolders_list) + if ((numnodes == 0) or (numnodes > count)): + numnodes = count + + # Load the keypairs + keypairs = [] + with open(LOCAL_RUN_FOLDER + 'normal_keys.txt', "r") as f: + keypairs = f.readlines() + keypairs = [x.strip() for x in keypairs] + + # Connect nodes (exchange hello messages) + edges = set() + for x in range(0, numnodes): + connect_cmd = 'cd ' + LOCAL_RUN_FOLDER + testfolders_list[ + x] + '; ulimit -Sc unlimited; ulimit -Hc unlimited; ./sendcmd' + ' --port ' + str( + NODE_LISTEN_PORT + x) + ' --cmd ' + 'addpeers' + has_peers_to_connect = False + for y in range(x + 1, numnodes): + index = y + if ((x + 1, index + 1) in edges): + continue + elif ((index + 1, x + 1) in edges): + continue + elif (x == index): + continue + else: + has_peers_to_connect = True + keypair = keypairs[index].split(" ") + print('connecting node ' + str(x + 1) + ' (port ' + str(NODE_LISTEN_PORT + x) + ') to node ' + str( + index + 1) + ' (' + str(NODE_LISTEN_PORT + index) + ')') + connect_cmd = connect_cmd + ' --cmdarg ' + keypair[0] + ' --cmdarg ' + '127.0.0.1' + ' --cmdarg ' + str( + NODE_LISTEN_PORT + index) + if (x < index): + edges.add((x + 1, index + 1)) + else: + edges.add((index + 1, x + 1)) + if has_peers_to_connect: + os.system(connect_cmd + ' &') + time.sleep(1) + + print('Total num of edges connected: ' + str(len(edges))) + def run_stop(): - os.system('killall zilliqa') - if os.path.exists(LOCAL_RUN_FOLDER): - testfolders_list = get_immediate_subdirectories(LOCAL_RUN_FOLDER) - count = len(testfolders_list) - for x in range(0, count): - os.system('fuser -k ' + str(NODE_LISTEN_PORT + x) + '/tcp') + os.system('killall zilliqa') + if os.path.exists(LOCAL_RUN_FOLDER): + testfolders_list = get_immediate_subdirectories(LOCAL_RUN_FOLDER) + count = len(testfolders_list) + for x in range(0, count): + os.system('fuser -k ' + str(NODE_LISTEN_PORT + x) + '/tcp') + def run_clean(): - testfolders_list = get_immediate_subdirectories(LOCAL_RUN_FOLDER) - count = len(testfolders_list) - run_setup(count, False) + testfolders_list = get_immediate_subdirectories(LOCAL_RUN_FOLDER) + count = len(testfolders_list) + run_setup(count, False) + def run_sendcmd(nodenum, msg): - os.system('tests/Zilliqa/sendcmd' + ' --port ' + str(NODE_LISTEN_PORT + nodenum - 1) + ' --cmd ' + 'cmd' + ' --cmdarg ' + msg) - + os.system( + './bin/sendcmd' + ' --port ' + str(NODE_LISTEN_PORT + nodenum - 1) + ' --cmd ' + 'cmd' + ' --cmdarg ' + msg) + + def run_sendcmdrandom(nodenum, msg_size): - # msg = "000400" + 'A' * msg_size * 2 - # os.system('tests/Zilliqa/sendcmd ' + str(NODE_LISTEN_PORT + nodenum - 1) + ' cmd ' + msg) - os.system('tests/Zilliqa/sendcmd' + ' --port ' + str(NODE_LISTEN_PORT) + ' --cmd ' + 'broadcast' + ' --cmdarg ' + msg_size) + # msg = "000400" + 'A' * msg_size * 2 + # os.system('./bin/sendcmd ' + str(NODE_LISTEN_PORT + nodenum - 1) + ' cmd ' + msg) + os.system('./bin/sendcmd' + ' --port ' + str(NODE_LISTEN_PORT) + ' --cmd ' + 'broadcast' + ' --cmdarg ' + msg_size) + def run_startpow(nodenum, dscount, blocknum, dsdiff, diff, rand1, rand2): - testfolders_list = get_immediate_subdirectories(LOCAL_RUN_FOLDER) - count = len(testfolders_list) + testfolders_list = get_immediate_subdirectories(LOCAL_RUN_FOLDER) + count = len(testfolders_list) - # Load the keypairs - keypairs = [] - with open(LOCAL_RUN_FOLDER + 'keys.txt', "r") as f: - keypairs = f.readlines() - keypairs = [x.strip() for x in keypairs] + # Load the keypairs + keypairs = [] + with open(LOCAL_RUN_FOLDER + 'normal_keys.txt', "r") as f: + keypairs = f.readlines() + keypairs = [x.strip() for x in keypairs] - # Assemble the STARTPOW message - startpow_cmd = 'tests/Zilliqa/sendcmd' + ' --port ' + str(NODE_LISTEN_PORT + nodenum - 1) + ' --cmd ' + 'cmd' + ' --cmdarg 0200' + blocknum + dsdiff + diff + rand1 + rand2 - for x in range(0, dscount): - keypair = keypairs[x].split(" ") - startpow_cmd = startpow_cmd + keypair[0] + '0000000000000000000000000100007F' + "{0:0{1}x}".format(NODE_LISTEN_PORT + x, 8) + # Assemble the STARTPOW message + startpow_cmd = './bin/sendcmd' + ' --port ' + str( + NODE_LISTEN_PORT + nodenum - 1) + ' --cmd ' + 'cmd' + ' --cmdarg 0200' + blocknum + dsdiff + diff + rand1 + rand2 + for x in range(0, dscount): + keypair = keypairs[x].split(" ") + startpow_cmd = startpow_cmd + keypair[0] + '0000000000000000000000000100007F' + "{0:0{1}x}".format( + NODE_LISTEN_PORT + x, 8) + + # Send to node + os.system(startpow_cmd) - # Send to node - os.system(startpow_cmd) def run_delete(): - if (os.path.exists(LOCAL_RUN_FOLDER)): - shutil.rmtree(LOCAL_RUN_FOLDER) + if (os.path.exists(LOCAL_RUN_FOLDER)): + shutil.rmtree(LOCAL_RUN_FOLDER) + if __name__ == "__main__": - main() + main() diff --git a/tests/Zilliqa/test_zilliqa_lookup.py b/tests/Zilliqa/test_zilliqa_lookup.py index 5fac9a1f3f..ed1d7d404a 100755 --- a/tests/Zilliqa/test_zilliqa_lookup.py +++ b/tests/Zilliqa/test_zilliqa_lookup.py @@ -14,17 +14,15 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -import subprocess import os import sys import shutil import stat -import time from subprocess import Popen, PIPE import xml.etree.cElementTree as ET -NODE_LISTEN_PORT = 4001 +NODE_LISTEN_PORT = 23456 LOCAL_RUN_FOLDER = './lookup_local_run/' LOCAL_FOLDER = "./" @@ -33,169 +31,198 @@ # need to be an absolute path TXN_PATH = "/tmp/zilliqa_txns" + def print_usage(): - print ("Testing multiple Zilliqa nodes in local machine\n" - "===============================================\n" - "Usage:\n\tpython " + sys.argv[0] + " [command] [command parameters]\n" - "Available commands:\n" - "\tTest Execution:\n" - "\t\tsetup [num-nodes] - Set up the nodes\n" - "\t\tstart - Start node processes\n" - "\t\tgentxn [seconds] - generate transactions\n") + print("Testing multiple Zilliqa nodes in local machine\n" + "===============================================\n" + "Usage:\n\tpython " + sys.argv[0] + " [command] [command parameters]\n" + "Available commands:\n" + "\tTest Execution:\n" + "\t\tsetup [num-nodes] - Set up the nodes\n" + "\t\tstart - Start node processes\n" + "\t\tgentxn [seconds] - generate transactions\n") + def main(): - numargs = len(sys.argv) - if (numargs < 2): - print_usage() - else: - command = sys.argv[1] - if (command == 'setup'): - print_usage() if (numargs != 3) else run_setup(numnodes=int(sys.argv[2]), printnodes=True) - elif (command == 'start'): - print_usage() if (numargs != 2) else run_start() - elif (command == 'gentxn'): - print_usage() if (numargs != 3) else run_gentxn(batch=int(sys.argv[2])) - else: - print_usage() + numargs = len(sys.argv) + if numargs < 2: + print_usage() + else: + command = sys.argv[1] + if command == 'setup': + print_usage() if (numargs != 3) else run_setup(numnodes=int(sys.argv[2]), printnodes=True) + elif command == 'start': + print_usage() if (numargs != 2) else run_start() + elif command == 'gentxn': + print_usage() if (numargs != 3) else run_gentxn(batch=int(sys.argv[2])) + else: + print_usage() + # ================ # Helper Functions # ================ def get_immediate_subdirectories(a_dir): - subdirs = [name for name in os.listdir(a_dir) if os.path.isdir(os.path.join(a_dir, name)) and name.startswith('node')] - subdirs.sort() - return subdirs + subdirs = [name for name in os.listdir(a_dir) if + os.path.isdir(os.path.join(a_dir, name)) and name.startswith('node')] + subdirs.sort() + return subdirs + # ======================== # Test Execution Functions # ======================== def run_setup(numnodes, printnodes): - os.system('killall lzilliqa') - if os.path.exists(LOCAL_RUN_FOLDER) != True: - # shutil.rmtree(LOCAL_RUN_FOLDER) - os.makedirs(LOCAL_RUN_FOLDER) - for x in range(0, numnodes): - testsubdir = LOCAL_RUN_FOLDER + 'node_' + str(x+1).zfill(4) - if os.path.exists(testsubdir) != True : - os.makedirs(testsubdir) - shutil.copyfile('./tests/Zilliqa/zilliqa', testsubdir + '/lzilliqa') - - st = os.stat(testsubdir + '/lzilliqa') - os.chmod(testsubdir + '/lzilliqa', st.st_mode | stat.S_IEXEC) - - if printnodes: - testfolders_list = get_immediate_subdirectories(LOCAL_RUN_FOLDER) - count = len(testfolders_list) - for x in range(0, count): - print ('[Node ' + str(x + 1).ljust(3) + '] [Port ' + str(NODE_LISTEN_PORT + x) + '] ' + LOCAL_RUN_FOLDER + testfolders_list[x]) - - - keypairs = [] - # Generate keypairs (sort by public key) - for x in range(0, count): - process = Popen(["./tests/Zilliqa/genkeypair"], stdout=PIPE, universal_newlines=True) - (output, err) = process.communicate() - exit_code = process.wait() - keypairs.append(output.strip()) - keypairs.sort() - - patch_lookup_pubkey(LOCAL_FOLDER + "/constants_local.xml", keypairs, count) - patch_seed_pubkey(LOCAL_FOLDER + "/constants_local.xml", keypairs, count) - nodes = ET.Element("nodes") - - # Store sorted keys list in text file - keys_file = open(LOCAL_RUN_FOLDER + 'keys.txt', "w") - for x in range(0, count): - keys_file.write(keypairs[x] + '\n') - keypair = keypairs[x].split(" ") - if (x < count): - peer = ET.SubElement(nodes, "peer") - ET.SubElement(peer, "pubk").text = keypair[0] - ET.SubElement(peer, "ip").text = '127.0.0.1' - ET.SubElement(peer, "port").text = str(NODE_LISTEN_PORT + x) - keys_file.close() + os.system('killall lzilliqa') + if os.path.exists(LOCAL_RUN_FOLDER) is not True: + # shutil.rmtree(LOCAL_RUN_FOLDER) + os.makedirs(LOCAL_RUN_FOLDER) + for x in range(0, numnodes): + testsubdir = LOCAL_RUN_FOLDER + 'node_' + str(x + 1).zfill(4) + if os.path.exists(testsubdir) is not True: + os.makedirs(testsubdir) + shutil.copyfile('./bin/zilliqa', testsubdir + '/lzilliqa') + + st = os.stat(testsubdir + '/lzilliqa') + os.chmod(testsubdir + '/lzilliqa', st.st_mode | stat.S_IEXEC) + + testfolders_list = get_immediate_subdirectories(LOCAL_RUN_FOLDER) + count = len(testfolders_list) + + + + if printnodes: + for x in range(0, count): + print('[Node ' + str(x + 1).ljust(3) + '] [Port ' + str(NODE_LISTEN_PORT + x) + '] ' + LOCAL_RUN_FOLDER + + testfolders_list[x]) + + keypairs = [] + # Generate keypairs (sort by public key) + for x in range(0, count): + process = Popen(["./bin/genkeypair"], stdout=PIPE, universal_newlines=True) + (output, err) = process.communicate() + exit_code = process.wait() + keypairs.append(output.strip()) + keypairs.sort() + + patch_lookup_pubkey(LOCAL_FOLDER + "constants.xml", keypairs) + patch_seed_pubkey(LOCAL_FOLDER + "constants.xml", keypairs) + + nodes = ET.Element("nodes") + + # Store sorted keys list in text file + keys_file = open(LOCAL_RUN_FOLDER + 'lookup_keys.txt', "w") + for x in range(0, count): + keys_file.write(keypairs[x] + '\n') + keys_file.close() def patch_constants_xml(filepath, read_txn=False): - root = ET.parse(filepath).getroot() + root = ET.parse(filepath).getroot() - td = root.find('dispatcher') - td.find('TXN_PATH').text = TXN_PATH - if read_txn: - td.find('USE_REMOTE_TXN_CREATOR').text='true' + general = root.find('general') + general.find('LOOKUP_NODE_MODE').text = 'true' - general = root.find('general') - general.find('LOOKUP_NODE_MODE').text = 'true' + tree = ET.ElementTree(root) + tree.write(filepath) - tree = ET.ElementTree(root) - tree.write(filepath) def run_gentxn(batch=100): - if not os.path.exists(TXN_PATH): - os.makedirs(TXN_PATH) + if not os.path.exists(TXN_PATH): + os.makedirs(TXN_PATH) - if not os.path.exists(GENTXN_WORKING_DIR): - os.makedirs(GENTXN_WORKING_DIR) + if not os.path.exists(GENTXN_WORKING_DIR): + os.makedirs(GENTXN_WORKING_DIR) - print("Created gentxn working folder: " + GENTXN_WORKING_DIR) - shutil.copy('bin/gentxn', os.path.join(GENTXN_WORKING_DIR, 'gentxn')) - gentxn_constants_xml_path = os.path.join(GENTXN_WORKING_DIR, 'constants.xml') - shutil.copyfile('constants_local.xml', gentxn_constants_xml_path) + print("Created gentxn working folder: " + GENTXN_WORKING_DIR) + shutil.copy('bin/gentxn', os.path.join(GENTXN_WORKING_DIR, 'gentxn')) + gentxn_constants_xml_path = os.path.join(GENTXN_WORKING_DIR, 'constants.xml') + shutil.copyfile('constants_local.xml', gentxn_constants_xml_path) - if os.path.exists(gentxn_constants_xml_path): - patch_constants_xml(gentxn_constants_xml_path) + if os.path.exists(gentxn_constants_xml_path): + patch_constants_xml(gentxn_constants_xml_path) - print("Waiting gentxn for creating {} batches".format(batch)) - os.system('cd ' + GENTXN_WORKING_DIR + '; ./gentxn --begin 0 --end {}'.format(batch)) + print("Waiting gentxn for creating {} batches".format(batch)) + os.system('cd ' + GENTXN_WORKING_DIR + '; ./gentxn --begin 0 --end {}'.format(batch)) -def patch_lookup_pubkey(filepath, keypairs, count): - root = ET.parse(filepath).getroot() - td = root.find('lookups') - elems = td.findall('peer/pubkey') - for x in range(0, count): - keypair = keypairs[x].split(" ") - elems[x].text = keypair[0] - tree = ET.ElementTree(root) - tree.write(filepath) -def patch_seed_pubkey(filepath, keypairs, count): +def patch_lookup_pubkey(filepath, keypairs): root = ET.parse(filepath).getroot() - td = root.find('upper_seed') - elems = td.findall('peer/pubkey') - for x in range(0, count): - keypair = keypairs[x].split(" ") - elems[x].text = keypair[0] + td = root.find('lookups') + if td: + root.remove(td) + root.append(ET.Element('lookups')) + td = root.find('lookups') + p = ET.SubElement(td, "peer") + ET.SubElement(p, "pubkey").text = keypairs[0].split(" ")[0] + ET.SubElement(p, "ip").text = '127.0.0.1' + ET.SubElement(p, "port").text = str(NODE_LISTEN_PORT) + ET.SubElement(p, "hostname").text = None + tree = ET.ElementTree(root) tree.write(filepath) +def patch_seed_pubkey(filepath, keypairs): + root = ET.parse(filepath).getroot() + td = root.find('upper_seed') + if td: + root.remove(td) + root.append(ET.Element('upper_seed')) + td = root.find('upper_seed') + p = ET.SubElement(td, "peer") + ET.SubElement(p, "pubkey").text = keypairs[0].split(" ")[0] + ET.SubElement(p, "ip").text = '127.0.0.1' + ET.SubElement(p, "port").text = str(NODE_LISTEN_PORT) + ET.SubElement(p, "hostname").text = None + + tree = ET.ElementTree(root) + tree.write(filepath) + def run_start(): - testfolders_list = get_immediate_subdirectories(LOCAL_RUN_FOLDER) - count = len(testfolders_list) - - # Load the keypairs - keypairs = [] - with open(LOCAL_RUN_FOLDER + 'keys.txt', "r") as f: - keypairs = f.readlines() - keypairs = [x.strip() for x in keypairs] - - - for x in range(0, count): - shutil.copyfile('config_normal.xml', LOCAL_RUN_FOLDER + testfolders_list[x] + '/config.xml') - shutil.copyfile('constants_local.xml', LOCAL_RUN_FOLDER + testfolders_list[x] + '/constants.xml') - shutil.copyfile('dsnodes.xml',LOCAL_RUN_FOLDER+testfolders_list[x]+'/dsnodes.xml') - # FIXME: every lookup node has the option USE_REMOTE_TXN_CREATOR set to true, which seemingly - # enable transaction dispatching on every lookup running locally. However, the truth is only the - # one with the jsonrpc server running will do the transaction dispatching and coincidentally there - # will be only one as there is an unknown issue that multiple lookup nodes are having port collision - # on 4201 and eventually only one will get the port and others won't be able to start jsonrpc server - patch_constants_xml(LOCAL_RUN_FOLDER + testfolders_list[x] + '/constants.xml', True) - - # Launch node zilliqa process - for x in range(0, count): - keypair = keypairs[x].split(" ") - os.system('cd ' + LOCAL_RUN_FOLDER + testfolders_list[x] + '; echo \"' + keypair[0] + ' ' + keypair[1] + '\" > mykey.txt' + '; ulimit -n 65535; ulimit -Sc unlimited; ulimit -Hc unlimited; $(pwd)/lzilliqa ' + ' --privk ' + keypair[1] + ' --pubk ' + keypair[0] + ' --address ' + '127.0.0.1' + ' --port ' + str(NODE_LISTEN_PORT + x) + ' > ./error_log_zilliqa 2>&1 &') + testfolders_list = get_immediate_subdirectories(LOCAL_RUN_FOLDER) + count = len(testfolders_list) + + dev_root = os.getenv("DEV_TREE_ROOT") + if dev_root is None: + print("DEV_TREE_ROOT is not set") + return + + + fp = LOCAL_FOLDER + "constants.xml" + + if not os.path.exists(fp): + print( fp +" not found") + return + + # Load the keypairs + keypairs = [] + with open(LOCAL_RUN_FOLDER + 'lookup_keys.txt', "r") as f: + keypairs = f.readlines() + keypairs = [x.strip() for x in keypairs] + + for x in range(0, count): + shutil.copyfile('config_normal.xml', LOCAL_RUN_FOLDER + testfolders_list[x] + '/config.xml') + shutil.copyfile(fp, LOCAL_RUN_FOLDER + testfolders_list[x] + '/constants.xml') + shutil.copyfile('dsnodes.xml', LOCAL_RUN_FOLDER + testfolders_list[x] + '/dsnodes.xml') + # FIXME: every lookup node has the option USE_REMOTE_TXN_CREATOR set to true, which seemingly + # enable transaction dispatching on every lookup running locally. However, the truth is only the + # one with the jsonrpc server running will do the transaction dispatching and coincidentally there + # will be only one as there is an unknown issue that multiple lookup nodes are having port collision + # on 4201 and eventually only one will get the port and others won't be able to start jsonrpc server + patch_constants_xml(LOCAL_RUN_FOLDER + testfolders_list[x] + '/constants.xml', True) + + # Launch node zilliqa process + for x in range(0, count): + keypair = keypairs[x].split(" ") + start_str = ' --privk ' + keypair[1] + ' --pubk ' + keypair[0] + ' --address ' + '127.0.0.1' + ' --port ' + str(NODE_LISTEN_PORT + x) + ' --identity ' + 'lookup-' + str(x) + print(start_str) + os.system('cd ' + LOCAL_RUN_FOLDER + testfolders_list[x] + '; echo \"' + keypair[0] + ' ' + keypair[ + 1] + '\" > mykey.txt' + '; ulimit -n 65535; ulimit -Sc unlimited; ulimit -Hc unlimited; $(pwd)/lzilliqa ' + + ' --privk ' + keypair[1] + ' --pubk ' + keypair[0] + ' --address ' + '127.0.0.1' + ' --port ' + + str(NODE_LISTEN_PORT + x) + ' --identity ' + 'lookup-' + str(x) + ' > ./error_log_zilliqa 2>&1 &') + if __name__ == "__main__": - main() + main() diff --git a/tests/Zilliqa/test_zilliqa_seedpub.py b/tests/Zilliqa/test_zilliqa_seedpub.py new file mode 100755 index 0000000000..31f852194d --- /dev/null +++ b/tests/Zilliqa/test_zilliqa_seedpub.py @@ -0,0 +1,214 @@ +#!/usr/bin/env python +# Copyright (C) 2019 Zilliqa +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import os +import sys +import shutil +import stat + +from subprocess import Popen, PIPE +import xml.etree.cElementTree as ET + + +NODE_LISTEN_PORT = 4201 + +LOCAL_RUN_FOLDER = './seedpub_local_run/' +LOCAL_FOLDER = "./" + +GENTXN_WORKING_DIR = os.path.join(LOCAL_RUN_FOLDER, 'gentxn') + +# need to be an absolute path +TXN_PATH = "/tmp/zilliqa_txns" + + +def print_usage(): + print("Testing multiple Zilliqa nodes in local machine\n" + "===============================================\n" + "Usage:\n\tpython " + sys.argv[0] + " [command] [command parameters]\n" + "Available commands:\n" + "\tTest Execution:\n" + "\t\tsetup [num-nodes] - Set up the nodes\n" + "\t\tstart - Start node processes\n" + "\t\tgentxn [seconds] - generate transactions\n") + + +def main(): + numargs = len(sys.argv) + if numargs < 2: + print_usage() + else: + command = sys.argv[1] + if command == 'setup': + print_usage() if (numargs != 3) else run_setup(numnodes=int(sys.argv[2]), printnodes=True) + elif command == 'start': + print_usage() if (numargs != 2) else run_start() + elif command == 'gentxn': + print_usage() if (numargs != 3) else run_gentxn(batch=int(sys.argv[2])) + else: + print_usage() + + +# ================ +# Helper Functions +# ================ + +def get_immediate_subdirectories(a_dir): + subdirs = [name for name in os.listdir(a_dir) if + os.path.isdir(os.path.join(a_dir, name)) and name.startswith('node')] + subdirs.sort() + return subdirs + + +# ======================== +# Test Execution Functions +# ======================== + +def run_setup(numnodes, printnodes): + os.system('killall seedpub') + if os.path.exists(LOCAL_RUN_FOLDER) is not True: + # shutil.rmtree(LOCAL_RUN_FOLDER) + os.makedirs(LOCAL_RUN_FOLDER) + for x in range(0, numnodes): + testsubdir = LOCAL_RUN_FOLDER + 'node_' + str(x + 1).zfill(4) + if os.path.exists(testsubdir) is not True: + os.makedirs(testsubdir) + shutil.copyfile('./bin/zilliqa', testsubdir + '/seedpub') + + st = os.stat(testsubdir + '/seedpub') + os.chmod(testsubdir + '/seedpub', st.st_mode | stat.S_IEXEC) + + testfolders_list = get_immediate_subdirectories(LOCAL_RUN_FOLDER) + count = len(testfolders_list) + + if printnodes: + for x in range(0, count): + print('[Node ' + str(x + 1).ljust(3) + '] [Port ' + str(NODE_LISTEN_PORT + x) + '] ' + LOCAL_RUN_FOLDER + + testfolders_list[x]) + + keypairs = [] + # Generate keypairs (sort by public key) + for x in range(0, count): + process = Popen(["./bin/genkeypair"], stdout=PIPE, universal_newlines=True) + (output, err) = process.communicate() + exit_code = process.wait() + keypairs.append(output.strip()) + keypairs.sort() + + + nodes = ET.Element("nodes") + + # Store sorted keys list in text file + keys_file = open(LOCAL_RUN_FOLDER + 'seedpub_keys.txt', "w") + for x in range(0, count): + keys_file.write(keypairs[x] + '\n') + keypair = keypairs[x].split(" ") + if x < count: + peer = ET.SubElement(nodes, "peer") + ET.SubElement(peer, "pubk").text = keypair[0] + ET.SubElement(peer, "ip").text = '127.0.0.1' + ET.SubElement(peer, "port").text = str(NODE_LISTEN_PORT + x) + keys_file.close() + + +def patch_constants_xml(filepath, read_txn=False): + return + +def run_gentxn(batch=100): + if not os.path.exists(TXN_PATH): + os.makedirs(TXN_PATH) + + if not os.path.exists(GENTXN_WORKING_DIR): + os.makedirs(GENTXN_WORKING_DIR) + + print("Created gentxn working folder: " + GENTXN_WORKING_DIR) + shutil.copy('bin/gentxn', os.path.join(GENTXN_WORKING_DIR, 'gentxn')) + gentxn_constants_xml_path = os.path.join(GENTXN_WORKING_DIR, 'constants.xml') + shutil.copyfile('constants_local.xml', gentxn_constants_xml_path) + + if os.path.exists(gentxn_constants_xml_path): + patch_constants_xml(gentxn_constants_xml_path) + + print("Waiting gentxn for creating {} batches".format(batch)) + os.system('cd ' + GENTXN_WORKING_DIR + '; ./gentxn --begin 0 --end {}'.format(batch)) + + +def patch_lookup_pubkey(filepath, keypairs, count): + root = ET.parse(filepath).getroot() + td = root.find('lookups') + elems = td.findall('peer/pubkey') + for x in range(0, count): + keypair = keypairs[x].split(" ") + elems[x].text = keypair[0] + tree = ET.ElementTree(root) + tree.write(filepath) + + +def patch_seed_pubkey(filepath, keypairs, count): + root = ET.parse(filepath).getroot() + td = root.find('upper_seed') + elems = td.findall('peer/pubkey') + for x in range(0, count): + keypair = keypairs[x].split(" ") + elems[x].text = keypair[0] + tree = ET.ElementTree(root) + tree.write(filepath) + + +def run_start(): + testfolders_list = get_immediate_subdirectories(LOCAL_RUN_FOLDER) + count = len(testfolders_list) + dev_root = os.getenv("DEV_TREE_ROOT") + if dev_root is None: + print("DEV_TREE_ROOT is not set") + return + + dev_root += "/Zilliqa" + fp = dev_root + "/" + "constants.xml" + + if not os.path.exists(fp): + print( fp +" not found") + return + + + + # Load the keypairs + keypairs = [] + with open(LOCAL_RUN_FOLDER + 'seedpub_keys.txt', "r") as f: + keypairs = f.readlines() + keypairs = [x.strip() for x in keypairs] + + for x in range(0, count): + shutil.copyfile('config_normal.xml', LOCAL_RUN_FOLDER + testfolders_list[x] + '/config.xml') + shutil.copyfile(fp, LOCAL_RUN_FOLDER + testfolders_list[x] + '/constants.xml') + shutil.copyfile('dsnodes.xml', LOCAL_RUN_FOLDER + testfolders_list[x] + '/dsnodes.xml') + # FIXME: every lookup node has the option USE_REMOTE_TXN_CREATOR set to true, which seemingly + # enable transaction dispatching on every lookup running locally. However, the truth is only the + # one with the jsonrpc server running will do the transaction dispatching and coincidentally there + # will be only one as there is an unknown issue that multiple lookup nodes are having port collision + # on 4201 and eventually only one will get the port and others won't be able to start jsonrpc server + patch_constants_xml(LOCAL_RUN_FOLDER + testfolders_list[x] + '/constants.xml', True) + + # Launch node zilliqa process + for x in range(0, count): + keypair = keypairs[x].split(" ") + os.system('cd ' + LOCAL_RUN_FOLDER + testfolders_list[x] + '; echo \"' + keypair[0] + ' ' + keypair[ + 1] + '\" > mykey.txt' + '; ulimit -n 65535; ulimit -Sc unlimited; ulimit -Hc unlimited; $(pwd)/seedpub ' + + ' --privk ' + keypair[1] + ' --pubk ' + keypair[0] + ' --address ' + '127.0.0.1' + ' --port ' + + str(NODE_LISTEN_PORT + x) + ' --identity ' + 'seedpub-' + str(x) + ' > ./error_log_zilliqa 2>&1 &') + + +if __name__ == "__main__": + main() diff --git a/tests/native/CMakeLists.txt b/tests/native/CMakeLists.txt new file mode 100644 index 0000000000..f4ec8a10cd --- /dev/null +++ b/tests/native/CMakeLists.txt @@ -0,0 +1,2 @@ +file(GLOB TEST_ZILLIQA_FILES *.sh *.py) +file(COPY ${TEST_ZILLIQA_FILES} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/tests/native/prepare_constants.py b/tests/native/prepare_constants.py new file mode 100644 index 0000000000..9d83961f50 --- /dev/null +++ b/tests/native/prepare_constants.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python +# Copyright (C) 2019 Zilliqa +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +import os +import shutil +import sys +from xml.etree import cElementTree as ET +def update_xml_files(source_file, target_file): + + root = ET.parse(source_file).getroot() + if not root: + print("Failed to parse xml file") + os.abort() + + DEV_TREE_ROOT=os.environ.get('DEV_TREE_ROOT') + + if not DEV_TREE_ROOT: + print("DEV_TREE_ROOT is not set") + os.abort() + else: + print("DEV_TREE_ROOT: " + DEV_TREE_ROOT) + + general = root.find('general') + if general: + general.find('LOOKUP_NODE_MODE').text = 'false' + general.find('DEBUG_LEVEL').text = '4' + else: + print("Failed to find general") + + scilla_root = root.find('smart_contract') + if scilla_root: + scilla_root.find('SCILLA_ROOT').text = DEV_TREE_ROOT +'/scilla' + scilla_root.find('ENABLE_SCILLA_MULTI_VERSION').text = 'false' + else: + print("Failed to find smart_contract") + jsonrpc = root.find('jsonrpc') + if jsonrpc: + jsonrpc.find('EVM_SERVER_BINARY').text = DEV_TREE_ROOT + '/Zilliqa/evm-ds/target/release/evm-ds' + jsonrpc.find('ENABLE_STATUS_RPC').text = 'false' + jsonrpc.find('LOOKUP_RPC_PORT').text = "4201" + else: + print("Failed to find jsonrpc") + + metric = root.find('metric/zilliqa') + if metric: + metric.find('METRIC_ZILLIQA_PROVIDER').text = 'NONE' + metric.find('METRIC_ZILLIQA_MASK').text = 'NONE' + else: + print("Failed to find metric") + + trace = root.find('trace/zilliqa') + if trace: + trace.find('TRACE_ZILLIQA_PROVIDER').text = 'NONE' + trace.find('TRACE_ZILLIQA_MASK').text = 'NONE' + else: + print("Failed to find trace") + + logging = root.find('logging/zilliqa') + if logging: + logging.find('LOGGING_ZILLIQA_PROVIDER').text = 'NONE' + else: + print("Failed to find logging") + + tree = ET.ElementTree(root) + tree.write(target_file) + +def main(): + numargs = len(sys.argv) + if (numargs < 2): + os.abort() + else: + in_file = sys.argv[1] + out_file = sys.argv[2] + + update_xml_files(in_file, out_file) + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/tests/native/start_native.sh b/tests/native/start_native.sh new file mode 100755 index 0000000000..a3b5e59bca --- /dev/null +++ b/tests/native/start_native.sh @@ -0,0 +1,29 @@ +#!/bin/bash +# Copyright (C) 2019 Zilliqa +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +export DEV_TREE_ROOT=`readlink -f $(pwd)/../..` + +# This script and following scripts use DEV_TREE_ROOT to find the root of the dev tree +# this is also referenced in the python code to allow moving trees and OSes + + +echo "DEV_TREE_ROOT: $DEV_TREE_ROOT" + +# takes a copy of constants.xml and constants_local.xml and prepares new versions with .native extension + +python ./tests/native/prepare_constants.py constants.xml constants.xml + +./tests/Node/pre_run.sh && ./tests/Node/test_node_lookup.sh && ./tests/Node/test_node_simple.sh From cbc1566d25c413cf72684788481f5864e6a86841 Mon Sep 17 00:00:00 2001 From: Chetan Phirke Date: Wed, 1 Nov 2023 13:57:50 +0530 Subject: [PATCH 10/61] Update the version to v9.3.0rc5 --- VERSION | 2 +- src/libUtils/SWInfo.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 79a4810bd0..a88d83f2b7 100644 --- a/VERSION +++ b/VERSION @@ -3,7 +3,7 @@ === [Zilliqa]Minor Version === 3 === [Zilliqa]Fix Version === -0rc4 +0rc5 === [Zilliqa] Expected DS Epoch=== 0 === [Scilla] Expected DS Epoch=== diff --git a/src/libUtils/SWInfo.h b/src/libUtils/SWInfo.h index b36bb982dd..4ccbec43b0 100644 --- a/src/libUtils/SWInfo.h +++ b/src/libUtils/SWInfo.h @@ -22,7 +22,7 @@ #include #include "common/Serializable.h" -const std::string VERSION_TAG = "v9.3.0rc4"; +const std::string VERSION_TAG = "v9.3.0rc5"; const std::string ZILLIQA_BRAND = "Copyright (C) Zilliqa. Version " + VERSION_TAG + ". "; From f089b1d877888d0fcf605b97b8bc05882e10716b Mon Sep 17 00:00:00 2001 From: stephen white Date: Tue, 31 Oct 2023 09:10:50 +0000 Subject: [PATCH 11/61] Fixes to the scripts and startups - does not touch cpp files. --- src/libNetwork/P2PServer.cpp | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/libNetwork/P2PServer.cpp b/src/libNetwork/P2PServer.cpp index e9173e038e..cd58de02b4 100644 --- a/src/libNetwork/P2PServer.cpp +++ b/src/libNetwork/P2PServer.cpp @@ -231,9 +231,6 @@ void P2PServerConnection::ReadNextMessage() { if (!ec) { assert(n == HDR_LEN); } - if (ec) { - // LOG_GENERAL(WARNING, "Got error code: " << ec.message()); - } if (ec != OPERATION_ABORTED) { self->OnHeaderRead(ec); } @@ -275,9 +272,6 @@ void P2PServerConnection::OnHeaderRead(const ErrorCode& ec) { if (!ec) { assert(n == self->m_readBuffer.size() - HDR_LEN); } - if (ec) { - // LOG_GENERAL(WARNING, "Got error code: " << ec.message()); - } if (ec != OPERATION_ABORTED) { self->OnBodyRead(ec); } @@ -286,7 +280,7 @@ void P2PServerConnection::OnHeaderRead(const ErrorCode& ec) { void P2PServerConnection::OnBodyRead(const ErrorCode& ec) { if (ec) { - LOG_GENERAL(INFO, "Read error: " << ec.message()); + LOG_GENERAL(WARNING, "Read error: " << ec.message()); CloseSocket(); OnConnectionClosed(); return; @@ -333,7 +327,7 @@ void P2PServerConnection::CloseSocket() { if (ec) { m_socket.close(ec); if (ec) { - LOG_GENERAL(INFO, "Informational, not an issue - Error closing socket: " << ec.message()); + LOG_GENERAL(DEBUG, "Informational, not an issue - Error closing socket: " << ec.message()); } return; } @@ -354,12 +348,12 @@ void P2PServerConnection::CloseSocket() { boost::container::small_vector buf; buf.resize(unread); m_socket.read_some(boost::asio::mutable_buffer(buf.data(), unread), ec); - LOG_GENERAL(INFO, "Draining remaining IO before close" << m_remotePeer.GetPrintableIPAddress()); + LOG_GENERAL(DEBUG, "Draining remaining IO before close" << m_remotePeer.GetPrintableIPAddress()); } while (!ec && (unread = m_socket.available(ec)) > 0); } m_socket.close(ec); if (ec) { - LOG_GENERAL(INFO, "Informational, not an issue - Error closing socket: " << ec.message()); + LOG_GENERAL(DEBUG, "Informational, not an issue - Error closing socket: " << ec.message()); } } From c876d4a2f883090ef69aacc9ab79953397f9907b Mon Sep 17 00:00:00 2001 From: stephen white Date: Tue, 31 Oct 2023 11:59:44 +0000 Subject: [PATCH 12/61] Toned down the warnings in p2pserver CHanged socket paths for Scilla --- tests/Zilliqa/test_zilliqa_local.py | 16 +++++++++----- tests/Zilliqa/test_zilliqa_lookup.py | 31 +++++++++++++++++++++------- 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/tests/Zilliqa/test_zilliqa_local.py b/tests/Zilliqa/test_zilliqa_local.py index 77e7f5d17e..64fd92a9ac 100755 --- a/tests/Zilliqa/test_zilliqa_local.py +++ b/tests/Zilliqa/test_zilliqa_local.py @@ -30,6 +30,7 @@ STATUS_SERVER_LISTEN_PORT = 4301 LOCAL_RUN_FOLDER = './local_run/' REJOIN_DS_GUARD_RUN_FOLDER = './dsguard_rejoin_local_run/' +SCILLA_SOCKET_NAME = "/tmp/scilla-ipc-socket" def print_usage(): @@ -289,13 +290,15 @@ def run_start(numdsnodes): shutil.copyfile('ds_whitelist.xml', LOCAL_RUN_FOLDER + testfolders_list[x] + '/ds_whitelist.xml') shutil.copyfile('shard_whitelist.xml', LOCAL_RUN_FOLDER + testfolders_list[x] + '/shard_whitelist.xml') shutil.copyfile(fp, LOCAL_RUN_FOLDER + testfolders_list[x] + '/constants.xml') - ipc_path = "/tmp/zilliqa" + str(NODE_LISTEN_PORT + x) + ".sock" + ipc_path = LOCAL_RUN_FOLDER + testfolders_list[x] + "/scilla" + ".sock" + scilla_server_path = LOCAL_RUN_FOLDER + testfolders_list[x] + "/scilla-server" + ".sock" status_server_port = str(STATUS_SERVER_LISTEN_PORT + x) '''patch_lookup_pubkey(LOCAL_RUN_FOLDER + testfolders_list[x] + '/dsnodes.xml', keypairs)''' '''patch_seed_pubkey(LOCAL_RUN_FOLDER + testfolders_list[x] + '/dsnodes.xml', keypairs)''' - patch_param_in_xml(LOCAL_RUN_FOLDER + testfolders_list[x] + '/constants.xml', ipc_path, status_server_port) + patch_param_in_xml(LOCAL_RUN_FOLDER + testfolders_list[x] + '/constants.xml', ipc_path, scilla_server_path, + status_server_port) shutil.copyfile('dsnodes.xml', LOCAL_RUN_FOLDER + testfolders_list[x] + '/dsnodes.xml') @@ -314,14 +317,17 @@ def run_start(numdsnodes): -def patch_param_in_xml(filepath, ipc_path, status_server_port): +def patch_param_in_xml(filepath, ipc_path, scilla_server_path, status_server_port): root = ET.parse(filepath).getroot() td = root.find('jsonrpc') ''' TODO will need extending for other params''' - td.find('SCILLA_IPC_SOCKET_PATH').text = ipc_path - td.find('STATUS_RPC_PORT').text = status_server_port + if td: + print("Setting SCILLA_IPC_SOCKET_PATH to " + ipc_path + " and STATUS_RPC_PORT to " + status_server_port ) + td.find('SCILLA_IPC_SOCKET_PATH').text = ipc_path + td.find('SCILLA_SERVER_SOCKET_PATH').text = scilla_server_path + td.find('STATUS_RPC_PORT').text = status_server_port tree = ET.ElementTree(root) tree.write(filepath) diff --git a/tests/Zilliqa/test_zilliqa_lookup.py b/tests/Zilliqa/test_zilliqa_lookup.py index ed1d7d404a..a695cf70db 100755 --- a/tests/Zilliqa/test_zilliqa_lookup.py +++ b/tests/Zilliqa/test_zilliqa_lookup.py @@ -25,6 +25,7 @@ NODE_LISTEN_PORT = 23456 LOCAL_RUN_FOLDER = './lookup_local_run/' LOCAL_FOLDER = "./" +STATUS_SERVER_LISTEN_PORT = 5555 GENTXN_WORKING_DIR = os.path.join(LOCAL_RUN_FOLDER, 'gentxn') @@ -91,8 +92,6 @@ def run_setup(numnodes, printnodes): testfolders_list = get_immediate_subdirectories(LOCAL_RUN_FOLDER) count = len(testfolders_list) - - if printnodes: for x in range(0, count): print('[Node ' + str(x + 1).ljust(3) + '] [Port ' + str(NODE_LISTEN_PORT + x) + '] ' + LOCAL_RUN_FOLDER + @@ -118,12 +117,20 @@ def run_setup(numnodes, printnodes): keys_file.write(keypairs[x] + '\n') keys_file.close() -def patch_constants_xml(filepath, read_txn=False): + +def patch_constants_xml(filepath, ipc_path, scilla_server_path, status_server_port): root = ET.parse(filepath).getroot() general = root.find('general') general.find('LOOKUP_NODE_MODE').text = 'true' + td = root.find('jsonrpc') + if td: + print("Setting SCILLA_IPC_SOCKET_PATH to " + ipc_path + " and STATUS_RPC_PORT to " + status_server_port) + td.find('SCILLA_IPC_SOCKET_PATH').text = ipc_path + td.find('SCILLA_SERVER_SOCKET_PATH').text = scilla_server_path + td.find('STATUS_RPC_PORT').text = status_server_port + tree = ET.ElementTree(root) tree.write(filepath) @@ -180,6 +187,7 @@ def patch_seed_pubkey(filepath, keypairs): tree = ET.ElementTree(root) tree.write(filepath) + def run_start(): testfolders_list = get_immediate_subdirectories(LOCAL_RUN_FOLDER) count = len(testfolders_list) @@ -189,11 +197,10 @@ def run_start(): print("DEV_TREE_ROOT is not set") return - fp = LOCAL_FOLDER + "constants.xml" if not os.path.exists(fp): - print( fp +" not found") + print(fp + " not found") return # Load the keypairs @@ -202,6 +209,10 @@ def run_start(): keypairs = f.readlines() keypairs = [x.strip() for x in keypairs] + ipc_path = "ipc.socket" + scilla_server_path = "scilla-server.socket" + status_server_port = str(STATUS_SERVER_LISTEN_PORT) + for x in range(0, count): shutil.copyfile('config_normal.xml', LOCAL_RUN_FOLDER + testfolders_list[x] + '/config.xml') shutil.copyfile(fp, LOCAL_RUN_FOLDER + testfolders_list[x] + '/constants.xml') @@ -211,12 +222,18 @@ def run_start(): # one with the jsonrpc server running will do the transaction dispatching and coincidentally there # will be only one as there is an unknown issue that multiple lookup nodes are having port collision # on 4201 and eventually only one will get the port and others won't be able to start jsonrpc server - patch_constants_xml(LOCAL_RUN_FOLDER + testfolders_list[x] + '/constants.xml', True) + ipc_path = LOCAL_RUN_FOLDER + testfolders_list[x] + "/scilla" + ".sock" + scilla_server_path = LOCAL_RUN_FOLDER + testfolders_list[x] + "/scilla-server" + ".sock" + status_server_port = str(STATUS_SERVER_LISTEN_PORT + x) + + patch_constants_xml(LOCAL_RUN_FOLDER + testfolders_list[x] + '/constants.xml', ipc_path, scilla_server_path, + status_server_port) # Launch node zilliqa process for x in range(0, count): keypair = keypairs[x].split(" ") - start_str = ' --privk ' + keypair[1] + ' --pubk ' + keypair[0] + ' --address ' + '127.0.0.1' + ' --port ' + str(NODE_LISTEN_PORT + x) + ' --identity ' + 'lookup-' + str(x) + start_str = ' --privk ' + keypair[1] + ' --pubk ' + keypair[0] + ' --address ' + '127.0.0.1' + ' --port ' + str( + NODE_LISTEN_PORT + x) + ' --identity ' + 'lookup-' + str(x) print(start_str) os.system('cd ' + LOCAL_RUN_FOLDER + testfolders_list[x] + '; echo \"' + keypair[0] + ' ' + keypair[ 1] + '\" > mykey.txt' + '; ulimit -n 65535; ulimit -Sc unlimited; ulimit -Hc unlimited; $(pwd)/lzilliqa ' + From 88ae3b4a5ac12400ad6f80a2b333fe465358ae6b Mon Sep 17 00:00:00 2001 From: stephen white Date: Tue, 31 Oct 2023 12:22:09 +0000 Subject: [PATCH 13/61] Toned down the warnings in p2pserver CHanged socket paths for Scilla Added a readme. and a clean.sh script --- tests/native/clean.sh | 18 ++++++++++++++++++ tests/native/readme | 22 ++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100755 tests/native/clean.sh create mode 100644 tests/native/readme diff --git a/tests/native/clean.sh b/tests/native/clean.sh new file mode 100755 index 0000000000..5774e6da27 --- /dev/null +++ b/tests/native/clean.sh @@ -0,0 +1,18 @@ +#!/bin/bash +# Copyright (C) 2019 Zilliqa +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# rather brute force but useful. +rm -rf local_run lookup_local_run +killall -9 zilliqa lzilliqa scilla-server diff --git a/tests/native/readme b/tests/native/readme new file mode 100644 index 0000000000..415a6ba6bb --- /dev/null +++ b/tests/native/readme @@ -0,0 +1,22 @@ +This is a very simple guide to get the native code up and running fro minimum set of tasks, a bunch of nodes and a lookup +server, its WIP and is been added to as we use it to debug more and more of the platform. + +use build.sh tests debug to build the native code, it will create a directory called build and put the binaries in there. + +from the zilliqa/build directory + +./tests/native/start_native.sh + +That's it, more coming soon, this will fire up a system with ten nodes and a lookup server using the constants.xml in the root of Zilliqa. + +The software makes a copy and overrides all the values it specifically needs. + +The software currently creates subdirectories under the build directory, these are local_run - contains the normal nodes , lookup_local_run contains the lookup server. + +Each directory has one directory per node, the node directory contains the node specific files, the lookup directory contains the lookup specific files. + +This is where you will find the relevant logs and other useful files for debugging. + +More coming soon. + +Steve. \ No newline at end of file From 9295d0a147913d7aa349983dc661bc0f680065d3 Mon Sep 17 00:00:00 2001 From: stephen white Date: Wed, 1 Nov 2023 11:29:51 +0000 Subject: [PATCH 14/61] Toned down the warnings in p2pserver CHanged socket paths for Scilla Added a readme. and a clean.sh script --- build.sh | 2 +- constants.xml | 14 +++++++------- docker/Dockerfile | 30 ++++++++++++++++-------------- src/libNetwork/P2PServer.cpp | 6 ++++-- 4 files changed, 28 insertions(+), 24 deletions(-) diff --git a/build.sh b/build.sh index ddcb804891..7bbb5360fc 100755 --- a/build.sh +++ b/build.sh @@ -170,7 +170,7 @@ echo "Current directory: $(pwd)" echo "Build directory: ${build_dir}" echo "Install directory: ${install_dir}" -jobs=$((n_parallel - 1)) +jobs=3 echo building using $jobs jobs diff --git a/constants.xml b/constants.xml index 9eae455481..85ed624396 100644 --- a/constants.xml +++ b/constants.xml @@ -2,7 +2,7 @@ - 4 + 3 false false 25 @@ -126,7 +126,7 @@ 127.0.0.1 - false + true false true @@ -134,13 +134,13 @@ 3 6 - 10 - 10 - 1000 + 5 + 5 + 2000 0 18 - true - true + false + false diff --git a/docker/Dockerfile b/docker/Dockerfile index fd1faa5c05..e69b95014c 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -18,7 +18,7 @@ ARG SCILLA_VERSION=v0.13.4 ARG SCILLA_IMAGE=zilliqa/scilla:${SCILLA_VERSION} # Common dependencies of the builder and runner stages. -FROM ubuntu:22.04 AS base +FROM arm64v8/ubuntu:22.04 AS base # Format guideline: one package per line and keep them alphabetically sorted RUN apt-get update \ && apt-get install -y software-properties-common \ @@ -78,12 +78,11 @@ ENV SCCACHE_DIR="/sccache" ENV RUSTC_WRAPPER="/root/.cargo/bin/sccache" ARG CMAKE_VERSION=3.25.1 -RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-Linux-x86_64.sh \ - && echo "6598da34f0e3a0f763809e25cfdd646aa1d5e4d133c4277821e63ae5cfe09457 cmake-${CMAKE_VERSION}-Linux-x86_64.sh" | sha256sum -c \ +RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-Linux-aarch64.sh \ && mkdir -p "${HOME}"/.local \ - && bash ./cmake-${CMAKE_VERSION}-Linux-x86_64.sh --skip-license --prefix="${HOME}"/.local/ \ + && bash ./cmake-${CMAKE_VERSION}-Linux-aarch64.sh --skip-license --prefix="${HOME}"/.local/ \ && "${HOME}"/.local/bin/cmake --version \ - && rm cmake-${CMAKE_VERSION}-Linux-x86_64.sh + && rm cmake-${CMAKE_VERSION}-Linux-aarch64.sh ENV PATH="/root/.local/bin:${PATH}" # Setup ccache @@ -98,6 +97,7 @@ ARG VCPKG_ROOT=/vcpkg RUN ccache -p && ccache -z +ENV VCPKG_FORCE_SYSTEM_BINARIES=1 # If COMMIT_OR_TAG is a branch name or a tag, clone a shallow copy which is # faster; if this fails, just clone the full repo and checkout the commit. RUN git clone https://github.com/microsoft/vcpkg ${VCPKG_ROOT} \ @@ -116,9 +116,11 @@ RUN apt update -y \ && curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - \ && apt update -y && apt install -y google-cloud-cli -ENV VCPKG_BINARY_SOURCES="default,readwrite;x-gcs,gs://vcpkg/ubuntu/22.04/x64-linux-dynamic/${VCPKG_COMMIT_OR_TAG}/,read" +ENV VCPKG_BINARY_SOURCES="default,readwrite;x-gcs,gs://vcpkg/ubuntu/22.04/arm64-linux-dynamic/${VCPKG_COMMIT_OR_TAG}/,readwrite" -RUN --mount=type=cache,target=/root/.cache/vcpkg/ ${VCPKG_ROOT}/vcpkg install --triplet=x64-linux-dynamic +RUN --mount=type=cache,target=/root/.cache/vcpkg/ \ + echo "set(VCPKG_TARGET_ARCHITECTURE arm64)\nset(VCPKG_CRT_LINKAGE dynamic)\nset(VCPKG_LIBRARY_LINKAGE dynamic)\nset(VCPKG_CMAKE_SYSTEM_NAME Linux)\nset(VCPKG_FIXUP_ELF_RPATH ON)" >> ${VCPKG_ROOT}/triplets/community/arm64-linux-dynamic.cmake \ + && ${VCPKG_ROOT}/vcpkg install --triplet=arm64-linux-dynamic ENV INSTALL_DIR=/usr/local ENV CCACHE_DIR="/ccache" @@ -128,13 +130,13 @@ WORKDIR /zilliqa COPY src/libPersistence/*.proto src/libPersistence/ COPY src/libUtils/*.proto src/libUtils/ COPY evm-ds/ evm-ds -RUN --mount=type=cache,target=/sccache/ cd evm-ds && PATH=/zilliqa/build/vcpkg_installed/x64-linux-dynamic/tools/protobuf:$PATH cargo build --release --package evm-ds && sccache --show-stats +RUN --mount=type=cache,target=/sccache/ cd evm-ds && PATH=/zilliqa/build/vcpkg_installed/arm64-linux-dynamic/tools/protobuf:$PATH cargo build --release --package evm-ds && sccache --show-stats RUN ls -l /zilliqa/evm-ds/target -RUN cp /zilliqa/build/vcpkg_installed/x64-linux-dynamic/lib/libffi.so /usr/local/lib \ - && cp /zilliqa/build/vcpkg_installed/x64-linux-dynamic/lib/libssl.so* /usr/local/lib \ - && cp /zilliqa/build/vcpkg_installed/x64-linux-dynamic/lib/libcrypto.so* /usr/local/lib +RUN cp /zilliqa/build/vcpkg_installed/arm64-linux-dynamic/lib/libffi.so /usr/local/lib \ + && cp /zilliqa/build/vcpkg_installed/arm64-linux-dynamic/lib/libssl.so* /usr/local/lib \ + && cp /zilliqa/build/vcpkg_installed/arm64-linux-dynamic/lib/libcrypto.so* /usr/local/lib RUN apt-get install -y patchelf @@ -191,8 +193,8 @@ RUN mkdir -p /scilla/0/bin2/ && cp -L /scilla/0/bin/* /scilla/0/bin2/ && strip / FROM builder AS test_runner RUN mkdir -p \ - /scilla/0/bin /scilla/0/src/stdlib /scilla/0/vcpkg_installed/x64-linux-dynamic \ - && ln -s /usr/local/lib /scilla/0/vcpkg_installed/x64-linux-dynamic + /scilla/0/bin /scilla/0/src/stdlib /scilla/0/vcpkg_installed/arm64-linux-dynamic \ + && ln -s /usr/local/lib /scilla/0/vcpkg_installed/arm64-linux-dynamic # pour in scilla binaries COPY --from=scilla /scilla/0/bin2 /scilla/0/bin # pour in scilla tests @@ -224,7 +226,7 @@ COPY --from=builder /usr/local/lib/*.so* /usr/local/lib/ COPY --from=builder /zilliqa/evm-ds/target/release/evm-ds /usr/local/bin/ COPY --from=builder /zilliqa/evm-ds/log4rs.yml /usr/local/etc/ -ADD https://github.com/krallin/tini/releases/latest/download/tini /tini +ADD https://github.com/krallin/tini/releases/latest/download/tini-arm64 /tini # The above COPY doesn't preserve symlinks which causes gcc/g++/cc/c++ # to hang as stand-alone binaries on Ubuntu 22.04. diff --git a/src/libNetwork/P2PServer.cpp b/src/libNetwork/P2PServer.cpp index cd58de02b4..a4c5ed2cc1 100644 --- a/src/libNetwork/P2PServer.cpp +++ b/src/libNetwork/P2PServer.cpp @@ -239,8 +239,10 @@ void P2PServerConnection::ReadNextMessage() { void P2PServerConnection::OnHeaderRead(const ErrorCode& ec) { if (ec) { - LOG_GENERAL(INFO, - "Peer " << m_remotePeer << " read error: " << ec.message()); + // Only report the error if it's not a connection reset caused by the peer closing. + if (ec != END_OF_FILE) { + LOG_GENERAL(WARNING, "Read error: " << ec.message()); + } CloseSocket(); OnConnectionClosed(); return; From 5efc51b9e52322212485da32e6dfba1c4659e9bb Mon Sep 17 00:00:00 2001 From: stephen Date: Wed, 1 Nov 2023 11:59:09 +0000 Subject: [PATCH 15/61] overwrote with mac version - oops --- docker/Dockerfile | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index e69b95014c..fd1faa5c05 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -18,7 +18,7 @@ ARG SCILLA_VERSION=v0.13.4 ARG SCILLA_IMAGE=zilliqa/scilla:${SCILLA_VERSION} # Common dependencies of the builder and runner stages. -FROM arm64v8/ubuntu:22.04 AS base +FROM ubuntu:22.04 AS base # Format guideline: one package per line and keep them alphabetically sorted RUN apt-get update \ && apt-get install -y software-properties-common \ @@ -78,11 +78,12 @@ ENV SCCACHE_DIR="/sccache" ENV RUSTC_WRAPPER="/root/.cargo/bin/sccache" ARG CMAKE_VERSION=3.25.1 -RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-Linux-aarch64.sh \ +RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-Linux-x86_64.sh \ + && echo "6598da34f0e3a0f763809e25cfdd646aa1d5e4d133c4277821e63ae5cfe09457 cmake-${CMAKE_VERSION}-Linux-x86_64.sh" | sha256sum -c \ && mkdir -p "${HOME}"/.local \ - && bash ./cmake-${CMAKE_VERSION}-Linux-aarch64.sh --skip-license --prefix="${HOME}"/.local/ \ + && bash ./cmake-${CMAKE_VERSION}-Linux-x86_64.sh --skip-license --prefix="${HOME}"/.local/ \ && "${HOME}"/.local/bin/cmake --version \ - && rm cmake-${CMAKE_VERSION}-Linux-aarch64.sh + && rm cmake-${CMAKE_VERSION}-Linux-x86_64.sh ENV PATH="/root/.local/bin:${PATH}" # Setup ccache @@ -97,7 +98,6 @@ ARG VCPKG_ROOT=/vcpkg RUN ccache -p && ccache -z -ENV VCPKG_FORCE_SYSTEM_BINARIES=1 # If COMMIT_OR_TAG is a branch name or a tag, clone a shallow copy which is # faster; if this fails, just clone the full repo and checkout the commit. RUN git clone https://github.com/microsoft/vcpkg ${VCPKG_ROOT} \ @@ -116,11 +116,9 @@ RUN apt update -y \ && curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - \ && apt update -y && apt install -y google-cloud-cli -ENV VCPKG_BINARY_SOURCES="default,readwrite;x-gcs,gs://vcpkg/ubuntu/22.04/arm64-linux-dynamic/${VCPKG_COMMIT_OR_TAG}/,readwrite" +ENV VCPKG_BINARY_SOURCES="default,readwrite;x-gcs,gs://vcpkg/ubuntu/22.04/x64-linux-dynamic/${VCPKG_COMMIT_OR_TAG}/,read" -RUN --mount=type=cache,target=/root/.cache/vcpkg/ \ - echo "set(VCPKG_TARGET_ARCHITECTURE arm64)\nset(VCPKG_CRT_LINKAGE dynamic)\nset(VCPKG_LIBRARY_LINKAGE dynamic)\nset(VCPKG_CMAKE_SYSTEM_NAME Linux)\nset(VCPKG_FIXUP_ELF_RPATH ON)" >> ${VCPKG_ROOT}/triplets/community/arm64-linux-dynamic.cmake \ - && ${VCPKG_ROOT}/vcpkg install --triplet=arm64-linux-dynamic +RUN --mount=type=cache,target=/root/.cache/vcpkg/ ${VCPKG_ROOT}/vcpkg install --triplet=x64-linux-dynamic ENV INSTALL_DIR=/usr/local ENV CCACHE_DIR="/ccache" @@ -130,13 +128,13 @@ WORKDIR /zilliqa COPY src/libPersistence/*.proto src/libPersistence/ COPY src/libUtils/*.proto src/libUtils/ COPY evm-ds/ evm-ds -RUN --mount=type=cache,target=/sccache/ cd evm-ds && PATH=/zilliqa/build/vcpkg_installed/arm64-linux-dynamic/tools/protobuf:$PATH cargo build --release --package evm-ds && sccache --show-stats +RUN --mount=type=cache,target=/sccache/ cd evm-ds && PATH=/zilliqa/build/vcpkg_installed/x64-linux-dynamic/tools/protobuf:$PATH cargo build --release --package evm-ds && sccache --show-stats RUN ls -l /zilliqa/evm-ds/target -RUN cp /zilliqa/build/vcpkg_installed/arm64-linux-dynamic/lib/libffi.so /usr/local/lib \ - && cp /zilliqa/build/vcpkg_installed/arm64-linux-dynamic/lib/libssl.so* /usr/local/lib \ - && cp /zilliqa/build/vcpkg_installed/arm64-linux-dynamic/lib/libcrypto.so* /usr/local/lib +RUN cp /zilliqa/build/vcpkg_installed/x64-linux-dynamic/lib/libffi.so /usr/local/lib \ + && cp /zilliqa/build/vcpkg_installed/x64-linux-dynamic/lib/libssl.so* /usr/local/lib \ + && cp /zilliqa/build/vcpkg_installed/x64-linux-dynamic/lib/libcrypto.so* /usr/local/lib RUN apt-get install -y patchelf @@ -193,8 +191,8 @@ RUN mkdir -p /scilla/0/bin2/ && cp -L /scilla/0/bin/* /scilla/0/bin2/ && strip / FROM builder AS test_runner RUN mkdir -p \ - /scilla/0/bin /scilla/0/src/stdlib /scilla/0/vcpkg_installed/arm64-linux-dynamic \ - && ln -s /usr/local/lib /scilla/0/vcpkg_installed/arm64-linux-dynamic + /scilla/0/bin /scilla/0/src/stdlib /scilla/0/vcpkg_installed/x64-linux-dynamic \ + && ln -s /usr/local/lib /scilla/0/vcpkg_installed/x64-linux-dynamic # pour in scilla binaries COPY --from=scilla /scilla/0/bin2 /scilla/0/bin # pour in scilla tests @@ -226,7 +224,7 @@ COPY --from=builder /usr/local/lib/*.so* /usr/local/lib/ COPY --from=builder /zilliqa/evm-ds/target/release/evm-ds /usr/local/bin/ COPY --from=builder /zilliqa/evm-ds/log4rs.yml /usr/local/etc/ -ADD https://github.com/krallin/tini/releases/latest/download/tini-arm64 /tini +ADD https://github.com/krallin/tini/releases/latest/download/tini /tini # The above COPY doesn't preserve symlinks which causes gcc/g++/cc/c++ # to hang as stand-alone binaries on Ubuntu 22.04. From c39134e7bdc0f93f38c4e2882e5ce3f8c5e55a54 Mon Sep 17 00:00:00 2001 From: stephen white Date: Thu, 2 Nov 2023 11:20:55 +0000 Subject: [PATCH 16/61] Added more configuration changes to desk mode. --- scripts/localdev.py | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/scripts/localdev.py b/scripts/localdev.py index 36354c925d..ca5d903ef5 100755 --- a/scripts/localdev.py +++ b/scripts/localdev.py @@ -743,6 +743,7 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se shutil.rmtree(instance_dir) print(f"Generating testnet configuration .. ") if desk: + print("Using Desktop mode for small configurations logging turned down, telemetry off") cmd = ["./bootstrap.py", testnet_name, "--clusters", "minikube", "--constants-from-file", os.path.join(ZILLIQA_DIR, "constants.xml"), "--image", zilliqa_image, @@ -785,14 +786,26 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se constants_xml_target_path = os.path.join(TESTNET_DIR, f"{testnet_name}/configmap/constants.xml") config_file = xml.dom.minidom.parse(constants_xml_target_path) - xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_HOSTNAME", "0.0.0.0") - xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PORT", "8090") - xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PROVIDER", "PROMETHEUS") - xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_MASK", "ALL") - xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_HOSTNAME", "tempo.default.svc.cluster.local") - xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_PORT", "4317") - xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_PROVIDER", "OTLPGRPC") - xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_MASK", "ALL") + if not desk: + xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_HOSTNAME", "0.0.0.0") + xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PORT", "0") + xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PROVIDER", "NONE") + xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_MASK", "NONE") + xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_HOSTNAME", "tempo.default.svc.cluster.local") + xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_PORT", "4317") + xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_PROVIDER", "OTLPGRPC") + xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_MASK", "ALL") + else: + print("Explicitly disabling all telemetry for desktop testing mode") + xml_replace_element(config_file, config_file.documentElement, "DEBUG_MODE", "3") + xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_HOSTNAME", "0.0.0.0") + xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PORT", "0") + xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PROVIDER", "NONE") + xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_MASK", "NONE") + xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_HOSTNAME", "tempo.default.svc.cluster.local") + xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_PORT", "4317") + xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_PROVIDER", "OTLPGRPC") + xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_MASK", "ALL") if chain_id is not None: xml_replace_element(config_file, config_file.documentElement, "CHAIN_ID", chain_id) output_config = config_file.toprettyxml(newl='') From 45d4e837dad4c8af12099335be69f8554ac09ebb Mon Sep 17 00:00:00 2001 From: bzawisto Date: Thu, 2 Nov 2023 12:32:53 +0100 Subject: [PATCH 17/61] Adding more helpful logging --- src/libConsensus/ConsensusCommon.cpp | 49 ++++++++++++++++--- .../FinalBlockPostProcessing.cpp | 21 +++++++- .../FinalBlockPreProcessing.cpp | 15 +++++- 3 files changed, 75 insertions(+), 10 deletions(-) diff --git a/src/libConsensus/ConsensusCommon.cpp b/src/libConsensus/ConsensusCommon.cpp index 5f0676c9e5..eaa2fd4d44 100644 --- a/src/libConsensus/ConsensusCommon.cpp +++ b/src/libConsensus/ConsensusCommon.cpp @@ -199,42 +199,77 @@ bool ConsensusCommon::PreProcessMessage(const zbytes& message, zbytes& reserializedMessage) const { if (message.size() > offset) { switch (message.at(offset)) { - case ConsensusMessageType::ANNOUNCE: + case ConsensusMessageType::ANNOUNCE: { + LOG_GENERAL(INFO, + "Processing ANNOUNCE Consensus message, internal consensus " + "state is: " + << GetStateString()); return Messenger::PreProcessMessage< ZilliqaMessage::ConsensusAnnouncement>(message, offset + 1, consensusID, senderPubKey, reserializedMessage); - case ConsensusMessageType::CONSENSUSFAILURE: + } + case ConsensusMessageType::CONSENSUSFAILURE: { + LOG_GENERAL(INFO, + "Processing CONSENSUSFAILURE Consensus message, internal " + "consensus state is: " + << GetStateString()); return Messenger::PreProcessMessage< ZilliqaMessage::ConsensusConsensusFailure>( message, offset + 1, consensusID, senderPubKey, reserializedMessage); + } case ConsensusMessageType::COMMIT: - case ConsensusMessageType::FINALCOMMIT: + case ConsensusMessageType::FINALCOMMIT: { + LOG_GENERAL(INFO, + "Processing COMMIT or FINALCOMMIT Consensus message, " + "internal consensus state is: " + << GetStateString()); return Messenger::PreProcessMessage( message, offset + 1, consensusID, senderPubKey, reserializedMessage); - case ConsensusMessageType::COMMITFAILURE: + } + case ConsensusMessageType::COMMITFAILURE: { + LOG_GENERAL(INFO, + "Processing COMMITFAILURE Consensus message, internal " + "consensus state is: " + << GetStateString()); return Messenger::PreProcessMessage< ZilliqaMessage::ConsensusCommitFailure>(message, offset + 1, consensusID, senderPubKey, reserializedMessage); + } case ConsensusMessageType::CHALLENGE: - case ConsensusMessageType::FINALCHALLENGE: + case ConsensusMessageType::FINALCHALLENGE: { + LOG_GENERAL(INFO, + "Processing CHALLENGE or FINALCHALLENGE Consensus message, " + "internal consensus state is: " + << GetStateString()); return Messenger::PreProcessMessage( message, offset + 1, consensusID, senderPubKey, reserializedMessage); + } case ConsensusMessageType::RESPONSE: - case ConsensusMessageType::FINALRESPONSE: + case ConsensusMessageType::FINALRESPONSE: { + LOG_GENERAL(INFO, + "Processing RESPONSE or FINALRESPONSE Consensus message, " + "internal consensus state is: " + << GetStateString()); return Messenger::PreProcessMessage( message, offset + 1, consensusID, senderPubKey, reserializedMessage); + } case ConsensusMessageType::COLLECTIVESIG: - case ConsensusMessageType::FINALCOLLECTIVESIG: + case ConsensusMessageType::FINALCOLLECTIVESIG: { + LOG_GENERAL(INFO, + "Processing COLLECTIVESIG or FINALCOLLECTIVESIG Consensus " + "message, internal consensus state is: " + << GetStateString()); return Messenger::PreProcessMessage< ZilliqaMessage::ConsensusCollectiveSig>(message, offset + 1, consensusID, senderPubKey, reserializedMessage); + } default: LOG_GENERAL(WARNING, "Unknown msg type " << (unsigned int)message.at(offset)); diff --git a/src/libDirectoryService/FinalBlockPostProcessing.cpp b/src/libDirectoryService/FinalBlockPostProcessing.cpp index d6baf050b1..8a1f4115a9 100644 --- a/src/libDirectoryService/FinalBlockPostProcessing.cpp +++ b/src/libDirectoryService/FinalBlockPostProcessing.cpp @@ -299,6 +299,9 @@ void DirectoryService::ProcessFinalBlockConsensusWhenDone() { ReloadGuardedShards(t_shards); } + LOG_GENERAL(INFO, + "Consensus is done, sending final block to others, ds_state: " + << GetStateString()); DataSender::GetInstance().SendDataToOthers( *m_finalBlock, *m_mediator.m_DSCommittee, t_shards.empty() ? m_shards : t_shards, t_microBlocks, @@ -378,6 +381,11 @@ bool DirectoryService::ProcessFinalBlockConsensus( return true; } + LOG_GENERAL( + INFO, + "DirectoryService::ProcessFinalBlockConsensus() enter, ds_state is: " + << GetStateString()); + uint32_t consensus_id = 0; zbytes reserialized_message; PubKey senderPubKey; @@ -405,13 +413,16 @@ bool DirectoryService::ProcessFinalBlockConsensus( } // Only buffer the Final block consensus message if in the immediate states // before consensus, or when doing view change - if (!((m_state == FINALBLOCK_CONSENSUS_PREP) || - (m_state == VIEWCHANGE_CONSENSUS))) { + if ((m_state != FINALBLOCK_CONSENSUS_PREP) && + (m_state != VIEWCHANGE_CONSENSUS)) { LOG_EPOCH(INFO, m_mediator.m_currentEpochNum, "Ignoring final block consensus message"); return false; } + LOG_GENERAL(INFO, + "Adding message to FinalBlockConsensusBuffer, " + "PROCESS_FINALBLOCKCONSENSUS action is allowed in my state"); AddToFinalBlockConsensusBuffer(consensus_id, reserialized_message, offset, from, senderPubKey); @@ -422,6 +433,10 @@ bool DirectoryService::ProcessFinalBlockConsensus( senderPubKey == m_mediator.m_DSCommittee->at(GetConsensusLeaderID()).first) { lock_guard g(m_mutexPrepareRunFinalblockConsensus); + LOG_GENERAL(INFO, + "DirectoryService::ProcessFinalBlockConsensus(): I'm calling " + "RunConsensusOnFinalBlock, ds_state is: " + << GetStateString()); RunConsensusOnFinalBlock(); } } else { @@ -438,6 +453,8 @@ bool DirectoryService::ProcessFinalBlockConsensus( AddToFinalBlockConsensusBuffer(consensus_id, reserialized_message, offset, from, senderPubKey); } else { + LOG_GENERAL(INFO, "Calling ProcessFinalBlockConsensusCore with ds_state: " + << GetStateString()); return ProcessFinalBlockConsensusCore(reserialized_message, offset, from, startByte); } diff --git a/src/libDirectoryService/FinalBlockPreProcessing.cpp b/src/libDirectoryService/FinalBlockPreProcessing.cpp index 4cff39d601..a3b2a3d6a8 100644 --- a/src/libDirectoryService/FinalBlockPreProcessing.cpp +++ b/src/libDirectoryService/FinalBlockPreProcessing.cpp @@ -231,6 +231,11 @@ bool DirectoryService::RunConsensusOnFinalBlockWhenDSPrimary() { return true; } + LOG_GENERAL(INFO, + "DirectoryService::RunConsensusOnFinalBlockWhenDSPrimary() " + "enter, ds_state is: " + << GetStateString()); + // No other shards exists, then allow additional time for txns distribution. if (m_mediator.m_ds->m_mode != DirectoryService::Mode::IDLE && m_mediator.m_node->m_myshardId == DEFAULT_SHARD_ID && @@ -1159,6 +1164,10 @@ bool DirectoryService::PrePrepFinalBlockValidator( bool DirectoryService::RunConsensusOnFinalBlockWhenDSBackup() { LOG_MARKER(); + LOG_GENERAL(INFO, + "DirectoryService::RunConsensusOnFinalBlockWhenDSBackup() enter, " + "ds_state is: " + << GetStateString()); if (LOOKUP_NODE_MODE) { LOG_GENERAL(WARNING, "DirectoryService::RunConsensusOnFinalBlockWhenDSBackup " @@ -1321,6 +1330,10 @@ void DirectoryService::RunConsensusOnFinalBlock() { return; } + LOG_GENERAL( + INFO, "DirectoryService::RunConsensusOnFinalBlock() enter, ds_state is: " + << GetStateString()); + { lock_guard g(m_mutexRunConsensusOnFinalBlock); @@ -1339,7 +1352,7 @@ void DirectoryService::RunConsensusOnFinalBlock() { } // We've been already here, don't do the same thing again in this round - if (m_mediator.m_node->m_txn_distribute_window_open) { + if (m_state == FINALBLOCK_CONSENSUS) { return; } From 4cd61b8cc6844196d876170c31ee1e3d63c1c53b Mon Sep 17 00:00:00 2001 From: bzawisto Date: Thu, 2 Nov 2023 12:32:53 +0100 Subject: [PATCH 18/61] Adding more helpful logging --- src/libConsensus/ConsensusCommon.cpp | 49 ++++++++++++++++--- .../FinalBlockPostProcessing.cpp | 21 +++++++- .../FinalBlockPreProcessing.cpp | 15 +++++- 3 files changed, 75 insertions(+), 10 deletions(-) diff --git a/src/libConsensus/ConsensusCommon.cpp b/src/libConsensus/ConsensusCommon.cpp index 5f0676c9e5..eaa2fd4d44 100644 --- a/src/libConsensus/ConsensusCommon.cpp +++ b/src/libConsensus/ConsensusCommon.cpp @@ -199,42 +199,77 @@ bool ConsensusCommon::PreProcessMessage(const zbytes& message, zbytes& reserializedMessage) const { if (message.size() > offset) { switch (message.at(offset)) { - case ConsensusMessageType::ANNOUNCE: + case ConsensusMessageType::ANNOUNCE: { + LOG_GENERAL(INFO, + "Processing ANNOUNCE Consensus message, internal consensus " + "state is: " + << GetStateString()); return Messenger::PreProcessMessage< ZilliqaMessage::ConsensusAnnouncement>(message, offset + 1, consensusID, senderPubKey, reserializedMessage); - case ConsensusMessageType::CONSENSUSFAILURE: + } + case ConsensusMessageType::CONSENSUSFAILURE: { + LOG_GENERAL(INFO, + "Processing CONSENSUSFAILURE Consensus message, internal " + "consensus state is: " + << GetStateString()); return Messenger::PreProcessMessage< ZilliqaMessage::ConsensusConsensusFailure>( message, offset + 1, consensusID, senderPubKey, reserializedMessage); + } case ConsensusMessageType::COMMIT: - case ConsensusMessageType::FINALCOMMIT: + case ConsensusMessageType::FINALCOMMIT: { + LOG_GENERAL(INFO, + "Processing COMMIT or FINALCOMMIT Consensus message, " + "internal consensus state is: " + << GetStateString()); return Messenger::PreProcessMessage( message, offset + 1, consensusID, senderPubKey, reserializedMessage); - case ConsensusMessageType::COMMITFAILURE: + } + case ConsensusMessageType::COMMITFAILURE: { + LOG_GENERAL(INFO, + "Processing COMMITFAILURE Consensus message, internal " + "consensus state is: " + << GetStateString()); return Messenger::PreProcessMessage< ZilliqaMessage::ConsensusCommitFailure>(message, offset + 1, consensusID, senderPubKey, reserializedMessage); + } case ConsensusMessageType::CHALLENGE: - case ConsensusMessageType::FINALCHALLENGE: + case ConsensusMessageType::FINALCHALLENGE: { + LOG_GENERAL(INFO, + "Processing CHALLENGE or FINALCHALLENGE Consensus message, " + "internal consensus state is: " + << GetStateString()); return Messenger::PreProcessMessage( message, offset + 1, consensusID, senderPubKey, reserializedMessage); + } case ConsensusMessageType::RESPONSE: - case ConsensusMessageType::FINALRESPONSE: + case ConsensusMessageType::FINALRESPONSE: { + LOG_GENERAL(INFO, + "Processing RESPONSE or FINALRESPONSE Consensus message, " + "internal consensus state is: " + << GetStateString()); return Messenger::PreProcessMessage( message, offset + 1, consensusID, senderPubKey, reserializedMessage); + } case ConsensusMessageType::COLLECTIVESIG: - case ConsensusMessageType::FINALCOLLECTIVESIG: + case ConsensusMessageType::FINALCOLLECTIVESIG: { + LOG_GENERAL(INFO, + "Processing COLLECTIVESIG or FINALCOLLECTIVESIG Consensus " + "message, internal consensus state is: " + << GetStateString()); return Messenger::PreProcessMessage< ZilliqaMessage::ConsensusCollectiveSig>(message, offset + 1, consensusID, senderPubKey, reserializedMessage); + } default: LOG_GENERAL(WARNING, "Unknown msg type " << (unsigned int)message.at(offset)); diff --git a/src/libDirectoryService/FinalBlockPostProcessing.cpp b/src/libDirectoryService/FinalBlockPostProcessing.cpp index d6baf050b1..8a1f4115a9 100644 --- a/src/libDirectoryService/FinalBlockPostProcessing.cpp +++ b/src/libDirectoryService/FinalBlockPostProcessing.cpp @@ -299,6 +299,9 @@ void DirectoryService::ProcessFinalBlockConsensusWhenDone() { ReloadGuardedShards(t_shards); } + LOG_GENERAL(INFO, + "Consensus is done, sending final block to others, ds_state: " + << GetStateString()); DataSender::GetInstance().SendDataToOthers( *m_finalBlock, *m_mediator.m_DSCommittee, t_shards.empty() ? m_shards : t_shards, t_microBlocks, @@ -378,6 +381,11 @@ bool DirectoryService::ProcessFinalBlockConsensus( return true; } + LOG_GENERAL( + INFO, + "DirectoryService::ProcessFinalBlockConsensus() enter, ds_state is: " + << GetStateString()); + uint32_t consensus_id = 0; zbytes reserialized_message; PubKey senderPubKey; @@ -405,13 +413,16 @@ bool DirectoryService::ProcessFinalBlockConsensus( } // Only buffer the Final block consensus message if in the immediate states // before consensus, or when doing view change - if (!((m_state == FINALBLOCK_CONSENSUS_PREP) || - (m_state == VIEWCHANGE_CONSENSUS))) { + if ((m_state != FINALBLOCK_CONSENSUS_PREP) && + (m_state != VIEWCHANGE_CONSENSUS)) { LOG_EPOCH(INFO, m_mediator.m_currentEpochNum, "Ignoring final block consensus message"); return false; } + LOG_GENERAL(INFO, + "Adding message to FinalBlockConsensusBuffer, " + "PROCESS_FINALBLOCKCONSENSUS action is allowed in my state"); AddToFinalBlockConsensusBuffer(consensus_id, reserialized_message, offset, from, senderPubKey); @@ -422,6 +433,10 @@ bool DirectoryService::ProcessFinalBlockConsensus( senderPubKey == m_mediator.m_DSCommittee->at(GetConsensusLeaderID()).first) { lock_guard g(m_mutexPrepareRunFinalblockConsensus); + LOG_GENERAL(INFO, + "DirectoryService::ProcessFinalBlockConsensus(): I'm calling " + "RunConsensusOnFinalBlock, ds_state is: " + << GetStateString()); RunConsensusOnFinalBlock(); } } else { @@ -438,6 +453,8 @@ bool DirectoryService::ProcessFinalBlockConsensus( AddToFinalBlockConsensusBuffer(consensus_id, reserialized_message, offset, from, senderPubKey); } else { + LOG_GENERAL(INFO, "Calling ProcessFinalBlockConsensusCore with ds_state: " + << GetStateString()); return ProcessFinalBlockConsensusCore(reserialized_message, offset, from, startByte); } diff --git a/src/libDirectoryService/FinalBlockPreProcessing.cpp b/src/libDirectoryService/FinalBlockPreProcessing.cpp index 4cff39d601..a3b2a3d6a8 100644 --- a/src/libDirectoryService/FinalBlockPreProcessing.cpp +++ b/src/libDirectoryService/FinalBlockPreProcessing.cpp @@ -231,6 +231,11 @@ bool DirectoryService::RunConsensusOnFinalBlockWhenDSPrimary() { return true; } + LOG_GENERAL(INFO, + "DirectoryService::RunConsensusOnFinalBlockWhenDSPrimary() " + "enter, ds_state is: " + << GetStateString()); + // No other shards exists, then allow additional time for txns distribution. if (m_mediator.m_ds->m_mode != DirectoryService::Mode::IDLE && m_mediator.m_node->m_myshardId == DEFAULT_SHARD_ID && @@ -1159,6 +1164,10 @@ bool DirectoryService::PrePrepFinalBlockValidator( bool DirectoryService::RunConsensusOnFinalBlockWhenDSBackup() { LOG_MARKER(); + LOG_GENERAL(INFO, + "DirectoryService::RunConsensusOnFinalBlockWhenDSBackup() enter, " + "ds_state is: " + << GetStateString()); if (LOOKUP_NODE_MODE) { LOG_GENERAL(WARNING, "DirectoryService::RunConsensusOnFinalBlockWhenDSBackup " @@ -1321,6 +1330,10 @@ void DirectoryService::RunConsensusOnFinalBlock() { return; } + LOG_GENERAL( + INFO, "DirectoryService::RunConsensusOnFinalBlock() enter, ds_state is: " + << GetStateString()); + { lock_guard g(m_mutexRunConsensusOnFinalBlock); @@ -1339,7 +1352,7 @@ void DirectoryService::RunConsensusOnFinalBlock() { } // We've been already here, don't do the same thing again in this round - if (m_mediator.m_node->m_txn_distribute_window_open) { + if (m_state == FINALBLOCK_CONSENSUS) { return; } From 764b838cac54f008b687209d869fcf7887db57ca Mon Sep 17 00:00:00 2001 From: stephen white Date: Thu, 2 Nov 2023 12:23:24 +0000 Subject: [PATCH 19/61] Made my changes to config descrete and inside localdev under the desk parameter --- constants.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/constants.xml b/constants.xml index 85ed624396..9eae455481 100644 --- a/constants.xml +++ b/constants.xml @@ -2,7 +2,7 @@ - 3 + 4 false false 25 @@ -126,7 +126,7 @@ 127.0.0.1 - true + false false true @@ -134,13 +134,13 @@ 3 6 - 5 - 5 - 2000 + 10 + 10 + 1000 0 18 - false - false + true + true From 3568490e7cd809b8c554d15064c269432f9cd440 Mon Sep 17 00:00:00 2001 From: stephen white Date: Thu, 2 Nov 2023 12:44:47 +0000 Subject: [PATCH 20/61] Made my changes to config descrete and inside localdev under the desk parameter --- build.sh | 6 +++++- scripts/localdev.py | 26 +++++++++++++++++--------- src/libUtils/Logger.h | 5 ++++- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/build.sh b/build.sh index 7bbb5360fc..b2ec1c40c8 100755 --- a/build.sh +++ b/build.sh @@ -105,13 +105,17 @@ do ;; fuzzer) CMAKE_EXTRA_OPTIONS="-DLIBFUZZER=ON ${CMAKE_EXTRA_OPTIONS}" - echo "Build with libfuzzer" + echo "Build with libfuzzer"`` ;; style) CMAKE_EXTRA_OPTIONS="-DLLVM_EXTRA_TOOLS=ON ${CMAKE_EXTRA_OPTIONS}" run_clang_format_fix=1 echo "Build with LLVM Extra Tools for coding style check (clang-format-fix)" ;; + nomark) + CMAKE_EXTRA_OPTIONS="-DNOMARK=ON ${CMAKE_EXTRA_OPTIONS}" + echo "Build with no markers" + ;; linter) CMAKE_EXTRA_OPTIONS="-DLLVM_EXTRA_TOOLS=ON ${CMAKE_EXTRA_OPTIONS}" run_clang_tidy_fix=1 diff --git a/scripts/localdev.py b/scripts/localdev.py index ca5d903ef5..c6c37baf42 100755 --- a/scripts/localdev.py +++ b/scripts/localdev.py @@ -786,18 +786,22 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se constants_xml_target_path = os.path.join(TESTNET_DIR, f"{testnet_name}/configmap/constants.xml") config_file = xml.dom.minidom.parse(constants_xml_target_path) - if not desk: - xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_HOSTNAME", "0.0.0.0") + if desk: + print("Explicitly disabling all telemetry for desktop testing mode") + xml_replace_element(config_file, config_file.documentElement, "DEBUG_LEVEL", "3") + xml_replace_element(config_file, config_file.documentElement, "BROADCAST_GOSSIP_MODE", "true") + xml_replace_element(config_file, config_file.documentElement, "SEND_RESPONSE_FOR_LAZY_PUSH", "false") + xml_replace_element(config_file, config_file.documentElement, "MAX_NEIGHBORS_PER_ROUND", "5") + xml_replace_element(config_file, config_file.documentElement, "NUM_GOSSIP_RECEIVERS", "5") + xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_HOSTNAME", "") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PORT", "0") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PROVIDER", "NONE") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_MASK", "NONE") - xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_HOSTNAME", "tempo.default.svc.cluster.local") - xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_PORT", "4317") - xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_PROVIDER", "OTLPGRPC") - xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_MASK", "ALL") + xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_HOSTNAME", "") + xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_PORT", "") + xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_PROVIDER", "NONE") + xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_MASK", "NONE") else: - print("Explicitly disabling all telemetry for desktop testing mode") - xml_replace_element(config_file, config_file.documentElement, "DEBUG_MODE", "3") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_HOSTNAME", "0.0.0.0") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PORT", "0") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PROVIDER", "NONE") @@ -907,7 +911,11 @@ def build_native_to_workspace(config): build_env['SCILLA_REPO_ROOT'] = SCILLA_DIR # Let's start off by building Scilla, in case it breaks. run_or_die(config, ["make"], in_dir = SCILLA_DIR, env = build_env) - run_or_die(config, ["./build.sh"], in_dir = ZILLIQA_DIR) + global desk + if desk: + run_or_die(config, ["./build.sh nomark"], in_dir = ZILLIQA_DIR) + else: + run_or_die(config, ["./build.sh"], in_dir = ZILLIQA_DIR) run_or_die(config, ["cargo", "build", "--release", "--package", "evm-ds"], in_dir = os.path.join(ZILLIQA_DIR, "evm-ds")) # OK. That worked. Now copy the relevant bits to our workspace diff --git a/src/libUtils/Logger.h b/src/libUtils/Logger.h index ecb07e4555..44fb48778a 100644 --- a/src/libUtils/Logger.h +++ b/src/libUtils/Logger.h @@ -161,9 +161,12 @@ std::shared_ptr CreateTracingExtraData(); #define LOG_GENERAL(level, msg) \ { TRACED_FILTERED_LOG(level, &Logger::IsGeneralSink) << ' ' << msg; } - +#if !defined(NOMARK) #define LOG_MARKER() \ Logger::ScopeMarker marker{__FILE__, __LINE__, __FUNCTION__}; +#else +#define LOG_MARKER() +#endif #define LOG_MARKER_CONTITIONAL(conditional) \ Logger::ScopeMarker marker{__FILE__, __LINE__, __FUNCTION__, conditional}; From 895627a54614c46a0cff4e8ed127bec23b4726f9 Mon Sep 17 00:00:00 2001 From: stephen white Date: Thu, 2 Nov 2023 17:33:43 +0000 Subject: [PATCH 21/61] Made my changes to config descrete and inside localdev under the desk parameter --- build.sh | 2 +- constants.xml | 2 +- scripts/localdev.py | 17 +++++++++++------ src/libNetwork/SendJobs.cpp | 10 ++++++---- src/libUtils/Logger.h | 2 ++ 5 files changed, 21 insertions(+), 12 deletions(-) diff --git a/build.sh b/build.sh index b2ec1c40c8..cae80e47f4 100755 --- a/build.sh +++ b/build.sh @@ -174,7 +174,7 @@ echo "Current directory: $(pwd)" echo "Build directory: ${build_dir}" echo "Install directory: ${install_dir}" -jobs=3 +jobs=4 echo building using $jobs jobs diff --git a/constants.xml b/constants.xml index 9eae455481..bf7d535f75 100644 --- a/constants.xml +++ b/constants.xml @@ -208,7 +208,7 @@ - 200 + 10 4 0.05 diff --git a/scripts/localdev.py b/scripts/localdev.py index c6c37baf42..da7d648fa6 100755 --- a/scripts/localdev.py +++ b/scripts/localdev.py @@ -747,12 +747,13 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se cmd = ["./bootstrap.py", testnet_name, "--clusters", "minikube", "--constants-from-file", os.path.join(ZILLIQA_DIR, "constants.xml"), "--image", zilliqa_image, - "-n", "6", - "-d", "5", + "-n", "15", + "-s", "15", + "-d", "15", "-l", "1", - "--guard", "4/0", + "--guard", "11/0", "--gentxn", "false", - "--multiplier-fanout", "1", + "--multiplier-fanout", "1,1", "--host-network", "false", "--https", "localdomain", "--seed-multiplier", "true", @@ -791,8 +792,8 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se xml_replace_element(config_file, config_file.documentElement, "DEBUG_LEVEL", "3") xml_replace_element(config_file, config_file.documentElement, "BROADCAST_GOSSIP_MODE", "true") xml_replace_element(config_file, config_file.documentElement, "SEND_RESPONSE_FOR_LAZY_PUSH", "false") - xml_replace_element(config_file, config_file.documentElement, "MAX_NEIGHBORS_PER_ROUND", "5") - xml_replace_element(config_file, config_file.documentElement, "NUM_GOSSIP_RECEIVERS", "5") + xml_replace_element(config_file, config_file.documentElement, "MAX_NEIGHBORS_PER_ROUND", "3") + xml_replace_element(config_file, config_file.documentElement, "NUM_GOSSIP_RECEIVERS", "3") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_HOSTNAME", "") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PORT", "0") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PROVIDER", "NONE") @@ -801,6 +802,10 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_PORT", "") xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_PROVIDER", "NONE") xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_MASK", "NONE") + xml_replace_element_if_exists(config_file, config_file.documentElement, "SIGN_VERIFY_EMPTY_MSGTYP", "false") + xml_replace_element_if_exists(config_file, config_file.documentElement, "SIGN_VERIFY_NONEMPTY_MSGTYP", "false") + xml_replace_element_if_exists(config_file, config_file.documentElement, "ROUND_TIME_IN_MS", "100") + xml_replace_element_if_exists(config_file, config_file.documentElement, "SIMULATED_NETWORK_DELAY_IN_MS", "0") else: xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_HOSTNAME", "0.0.0.0") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PORT", "0") diff --git a/src/libNetwork/SendJobs.cpp b/src/libNetwork/SendJobs.cpp index b55bfd21f8..f7086f02fc 100644 --- a/src/libNetwork/SendJobs.cpp +++ b/src/libNetwork/SendJobs.cpp @@ -502,10 +502,12 @@ class SendJobsImpl : public SendJobs, void SendMessageToPeer(const Peer& peer, RawMessage message, bool allow_relaxed_blacklist) override { zil::local::variables.AddSendMessageToPeerCount(1); - if (peer.m_listenPortHost == 0) { - LOG_GENERAL(WARNING, "Ignoring message to peer " << peer); - zil::local::variables.AddSendMessageToPeerFailed(1); - return; + if (false) { + if (peer.m_listenPortHost == 0) { + LOG_GENERAL(WARNING, "Ignoring message to peer " << peer); + zil::local::variables.AddSendMessageToPeerFailed(1); + return; + } } LOG_GENERAL(DEBUG, "Enqueueing message, size=" << message.size diff --git a/src/libUtils/Logger.h b/src/libUtils/Logger.h index 44fb48778a..58dceb1a99 100644 --- a/src/libUtils/Logger.h +++ b/src/libUtils/Logger.h @@ -161,6 +161,8 @@ std::shared_ptr CreateTracingExtraData(); #define LOG_GENERAL(level, msg) \ { TRACED_FILTERED_LOG(level, &Logger::IsGeneralSink) << ' ' << msg; } + +#define NOMARK 1 #if !defined(NOMARK) #define LOG_MARKER() \ Logger::ScopeMarker marker{__FILE__, __LINE__, __FUNCTION__}; From 2264486bf59a7b866ad129b5f0d265ba05d59c70 Mon Sep 17 00:00:00 2001 From: stephen white Date: Thu, 2 Nov 2023 18:53:27 +0000 Subject: [PATCH 22/61] Made my changes to config descrete and inside localdev under the desk parameter --- scripts/localdev.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/scripts/localdev.py b/scripts/localdev.py index da7d648fa6..fc2dd21fa0 100755 --- a/scripts/localdev.py +++ b/scripts/localdev.py @@ -747,13 +747,12 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se cmd = ["./bootstrap.py", testnet_name, "--clusters", "minikube", "--constants-from-file", os.path.join(ZILLIQA_DIR, "constants.xml"), "--image", zilliqa_image, - "-n", "15", - "-s", "15", - "-d", "15", + "-n", "6", + "-d", "5", "-l", "1", - "--guard", "11/0", + "--guard", "4/0", "--gentxn", "false", - "--multiplier-fanout", "1,1", + "--multiplier-fanout", "1", "--host-network", "false", "--https", "localdomain", "--seed-multiplier", "true", @@ -792,8 +791,8 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se xml_replace_element(config_file, config_file.documentElement, "DEBUG_LEVEL", "3") xml_replace_element(config_file, config_file.documentElement, "BROADCAST_GOSSIP_MODE", "true") xml_replace_element(config_file, config_file.documentElement, "SEND_RESPONSE_FOR_LAZY_PUSH", "false") - xml_replace_element(config_file, config_file.documentElement, "MAX_NEIGHBORS_PER_ROUND", "3") - xml_replace_element(config_file, config_file.documentElement, "NUM_GOSSIP_RECEIVERS", "3") + xml_replace_element(config_file, config_file.documentElement, "MAX_NEIGHBORS_PER_ROUND", "5") + xml_replace_element(config_file, config_file.documentElement, "NUM_GOSSIP_RECEIVERS", "5") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_HOSTNAME", "") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PORT", "0") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PROVIDER", "NONE") From 6d0e64f285a09852f70841e56ddb44c61b2dd1b1 Mon Sep 17 00:00:00 2001 From: stephen white Date: Fri, 3 Nov 2023 09:47:16 +0000 Subject: [PATCH 23/61] Made my changes to config descrete and inside localdev under the desk parameter --- build.sh | 1 - constants.xml | 2 +- scripts/localdev.py | 4 ---- src/libNetwork/SendJobs.cpp | 4 +--- 4 files changed, 2 insertions(+), 9 deletions(-) diff --git a/build.sh b/build.sh index cae80e47f4..55623a9d3b 100755 --- a/build.sh +++ b/build.sh @@ -174,7 +174,6 @@ echo "Current directory: $(pwd)" echo "Build directory: ${build_dir}" echo "Install directory: ${install_dir}" -jobs=4 echo building using $jobs jobs diff --git a/constants.xml b/constants.xml index bf7d535f75..9eae455481 100644 --- a/constants.xml +++ b/constants.xml @@ -208,7 +208,7 @@ - 10 + 200 4 0.05 diff --git a/scripts/localdev.py b/scripts/localdev.py index fc2dd21fa0..c6c37baf42 100755 --- a/scripts/localdev.py +++ b/scripts/localdev.py @@ -801,10 +801,6 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_PORT", "") xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_PROVIDER", "NONE") xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_MASK", "NONE") - xml_replace_element_if_exists(config_file, config_file.documentElement, "SIGN_VERIFY_EMPTY_MSGTYP", "false") - xml_replace_element_if_exists(config_file, config_file.documentElement, "SIGN_VERIFY_NONEMPTY_MSGTYP", "false") - xml_replace_element_if_exists(config_file, config_file.documentElement, "ROUND_TIME_IN_MS", "100") - xml_replace_element_if_exists(config_file, config_file.documentElement, "SIMULATED_NETWORK_DELAY_IN_MS", "0") else: xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_HOSTNAME", "0.0.0.0") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PORT", "0") diff --git a/src/libNetwork/SendJobs.cpp b/src/libNetwork/SendJobs.cpp index f7086f02fc..c22f21b1b0 100644 --- a/src/libNetwork/SendJobs.cpp +++ b/src/libNetwork/SendJobs.cpp @@ -502,12 +502,10 @@ class SendJobsImpl : public SendJobs, void SendMessageToPeer(const Peer& peer, RawMessage message, bool allow_relaxed_blacklist) override { zil::local::variables.AddSendMessageToPeerCount(1); - if (false) { - if (peer.m_listenPortHost == 0) { + if (peer.m_listenPortHost == 0) { LOG_GENERAL(WARNING, "Ignoring message to peer " << peer); zil::local::variables.AddSendMessageToPeerFailed(1); return; - } } LOG_GENERAL(DEBUG, "Enqueueing message, size=" << message.size From 0118808e657463f0e55ff9fb7af6cceddf1b9eb0 Mon Sep 17 00:00:00 2001 From: stephen white Date: Fri, 3 Nov 2023 11:08:36 +0000 Subject: [PATCH 24/61] Made my changes to config descrete and inside localdev under the desk parameter --- scripts/localdev.py | 29 +- src/libNetwork/SendJobs.cpp | 6 +- src/libUtils/Logger.h | 2 - tests/EvmAcceptanceTests/.eslintrc.json | 10 +- tests/EvmAcceptanceTests/hardhat.config.ts | 15 +- .../helpers/SignersHelper.ts | 40 +- tests/EvmAcceptanceTests/helpers/UiHelper.ts | 40 + tests/EvmAcceptanceTests/helpers/index.ts | 2 +- tests/EvmAcceptanceTests/package-lock.json | 993 ++- tests/EvmAcceptanceTests/package.json | 4 +- tests/EvmAcceptanceTests/pnpm-lock.yaml | 6310 ++++++++++------- .../scripts/FundAccountsAsync.ts | 12 +- .../EvmAcceptanceTests/tasks/RefundSigners.ts | 68 +- tests/EvmAcceptanceTests/tasks/SetRewards.ts | 18 +- tests/EvmAcceptanceTests/tasks/Setup.ts | 214 +- tests/EvmAcceptanceTests/tasks/Ui.ts | 81 + tests/Zilliqa/test_zilliqa_local.py | 16 +- tests/Zilliqa/test_zilliqa_lookup.py | 31 +- 18 files changed, 4842 insertions(+), 3049 deletions(-) create mode 100644 tests/EvmAcceptanceTests/helpers/UiHelper.ts create mode 100644 tests/EvmAcceptanceTests/tasks/Ui.ts diff --git a/scripts/localdev.py b/scripts/localdev.py index c6c37baf42..ddb4990c23 100755 --- a/scripts/localdev.py +++ b/scripts/localdev.py @@ -745,19 +745,20 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se if desk: print("Using Desktop mode for small configurations logging turned down, telemetry off") cmd = ["./bootstrap.py", testnet_name, "--clusters", "minikube", "--constants-from-file", - os.path.join(ZILLIQA_DIR, "constants.xml"), - "--image", zilliqa_image, - "-n", "6", - "-d", "5", - "-l", "1", - "--guard", "4/0", - "--gentxn", "false", - "--multiplier-fanout", "1", - "--host-network", "false", - "--https", "localdomain", - "--seed-multiplier", "true", - "--bucket", bucket_name, - "--localstack", "true"] + os.path.join(ZILLIQA_DIR, "constants.xml"), + "--image", zilliqa_image, + "-n", "15", + "-s", "15", + "-d", "15", + "-l", "1", + "--guard", "11/0", + "--gentxn", "false", + "--multiplier-fanout", "1,1", + "--host-network", "false", + "--https", "localdomain", + "--seed-multiplier", "true", + "--bucket", bucket_name, + "--localstack", "true"] else: cmd = ["./bootstrap.py", testnet_name, "--clusters", "minikube", "--constants-from-file", os.path.join(ZILLIQA_DIR, "constants.xml"), @@ -789,7 +790,7 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se if desk: print("Explicitly disabling all telemetry for desktop testing mode") xml_replace_element(config_file, config_file.documentElement, "DEBUG_LEVEL", "3") - xml_replace_element(config_file, config_file.documentElement, "BROADCAST_GOSSIP_MODE", "true") + xml_replace_element(config_file, config_file.documentElement, "BROADCAST_GOSSIP_MODE", "false") xml_replace_element(config_file, config_file.documentElement, "SEND_RESPONSE_FOR_LAZY_PUSH", "false") xml_replace_element(config_file, config_file.documentElement, "MAX_NEIGHBORS_PER_ROUND", "5") xml_replace_element(config_file, config_file.documentElement, "NUM_GOSSIP_RECEIVERS", "5") diff --git a/src/libNetwork/SendJobs.cpp b/src/libNetwork/SendJobs.cpp index c22f21b1b0..b55bfd21f8 100644 --- a/src/libNetwork/SendJobs.cpp +++ b/src/libNetwork/SendJobs.cpp @@ -503,9 +503,9 @@ class SendJobsImpl : public SendJobs, bool allow_relaxed_blacklist) override { zil::local::variables.AddSendMessageToPeerCount(1); if (peer.m_listenPortHost == 0) { - LOG_GENERAL(WARNING, "Ignoring message to peer " << peer); - zil::local::variables.AddSendMessageToPeerFailed(1); - return; + LOG_GENERAL(WARNING, "Ignoring message to peer " << peer); + zil::local::variables.AddSendMessageToPeerFailed(1); + return; } LOG_GENERAL(DEBUG, "Enqueueing message, size=" << message.size diff --git a/src/libUtils/Logger.h b/src/libUtils/Logger.h index 58dceb1a99..44fb48778a 100644 --- a/src/libUtils/Logger.h +++ b/src/libUtils/Logger.h @@ -161,8 +161,6 @@ std::shared_ptr CreateTracingExtraData(); #define LOG_GENERAL(level, msg) \ { TRACED_FILTERED_LOG(level, &Logger::IsGeneralSink) << ' ' << msg; } - -#define NOMARK 1 #if !defined(NOMARK) #define LOG_MARKER() \ Logger::ScopeMarker marker{__FILE__, __LINE__, __FUNCTION__}; diff --git a/tests/EvmAcceptanceTests/.eslintrc.json b/tests/EvmAcceptanceTests/.eslintrc.json index 9eb3697c62..dc313206da 100644 --- a/tests/EvmAcceptanceTests/.eslintrc.json +++ b/tests/EvmAcceptanceTests/.eslintrc.json @@ -6,7 +6,7 @@ "node": true }, "extends": ["plugin:mocha/recommended", "prettier"], - "plugins": ["mocha", "prettier"], + "plugins": ["mocha", "prettier", "unused-imports"], "parserOptions": { "ecmaVersion": "latest" }, @@ -17,6 +17,12 @@ "quotes": ["error", "double"], "semi": ["error", "always"], "mocha/no-pending-tests": "off", - "comma-dangle": ["error", "never"] + "comma-dangle": ["error", "never"], + "no-unused-vars": "off", // or "@typescript-eslint/no-unused-vars": "off", + "unused-imports/no-unused-imports": ["error"], + "unused-imports/no-unused-vars": [ + "warn", + {"vars": "all", "varsIgnorePattern": "^_", "args": "after-used", "argsIgnorePattern": "^_"} + ] } } diff --git a/tests/EvmAcceptanceTests/hardhat.config.ts b/tests/EvmAcceptanceTests/hardhat.config.ts index ca9da871bb..b86d4e0fb9 100644 --- a/tests/EvmAcceptanceTests/hardhat.config.ts +++ b/tests/EvmAcceptanceTests/hardhat.config.ts @@ -2,7 +2,7 @@ import "@nomicfoundation/hardhat-toolbox"; import "@nomiclabs/hardhat-web3"; import {HardhatUserConfig} from "hardhat/types"; import "dotenv/config"; -import { loadFromSignersFile } from "./helpers/SignersHelper"; +import {loadFromSignersFile} from "./helpers/SignersHelper"; import {ENV_VARS} from "./helpers/EnvVarParser"; if (ENV_VARS.scilla) { @@ -27,6 +27,16 @@ const config: HardhatUserConfig = { defaultNetwork: "isolated_server", networks: { + mauro: { + url: "https://api.devnet.zilliqa.com", + websocketUrl: "https://api.devnet.zilliqa.com", + accounts: ["7498BC4F05582DBA6A5A2C11B86F080C071138B83B05396634A50175BE250D77"], + chainId: 0x8269, + zilliqaNetwork: true, + web3ClientVersion: "Zilliqa/v8.2", + protocolVersion: 0x41, + miningState: false + }, public_devnet: { url: "https://api.devnet.zilliqa.com", websocketUrl: "ws://api.devnet.zilliqa.com", @@ -166,6 +176,7 @@ import "./tasks/Transfer"; import "./tasks/InitSigners"; import "./tasks/RefundSigners"; import "./tasks/SetRewards"; +import "./tasks/Ui"; import {initZilliqa} from "hardhat-scilla-plugin"; -export default config; \ No newline at end of file +export default config; diff --git a/tests/EvmAcceptanceTests/helpers/SignersHelper.ts b/tests/EvmAcceptanceTests/helpers/SignersHelper.ts index 8c64c512aa..78202dcf8d 100644 --- a/tests/EvmAcceptanceTests/helpers/SignersHelper.ts +++ b/tests/EvmAcceptanceTests/helpers/SignersHelper.ts @@ -6,12 +6,22 @@ import fs from "fs"; /// HRE CAN'T BE IMPORTED, BECAUSE THIS FUNCTIONS ARE USED IN TASKS, IT SHOULD BE PASSED AS AN ARGUMENT. +export enum AccountType { + EthBased = "eth", + ZilBased = "zil" +} + +export type Account = { + type: AccountType; + private_key: string; +}; + export const getEthBalance = async ( hre: HardhatRuntimeEnvironment, privateKey: string ): Promise<[address: string, balance: BigNumber]> => { const wallet = new ethers.Wallet(privateKey, hre.ethers.provider); - return [wallet.address, await wallet.getBalance()]; + return [wallet.address.toLowerCase(), await wallet.getBalance()]; }; export const getZilBalance = async ( @@ -23,9 +33,9 @@ export const getZilBalance = async ( const balanceResult = await zilliqa.blockchain.getBalance(address); if (balanceResult.error) { - return [address, new BN(0)]; + return [address.toLowerCase(), new BN(0)]; } else { - return [address, new BN(balanceResult.result.balance)]; + return [address.toLowerCase(), new BN(balanceResult.result.balance)]; } }; @@ -48,4 +58,26 @@ export const loadFromSignersFile = (network_name: string): string[] => { export const loadSignersFromConfig = (hre: HardhatRuntimeEnvironment): string[] => { return hre.network["config"]["accounts"] as string[]; -}; \ No newline at end of file +}; + +export const getAllSigners = (hre: HardhatRuntimeEnvironment): string[] => { + return [...loadFromSignersFile(hre.network.name), ...loadSignersFromConfig(hre)]; +}; + +export const getEthSignersBalances = async ( + hre: HardhatRuntimeEnvironment +): Promise<[address: string, balance: BigNumber][]> => { + const signers = getAllSigners(hre); + + let promises = signers.map((signer) => getEthBalance(hre, signer)); + return await Promise.all(promises); +}; + +export const getZilSignersBalances = async ( + hre: HardhatRuntimeEnvironment +): Promise<[address: string, balance: BN][]> => { + const signers = getAllSigners(hre); + + let promises = signers.map((signer) => getZilBalance(hre, signer)); + return await Promise.all(promises); +}; diff --git a/tests/EvmAcceptanceTests/helpers/UiHelper.ts b/tests/EvmAcceptanceTests/helpers/UiHelper.ts new file mode 100644 index 0000000000..6ef8a186d2 --- /dev/null +++ b/tests/EvmAcceptanceTests/helpers/UiHelper.ts @@ -0,0 +1,40 @@ +import input from "@inquirer/input"; +import select from "@inquirer/select"; +import {Account, AccountType} from "./SignersHelper"; + +export const askAmount = async (message?: string): Promise => { + return Number(await input({message: message || "How much for each signer?"})); +}; + +export const askForAccount = async (typeMessage?: string, privateKeyMessage?: string): Promise => { + const type = await askForAccountType(typeMessage); + const private_key = await input({message: privateKeyMessage || "Enter your private key: "}); + return { + type, + private_key + }; +}; + +export const askForAccountType = async ( + message?: string, + ethMessage?: string, + zilMessage?: string +): Promise => { + return await select({ + message: message || "What type of funded source account do you have?", + choices: [ + { + name: ethMessage || "An eth-based account", + value: AccountType.EthBased + }, + { + name: zilMessage || "A zil-based account", + value: AccountType.ZilBased + } + ] + }); +}; + +export const askForAddress = async (message?: string): Promise => { + return await input({message: message || "Enter the destination address: "}); +}; diff --git a/tests/EvmAcceptanceTests/helpers/index.ts b/tests/EvmAcceptanceTests/helpers/index.ts index b6b38a5d62..f1b60fb298 100644 --- a/tests/EvmAcceptanceTests/helpers/index.ts +++ b/tests/EvmAcceptanceTests/helpers/index.ts @@ -1,4 +1,4 @@ export * from "./DebugHelper"; export * from "./JsonRpcHelper"; export * from "./Parallelizer"; -export * from "./SignersHelper"; \ No newline at end of file +export * from "./SignersHelper"; diff --git a/tests/EvmAcceptanceTests/package-lock.json b/tests/EvmAcceptanceTests/package-lock.json index 069b1250b5..cd99aec1ab 100644 --- a/tests/EvmAcceptanceTests/package-lock.json +++ b/tests/EvmAcceptanceTests/package-lock.json @@ -9,6 +9,8 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "@inquirer/input": "^1.2.13", + "@inquirer/select": "^1.3.0", "@types/deep-equal-in-any-order": "^1.0.1", "@types/terminal-kit": "^2.5.2", "@zilliqa-js/zilliqa": "^3.4.4", @@ -16,7 +18,6 @@ "deep-equal-in-any-order": "^2.0.6", "dotenv": "^16.3.1", "ora": "^3.4.0", - "terminal-kit": "^3.0.0", "yargs": "^17.7.2" }, "devDependencies": { @@ -43,6 +44,7 @@ "eslint-config-prettier": "^8.10.0", "eslint-plugin-mocha": "10.1.0", "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-unused-imports": "^3.0.0", "ethers": "^5.7.2", "hardhat": "^2.18.0", "hardhat-gas-reporter": "^1.0.9", @@ -632,19 +634,6 @@ "case": "^1.6.3" } }, - "node_modules/@cronvel/get-pixels": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@cronvel/get-pixels/-/get-pixels-3.4.1.tgz", - "integrity": "sha512-gB5C5nDIacLUdsMuW8YsM9SzK3vaFANe4J11CVXpovpy7bZUGrcJKmc6m/0gWG789pKr6XSZY2aEetjFvSRw5g==", - "dependencies": { - "jpeg-js": "^0.4.4", - "ndarray": "^1.0.19", - "ndarray-pack": "^1.1.1", - "node-bitmap": "0.0.1", - "omggif": "^1.0.10", - "pngjs": "^6.0.0" - } - }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -1809,6 +1798,322 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@inquirer/core": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-5.1.0.tgz", + "integrity": "sha512-EVnific72BhMOMo8mElvrYhGFWJZ73X6j0I+fITIPTsdAz6Z9A3w3csKy+XaH87/5QAEIQHR7RSCVXvQpIqNdQ==", + "dependencies": { + "@inquirer/type": "^1.1.5", + "@types/mute-stream": "^0.0.2", + "@types/node": "^20.8.2", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "cli-spinners": "^2.9.1", + "cli-width": "^4.1.0", + "figures": "^3.2.0", + "mute-stream": "^1.0.0", + "run-async": "^3.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/@inquirer/core/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@inquirer/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@inquirer/core/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@inquirer/core/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@inquirer/core/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@inquirer/core/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/input": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-1.2.13.tgz", + "integrity": "sha512-gALuvSpZRYfqygPjlYWodMZ4TXwALvw7Pk4tRFhE1oMN79rLVlg88Z/X6JCUh+uV2qLaxxgbeP+cgPWTvuWsCg==", + "dependencies": { + "@inquirer/core": "^5.1.0", + "@inquirer/type": "^1.1.5", + "chalk": "^4.1.2" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/@inquirer/input/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@inquirer/input/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@inquirer/input/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@inquirer/input/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@inquirer/input/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/input/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/select": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-1.3.0.tgz", + "integrity": "sha512-3sL5odCDYI+i+piAFqFa5ULDUKEpc0U1zEY4Wm6gjP6nMAHWM8r1UzMlpQXCyHny91Tz+oeSLeKinAde0z6R7w==", + "dependencies": { + "@inquirer/core": "^5.1.0", + "@inquirer/type": "^1.1.5", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "figures": "^3.2.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/@inquirer/select/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@inquirer/select/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@inquirer/select/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@inquirer/select/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@inquirer/select/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/select/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/type": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.1.5.tgz", + "integrity": "sha512-wmwHvHozpPo4IZkkNtbYenem/0wnfI6hvOcGKmPEa0DwuaH5XUQzFqy6OpEpjEegZMhYIk8HDYITI16BPLtrRA==", + "engines": { + "node": ">=14.18.0" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -4858,15 +5163,26 @@ "integrity": "sha512-NaHL0+0lLNhX6d9rs+NSt97WH/gIlRHmszXbQ/8/MV/eVcFNdeJ/GYhrFuUc8K7WuPhRhTSdMkCp8VMzhUq85w==", "dev": true }, + "node_modules/@types/mute-stream": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.2.tgz", + "integrity": "sha512-FpiGjk6+IOrN0lZEfUUjdra1csU1VxwYFj4S0Zj+TJpu5x5mZW30RkEZojTadrNZHNmpCHgoE62IQZAH0OeuIA==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/nextgen-events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/nextgen-events/-/nextgen-events-1.1.1.tgz", "integrity": "sha512-5ah4pA0NmgvlUp5BAAOj3VogC31OD7ZbU+VC9DYpy5o8zQKqnxCjnnckUDsCjGnynMwzV0NUlzj23Y5/y/xfXA==" }, "node_modules/@types/node": { - "version": "18.7.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.18.tgz", - "integrity": "sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==" + "version": "20.8.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", + "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/ora": { "version": "3.2.0", @@ -4969,6 +5285,11 @@ "@types/node": "*" } }, + "node_modules/@types/wrap-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", + "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==" + }, "node_modules/@types/yargs": { "version": "17.0.28", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.28.tgz", @@ -5335,7 +5656,6 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, "dependencies": { "type-fest": "^0.21.3" }, @@ -6294,11 +6614,6 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, - "node_modules/chroma-js": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.4.2.tgz", - "integrity": "sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A==" - }, "node_modules/ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", @@ -6436,9 +6751,9 @@ } }, "node_modules/cli-spinners": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", - "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.1.tgz", + "integrity": "sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==", "engines": { "node": ">=6" }, @@ -6568,6 +6883,14 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "engines": { + "node": ">= 12" + } + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -7040,14 +7363,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/cwise-compiler": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cwise-compiler/-/cwise-compiler-1.1.3.tgz", - "integrity": "sha512-WXlK/m+Di8DMMcCjcWr4i+XzcQra9eCdXIJrgh4TUgh0pIS/yJduLxS9JgefsHJ/YVLdgPtXm9r62W92MvanEQ==", - "dependencies": { - "uniq": "^1.0.0" - } - }, "node_modules/d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -7811,6 +8126,36 @@ } } }, + "node_modules/eslint-plugin-unused-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.0.0.tgz", + "integrity": "sha512-sduiswLJfZHeeBJ+MQaG+xYzSWdRXoSw61DpU13mzWumCkR0ufD0HmO4kdNokjrkluMHpj/7PJeN35pgbhW3kw==", + "dev": true, + "dependencies": { + "eslint-rule-composer": "^0.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^6.0.0", + "eslint": "^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, + "node_modules/eslint-rule-composer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", @@ -9286,6 +9631,20 @@ "node": "^12.20 || >= 14.13" } }, + "node_modules/figures": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -10663,11 +11022,6 @@ "fp-ts": "^1.0.0" } }, - "node_modules/iota-array": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/iota-array/-/iota-array-1.0.0.tgz", - "integrity": "sha512-pZ2xT+LOHckCatGQ3DcG/a+QuEqvoxqkiL7tvE8nn3uuu+f6i1TtpB5/FtWFbxUuVr5PZCx8KskuGatbJDXOWA==" - }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -12262,11 +12616,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/jpeg-js": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", - "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==" - }, "node_modules/js-sdsl": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.2.tgz", @@ -12436,14 +12785,6 @@ "graceful-fs": "^4.1.9" } }, - "node_modules/lazyness": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/lazyness/-/lazyness-1.2.0.tgz", - "integrity": "sha512-KenL6EFbwxBwRxG93t0gcUyi0Nw0Ub31FJKN1laA4UscdkL1K1AxUd0gYZdcLU3v+x+wcFi4uQKS5hL+fk500g==", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", @@ -13768,6 +14109,14 @@ "buffer": "^5.5.0" } }, + "node_modules/mute-stream": { + "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==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/nan": { "version": "2.18.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", @@ -13809,29 +14158,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/ndarray": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/ndarray/-/ndarray-1.0.19.tgz", - "integrity": "sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ==", - "dependencies": { - "iota-array": "^1.0.0", - "is-buffer": "^1.0.2" - } - }, - "node_modules/ndarray-pack": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ndarray-pack/-/ndarray-pack-1.2.1.tgz", - "integrity": "sha512-51cECUJMT0rUZNQa09EoKsnFeDL4x2dHRT0VR5U2H5ZgEcm95ZDWcMA5JShroXjHOejmAD/fg8+H+OvUnVXz2g==", - "dependencies": { - "cwise-compiler": "^1.1.2", - "ndarray": "^1.0.13" - } - }, - "node_modules/ndarray/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -13852,14 +14178,6 @@ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" }, - "node_modules/nextgen-events": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/nextgen-events/-/nextgen-events-1.5.3.tgz", - "integrity": "sha512-P6qw6kenNXP+J9XlKJNi/MNHUQ+Lx5K8FEcSfX7/w8KJdZan5+BB5MKzuNgL2RTjHG1Svg8SehfseVEp8zAqwA==", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", @@ -13875,14 +14193,6 @@ "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", "dev": true }, - "node_modules/node-bitmap": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/node-bitmap/-/node-bitmap-0.0.1.tgz", - "integrity": "sha512-Jx5lPaaLdIaOsj2mVLWMWulXF6GQVdyLvNSxmiYCvZ8Ma2hfKX0POoR2kgKOqz+oFsRreq0yYZjQ2wjE9VNzCA==", - "engines": { - "node": ">=v0.6.5" - } - }, "node_modules/node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", @@ -14186,11 +14496,6 @@ "http-https": "^1.0.0" } }, - "node_modules/omggif": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", - "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==" - }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -14686,14 +14991,6 @@ "node": ">= 6" } }, - "node_modules/pngjs": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", - "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==", - "engines": { - "node": ">=12.13.0" - } - }, "node_modules/prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -15446,6 +15743,14 @@ "rlp": "bin/rlp" } }, + "node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -15800,7 +16105,8 @@ "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true }, "node_modules/setprototypeof": { "version": "1.2.0", @@ -15808,17 +16114,6 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, - "node_modules/seventh": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/seventh/-/seventh-0.8.2.tgz", - "integrity": "sha512-GQsGIdg98GLYW4KEtzr+JKfI94NTaSeJAzAL3XrObeFeHvVp7PwuVELYNzk6XO1s8rWD+tTDKce3wh/No8ZPAg==", - "dependencies": { - "setimmediate": "^1.0.5" - }, - "engines": { - "node": ">=16.13.0" - } - }, "node_modules/sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", @@ -16389,14 +16684,6 @@ "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", "dev": true }, - "node_modules/string-kit": { - "version": "0.17.10", - "resolved": "https://registry.npmjs.org/string-kit/-/string-kit-0.17.10.tgz", - "integrity": "sha512-n3/2BeEJrlzztoxeBTt9DVh0dfHordBuZoFsSJs59tk1JoPVvtvNsvAgqu0Nlpj5Y/qoQbnT8jCnfuoHcsfGnw==", - "engines": { - "node": ">=14.15.0" - } - }, "node_modules/string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -16905,24 +17192,6 @@ "yallist": "^3.0.0" } }, - "node_modules/terminal-kit": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/terminal-kit/-/terminal-kit-3.0.0.tgz", - "integrity": "sha512-GSJGYF0+hoFylKJXmq0ntE42b4S7zUkxFpf7FqHGwKFPCNeGkuv3jV0tmGquZkmfh5mYb/B2xoPJiP40mJsQrg==", - "dependencies": { - "@cronvel/get-pixels": "^3.4.1", - "chroma-js": "^2.4.2", - "lazyness": "^1.2.0", - "ndarray": "^1.0.19", - "nextgen-events": "^1.5.3", - "seventh": "^0.8.1", - "string-kit": "^0.17.6", - "tree-kit": "^0.7.4" - }, - "engines": { - "node": ">=16.13.0" - } - }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -17106,11 +17375,6 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, - "node_modules/tree-kit": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/tree-kit/-/tree-kit-0.7.5.tgz", - "integrity": "sha512-CmyY7d0OYE5W6UCmvij+SaocG7z+q4roF+Oj7BtU8B+KlpdiRZRMUwNyqfmWYcpYgsOcY1/dfIx/VsLmbAOLGg==" - }, "node_modules/ts-command-line-args": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.3.1.tgz", @@ -17322,7 +17586,6 @@ "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==", - "dev": true, "engines": { "node": ">=10" }, @@ -17481,10 +17744,10 @@ "node": ">=12.18" } }, - "node_modules/uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==" + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/universalify": { "version": "0.1.2", @@ -20502,19 +20765,6 @@ "case": "^1.6.3" } }, - "@cronvel/get-pixels": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@cronvel/get-pixels/-/get-pixels-3.4.1.tgz", - "integrity": "sha512-gB5C5nDIacLUdsMuW8YsM9SzK3vaFANe4J11CVXpovpy7bZUGrcJKmc6m/0gWG789pKr6XSZY2aEetjFvSRw5g==", - "requires": { - "jpeg-js": "^0.4.4", - "ndarray": "^1.0.19", - "ndarray-pack": "^1.1.1", - "node-bitmap": "0.0.1", - "omggif": "^1.0.10", - "pngjs": "^6.0.0" - } - }, "@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -21303,6 +21553,232 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "@inquirer/core": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-5.1.0.tgz", + "integrity": "sha512-EVnific72BhMOMo8mElvrYhGFWJZ73X6j0I+fITIPTsdAz6Z9A3w3csKy+XaH87/5QAEIQHR7RSCVXvQpIqNdQ==", + "requires": { + "@inquirer/type": "^1.1.5", + "@types/mute-stream": "^0.0.2", + "@types/node": "^20.8.2", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "cli-spinners": "^2.9.1", + "cli-width": "^4.1.0", + "figures": "^3.2.0", + "mute-stream": "^1.0.0", + "run-async": "^3.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "@inquirer/input": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-1.2.13.tgz", + "integrity": "sha512-gALuvSpZRYfqygPjlYWodMZ4TXwALvw7Pk4tRFhE1oMN79rLVlg88Z/X6JCUh+uV2qLaxxgbeP+cgPWTvuWsCg==", + "requires": { + "@inquirer/core": "^5.1.0", + "@inquirer/type": "^1.1.5", + "chalk": "^4.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@inquirer/select": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-1.3.0.tgz", + "integrity": "sha512-3sL5odCDYI+i+piAFqFa5ULDUKEpc0U1zEY4Wm6gjP6nMAHWM8r1UzMlpQXCyHny91Tz+oeSLeKinAde0z6R7w==", + "requires": { + "@inquirer/core": "^5.1.0", + "@inquirer/type": "^1.1.5", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "figures": "^3.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@inquirer/type": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.1.5.tgz", + "integrity": "sha512-wmwHvHozpPo4IZkkNtbYenem/0wnfI6hvOcGKmPEa0DwuaH5XUQzFqy6OpEpjEegZMhYIk8HDYITI16BPLtrRA==" + }, "@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -23765,15 +24241,26 @@ "integrity": "sha512-NaHL0+0lLNhX6d9rs+NSt97WH/gIlRHmszXbQ/8/MV/eVcFNdeJ/GYhrFuUc8K7WuPhRhTSdMkCp8VMzhUq85w==", "dev": true }, + "@types/mute-stream": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.2.tgz", + "integrity": "sha512-FpiGjk6+IOrN0lZEfUUjdra1csU1VxwYFj4S0Zj+TJpu5x5mZW30RkEZojTadrNZHNmpCHgoE62IQZAH0OeuIA==", + "requires": { + "@types/node": "*" + } + }, "@types/nextgen-events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/nextgen-events/-/nextgen-events-1.1.1.tgz", "integrity": "sha512-5ah4pA0NmgvlUp5BAAOj3VogC31OD7ZbU+VC9DYpy5o8zQKqnxCjnnckUDsCjGnynMwzV0NUlzj23Y5/y/xfXA==" }, "@types/node": { - "version": "18.7.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.18.tgz", - "integrity": "sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==" + "version": "20.8.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", + "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", + "requires": { + "undici-types": "~5.26.4" + } }, "@types/ora": { "version": "3.2.0", @@ -23877,6 +24364,11 @@ "@types/node": "*" } }, + "@types/wrap-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", + "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==" + }, "@types/yargs": { "version": "17.0.28", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.28.tgz", @@ -24192,7 +24684,6 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, "requires": { "type-fest": "^0.21.3" } @@ -24928,11 +25419,6 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, - "chroma-js": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.4.2.tgz", - "integrity": "sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A==" - }, "ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", @@ -25036,9 +25522,9 @@ } }, "cli-spinners": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", - "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==" + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.1.tgz", + "integrity": "sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==" }, "cli-table3": { "version": "0.5.1", @@ -25117,6 +25603,11 @@ } } }, + "cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==" + }, "cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -25508,14 +25999,6 @@ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true }, - "cwise-compiler": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cwise-compiler/-/cwise-compiler-1.1.3.tgz", - "integrity": "sha512-WXlK/m+Di8DMMcCjcWr4i+XzcQra9eCdXIJrgh4TUgh0pIS/yJduLxS9JgefsHJ/YVLdgPtXm9r62W92MvanEQ==", - "requires": { - "uniq": "^1.0.0" - } - }, "d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -26248,6 +26731,21 @@ "prettier-linter-helpers": "^1.0.0" } }, + "eslint-plugin-unused-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.0.0.tgz", + "integrity": "sha512-sduiswLJfZHeeBJ+MQaG+xYzSWdRXoSw61DpU13mzWumCkR0ufD0HmO4kdNokjrkluMHpj/7PJeN35pgbhW3kw==", + "dev": true, + "requires": { + "eslint-rule-composer": "^0.3.0" + } + }, + "eslint-rule-composer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", + "dev": true + }, "eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", @@ -27264,6 +27762,14 @@ "web-streams-polyfill": "^3.0.3" } }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -28322,11 +28828,6 @@ "fp-ts": "^1.0.0" } }, - "iota-array": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/iota-array/-/iota-array-1.0.0.tgz", - "integrity": "sha512-pZ2xT+LOHckCatGQ3DcG/a+QuEqvoxqkiL7tvE8nn3uuu+f6i1TtpB5/FtWFbxUuVr5PZCx8KskuGatbJDXOWA==" - }, "ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -29474,11 +29975,6 @@ } } }, - "jpeg-js": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", - "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==" - }, "js-sdsl": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.2.tgz", @@ -29616,11 +30112,6 @@ "graceful-fs": "^4.1.9" } }, - "lazyness": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/lazyness/-/lazyness-1.2.0.tgz", - "integrity": "sha512-KenL6EFbwxBwRxG93t0gcUyi0Nw0Ub31FJKN1laA4UscdkL1K1AxUd0gYZdcLU3v+x+wcFi4uQKS5hL+fk500g==" - }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", @@ -30607,6 +31098,11 @@ } } }, + "mute-stream": { + "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": { "version": "2.18.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", @@ -30642,31 +31138,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "ndarray": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/ndarray/-/ndarray-1.0.19.tgz", - "integrity": "sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ==", - "requires": { - "iota-array": "^1.0.0", - "is-buffer": "^1.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - } - } - }, - "ndarray-pack": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ndarray-pack/-/ndarray-pack-1.2.1.tgz", - "integrity": "sha512-51cECUJMT0rUZNQa09EoKsnFeDL4x2dHRT0VR5U2H5ZgEcm95ZDWcMA5JShroXjHOejmAD/fg8+H+OvUnVXz2g==", - "requires": { - "cwise-compiler": "^1.1.2", - "ndarray": "^1.0.13" - } - }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -30684,11 +31155,6 @@ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" }, - "nextgen-events": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/nextgen-events/-/nextgen-events-1.5.3.tgz", - "integrity": "sha512-P6qw6kenNXP+J9XlKJNi/MNHUQ+Lx5K8FEcSfX7/w8KJdZan5+BB5MKzuNgL2RTjHG1Svg8SehfseVEp8zAqwA==" - }, "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", @@ -30704,11 +31170,6 @@ "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", "dev": true }, - "node-bitmap": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/node-bitmap/-/node-bitmap-0.0.1.tgz", - "integrity": "sha512-Jx5lPaaLdIaOsj2mVLWMWulXF6GQVdyLvNSxmiYCvZ8Ma2hfKX0POoR2kgKOqz+oFsRreq0yYZjQ2wjE9VNzCA==" - }, "node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", @@ -30928,11 +31389,6 @@ "http-https": "^1.0.0" } }, - "omggif": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", - "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==" - }, "on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -31306,11 +31762,6 @@ "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true }, - "pngjs": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", - "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==" - }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -31867,6 +32318,11 @@ "bn.js": "^5.2.0" } }, + "run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==" + }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -32145,7 +32601,8 @@ "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true }, "setprototypeof": { "version": "1.2.0", @@ -32153,14 +32610,6 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, - "seventh": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/seventh/-/seventh-0.8.2.tgz", - "integrity": "sha512-GQsGIdg98GLYW4KEtzr+JKfI94NTaSeJAzAL3XrObeFeHvVp7PwuVELYNzk6XO1s8rWD+tTDKce3wh/No8ZPAg==", - "requires": { - "setimmediate": "^1.0.5" - } - }, "sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", @@ -32624,11 +33073,6 @@ "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", "dev": true }, - "string-kit": { - "version": "0.17.10", - "resolved": "https://registry.npmjs.org/string-kit/-/string-kit-0.17.10.tgz", - "integrity": "sha512-n3/2BeEJrlzztoxeBTt9DVh0dfHordBuZoFsSJs59tk1JoPVvtvNsvAgqu0Nlpj5Y/qoQbnT8jCnfuoHcsfGnw==" - }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -33017,21 +33461,6 @@ } } }, - "terminal-kit": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/terminal-kit/-/terminal-kit-3.0.0.tgz", - "integrity": "sha512-GSJGYF0+hoFylKJXmq0ntE42b4S7zUkxFpf7FqHGwKFPCNeGkuv3jV0tmGquZkmfh5mYb/B2xoPJiP40mJsQrg==", - "requires": { - "@cronvel/get-pixels": "^3.4.1", - "chroma-js": "^2.4.2", - "lazyness": "^1.2.0", - "ndarray": "^1.0.19", - "nextgen-events": "^1.5.3", - "seventh": "^0.8.1", - "string-kit": "^0.17.6", - "tree-kit": "^0.7.4" - } - }, "test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -33185,11 +33614,6 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, - "tree-kit": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/tree-kit/-/tree-kit-0.7.5.tgz", - "integrity": "sha512-CmyY7d0OYE5W6UCmvij+SaocG7z+q4roF+Oj7BtU8B+KlpdiRZRMUwNyqfmWYcpYgsOcY1/dfIx/VsLmbAOLGg==" - }, "ts-command-line-args": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.3.1.tgz", @@ -33344,8 +33768,7 @@ "type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" }, "type-is": { "version": "1.6.18", @@ -33457,10 +33880,10 @@ "busboy": "^1.6.0" } }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==" + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "universalify": { "version": "0.1.2", diff --git a/tests/EvmAcceptanceTests/package.json b/tests/EvmAcceptanceTests/package.json index 9af27bafa5..33e43c9661 100644 --- a/tests/EvmAcceptanceTests/package.json +++ b/tests/EvmAcceptanceTests/package.json @@ -36,6 +36,7 @@ "eslint-config-prettier": "^8.10.0", "eslint-plugin-mocha": "10.1.0", "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-unused-imports": "^3.0.0", "ethers": "^5.7.2", "hardhat": "^2.18.0", "hardhat-gas-reporter": "^1.0.9", @@ -51,6 +52,8 @@ "web3": "^1.10.2" }, "dependencies": { + "@inquirer/input": "^1.2.13", + "@inquirer/select": "^1.3.0", "@types/deep-equal-in-any-order": "^1.0.1", "@types/terminal-kit": "^2.5.2", "@zilliqa-js/zilliqa": "^3.4.4", @@ -58,7 +61,6 @@ "deep-equal-in-any-order": "^2.0.6", "dotenv": "^16.3.1", "ora": "^3.4.0", - "terminal-kit": "^3.0.0", "yargs": "^17.7.2" }, "lint-staged": { diff --git a/tests/EvmAcceptanceTests/pnpm-lock.yaml b/tests/EvmAcceptanceTests/pnpm-lock.yaml index d339966d0c..e0f29b1bc5 100644 --- a/tests/EvmAcceptanceTests/pnpm-lock.yaml +++ b/tests/EvmAcceptanceTests/pnpm-lock.yaml @@ -1,17 +1,17 @@ -lockfileVersion: '6.0' +lockfileVersion: "6.0" settings: autoInstallPeers: true excludeLinksFromLockfile: false dependencies: - '@types/deep-equal-in-any-order': + "@types/deep-equal-in-any-order": specifier: ^1.0.1 version: 1.0.1 - '@types/terminal-kit': + "@types/terminal-kit": specifier: ^2.5.2 version: 2.5.2 - '@zilliqa-js/zilliqa': + "@zilliqa-js/zilliqa": specifier: ^3.4.4 version: 3.4.4 cli-color: @@ -34,55 +34,55 @@ dependencies: version: 17.7.2 devDependencies: - '@ethersproject/providers': + "@ethersproject/providers": specifier: ^5.7.2 version: 5.7.2 - '@nomicfoundation/hardhat-chai-matchers': + "@nomicfoundation/hardhat-chai-matchers": specifier: ^1.0.6 version: 1.0.6(@nomiclabs/hardhat-ethers@2.2.2)(chai@4.3.10)(ethers@5.7.2)(hardhat@2.17.4) - '@nomicfoundation/hardhat-network-helpers': + "@nomicfoundation/hardhat-network-helpers": specifier: ^1.0.9 version: 1.0.9(hardhat@2.17.4) - '@nomicfoundation/hardhat-toolbox': + "@nomicfoundation/hardhat-toolbox": specifier: ^2.0.2 version: 2.0.2(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@nomicfoundation/hardhat-chai-matchers@1.0.6)(@nomicfoundation/hardhat-network-helpers@1.0.9)(@nomiclabs/hardhat-ethers@2.2.2)(@nomiclabs/hardhat-etherscan@3.1.7)(@typechain/ethers-v5@10.2.1)(@typechain/hardhat@6.1.6)(@types/chai@4.3.6)(@types/mocha@10.0.2)(@types/node@20.8.0)(chai@4.3.10)(ethers@5.7.2)(hardhat-gas-reporter@1.0.9)(hardhat@2.17.4)(solidity-coverage@0.8.5)(ts-node@10.9.1)(typechain@8.3.1)(typescript@5.2.2) - '@nomiclabs/hardhat-ethers': + "@nomiclabs/hardhat-ethers": specifier: 2.2.2 version: 2.2.2(ethers@5.7.2)(hardhat@2.17.4) - '@nomiclabs/hardhat-etherscan': + "@nomiclabs/hardhat-etherscan": specifier: ^3.1.7 version: 3.1.7(hardhat@2.17.4) - '@nomiclabs/hardhat-web3': + "@nomiclabs/hardhat-web3": specifier: ^2.0.0 version: 2.0.0(hardhat@2.17.4)(web3@1.10.2) - '@openzeppelin/contracts': + "@openzeppelin/contracts": specifier: ^4.9.3 version: 4.9.3 - '@openzeppelin/test-helpers': + "@openzeppelin/test-helpers": specifier: ^0.5.16 version: 0.5.16(bn.js@4.12.0) - '@typechain/ethers-v5': + "@typechain/ethers-v5": specifier: ^10.2.1 version: 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.1)(typescript@5.2.2) - '@typechain/hardhat': + "@typechain/hardhat": specifier: ^6.1.6 version: 6.1.6(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@typechain/ethers-v5@10.2.1)(ethers@5.7.2)(hardhat@2.17.4)(typechain@8.3.1) - '@types/chai': + "@types/chai": specifier: ^4.3.6 version: 4.3.6 - '@types/cli-color': + "@types/cli-color": specifier: ^2.0.3 version: 2.0.3 - '@types/mocha': + "@types/mocha": specifier: ^10.0.2 version: 10.0.2 - '@types/ora': + "@types/ora": specifier: ^3.2.0 version: 3.2.0 - '@types/semver': + "@types/semver": specifier: ^7.5.3 version: 7.5.3 - '@types/yargs': + "@types/yargs": specifier: ^17.0.26 version: 17.0.26 axios: @@ -147,47 +147,51 @@ devDependencies: version: 1.10.2 packages: - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: ">=0.10.0"} dev: true /@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} - engines: {node: '>=6.0.0'} + resolution: + {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: ">=6.0.0"} dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 + "@jridgewell/gen-mapping": 0.3.3 + "@jridgewell/trace-mapping": 0.3.19 dev: true /@babel/code-frame@7.22.13: - resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} - engines: {node: '>=6.9.0'} + resolution: + {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + engines: {node: ">=6.9.0"} dependencies: - '@babel/highlight': 7.22.20 + "@babel/highlight": 7.22.20 chalk: 2.4.2 dev: true /@babel/compat-data@7.22.20: - resolution: {integrity: sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==} - engines: {node: '>=6.9.0'} + resolution: + {integrity: sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==} + engines: {node: ">=6.9.0"} dev: true /@babel/core@7.23.0: - resolution: {integrity: sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.0 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) - '@babel/helpers': 7.23.1 - '@babel/parser': 7.23.0 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.0 - '@babel/types': 7.23.0 + resolution: + {integrity: sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==} + engines: {node: ">=6.9.0"} + dependencies: + "@ampproject/remapping": 2.2.1 + "@babel/code-frame": 7.22.13 + "@babel/generator": 7.23.0 + "@babel/helper-compilation-targets": 7.22.15 + "@babel/helper-module-transforms": 7.23.0(@babel/core@7.23.0) + "@babel/helpers": 7.23.1 + "@babel/parser": 7.23.0 + "@babel/template": 7.22.15 + "@babel/traverse": 7.23.0 + "@babel/types": 7.23.0 convert-source-map: 2.0.0 debug: 4.3.4(supports-color@8.1.1) gensync: 1.0.0-beta.2 @@ -198,286 +202,319 @@ packages: dev: true /@babel/generator@7.23.0: - resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} - engines: {node: '>=6.9.0'} + resolution: + {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} + engines: {node: ">=6.9.0"} dependencies: - '@babel/types': 7.23.0 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 + "@babel/types": 7.23.0 + "@jridgewell/gen-mapping": 0.3.3 + "@jridgewell/trace-mapping": 0.3.19 jsesc: 2.5.2 dev: true /@babel/helper-compilation-targets@7.22.15: - resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} - engines: {node: '>=6.9.0'} + resolution: + {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + engines: {node: ">=6.9.0"} dependencies: - '@babel/compat-data': 7.22.20 - '@babel/helper-validator-option': 7.22.15 + "@babel/compat-data": 7.22.20 + "@babel/helper-validator-option": 7.22.15 browserslist: 4.22.1 lru-cache: 5.1.1 semver: 6.3.1 dev: true /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} - engines: {node: '>=6.9.0'} + resolution: + {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: ">=6.9.0"} dev: true /@babel/helper-function-name@7.23.0: - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} - engines: {node: '>=6.9.0'} + resolution: + {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: ">=6.9.0"} dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.0 + "@babel/template": 7.22.15 + "@babel/types": 7.23.0 dev: true /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} + resolution: + {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: ">=6.9.0"} dependencies: - '@babel/types': 7.23.0 + "@babel/types": 7.23.0 dev: true /@babel/helper-module-imports@7.22.15: - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} - engines: {node: '>=6.9.0'} + resolution: + {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: ">=6.9.0"} dependencies: - '@babel/types': 7.23.0 + "@babel/types": 7.23.0 dev: true /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.0): - resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} - engines: {node: '>=6.9.0'} + resolution: + {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} + engines: {node: ">=6.9.0"} peerDependencies: - '@babel/core': ^7.0.0 + "@babel/core": ^7.0.0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 + "@babel/core": 7.23.0 + "@babel/helper-environment-visitor": 7.22.20 + "@babel/helper-module-imports": 7.22.15 + "@babel/helper-simple-access": 7.22.5 + "@babel/helper-split-export-declaration": 7.22.6 + "@babel/helper-validator-identifier": 7.22.20 dev: true /@babel/helper-plugin-utils@7.22.5: - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} - engines: {node: '>=6.9.0'} + resolution: + {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: ">=6.9.0"} dev: true /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} + resolution: + {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: ">=6.9.0"} dependencies: - '@babel/types': 7.23.0 + "@babel/types": 7.23.0 dev: true /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} - engines: {node: '>=6.9.0'} + resolution: + {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: ">=6.9.0"} dependencies: - '@babel/types': 7.23.0 + "@babel/types": 7.23.0 dev: true /@babel/helper-string-parser@7.22.5: - resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} - engines: {node: '>=6.9.0'} + resolution: + {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + engines: {node: ">=6.9.0"} dev: true /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} + resolution: + {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: ">=6.9.0"} dev: true /@babel/helper-validator-option@7.22.15: - resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} - engines: {node: '>=6.9.0'} + resolution: + {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + engines: {node: ">=6.9.0"} dev: true /@babel/helpers@7.23.1: - resolution: {integrity: sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==} - engines: {node: '>=6.9.0'} + resolution: + {integrity: sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==} + engines: {node: ">=6.9.0"} dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.0 - '@babel/types': 7.23.0 + "@babel/template": 7.22.15 + "@babel/traverse": 7.23.0 + "@babel/types": 7.23.0 transitivePeerDependencies: - supports-color dev: true /@babel/highlight@7.22.20: - resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} - engines: {node: '>=6.9.0'} + resolution: + {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} + engines: {node: ">=6.9.0"} dependencies: - '@babel/helper-validator-identifier': 7.22.20 + "@babel/helper-validator-identifier": 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 dev: true /@babel/parser@7.23.0: - resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} - engines: {node: '>=6.0.0'} + resolution: + {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} + engines: {node: ">=6.0.0"} hasBin: true dependencies: - '@babel/types': 7.23.0 + "@babel/types": 7.23.0 dev: true /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.0): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + resolution: + {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + "@babel/core": 7.23.0 + "@babel/helper-plugin-utils": 7.22.5 dev: true /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.0): - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + resolution: + {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + "@babel/core": 7.23.0 + "@babel/helper-plugin-utils": 7.22.5 dev: true /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.0): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + resolution: + {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + "@babel/core": 7.23.0 + "@babel/helper-plugin-utils": 7.22.5 dev: true /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.0): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + resolution: + {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + "@babel/core": 7.23.0 + "@babel/helper-plugin-utils": 7.22.5 dev: true /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.0): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + resolution: + {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + "@babel/core": 7.23.0 + "@babel/helper-plugin-utils": 7.22.5 dev: true /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} - engines: {node: '>=6.9.0'} + resolution: + {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} + engines: {node: ">=6.9.0"} peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + "@babel/core": 7.23.0 + "@babel/helper-plugin-utils": 7.22.5 dev: true /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.0): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + resolution: + {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + "@babel/core": 7.23.0 + "@babel/helper-plugin-utils": 7.22.5 dev: true /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.0): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + resolution: + {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + "@babel/core": 7.23.0 + "@babel/helper-plugin-utils": 7.22.5 dev: true /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.0): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + resolution: + {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + "@babel/core": 7.23.0 + "@babel/helper-plugin-utils": 7.22.5 dev: true /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.0): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + resolution: + {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + "@babel/core": 7.23.0 + "@babel/helper-plugin-utils": 7.22.5 dev: true /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.0): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + resolution: + {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + "@babel/core": 7.23.0 + "@babel/helper-plugin-utils": 7.22.5 dev: true /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.0): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + resolution: + {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + "@babel/core": 7.23.0 + "@babel/helper-plugin-utils": 7.22.5 dev: true /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.0): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} + resolution: + {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: ">=6.9.0"} peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + "@babel/core": 7.23.0 + "@babel/helper-plugin-utils": 7.22.5 dev: true /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} - engines: {node: '>=6.9.0'} + resolution: + {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} + engines: {node: ">=6.9.0"} peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + "@babel/core": 7.23.0 + "@babel/helper-plugin-utils": 7.22.5 dev: true /@babel/runtime@7.23.1: - resolution: {integrity: sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==} - engines: {node: '>=6.9.0'} + resolution: + {integrity: sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==} + engines: {node: ">=6.9.0"} dependencies: regenerator-runtime: 0.14.0 dev: true /@babel/template@7.22.15: - resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} - engines: {node: '>=6.9.0'} + resolution: + {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: ">=6.9.0"} dependencies: - '@babel/code-frame': 7.22.13 - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 + "@babel/code-frame": 7.22.13 + "@babel/parser": 7.23.0 + "@babel/types": 7.23.0 dev: true /@babel/traverse@7.23.0: - resolution: {integrity: sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 + resolution: + {integrity: sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==} + engines: {node: ">=6.9.0"} + dependencies: + "@babel/code-frame": 7.22.13 + "@babel/generator": 7.23.0 + "@babel/helper-environment-visitor": 7.22.20 + "@babel/helper-function-name": 7.23.0 + "@babel/helper-hoist-variables": 7.22.5 + "@babel/helper-split-export-declaration": 7.22.6 + "@babel/parser": 7.23.0 + "@babel/types": 7.23.0 debug: 4.3.4(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: @@ -485,47 +522,54 @@ packages: dev: true /@babel/types@7.23.0: - resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} - engines: {node: '>=6.9.0'} + resolution: + {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} + engines: {node: ">=6.9.0"} dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.20 + "@babel/helper-string-parser": 7.22.5 + "@babel/helper-validator-identifier": 7.22.20 to-fast-properties: 2.0.0 dev: true /@chainsafe/as-sha256@0.3.1: - resolution: {integrity: sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==} + resolution: + {integrity: sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==} dev: true /@chainsafe/persistent-merkle-tree@0.4.2: - resolution: {integrity: sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==} + resolution: + {integrity: sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==} dependencies: - '@chainsafe/as-sha256': 0.3.1 + "@chainsafe/as-sha256": 0.3.1 dev: true /@chainsafe/persistent-merkle-tree@0.5.0: - resolution: {integrity: sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==} + resolution: + {integrity: sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==} dependencies: - '@chainsafe/as-sha256': 0.3.1 + "@chainsafe/as-sha256": 0.3.1 dev: true /@chainsafe/ssz@0.10.2: - resolution: {integrity: sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==} + resolution: + {integrity: sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==} dependencies: - '@chainsafe/as-sha256': 0.3.1 - '@chainsafe/persistent-merkle-tree': 0.5.0 + "@chainsafe/as-sha256": 0.3.1 + "@chainsafe/persistent-merkle-tree": 0.5.0 dev: true /@chainsafe/ssz@0.9.4: - resolution: {integrity: sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==} + resolution: + {integrity: sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==} dependencies: - '@chainsafe/as-sha256': 0.3.1 - '@chainsafe/persistent-merkle-tree': 0.4.2 + "@chainsafe/as-sha256": 0.3.1 + "@chainsafe/persistent-merkle-tree": 0.4.2 case: 1.6.3 dev: true /@cronvel/get-pixels@3.4.1: - resolution: {integrity: sha512-gB5C5nDIacLUdsMuW8YsM9SzK3vaFANe4J11CVXpovpy7bZUGrcJKmc6m/0gWG789pKr6XSZY2aEetjFvSRw5g==} + resolution: + {integrity: sha512-gB5C5nDIacLUdsMuW8YsM9SzK3vaFANe4J11CVXpovpy7bZUGrcJKmc6m/0gWG789pKr6XSZY2aEetjFvSRw5g==} dependencies: jpeg-js: 0.4.4 ndarray: 1.0.19 @@ -536,14 +580,16 @@ packages: dev: false /@cspotcode/source-map-support@0.8.1: - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} + resolution: + {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: ">=12"} dependencies: - '@jridgewell/trace-mapping': 0.3.9 + "@jridgewell/trace-mapping": 0.3.9 dev: true /@ensdomains/address-encoder@0.1.9: - resolution: {integrity: sha512-E2d2gP4uxJQnDu2Kfg1tHNspefzbLT8Tyjrm5sEuim32UkU2sm5xL4VXtgc2X33fmPEw9+jUMpGs4veMbf+PYg==} + resolution: + {integrity: sha512-E2d2gP4uxJQnDu2Kfg1tHNspefzbLT8Tyjrm5sEuim32UkU2sm5xL4VXtgc2X33fmPEw9+jUMpGs4veMbf+PYg==} dependencies: bech32: 1.1.4 blakejs: 1.2.1 @@ -555,7 +601,8 @@ packages: dev: true /@ensdomains/ens@0.4.5: - resolution: {integrity: sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==} + resolution: + {integrity: sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==} deprecated: Please use @ensdomains/ens-contracts dependencies: bluebird: 3.7.2 @@ -566,12 +613,13 @@ packages: dev: true /@ensdomains/ensjs@2.1.0: - resolution: {integrity: sha512-GRbGPT8Z/OJMDuxs75U/jUNEC0tbL0aj7/L/QQznGYKm/tiasp+ndLOaoULy9kKJFC0TBByqfFliEHDgoLhyog==} + resolution: + {integrity: sha512-GRbGPT8Z/OJMDuxs75U/jUNEC0tbL0aj7/L/QQznGYKm/tiasp+ndLOaoULy9kKJFC0TBByqfFliEHDgoLhyog==} dependencies: - '@babel/runtime': 7.23.1 - '@ensdomains/address-encoder': 0.1.9 - '@ensdomains/ens': 0.4.5 - '@ensdomains/resolver': 0.2.4 + "@babel/runtime": 7.23.1 + "@ensdomains/address-encoder": 0.1.9 + "@ensdomains/ens": 0.4.5 + "@ensdomains/resolver": 0.2.4 content-hash: 2.5.2 eth-ens-namehash: 2.0.8 ethers: 5.7.2 @@ -582,12 +630,14 @@ packages: dev: true /@ensdomains/resolver@0.2.4: - resolution: {integrity: sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==} + resolution: + {integrity: sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==} deprecated: Please use @ensdomains/ens-contracts dev: true /@eslint-community/eslint-utils@4.4.0(eslint@8.50.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + resolution: + {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -597,12 +647,14 @@ packages: dev: true /@eslint-community/regexpp@4.9.0: - resolution: {integrity: sha512-zJmuCWj2VLBt4c25CfBIbMZLGLyhkvs7LznyVX5HfpzeocThgIj5XQK4L+g3U36mMcx8bPMhGyPpwCATamC4jQ==} + resolution: + {integrity: sha512-zJmuCWj2VLBt4c25CfBIbMZLGLyhkvs7LznyVX5HfpzeocThgIj5XQK4L+g3U36mMcx8bPMhGyPpwCATamC4jQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true /@eslint/eslintrc@2.1.2: - resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} + resolution: + {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 @@ -619,233 +671,257 @@ packages: dev: true /@eslint/js@8.50.0: - resolution: {integrity: sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==} + resolution: + {integrity: sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true /@ethereumjs/common@2.5.0: - resolution: {integrity: sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==} + resolution: + {integrity: sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==} dependencies: crc-32: 1.2.2 ethereumjs-util: 7.1.5 dev: true /@ethereumjs/rlp@4.0.1: - resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} - engines: {node: '>=14'} + resolution: + {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} + engines: {node: ">=14"} hasBin: true dev: true /@ethereumjs/tx@3.3.2: - resolution: {integrity: sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==} + resolution: + {integrity: sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==} dependencies: - '@ethereumjs/common': 2.5.0 + "@ethereumjs/common": 2.5.0 ethereumjs-util: 7.1.5 dev: true /@ethereumjs/util@8.1.0: - resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} - engines: {node: '>=14'} + resolution: + {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} + engines: {node: ">=14"} dependencies: - '@ethereumjs/rlp': 4.0.1 + "@ethereumjs/rlp": 4.0.1 ethereum-cryptography: 2.1.2 micro-ftch: 0.3.1 dev: true /@ethersproject/abi@5.7.0: - resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} + resolution: + {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/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 dev: true /@ethersproject/abstract-provider@5.7.0: - resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} + resolution: + {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/networks': 5.7.1 - '@ethersproject/properties': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/web': 5.7.1 + "@ethersproject/bignumber": 5.7.0 + "@ethersproject/bytes": 5.7.0 + "@ethersproject/logger": 5.7.0 + "@ethersproject/networks": 5.7.1 + "@ethersproject/properties": 5.7.0 + "@ethersproject/transactions": 5.7.0 + "@ethersproject/web": 5.7.1 dev: true /@ethersproject/abstract-signer@5.7.0: - resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} + resolution: + {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/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 dev: true /@ethersproject/address@5.7.0: - resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} + resolution: + {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/bignumber": 5.7.0 + "@ethersproject/bytes": 5.7.0 + "@ethersproject/keccak256": 5.7.0 + "@ethersproject/logger": 5.7.0 + "@ethersproject/rlp": 5.7.0 dev: true /@ethersproject/base64@5.7.0: - resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} + resolution: + {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} dependencies: - '@ethersproject/bytes': 5.7.0 + "@ethersproject/bytes": 5.7.0 dev: true /@ethersproject/basex@5.7.0: - resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} + resolution: + {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/properties': 5.7.0 + "@ethersproject/bytes": 5.7.0 + "@ethersproject/properties": 5.7.0 dev: true /@ethersproject/bignumber@5.7.0: - resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} + resolution: + {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 + "@ethersproject/bytes": 5.7.0 + "@ethersproject/logger": 5.7.0 bn.js: 5.2.1 dev: true /@ethersproject/bytes@5.7.0: - resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} + resolution: + {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} dependencies: - '@ethersproject/logger': 5.7.0 + "@ethersproject/logger": 5.7.0 dev: true /@ethersproject/constants@5.7.0: - resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} + resolution: + {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} dependencies: - '@ethersproject/bignumber': 5.7.0 + "@ethersproject/bignumber": 5.7.0 dev: true /@ethersproject/contracts@5.7.0: - resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} + resolution: + {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/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 dev: true /@ethersproject/hash@5.7.0: - resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} + resolution: + {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/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 dev: true /@ethersproject/hdnode@5.7.0: - resolution: {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 + resolution: + {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 dev: true /@ethersproject/json-wallets@5.7.0: - resolution: {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 + resolution: + {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 dev: true /@ethersproject/keccak256@5.7.0: - resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} + resolution: + {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} dependencies: - '@ethersproject/bytes': 5.7.0 + "@ethersproject/bytes": 5.7.0 js-sha3: 0.8.0 dev: true /@ethersproject/logger@5.7.0: - resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} + resolution: + {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} dev: true /@ethersproject/networks@5.7.1: - resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} + resolution: + {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} dependencies: - '@ethersproject/logger': 5.7.0 + "@ethersproject/logger": 5.7.0 dev: true /@ethersproject/pbkdf2@5.7.0: - resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} + resolution: + {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/sha2': 5.7.0 + "@ethersproject/bytes": 5.7.0 + "@ethersproject/sha2": 5.7.0 dev: true /@ethersproject/properties@5.7.0: - resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} + resolution: + {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} dependencies: - '@ethersproject/logger': 5.7.0 + "@ethersproject/logger": 5.7.0 dev: true /@ethersproject/providers@5.7.2: - resolution: {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.1 - '@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.1 + resolution: + {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.1 + "@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.1 bech32: 1.1.4 ws: 7.4.6 transitivePeerDependencies: @@ -854,129 +930,142 @@ packages: dev: true /@ethersproject/random@5.7.0: - resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} + resolution: + {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 + "@ethersproject/bytes": 5.7.0 + "@ethersproject/logger": 5.7.0 dev: true /@ethersproject/rlp@5.7.0: - resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} + resolution: + {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 + "@ethersproject/bytes": 5.7.0 + "@ethersproject/logger": 5.7.0 dev: true /@ethersproject/sha2@5.7.0: - resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} + resolution: + {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 + "@ethersproject/bytes": 5.7.0 + "@ethersproject/logger": 5.7.0 hash.js: 1.1.7 dev: true /@ethersproject/signing-key@5.7.0: - resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} + resolution: + {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 + "@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 dev: true /@ethersproject/solidity@5.7.0: - resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} + resolution: + {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/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 dev: true /@ethersproject/strings@5.7.0: - resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} + resolution: + {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 + "@ethersproject/bytes": 5.7.0 + "@ethersproject/constants": 5.7.0 + "@ethersproject/logger": 5.7.0 dev: true /@ethersproject/transactions@5.7.0: - resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} + resolution: + {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/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 dev: true /@ethersproject/units@5.7.0: - resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} + resolution: + {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 + "@ethersproject/bignumber": 5.7.0 + "@ethersproject/constants": 5.7.0 + "@ethersproject/logger": 5.7.0 dev: true /@ethersproject/wallet@5.7.0: - resolution: {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 + resolution: + {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 dev: true /@ethersproject/web@5.7.1: - resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} + resolution: + {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/base64": 5.7.0 + "@ethersproject/bytes": 5.7.0 + "@ethersproject/logger": 5.7.0 + "@ethersproject/properties": 5.7.0 + "@ethersproject/strings": 5.7.0 dev: true /@ethersproject/wordlists@5.7.0: - resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} + resolution: + {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 + "@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 dev: true /@fastify/busboy@2.0.0: - resolution: {integrity: sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==} - engines: {node: '>=14'} + resolution: + {integrity: sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==} + engines: {node: ">=14"} dev: true /@humanwhocodes/config-array@0.11.11: - resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} - engines: {node: '>=10.10.0'} + resolution: + {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} + engines: {node: ">=10.10.0"} dependencies: - '@humanwhocodes/object-schema': 1.2.1 + "@humanwhocodes/object-schema": 1.2.1 debug: 4.3.4(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: @@ -984,17 +1073,20 @@ packages: dev: true /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} + resolution: + {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: ">=12.22"} dev: true /@humanwhocodes/object-schema@1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + resolution: + {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true /@istanbuljs/load-nyc-config@1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: ">=8"} dependencies: camelcase: 5.3.1 find-up: 4.1.0 @@ -1004,16 +1096,18 @@ packages: dev: true /@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: ">=8"} dev: true /@jest/console@29.7.0: - resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + resolution: + {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.8.0 + "@jest/types": 29.6.3 + "@types/node": 20.8.0 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -1021,24 +1115,27 @@ packages: dev: true /@jest/environment@29.7.0: - resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + resolution: + {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.8.0 + "@jest/fake-timers": 29.7.0 + "@jest/types": 29.6.3 + "@types/node": 20.8.0 jest-mock: 29.7.0 dev: true /@jest/expect-utils@29.7.0: - resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + resolution: + {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-get-type: 29.6.3 dev: true /@jest/expect@29.7.0: - resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + resolution: + {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: expect: 29.7.0 @@ -1048,62 +1145,68 @@ packages: dev: true /@jest/fake-timers@29.7.0: - resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + resolution: + {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.8.0 + "@jest/types": 29.6.3 + "@sinonjs/fake-timers": 10.3.0 + "@types/node": 20.8.0 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 dev: true /@jest/globals@29.7.0: - resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + resolution: + {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/types': 29.6.3 + "@jest/environment": 29.7.0 + "@jest/expect": 29.7.0 + "@jest/types": 29.6.3 jest-mock: 29.7.0 transitivePeerDependencies: - supports-color dev: true /@jest/schemas@29.6.3: - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + resolution: + {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@sinclair/typebox': 0.27.8 + "@sinclair/typebox": 0.27.8 dev: true /@jest/source-map@29.6.3: - resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + resolution: + {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jridgewell/trace-mapping': 0.3.19 + "@jridgewell/trace-mapping": 0.3.19 callsites: 3.1.0 graceful-fs: 4.2.11 dev: true /@jest/test-result@29.7.0: - resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + resolution: + {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/console': 29.7.0 - '@jest/types': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.4 + "@jest/console": 29.7.0 + "@jest/types": 29.6.3 + "@types/istanbul-lib-coverage": 2.0.4 collect-v8-coverage: 1.0.2 dev: true /@jest/transform@29.7.0: - resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + resolution: + {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.23.0 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.19 + "@babel/core": 7.23.0 + "@jest/types": 29.6.3 + "@jridgewell/trace-mapping": 0.3.19 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 @@ -1121,57 +1224,65 @@ packages: dev: true /@jest/types@29.6.3: - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + resolution: + {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.2 - '@types/node': 20.8.0 - '@types/yargs': 17.0.26 + "@jest/schemas": 29.6.3 + "@types/istanbul-lib-coverage": 2.0.4 + "@types/istanbul-reports": 3.0.2 + "@types/node": 20.8.0 + "@types/yargs": 17.0.26 chalk: 4.1.2 dev: true /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} + resolution: + {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: ">=6.0.0"} dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.19 + "@jridgewell/set-array": 1.1.2 + "@jridgewell/sourcemap-codec": 1.4.15 + "@jridgewell/trace-mapping": 0.3.19 dev: true /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} + resolution: + {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: ">=6.0.0"} dev: true /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} + resolution: + {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: ">=6.0.0"} dev: true /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + resolution: + {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} dev: true /@jridgewell/trace-mapping@0.3.19: - resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} + resolution: + {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 + "@jridgewell/resolve-uri": 3.1.1 + "@jridgewell/sourcemap-codec": 1.4.15 dev: true /@jridgewell/trace-mapping@0.3.9: - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + resolution: + {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 + "@jridgewell/resolve-uri": 3.1.1 + "@jridgewell/sourcemap-codec": 1.4.15 dev: true /@metamask/eth-sig-util@4.0.1: - resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==} - engines: {node: '>=12.0.0'} + resolution: + {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==} + engines: {node: ">=12.0.0"} dependencies: ethereumjs-abi: 0.6.8 ethereumjs-util: 6.2.1 @@ -1181,54 +1292,62 @@ packages: dev: true /@noble/curves@1.1.0: - resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} + resolution: + {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} dependencies: - '@noble/hashes': 1.3.1 + "@noble/hashes": 1.3.1 dev: true /@noble/hashes@1.2.0: - resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} + resolution: + {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} dev: true /@noble/hashes@1.3.1: - resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} - engines: {node: '>= 16'} + resolution: + {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} + engines: {node: ">= 16"} dev: true /@noble/secp256k1@1.7.1: - resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} + resolution: + {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} dev: true /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + resolution: + {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: ">= 8"} dependencies: - '@nodelib/fs.stat': 2.0.5 + "@nodelib/fs.stat": 2.0.5 run-parallel: 1.2.0 dev: true /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + resolution: + {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: ">= 8"} dev: true /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + resolution: + {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: ">= 8"} dependencies: - '@nodelib/fs.scandir': 2.1.5 + "@nodelib/fs.scandir": 2.1.5 fastq: 1.15.0 dev: true /@nomicfoundation/ethereumjs-block@5.0.2: - resolution: {integrity: sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q==} - engines: {node: '>=14'} - dependencies: - '@nomicfoundation/ethereumjs-common': 4.0.2 - '@nomicfoundation/ethereumjs-rlp': 5.0.2 - '@nomicfoundation/ethereumjs-trie': 6.0.2 - '@nomicfoundation/ethereumjs-tx': 5.0.2 - '@nomicfoundation/ethereumjs-util': 9.0.2 + resolution: + {integrity: sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q==} + engines: {node: ">=14"} + dependencies: + "@nomicfoundation/ethereumjs-common": 4.0.2 + "@nomicfoundation/ethereumjs-rlp": 5.0.2 + "@nomicfoundation/ethereumjs-trie": 6.0.2 + "@nomicfoundation/ethereumjs-tx": 5.0.2 + "@nomicfoundation/ethereumjs-util": 9.0.2 ethereum-cryptography: 0.1.3 ethers: 5.7.2 transitivePeerDependencies: @@ -1237,16 +1356,17 @@ packages: dev: true /@nomicfoundation/ethereumjs-blockchain@7.0.2: - resolution: {integrity: sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w==} - engines: {node: '>=14'} - dependencies: - '@nomicfoundation/ethereumjs-block': 5.0.2 - '@nomicfoundation/ethereumjs-common': 4.0.2 - '@nomicfoundation/ethereumjs-ethash': 3.0.2 - '@nomicfoundation/ethereumjs-rlp': 5.0.2 - '@nomicfoundation/ethereumjs-trie': 6.0.2 - '@nomicfoundation/ethereumjs-tx': 5.0.2 - '@nomicfoundation/ethereumjs-util': 9.0.2 + resolution: + {integrity: sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w==} + engines: {node: ">=14"} + dependencies: + "@nomicfoundation/ethereumjs-block": 5.0.2 + "@nomicfoundation/ethereumjs-common": 4.0.2 + "@nomicfoundation/ethereumjs-ethash": 3.0.2 + "@nomicfoundation/ethereumjs-rlp": 5.0.2 + "@nomicfoundation/ethereumjs-trie": 6.0.2 + "@nomicfoundation/ethereumjs-tx": 5.0.2 + "@nomicfoundation/ethereumjs-util": 9.0.2 abstract-level: 1.0.3 debug: 4.3.4(supports-color@8.1.1) ethereum-cryptography: 0.1.3 @@ -1260,19 +1380,21 @@ packages: dev: true /@nomicfoundation/ethereumjs-common@4.0.2: - resolution: {integrity: sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg==} + resolution: + {integrity: sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg==} dependencies: - '@nomicfoundation/ethereumjs-util': 9.0.2 + "@nomicfoundation/ethereumjs-util": 9.0.2 crc-32: 1.2.2 dev: true /@nomicfoundation/ethereumjs-ethash@3.0.2: - resolution: {integrity: sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg==} - engines: {node: '>=14'} + resolution: + {integrity: sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg==} + engines: {node: ">=14"} dependencies: - '@nomicfoundation/ethereumjs-block': 5.0.2 - '@nomicfoundation/ethereumjs-rlp': 5.0.2 - '@nomicfoundation/ethereumjs-util': 9.0.2 + "@nomicfoundation/ethereumjs-block": 5.0.2 + "@nomicfoundation/ethereumjs-rlp": 5.0.2 + "@nomicfoundation/ethereumjs-util": 9.0.2 abstract-level: 1.0.3 bigint-crypto-utils: 3.3.0 ethereum-cryptography: 0.1.3 @@ -1282,13 +1404,14 @@ packages: dev: true /@nomicfoundation/ethereumjs-evm@2.0.2: - resolution: {integrity: sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ==} - engines: {node: '>=14'} - dependencies: - '@ethersproject/providers': 5.7.2 - '@nomicfoundation/ethereumjs-common': 4.0.2 - '@nomicfoundation/ethereumjs-tx': 5.0.2 - '@nomicfoundation/ethereumjs-util': 9.0.2 + resolution: + {integrity: sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ==} + engines: {node: ">=14"} + dependencies: + "@ethersproject/providers": 5.7.2 + "@nomicfoundation/ethereumjs-common": 4.0.2 + "@nomicfoundation/ethereumjs-tx": 5.0.2 + "@nomicfoundation/ethereumjs-util": 9.0.2 debug: 4.3.4(supports-color@8.1.1) ethereum-cryptography: 0.1.3 mcl-wasm: 0.7.9 @@ -1300,16 +1423,18 @@ packages: dev: true /@nomicfoundation/ethereumjs-rlp@5.0.2: - resolution: {integrity: sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA==} - engines: {node: '>=14'} + resolution: + {integrity: sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA==} + engines: {node: ">=14"} hasBin: true dev: true /@nomicfoundation/ethereumjs-statemanager@2.0.2: - resolution: {integrity: sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA==} + resolution: + {integrity: sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA==} dependencies: - '@nomicfoundation/ethereumjs-common': 4.0.2 - '@nomicfoundation/ethereumjs-rlp': 5.0.2 + "@nomicfoundation/ethereumjs-common": 4.0.2 + "@nomicfoundation/ethereumjs-rlp": 5.0.2 debug: 4.3.4(supports-color@8.1.1) ethereum-cryptography: 0.1.3 ethers: 5.7.2 @@ -1321,25 +1446,27 @@ packages: dev: true /@nomicfoundation/ethereumjs-trie@6.0.2: - resolution: {integrity: sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ==} - engines: {node: '>=14'} + resolution: + {integrity: sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ==} + engines: {node: ">=14"} dependencies: - '@nomicfoundation/ethereumjs-rlp': 5.0.2 - '@nomicfoundation/ethereumjs-util': 9.0.2 - '@types/readable-stream': 2.3.15 + "@nomicfoundation/ethereumjs-rlp": 5.0.2 + "@nomicfoundation/ethereumjs-util": 9.0.2 + "@types/readable-stream": 2.3.15 ethereum-cryptography: 0.1.3 readable-stream: 3.6.2 dev: true /@nomicfoundation/ethereumjs-tx@5.0.2: - resolution: {integrity: sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g==} - engines: {node: '>=14'} - dependencies: - '@chainsafe/ssz': 0.9.4 - '@ethersproject/providers': 5.7.2 - '@nomicfoundation/ethereumjs-common': 4.0.2 - '@nomicfoundation/ethereumjs-rlp': 5.0.2 - '@nomicfoundation/ethereumjs-util': 9.0.2 + resolution: + {integrity: sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g==} + engines: {node: ">=14"} + dependencies: + "@chainsafe/ssz": 0.9.4 + "@ethersproject/providers": 5.7.2 + "@nomicfoundation/ethereumjs-common": 4.0.2 + "@nomicfoundation/ethereumjs-rlp": 5.0.2 + "@nomicfoundation/ethereumjs-util": 9.0.2 ethereum-cryptography: 0.1.3 transitivePeerDependencies: - bufferutil @@ -1347,27 +1474,29 @@ packages: dev: true /@nomicfoundation/ethereumjs-util@9.0.2: - resolution: {integrity: sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ==} - engines: {node: '>=14'} + resolution: + {integrity: sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ==} + engines: {node: ">=14"} dependencies: - '@chainsafe/ssz': 0.10.2 - '@nomicfoundation/ethereumjs-rlp': 5.0.2 + "@chainsafe/ssz": 0.10.2 + "@nomicfoundation/ethereumjs-rlp": 5.0.2 ethereum-cryptography: 0.1.3 dev: true /@nomicfoundation/ethereumjs-vm@7.0.2: - resolution: {integrity: sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA==} - engines: {node: '>=14'} - dependencies: - '@nomicfoundation/ethereumjs-block': 5.0.2 - '@nomicfoundation/ethereumjs-blockchain': 7.0.2 - '@nomicfoundation/ethereumjs-common': 4.0.2 - '@nomicfoundation/ethereumjs-evm': 2.0.2 - '@nomicfoundation/ethereumjs-rlp': 5.0.2 - '@nomicfoundation/ethereumjs-statemanager': 2.0.2 - '@nomicfoundation/ethereumjs-trie': 6.0.2 - '@nomicfoundation/ethereumjs-tx': 5.0.2 - '@nomicfoundation/ethereumjs-util': 9.0.2 + resolution: + {integrity: sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA==} + engines: {node: ">=14"} + dependencies: + "@nomicfoundation/ethereumjs-block": 5.0.2 + "@nomicfoundation/ethereumjs-blockchain": 7.0.2 + "@nomicfoundation/ethereumjs-common": 4.0.2 + "@nomicfoundation/ethereumjs-evm": 2.0.2 + "@nomicfoundation/ethereumjs-rlp": 5.0.2 + "@nomicfoundation/ethereumjs-statemanager": 2.0.2 + "@nomicfoundation/ethereumjs-trie": 6.0.2 + "@nomicfoundation/ethereumjs-tx": 5.0.2 + "@nomicfoundation/ethereumjs-util": 9.0.2 debug: 4.3.4(supports-color@8.1.1) ethereum-cryptography: 0.1.3 mcl-wasm: 0.7.9 @@ -1379,16 +1508,17 @@ packages: dev: true /@nomicfoundation/hardhat-chai-matchers@1.0.6(@nomiclabs/hardhat-ethers@2.2.2)(chai@4.3.10)(ethers@5.7.2)(hardhat@2.17.4): - resolution: {integrity: sha512-f5ZMNmabZeZegEfuxn/0kW+mm7+yV7VNDxLpMOMGXWFJ2l/Ct3QShujzDRF9cOkK9Ui/hbDeOWGZqyQALDXVCQ==} + resolution: + {integrity: sha512-f5ZMNmabZeZegEfuxn/0kW+mm7+yV7VNDxLpMOMGXWFJ2l/Ct3QShujzDRF9cOkK9Ui/hbDeOWGZqyQALDXVCQ==} peerDependencies: - '@nomiclabs/hardhat-ethers': ^2.0.0 + "@nomiclabs/hardhat-ethers": ^2.0.0 chai: ^4.2.0 ethers: ^5.0.0 hardhat: ^2.9.4 dependencies: - '@ethersproject/abi': 5.7.0 - '@nomiclabs/hardhat-ethers': 2.2.2(ethers@5.7.2)(hardhat@2.17.4) - '@types/chai-as-promised': 7.1.6 + "@ethersproject/abi": 5.7.0 + "@nomiclabs/hardhat-ethers": 2.2.2(ethers@5.7.2)(hardhat@2.17.4) + "@types/chai-as-promised": 7.1.6 chai: 4.3.10 chai-as-promised: 7.1.1(chai@4.3.10) deep-eql: 4.1.3 @@ -1398,7 +1528,8 @@ packages: dev: true /@nomicfoundation/hardhat-network-helpers@1.0.9(hardhat@2.17.4): - resolution: {integrity: sha512-OXWCv0cHpwLUO2u7bFxBna6dQtCC2Gg/aN/KtJLO7gmuuA28vgmVKYFRCDUqrbjujzgfwQ2aKyZ9Y3vSmDqS7Q==} + resolution: + {integrity: sha512-OXWCv0cHpwLUO2u7bFxBna6dQtCC2Gg/aN/KtJLO7gmuuA28vgmVKYFRCDUqrbjujzgfwQ2aKyZ9Y3vSmDqS7Q==} peerDependencies: hardhat: ^2.9.5 dependencies: @@ -1407,39 +1538,40 @@ packages: dev: true /@nomicfoundation/hardhat-toolbox@2.0.2(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@nomicfoundation/hardhat-chai-matchers@1.0.6)(@nomicfoundation/hardhat-network-helpers@1.0.9)(@nomiclabs/hardhat-ethers@2.2.2)(@nomiclabs/hardhat-etherscan@3.1.7)(@typechain/ethers-v5@10.2.1)(@typechain/hardhat@6.1.6)(@types/chai@4.3.6)(@types/mocha@10.0.2)(@types/node@20.8.0)(chai@4.3.10)(ethers@5.7.2)(hardhat-gas-reporter@1.0.9)(hardhat@2.17.4)(solidity-coverage@0.8.5)(ts-node@10.9.1)(typechain@8.3.1)(typescript@5.2.2): - resolution: {integrity: sha512-vnN1AzxbvpSx9pfdRHbUzTRIXpMLPXnUlkW855VaDk6N1pwRaQ2gNzEmFAABk4lWf11E00PKwFd/q27HuwYrYg==} + resolution: + {integrity: sha512-vnN1AzxbvpSx9pfdRHbUzTRIXpMLPXnUlkW855VaDk6N1pwRaQ2gNzEmFAABk4lWf11E00PKwFd/q27HuwYrYg==} peerDependencies: - '@ethersproject/abi': ^5.4.7 - '@ethersproject/providers': ^5.4.7 - '@nomicfoundation/hardhat-chai-matchers': ^1.0.0 - '@nomicfoundation/hardhat-network-helpers': ^1.0.0 - '@nomiclabs/hardhat-ethers': ^2.0.0 - '@nomiclabs/hardhat-etherscan': ^3.0.0 - '@typechain/ethers-v5': ^10.1.0 - '@typechain/hardhat': ^6.1.2 - '@types/chai': ^4.2.0 - '@types/mocha': '>=9.1.0' - '@types/node': '>=12.0.0' + "@ethersproject/abi": ^5.4.7 + "@ethersproject/providers": ^5.4.7 + "@nomicfoundation/hardhat-chai-matchers": ^1.0.0 + "@nomicfoundation/hardhat-network-helpers": ^1.0.0 + "@nomiclabs/hardhat-ethers": ^2.0.0 + "@nomiclabs/hardhat-etherscan": ^3.0.0 + "@typechain/ethers-v5": ^10.1.0 + "@typechain/hardhat": ^6.1.2 + "@types/chai": ^4.2.0 + "@types/mocha": ">=9.1.0" + "@types/node": ">=12.0.0" chai: ^4.2.0 ethers: ^5.4.7 hardhat: ^2.11.0 hardhat-gas-reporter: ^1.0.8 solidity-coverage: ^0.8.1 - ts-node: '>=8.0.0' + ts-node: ">=8.0.0" typechain: ^8.1.0 - typescript: '>=4.5.0' - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/providers': 5.7.2 - '@nomicfoundation/hardhat-chai-matchers': 1.0.6(@nomiclabs/hardhat-ethers@2.2.2)(chai@4.3.10)(ethers@5.7.2)(hardhat@2.17.4) - '@nomicfoundation/hardhat-network-helpers': 1.0.9(hardhat@2.17.4) - '@nomiclabs/hardhat-ethers': 2.2.2(ethers@5.7.2)(hardhat@2.17.4) - '@nomiclabs/hardhat-etherscan': 3.1.7(hardhat@2.17.4) - '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.1)(typescript@5.2.2) - '@typechain/hardhat': 6.1.6(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@typechain/ethers-v5@10.2.1)(ethers@5.7.2)(hardhat@2.17.4)(typechain@8.3.1) - '@types/chai': 4.3.6 - '@types/mocha': 10.0.2 - '@types/node': 20.8.0 + typescript: ">=4.5.0" + dependencies: + "@ethersproject/abi": 5.7.0 + "@ethersproject/providers": 5.7.2 + "@nomicfoundation/hardhat-chai-matchers": 1.0.6(@nomiclabs/hardhat-ethers@2.2.2)(chai@4.3.10)(ethers@5.7.2)(hardhat@2.17.4) + "@nomicfoundation/hardhat-network-helpers": 1.0.9(hardhat@2.17.4) + "@nomiclabs/hardhat-ethers": 2.2.2(ethers@5.7.2)(hardhat@2.17.4) + "@nomiclabs/hardhat-etherscan": 3.1.7(hardhat@2.17.4) + "@typechain/ethers-v5": 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.1)(typescript@5.2.2) + "@typechain/hardhat": 6.1.6(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@typechain/ethers-v5@10.2.1)(ethers@5.7.2)(hardhat@2.17.4)(typechain@8.3.1) + "@types/chai": 4.3.6 + "@types/mocha": 10.0.2 + "@types/node": 20.8.0 chai: 4.3.10 ethers: 5.7.2 hardhat: 2.17.4(ts-node@10.9.1)(typescript@5.2.2) @@ -1451,8 +1583,9 @@ packages: dev: true /@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1: - resolution: {integrity: sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==} - engines: {node: '>= 10'} + resolution: + {integrity: sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==} + engines: {node: ">= 10"} cpu: [arm64] os: [darwin] requiresBuild: true @@ -1460,8 +1593,9 @@ packages: optional: true /@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1: - resolution: {integrity: sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==} - engines: {node: '>= 10'} + resolution: + {integrity: sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==} + engines: {node: ">= 10"} cpu: [x64] os: [darwin] requiresBuild: true @@ -1469,8 +1603,9 @@ packages: optional: true /@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1: - resolution: {integrity: sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==} - engines: {node: '>= 10'} + resolution: + {integrity: sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==} + engines: {node: ">= 10"} cpu: [x64] os: [freebsd] requiresBuild: true @@ -1478,8 +1613,9 @@ packages: optional: true /@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1: - resolution: {integrity: sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==} - engines: {node: '>= 10'} + resolution: + {integrity: sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==} + engines: {node: ">= 10"} cpu: [arm64] os: [linux] requiresBuild: true @@ -1487,8 +1623,9 @@ packages: optional: true /@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1: - resolution: {integrity: sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==} - engines: {node: '>= 10'} + resolution: + {integrity: sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==} + engines: {node: ">= 10"} cpu: [arm64] os: [linux] requiresBuild: true @@ -1496,8 +1633,9 @@ packages: optional: true /@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1: - resolution: {integrity: sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==} - engines: {node: '>= 10'} + resolution: + {integrity: sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==} + engines: {node: ">= 10"} cpu: [x64] os: [linux] requiresBuild: true @@ -1505,8 +1643,9 @@ packages: optional: true /@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1: - resolution: {integrity: sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==} - engines: {node: '>= 10'} + resolution: + {integrity: sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==} + engines: {node: ">= 10"} cpu: [x64] os: [linux] requiresBuild: true @@ -1514,8 +1653,9 @@ packages: optional: true /@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1: - resolution: {integrity: sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==} - engines: {node: '>= 10'} + resolution: + {integrity: sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==} + engines: {node: ">= 10"} cpu: [arm64] os: [win32] requiresBuild: true @@ -1523,8 +1663,9 @@ packages: optional: true /@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1: - resolution: {integrity: sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==} - engines: {node: '>= 10'} + resolution: + {integrity: sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==} + engines: {node: ">= 10"} cpu: [ia32] os: [win32] requiresBuild: true @@ -1532,8 +1673,9 @@ packages: optional: true /@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1: - resolution: {integrity: sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==} - engines: {node: '>= 10'} + resolution: + {integrity: sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==} + engines: {node: ">= 10"} cpu: [x64] os: [win32] requiresBuild: true @@ -1541,23 +1683,25 @@ packages: optional: true /@nomicfoundation/solidity-analyzer@0.1.1: - resolution: {integrity: sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==} - engines: {node: '>= 12'} + resolution: + {integrity: sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==} + engines: {node: ">= 12"} optionalDependencies: - '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.1 - '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.1 - '@nomicfoundation/solidity-analyzer-freebsd-x64': 0.1.1 - '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.1 - '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.1 - '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.1 - '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.1 - '@nomicfoundation/solidity-analyzer-win32-arm64-msvc': 0.1.1 - '@nomicfoundation/solidity-analyzer-win32-ia32-msvc': 0.1.1 - '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.1 + "@nomicfoundation/solidity-analyzer-darwin-arm64": 0.1.1 + "@nomicfoundation/solidity-analyzer-darwin-x64": 0.1.1 + "@nomicfoundation/solidity-analyzer-freebsd-x64": 0.1.1 + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": 0.1.1 + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": 0.1.1 + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": 0.1.1 + "@nomicfoundation/solidity-analyzer-linux-x64-musl": 0.1.1 + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": 0.1.1 + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": 0.1.1 + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": 0.1.1 dev: true /@nomiclabs/hardhat-ethers@2.2.2(ethers@5.7.2)(hardhat@2.17.4): - resolution: {integrity: sha512-NLDlDFL2us07C0jB/9wzvR0kuLivChJWCXTKcj3yqjZqMoYp7g7wwS157F70VHx/+9gHIBGzak5pKDwG8gEefA==} + resolution: + {integrity: sha512-NLDlDFL2us07C0jB/9wzvR0kuLivChJWCXTKcj3yqjZqMoYp7g7wwS157F70VHx/+9gHIBGzak5pKDwG8gEefA==} peerDependencies: ethers: ^5.0.0 hardhat: ^2.0.0 @@ -1567,12 +1711,13 @@ packages: dev: true /@nomiclabs/hardhat-etherscan@3.1.7(hardhat@2.17.4): - resolution: {integrity: sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ==} + resolution: + {integrity: sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ==} peerDependencies: hardhat: ^2.0.4 dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/address': 5.7.0 + "@ethersproject/abi": 5.7.0 + "@ethersproject/address": 5.7.0 cbor: 8.1.0 chalk: 2.4.2 debug: 4.3.4(supports-color@8.1.1) @@ -1587,32 +1732,36 @@ packages: dev: true /@nomiclabs/hardhat-web3@2.0.0(hardhat@2.17.4)(web3@1.10.2): - resolution: {integrity: sha512-zt4xN+D+fKl3wW2YlTX3k9APR3XZgPkxJYf36AcliJn3oujnKEVRZaHu0PhgLjO+gR+F/kiYayo9fgd2L8970Q==} + resolution: + {integrity: sha512-zt4xN+D+fKl3wW2YlTX3k9APR3XZgPkxJYf36AcliJn3oujnKEVRZaHu0PhgLjO+gR+F/kiYayo9fgd2L8970Q==} peerDependencies: hardhat: ^2.0.0 web3: ^1.0.0-beta.36 dependencies: - '@types/bignumber.js': 5.0.0 + "@types/bignumber.js": 5.0.0 hardhat: 2.17.4(ts-node@10.9.1)(typescript@5.2.2) web3: 1.10.2 dev: true /@openzeppelin/contract-loader@0.6.3: - resolution: {integrity: sha512-cOFIjBjwbGgZhDZsitNgJl0Ye1rd5yu/Yx5LMgeq3u0ZYzldm4uObzHDFq4gjDdoypvyORjjJa3BlFA7eAnVIg==} + resolution: + {integrity: sha512-cOFIjBjwbGgZhDZsitNgJl0Ye1rd5yu/Yx5LMgeq3u0ZYzldm4uObzHDFq4gjDdoypvyORjjJa3BlFA7eAnVIg==} dependencies: find-up: 4.1.0 fs-extra: 8.1.0 dev: true /@openzeppelin/contracts@4.9.3: - resolution: {integrity: sha512-He3LieZ1pP2TNt5JbkPA4PNT9WC3gOTOlDcFGJW4Le4QKqwmiNJCRt44APfxMxvq7OugU/cqYuPcSBzOw38DAg==} + resolution: + {integrity: sha512-He3LieZ1pP2TNt5JbkPA4PNT9WC3gOTOlDcFGJW4Le4QKqwmiNJCRt44APfxMxvq7OugU/cqYuPcSBzOw38DAg==} dev: true /@openzeppelin/test-helpers@0.5.16(bn.js@4.12.0): - resolution: {integrity: sha512-T1EvspSfH1qQO/sgGlskLfYVBbqzJR23SZzYl/6B2JnT4EhThcI85UpvDk0BkLWKaDScQTabGHt4GzHW+3SfZg==} + resolution: + {integrity: sha512-T1EvspSfH1qQO/sgGlskLfYVBbqzJR23SZzYl/6B2JnT4EhThcI85UpvDk0BkLWKaDScQTabGHt4GzHW+3SfZg==} dependencies: - '@openzeppelin/contract-loader': 0.6.3 - '@truffle/contract': 4.6.31 + "@openzeppelin/contract-loader": 0.6.3 + "@truffle/contract": 4.6.31 ansi-colors: 3.2.4 chai: 4.3.10 chai-bn: 0.2.2(bn.js@4.12.0)(chai@4.3.10) @@ -1630,110 +1779,129 @@ packages: dev: true /@protobufjs/aspromise@1.1.2: - resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + resolution: + {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} /@protobufjs/base64@1.1.2: - resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + resolution: + {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} /@protobufjs/codegen@2.0.4: - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + resolution: + {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} /@protobufjs/eventemitter@1.1.0: - resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + resolution: + {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} /@protobufjs/fetch@1.1.0: - resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + resolution: + {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/inquire': 1.1.0 + "@protobufjs/aspromise": 1.1.2 + "@protobufjs/inquire": 1.1.0 /@protobufjs/float@1.0.2: - resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + resolution: + {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} /@protobufjs/inquire@1.1.0: - resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + resolution: + {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} /@protobufjs/path@1.1.2: - resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + resolution: + {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} /@protobufjs/pool@1.1.0: - resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + resolution: + {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} /@protobufjs/utf8@1.1.0: - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + resolution: + {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} /@scure/base@1.1.3: - resolution: {integrity: sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==} + resolution: + {integrity: sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==} dev: true /@scure/bip32@1.1.5: - resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} + resolution: + {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} dependencies: - '@noble/hashes': 1.2.0 - '@noble/secp256k1': 1.7.1 - '@scure/base': 1.1.3 + "@noble/hashes": 1.2.0 + "@noble/secp256k1": 1.7.1 + "@scure/base": 1.1.3 dev: true /@scure/bip32@1.3.1: - resolution: {integrity: sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==} + resolution: + {integrity: sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==} dependencies: - '@noble/curves': 1.1.0 - '@noble/hashes': 1.3.1 - '@scure/base': 1.1.3 + "@noble/curves": 1.1.0 + "@noble/hashes": 1.3.1 + "@scure/base": 1.1.3 dev: true /@scure/bip39@1.1.1: - resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} + resolution: + {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} dependencies: - '@noble/hashes': 1.2.0 - '@scure/base': 1.1.3 + "@noble/hashes": 1.2.0 + "@scure/base": 1.1.3 dev: true /@scure/bip39@1.2.1: - resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} + resolution: + {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} dependencies: - '@noble/hashes': 1.3.1 - '@scure/base': 1.1.3 + "@noble/hashes": 1.3.1 + "@scure/base": 1.1.3 dev: true /@sentry/core@5.30.0: - resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} - engines: {node: '>=6'} - dependencies: - '@sentry/hub': 5.30.0 - '@sentry/minimal': 5.30.0 - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 + resolution: + {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} + engines: {node: ">=6"} + dependencies: + "@sentry/hub": 5.30.0 + "@sentry/minimal": 5.30.0 + "@sentry/types": 5.30.0 + "@sentry/utils": 5.30.0 tslib: 1.14.1 dev: true /@sentry/hub@5.30.0: - resolution: {integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==} + engines: {node: ">=6"} dependencies: - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 + "@sentry/types": 5.30.0 + "@sentry/utils": 5.30.0 tslib: 1.14.1 dev: true /@sentry/minimal@5.30.0: - resolution: {integrity: sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==} + engines: {node: ">=6"} dependencies: - '@sentry/hub': 5.30.0 - '@sentry/types': 5.30.0 + "@sentry/hub": 5.30.0 + "@sentry/types": 5.30.0 tslib: 1.14.1 dev: true /@sentry/node@5.30.0: - resolution: {integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==} - engines: {node: '>=6'} - dependencies: - '@sentry/core': 5.30.0 - '@sentry/hub': 5.30.0 - '@sentry/tracing': 5.30.0 - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 + resolution: + {integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==} + engines: {node: ">=6"} + dependencies: + "@sentry/core": 5.30.0 + "@sentry/hub": 5.30.0 + "@sentry/tracing": 5.30.0 + "@sentry/types": 5.30.0 + "@sentry/utils": 5.30.0 cookie: 0.4.2 https-proxy-agent: 5.0.1 lru_map: 0.3.3 @@ -1743,78 +1911,90 @@ packages: dev: true /@sentry/tracing@5.30.0: - resolution: {integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==} - engines: {node: '>=6'} - dependencies: - '@sentry/hub': 5.30.0 - '@sentry/minimal': 5.30.0 - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 + resolution: + {integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==} + engines: {node: ">=6"} + dependencies: + "@sentry/hub": 5.30.0 + "@sentry/minimal": 5.30.0 + "@sentry/types": 5.30.0 + "@sentry/utils": 5.30.0 tslib: 1.14.1 dev: true /@sentry/types@5.30.0: - resolution: {integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==} + engines: {node: ">=6"} dev: true /@sentry/utils@5.30.0: - resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==} + engines: {node: ">=6"} dependencies: - '@sentry/types': 5.30.0 + "@sentry/types": 5.30.0 tslib: 1.14.1 dev: true /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + resolution: + {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true /@sindresorhus/is@4.6.0: - resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: ">=10"} dev: true /@sinonjs/commons@3.0.0: - resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} + resolution: + {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} dependencies: type-detect: 4.0.8 dev: true /@sinonjs/fake-timers@10.3.0: - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + resolution: + {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} dependencies: - '@sinonjs/commons': 3.0.0 + "@sinonjs/commons": 3.0.0 dev: true /@solidity-parser/parser@0.14.5: - resolution: {integrity: sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==} + resolution: + {integrity: sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==} dependencies: antlr4ts: 0.5.0-alpha.4 dev: true /@solidity-parser/parser@0.16.1: - resolution: {integrity: sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw==} + resolution: + {integrity: sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw==} dependencies: antlr4ts: 0.5.0-alpha.4 dev: true /@szmarczak/http-timer@4.0.6: - resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: ">=10"} dependencies: defer-to-connect: 2.0.1 dev: true /@szmarczak/http-timer@5.0.1: - resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} - engines: {node: '>=14.16'} + resolution: + {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: ">=14.16"} dependencies: defer-to-connect: 2.0.1 dev: true /@truffle/abi-utils@1.0.3: - resolution: {integrity: sha512-AWhs01HCShaVKjml7Z4AbVREr/u4oiWxCcoR7Cktm0mEvtT04pvnxW5xB/cI4znRkrbPdFQlFt67kgrAjesYkw==} + resolution: + {integrity: sha512-AWhs01HCShaVKjml7Z4AbVREr/u4oiWxCcoR7Cktm0mEvtT04pvnxW5xB/cI4znRkrbPdFQlFt67kgrAjesYkw==} engines: {node: ^16.20 || ^18.16 || >=20} dependencies: change-case: 3.0.2 @@ -1823,16 +2003,18 @@ packages: dev: true /@truffle/blockchain-utils@0.1.9: - resolution: {integrity: sha512-RHfumgbIVo68Rv9ofDYfynjnYZIfP/f1vZy4RoqkfYAO+fqfc58PDRzB1WAGq2U6GPuOnipOJxQhnqNnffORZg==} + resolution: + {integrity: sha512-RHfumgbIVo68Rv9ofDYfynjnYZIfP/f1vZy4RoqkfYAO+fqfc58PDRzB1WAGq2U6GPuOnipOJxQhnqNnffORZg==} engines: {node: ^16.20 || ^18.16 || >=20} dev: true /@truffle/codec@0.17.3: - resolution: {integrity: sha512-Ko/+dsnntNyrJa57jUD9u4qx9nQby+H4GsUO6yjiCPSX0TQnEHK08XWqBSg0WdmCH2+h0y1nr2CXSx8gbZapxg==} + resolution: + {integrity: sha512-Ko/+dsnntNyrJa57jUD9u4qx9nQby+H4GsUO6yjiCPSX0TQnEHK08XWqBSg0WdmCH2+h0y1nr2CXSx8gbZapxg==} engines: {node: ^16.20 || ^18.16 || >=20} dependencies: - '@truffle/abi-utils': 1.0.3 - '@truffle/compile-common': 0.9.8 + "@truffle/abi-utils": 1.0.3 + "@truffle/compile-common": 0.9.8 big.js: 6.2.1 bn.js: 5.2.1 cbor: 5.2.0 @@ -1846,15 +2028,17 @@ packages: dev: true /@truffle/compile-common@0.9.8: - resolution: {integrity: sha512-DTpiyo32t/YhLI1spn84D3MHYHrnoVqO+Gp7ZHrYNwDs86mAxtNiH5lsVzSb8cPgiqlvNsRCU9nm9R0YmKMTBQ==} + resolution: + {integrity: sha512-DTpiyo32t/YhLI1spn84D3MHYHrnoVqO+Gp7ZHrYNwDs86mAxtNiH5lsVzSb8cPgiqlvNsRCU9nm9R0YmKMTBQ==} engines: {node: ^16.20 || ^18.16 || >=20} dependencies: - '@truffle/error': 0.2.2 + "@truffle/error": 0.2.2 colors: 1.4.0 dev: true /@truffle/contract-schema@3.4.16: - resolution: {integrity: sha512-g0WNYR/J327DqtJPI70ubS19K1Fth/1wxt2jFqLsPmz5cGZVjCwuhiie+LfBde4/Mc9QR8G+L3wtmT5cyoBxAg==} + resolution: + {integrity: sha512-g0WNYR/J327DqtJPI70ubS19K1Fth/1wxt2jFqLsPmz5cGZVjCwuhiie+LfBde4/Mc9QR8G+L3wtmT5cyoBxAg==} engines: {node: ^16.20 || ^18.16 || >=20} dependencies: ajv: 6.12.6 @@ -1864,15 +2048,16 @@ packages: dev: true /@truffle/contract@4.6.31: - resolution: {integrity: sha512-s+oHDpXASnZosiCdzu+X1Tx5mUJUs1L1CYXIcgRmzMghzqJkaUFmR6NpNo7nJYliYbO+O9/aW8oCKqQ7rCHfmQ==} + resolution: + {integrity: sha512-s+oHDpXASnZosiCdzu+X1Tx5mUJUs1L1CYXIcgRmzMghzqJkaUFmR6NpNo7nJYliYbO+O9/aW8oCKqQ7rCHfmQ==} engines: {node: ^16.20 || ^18.16 || >=20} dependencies: - '@ensdomains/ensjs': 2.1.0 - '@truffle/blockchain-utils': 0.1.9 - '@truffle/contract-schema': 3.4.16 - '@truffle/debug-utils': 6.0.57 - '@truffle/error': 0.2.2 - '@truffle/interface-adapter': 0.5.37 + "@ensdomains/ensjs": 2.1.0 + "@truffle/blockchain-utils": 0.1.9 + "@truffle/contract-schema": 3.4.16 + "@truffle/debug-utils": 6.0.57 + "@truffle/error": 0.2.2 + "@truffle/interface-adapter": 0.5.37 bignumber.js: 7.2.1 debug: 4.3.4(supports-color@8.1.1) ethers: 4.0.49 @@ -1889,11 +2074,12 @@ packages: dev: true /@truffle/debug-utils@6.0.57: - resolution: {integrity: sha512-Q6oI7zLaeNLB69ixjwZk2UZEWBY6b2OD1sjLMGDKBGR7GaHYiw96GLR2PFgPH1uwEeLmV4N78LYaQCrDsHbNeA==} + resolution: + {integrity: sha512-Q6oI7zLaeNLB69ixjwZk2UZEWBY6b2OD1sjLMGDKBGR7GaHYiw96GLR2PFgPH1uwEeLmV4N78LYaQCrDsHbNeA==} engines: {node: ^16.20 || ^18.16 || >=20} dependencies: - '@truffle/codec': 0.17.3 - '@trufflesuite/chromafi': 3.0.0 + "@truffle/codec": 0.17.3 + "@trufflesuite/chromafi": 3.0.0 bn.js: 5.2.1 chalk: 2.4.2 debug: 4.3.4(supports-color@8.1.1) @@ -1903,12 +2089,14 @@ packages: dev: true /@truffle/error@0.2.2: - resolution: {integrity: sha512-TqbzJ0O8DHh34cu8gDujnYl4dUl6o2DE4PR6iokbybvnIm/L2xl6+Gv1VC+YJS45xfH83Yo3/Zyg/9Oq8/xZWg==} + resolution: + {integrity: sha512-TqbzJ0O8DHh34cu8gDujnYl4dUl6o2DE4PR6iokbybvnIm/L2xl6+Gv1VC+YJS45xfH83Yo3/Zyg/9Oq8/xZWg==} engines: {node: ^16.20 || ^18.16 || >=20} dev: true /@truffle/interface-adapter@0.5.37: - resolution: {integrity: sha512-lPH9MDgU+7sNDlJSClwyOwPCfuOimqsCx0HfGkznL3mcFRymc1pukAR1k17zn7ErHqBwJjiKAZ6Ri72KkS+IWw==} + resolution: + {integrity: sha512-lPH9MDgU+7sNDlJSClwyOwPCfuOimqsCx0HfGkznL3mcFRymc1pukAR1k17zn7ErHqBwJjiKAZ6Ri72KkS+IWw==} engines: {node: ^16.20 || ^18.16 || >=20} dependencies: bn.js: 5.2.1 @@ -1922,7 +2110,8 @@ packages: dev: true /@trufflesuite/chromafi@3.0.0: - resolution: {integrity: sha512-oqWcOqn8nT1bwlPPfidfzS55vqcIDdpfzo3HbU9EnUmcSTX+I8z0UyUFI3tZQjByVJulbzxHxUGS3ZJPwK/GPQ==} + resolution: + {integrity: sha512-oqWcOqn8nT1bwlPPfidfzS55vqcIDdpfzo3HbU9EnUmcSTX+I8z0UyUFI3tZQjByVJulbzxHxUGS3ZJPwK/GPQ==} dependencies: camelcase: 4.1.0 chalk: 2.4.2 @@ -1935,32 +2124,37 @@ packages: dev: true /@tsconfig/node10@1.0.9: - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + resolution: + {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} dev: true /@tsconfig/node12@1.0.11: - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + resolution: + {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} dev: true /@tsconfig/node14@1.0.3: - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + resolution: + {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} dev: true /@tsconfig/node16@1.0.4: - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + resolution: + {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} dev: true /@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.1)(typescript@5.2.2): - resolution: {integrity: sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==} + resolution: + {integrity: sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==} peerDependencies: - '@ethersproject/abi': ^5.0.0 - '@ethersproject/providers': ^5.0.0 + "@ethersproject/abi": ^5.0.0 + "@ethersproject/providers": ^5.0.0 ethers: ^5.1.3 typechain: ^8.1.1 - typescript: '>=4.3.0' + typescript: ">=4.3.0" dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/providers': 5.7.2 + "@ethersproject/abi": 5.7.0 + "@ethersproject/providers": 5.7.2 ethers: 5.7.2 lodash: 4.17.21 ts-essentials: 7.0.3(typescript@5.2.2) @@ -1969,18 +2163,19 @@ packages: dev: true /@typechain/hardhat@6.1.6(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@typechain/ethers-v5@10.2.1)(ethers@5.7.2)(hardhat@2.17.4)(typechain@8.3.1): - resolution: {integrity: sha512-BiVnegSs+ZHVymyidtK472syodx1sXYlYJJixZfRstHVGYTi8V1O7QG4nsjyb0PC/LORcq7sfBUcHto1y6UgJA==} + resolution: + {integrity: sha512-BiVnegSs+ZHVymyidtK472syodx1sXYlYJJixZfRstHVGYTi8V1O7QG4nsjyb0PC/LORcq7sfBUcHto1y6UgJA==} peerDependencies: - '@ethersproject/abi': ^5.4.7 - '@ethersproject/providers': ^5.4.7 - '@typechain/ethers-v5': ^10.2.1 + "@ethersproject/abi": ^5.4.7 + "@ethersproject/providers": ^5.4.7 + "@typechain/ethers-v5": ^10.2.1 ethers: ^5.4.7 hardhat: ^2.9.9 typechain: ^8.1.1 dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/providers': 5.7.2 - '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.1)(typescript@5.2.2) + "@ethersproject/abi": 5.7.0 + "@ethersproject/providers": 5.7.2 + "@typechain/ethers-v5": 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.1)(typescript@5.2.2) ethers: 5.7.2 fs-extra: 9.1.0 hardhat: 2.17.4(ts-node@10.9.1)(typescript@5.2.2) @@ -1988,235 +2183,279 @@ packages: dev: true /@types/bignumber.js@5.0.0: - resolution: {integrity: sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA==} + resolution: + {integrity: sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA==} deprecated: This is a stub types definition for bignumber.js (https://github.com/MikeMcl/bignumber.js/). bignumber.js provides its own type definitions, so you don't need @types/bignumber.js installed! dependencies: bignumber.js: 9.1.2 dev: true /@types/bip39@2.4.2: - resolution: {integrity: sha512-Vo9lqOIRq8uoIzEVrV87ZvcIM0PN9t0K3oYZ/CS61fIYKCBdOIM7mlWzXuRvSXrDtVa1uUO2w1cdfufxTC0bzg==} + resolution: + {integrity: sha512-Vo9lqOIRq8uoIzEVrV87ZvcIM0PN9t0K3oYZ/CS61fIYKCBdOIM7mlWzXuRvSXrDtVa1uUO2w1cdfufxTC0bzg==} dependencies: - '@types/node': 20.8.0 + "@types/node": 20.8.0 /@types/bn.js@4.11.6: - resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} + resolution: + {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} dependencies: - '@types/node': 20.8.0 + "@types/node": 20.8.0 dev: true /@types/bn.js@5.1.2: - resolution: {integrity: sha512-dkpZu0szUtn9UXTmw+e0AJFd4D2XAxDnsCLdc05SfqpqzPEBft8eQr8uaFitfo/dUUOZERaLec2hHMG87A4Dxg==} + resolution: + {integrity: sha512-dkpZu0szUtn9UXTmw+e0AJFd4D2XAxDnsCLdc05SfqpqzPEBft8eQr8uaFitfo/dUUOZERaLec2hHMG87A4Dxg==} dependencies: - '@types/node': 20.8.0 + "@types/node": 20.8.0 dev: true /@types/cacheable-request@6.0.3: - resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + resolution: + {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} dependencies: - '@types/http-cache-semantics': 4.0.2 - '@types/keyv': 3.1.4 - '@types/node': 12.20.55 - '@types/responselike': 1.0.1 + "@types/http-cache-semantics": 4.0.2 + "@types/keyv": 3.1.4 + "@types/node": 12.20.55 + "@types/responselike": 1.0.1 dev: true /@types/chai-as-promised@7.1.6: - resolution: {integrity: sha512-cQLhk8fFarRVZAXUQV1xEnZgMoPxqKojBvRkqPCKPQCzEhpbbSKl1Uu75kDng7k5Ln6LQLUmNBjLlFthCgm1NA==} + resolution: + {integrity: sha512-cQLhk8fFarRVZAXUQV1xEnZgMoPxqKojBvRkqPCKPQCzEhpbbSKl1Uu75kDng7k5Ln6LQLUmNBjLlFthCgm1NA==} dependencies: - '@types/chai': 4.3.6 + "@types/chai": 4.3.6 dev: true /@types/chai-subset@1.3.3: - resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + resolution: + {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} dependencies: - '@types/chai': 4.3.6 + "@types/chai": 4.3.6 dev: true /@types/chai@4.3.6: - resolution: {integrity: sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==} + resolution: + {integrity: sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==} dev: true /@types/cli-color@2.0.3: - resolution: {integrity: sha512-JcGK/IFNVt5a99Xsz4wMCK8jfylpZ5E9AxzGcTVLD5nNYPYxXkylTRV7mcqA324rKLfqT3juU5KjQbI9CAV3SA==} + resolution: + {integrity: sha512-JcGK/IFNVt5a99Xsz4wMCK8jfylpZ5E9AxzGcTVLD5nNYPYxXkylTRV7mcqA324rKLfqT3juU5KjQbI9CAV3SA==} dev: true /@types/concat-stream@1.6.1: - resolution: {integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==} + resolution: + {integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==} dependencies: - '@types/node': 8.10.66 + "@types/node": 8.10.66 dev: true /@types/deep-equal-in-any-order@1.0.1: - resolution: {integrity: sha512-hUWUUE53WjKfcCncSmWmNXVNNT+0Iz7gYFnov3zdCXrX3Thxp1Cnmfd5LwWOeCVUV5LhpiFgS05vaAG72doo9w==} + resolution: + {integrity: sha512-hUWUUE53WjKfcCncSmWmNXVNNT+0Iz7gYFnov3zdCXrX3Thxp1Cnmfd5LwWOeCVUV5LhpiFgS05vaAG72doo9w==} dev: false /@types/form-data@0.0.33: - resolution: {integrity: sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==} + resolution: + {integrity: sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==} dependencies: - '@types/node': 8.10.66 + "@types/node": 8.10.66 dev: true /@types/glob@7.2.0: - resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + resolution: + {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 20.8.0 + "@types/minimatch": 5.1.2 + "@types/node": 20.8.0 dev: true /@types/graceful-fs@4.1.7: - resolution: {integrity: sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw==} + resolution: + {integrity: sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw==} dependencies: - '@types/node': 20.8.0 + "@types/node": 20.8.0 dev: true /@types/hdkey@0.7.1: - resolution: {integrity: sha512-4Kkr06hq+R8a9EzVNqXGOY2x1xA7dhY6qlp6OvaZ+IJy1BCca1Cv126RD9X7CMJoXoLo8WvAizy8gQHpqW6K0Q==} + resolution: + {integrity: sha512-4Kkr06hq+R8a9EzVNqXGOY2x1xA7dhY6qlp6OvaZ+IJy1BCca1Cv126RD9X7CMJoXoLo8WvAizy8gQHpqW6K0Q==} dependencies: - '@types/node': 20.8.0 + "@types/node": 20.8.0 /@types/http-cache-semantics@4.0.2: - resolution: {integrity: sha512-FD+nQWA2zJjh4L9+pFXqWOi0Hs1ryBCfI+985NjluQ1p8EYtoLvjLOKidXBtZ4/IcxDX4o8/E8qDS3540tNliw==} + resolution: + {integrity: sha512-FD+nQWA2zJjh4L9+pFXqWOi0Hs1ryBCfI+985NjluQ1p8EYtoLvjLOKidXBtZ4/IcxDX4o8/E8qDS3540tNliw==} dev: true /@types/istanbul-lib-coverage@2.0.4: - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + resolution: + {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} dev: true /@types/istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ==} + resolution: + {integrity: sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ==} dependencies: - '@types/istanbul-lib-coverage': 2.0.4 + "@types/istanbul-lib-coverage": 2.0.4 dev: true /@types/istanbul-reports@3.0.2: - resolution: {integrity: sha512-kv43F9eb3Lhj+lr/Hn6OcLCs/sSM8bt+fIaP11rCYngfV6NVjzWXJ17owQtDQTL9tQ8WSLUrGsSJ6rJz0F1w1A==} + resolution: + {integrity: sha512-kv43F9eb3Lhj+lr/Hn6OcLCs/sSM8bt+fIaP11rCYngfV6NVjzWXJ17owQtDQTL9tQ8WSLUrGsSJ6rJz0F1w1A==} dependencies: - '@types/istanbul-lib-report': 3.0.1 + "@types/istanbul-lib-report": 3.0.1 dev: true /@types/keyv@3.1.4: - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + resolution: + {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 12.20.55 + "@types/node": 12.20.55 dev: true /@types/long@4.0.2: - resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + resolution: + {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} /@types/lru-cache@5.1.1: - resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} + resolution: + {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} dev: true /@types/minimatch@5.1.2: - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + resolution: + {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} dev: true /@types/mocha@10.0.2: - resolution: {integrity: sha512-NaHL0+0lLNhX6d9rs+NSt97WH/gIlRHmszXbQ/8/MV/eVcFNdeJ/GYhrFuUc8K7WuPhRhTSdMkCp8VMzhUq85w==} + resolution: + {integrity: sha512-NaHL0+0lLNhX6d9rs+NSt97WH/gIlRHmszXbQ/8/MV/eVcFNdeJ/GYhrFuUc8K7WuPhRhTSdMkCp8VMzhUq85w==} dev: true /@types/nextgen-events@1.1.2: - resolution: {integrity: sha512-OULZqKMn+YiJozWmGE3pN1nlkhWENeKelsAAL1IR4neIEprcA7UelPr6P0+881Wfb9DnkQxj06QTtIQ08gdPqA==} + resolution: + {integrity: sha512-OULZqKMn+YiJozWmGE3pN1nlkhWENeKelsAAL1IR4neIEprcA7UelPr6P0+881Wfb9DnkQxj06QTtIQ08gdPqA==} dev: false /@types/node@10.17.60: - resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} + resolution: + {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} dev: true /@types/node@12.20.55: - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + resolution: + {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} dev: true /@types/node@20.8.0: - resolution: {integrity: sha512-LzcWltT83s1bthcvjBmiBvGJiiUe84NWRHkw+ZV6Fr41z2FbIzvc815dk2nQ3RAKMuN2fkenM/z3Xv2QzEpYxQ==} + resolution: + {integrity: sha512-LzcWltT83s1bthcvjBmiBvGJiiUe84NWRHkw+ZV6Fr41z2FbIzvc815dk2nQ3RAKMuN2fkenM/z3Xv2QzEpYxQ==} /@types/node@8.10.66: - resolution: {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==} + resolution: + {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==} dev: true /@types/ora@3.2.0: - resolution: {integrity: sha512-jll99xUKpiFbIFZSQcxm4numfsLaOWBzWNaRk3PvTSE7BPqTzzOCFmS0mQ7m8qkTfmYhuYbehTGsxkvRLPC++w==} + resolution: + {integrity: sha512-jll99xUKpiFbIFZSQcxm4numfsLaOWBzWNaRk3PvTSE7BPqTzzOCFmS0mQ7m8qkTfmYhuYbehTGsxkvRLPC++w==} deprecated: This is a stub types definition. ora provides its own type definitions, so you do not need this installed. dependencies: ora: 3.4.0 dev: true /@types/pbkdf2@3.1.0: - resolution: {integrity: sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==} + resolution: + {integrity: sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==} dependencies: - '@types/node': 20.8.0 + "@types/node": 20.8.0 dev: true /@types/prettier@2.7.3: - resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + resolution: + {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} dev: true /@types/qs@6.9.8: - resolution: {integrity: sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==} + resolution: + {integrity: sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==} dev: true /@types/readable-stream@2.3.15: - resolution: {integrity: sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==} + resolution: + {integrity: sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==} dependencies: - '@types/node': 20.8.0 + "@types/node": 20.8.0 safe-buffer: 5.1.2 dev: true /@types/responselike@1.0.1: - resolution: {integrity: sha512-TiGnitEDxj2X0j+98Eqk5lv/Cij8oHd32bU4D/Yw6AOq7vvTk0gSD2GPj0G/HkvhMoVsdlhYF4yqqlyPBTM6Sg==} + resolution: + {integrity: sha512-TiGnitEDxj2X0j+98Eqk5lv/Cij8oHd32bU4D/Yw6AOq7vvTk0gSD2GPj0G/HkvhMoVsdlhYF4yqqlyPBTM6Sg==} dependencies: - '@types/node': 12.20.55 + "@types/node": 12.20.55 dev: true /@types/secp256k1@4.0.4: - resolution: {integrity: sha512-oN0PFsYxDZnX/qSJ5S5OwaEDTYfekhvaM5vqui2bu1AA39pKofmgL104Q29KiOXizXS2yLjSzc5YdTyMKdcy4A==} + resolution: + {integrity: sha512-oN0PFsYxDZnX/qSJ5S5OwaEDTYfekhvaM5vqui2bu1AA39pKofmgL104Q29KiOXizXS2yLjSzc5YdTyMKdcy4A==} dependencies: - '@types/node': 20.8.0 + "@types/node": 20.8.0 dev: true /@types/semver@7.5.3: - resolution: {integrity: sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==} + resolution: + {integrity: sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==} dev: true /@types/sodium-native@2.3.5: - resolution: {integrity: sha512-a3DAIpW8+36XAY8aIR36JBQQsfOabxHuJwx11DL/PTvnbwEWPAXW66b8QbMi0r2vUnkOfREsketxdvjBmQxqDQ==} + resolution: + {integrity: sha512-a3DAIpW8+36XAY8aIR36JBQQsfOabxHuJwx11DL/PTvnbwEWPAXW66b8QbMi0r2vUnkOfREsketxdvjBmQxqDQ==} dependencies: - '@types/node': 20.8.0 + "@types/node": 20.8.0 /@types/stack-utils@2.0.1: - resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} + resolution: + {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} dev: true /@types/terminal-kit@2.5.2: - resolution: {integrity: sha512-WGLshu4tbU82G+QmikPEVwlDH8itM2ujzcj5Y4AdG43qHNIeyLIt2DeN91lHtnhCgNtTfvdeZD5jZAquDC9qUg==} + resolution: + {integrity: sha512-WGLshu4tbU82G+QmikPEVwlDH8itM2ujzcj5Y4AdG43qHNIeyLIt2DeN91lHtnhCgNtTfvdeZD5jZAquDC9qUg==} dependencies: - '@types/nextgen-events': 1.1.2 + "@types/nextgen-events": 1.1.2 dev: false /@types/websocket@1.0.4: - resolution: {integrity: sha512-qn1LkcFEKK8RPp459jkjzsfpbsx36BBt3oC3pITYtkoBw/aVX+EZFa5j3ThCRTNpLFvIMr5dSTD4RaMdilIOpA==} + resolution: + {integrity: sha512-qn1LkcFEKK8RPp459jkjzsfpbsx36BBt3oC3pITYtkoBw/aVX+EZFa5j3ThCRTNpLFvIMr5dSTD4RaMdilIOpA==} dependencies: - '@types/node': 20.8.0 + "@types/node": 20.8.0 /@types/yargs-parser@21.0.1: - resolution: {integrity: sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ==} + resolution: + {integrity: sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ==} dev: true /@types/yargs@17.0.26: - resolution: {integrity: sha512-Y3vDy2X6zw/ZCumcwLpdhM5L7jmyGpmBCTYMHDLqT2IKVMYRRLdv6ZakA+wxhra6Z/3bwhNbNl9bDGXaFU+6rw==} + resolution: + {integrity: sha512-Y3vDy2X6zw/ZCumcwLpdhM5L7jmyGpmBCTYMHDLqT2IKVMYRRLdv6ZakA+wxhra6Z/3bwhNbNl9bDGXaFU+6rw==} dependencies: - '@types/yargs-parser': 21.0.1 + "@types/yargs-parser": 21.0.1 dev: true /@zilliqa-js/account@3.4.4: - resolution: {integrity: sha512-fZ2I8Q3ZwR7jb0eKIykKeogaVls8Taoy+ceLLUyNR8SEpHxBsWDQYckJLl+iOVMwv51468JYQJEqqMJz1Kfytw==} - dependencies: - '@types/bip39': 2.4.2 - '@types/hdkey': 0.7.1 - '@zilliqa-js/core': 3.4.4 - '@zilliqa-js/crypto': 3.4.4 - '@zilliqa-js/proto': 3.4.4 - '@zilliqa-js/util': 3.4.4 + resolution: + {integrity: sha512-fZ2I8Q3ZwR7jb0eKIykKeogaVls8Taoy+ceLLUyNR8SEpHxBsWDQYckJLl+iOVMwv51468JYQJEqqMJz1Kfytw==} + dependencies: + "@types/bip39": 2.4.2 + "@types/hdkey": 0.7.1 + "@zilliqa-js/core": 3.4.4 + "@zilliqa-js/crypto": 3.4.4 + "@zilliqa-js/proto": 3.4.4 + "@zilliqa-js/util": 3.4.4 bip39: 2.6.0 buffer: 6.0.3 hash.js: 1.1.7 @@ -2226,25 +2465,27 @@ packages: - encoding /@zilliqa-js/blockchain@3.4.4: - resolution: {integrity: sha512-4uSHEP5bGMNAcBWTpexLWL4uf3nssXiKQMYpZCUuPDI45DRmsMuWRtCN2Izo0nwXRGOjRCWsha6bl5cqofG2qA==} + resolution: + {integrity: sha512-4uSHEP5bGMNAcBWTpexLWL4uf3nssXiKQMYpZCUuPDI45DRmsMuWRtCN2Izo0nwXRGOjRCWsha6bl5cqofG2qA==} dependencies: - '@zilliqa-js/account': 3.4.4 - '@zilliqa-js/core': 3.4.4 - '@zilliqa-js/crypto': 3.4.4 - '@zilliqa-js/util': 3.4.4 + "@zilliqa-js/account": 3.4.4 + "@zilliqa-js/core": 3.4.4 + "@zilliqa-js/crypto": 3.4.4 + "@zilliqa-js/util": 3.4.4 tslib: 2.3.1 utility-types: 3.10.0 transitivePeerDependencies: - encoding /@zilliqa-js/contract@3.4.4: - resolution: {integrity: sha512-VMIs5DBSx1hudjTYe8fIEEOfTPz4u4qrcuXBrBUiUtHFFhGoeoecB/NFr0qQ1n2+3BtIsFdYa8Bw4rlA15hDzQ==} - dependencies: - '@zilliqa-js/account': 3.4.4 - '@zilliqa-js/blockchain': 3.4.4 - '@zilliqa-js/core': 3.4.4 - '@zilliqa-js/crypto': 3.4.4 - '@zilliqa-js/util': 3.4.4 + resolution: + {integrity: sha512-VMIs5DBSx1hudjTYe8fIEEOfTPz4u4qrcuXBrBUiUtHFFhGoeoecB/NFr0qQ1n2+3BtIsFdYa8Bw4rlA15hDzQ==} + dependencies: + "@zilliqa-js/account": 3.4.4 + "@zilliqa-js/blockchain": 3.4.4 + "@zilliqa-js/core": 3.4.4 + "@zilliqa-js/crypto": 3.4.4 + "@zilliqa-js/util": 3.4.4 bn.js: 4.12.0 buffer-from: 1.1.2 cross-fetch: 2.2.5 @@ -2256,7 +2497,8 @@ packages: - encoding /@zilliqa-js/core@3.4.4: - resolution: {integrity: sha512-vbvvdrkE4YJqpC599wAGrsChOMYIFMJSFwMWYQpCk4ly9SoiP3rY1LpIBb4yxUjO6ALzUEmJuYiDlWVnf1vp5A==} + resolution: + {integrity: sha512-vbvvdrkE4YJqpC599wAGrsChOMYIFMJSFwMWYQpCk4ly9SoiP3rY1LpIBb4yxUjO6ALzUEmJuYiDlWVnf1vp5A==} dependencies: buffer: 6.0.3 cross-fetch: 2.2.6 @@ -2266,9 +2508,10 @@ packages: - encoding /@zilliqa-js/crypto@3.4.4: - resolution: {integrity: sha512-XSzNdY3i+vq3U5E/IQRqJtoNxf0L6HXKZVnsHMiF63pgOTE8yxqmwUm3aFTmHCI1No/NDrNzQcSM5gbo1wTmPg==} + resolution: + {integrity: sha512-XSzNdY3i+vq3U5E/IQRqJtoNxf0L6HXKZVnsHMiF63pgOTE8yxqmwUm3aFTmHCI1No/NDrNzQcSM5gbo1wTmPg==} dependencies: - '@zilliqa-js/util': 3.4.4 + "@zilliqa-js/util": 3.4.4 aes-js: 3.1.2 buffer: 6.0.3 elliptic: 6.5.4 @@ -2282,14 +2525,16 @@ packages: uuid: 8.3.2 /@zilliqa-js/proto@3.4.4: - resolution: {integrity: sha512-Jl9k977rCt1X4/lRpsf/QNVN5nc85p+J08zqS9hah9BzvB69Vk+G7ExrKkkO5jFD06PGyPo6aKGB9pPN+izx5Q==} + resolution: + {integrity: sha512-Jl9k977rCt1X4/lRpsf/QNVN5nc85p+J08zqS9hah9BzvB69Vk+G7ExrKkkO5jFD06PGyPo6aKGB9pPN+izx5Q==} dependencies: protobufjs: 6.11.4 /@zilliqa-js/subscriptions@3.4.4: - resolution: {integrity: sha512-P0cRk3Wwi81VmKAzOB6wBBWEKkiJ1vrBIliKP2iqAptdOou1TKA+0ZeM3n0ZLR3jLwS2Xjq+6xkv26PlA7G0bQ==} + resolution: + {integrity: sha512-P0cRk3Wwi81VmKAzOB6wBBWEKkiJ1vrBIliKP2iqAptdOou1TKA+0ZeM3n0ZLR3jLwS2Xjq+6xkv26PlA7G0bQ==} dependencies: - '@types/websocket': 1.0.4 + "@types/websocket": 1.0.4 buffer: 6.0.3 camelcase: 5.0.0 mitt: 1.2.0 @@ -2299,7 +2544,8 @@ packages: - supports-color /@zilliqa-js/util@3.4.4: - resolution: {integrity: sha512-Gp9Am0E9J3iE8E9oGmmjQx/ko+iLWXyKdRLNHsgO4jfJLLbWxZueedOGlKlOG7Y+/z0sDjljXBRuAP7BoTfcAQ==} + resolution: + {integrity: sha512-Gp9Am0E9J3iE8E9oGmmjQx/ko+iLWXyKdRLNHsgO4jfJLLbWxZueedOGlKlOG7Y+/z0sDjljXBRuAP7BoTfcAQ==} dependencies: bn.js: 4.12.0 camelcase: 5.3.1 @@ -2307,16 +2553,17 @@ packages: tslib: 2.3.1 /@zilliqa-js/zilliqa@3.4.4: - resolution: {integrity: sha512-jh7uMHqEU+IpM1Ln+f0qEFmu3gtw8/ZDT83LTDX6KHoDJb8uEh3o0KYyDFCUMrXbQJiHp8XoUyUY7doyHpQpRg==} - dependencies: - '@zilliqa-js/account': 3.4.4 - '@zilliqa-js/blockchain': 3.4.4 - '@zilliqa-js/contract': 3.4.4 - '@zilliqa-js/core': 3.4.4 - '@zilliqa-js/crypto': 3.4.4 - '@zilliqa-js/proto': 3.4.4 - '@zilliqa-js/subscriptions': 3.4.4 - '@zilliqa-js/util': 3.4.4 + resolution: + {integrity: sha512-jh7uMHqEU+IpM1Ln+f0qEFmu3gtw8/ZDT83LTDX6KHoDJb8uEh3o0KYyDFCUMrXbQJiHp8XoUyUY7doyHpQpRg==} + dependencies: + "@zilliqa-js/account": 3.4.4 + "@zilliqa-js/blockchain": 3.4.4 + "@zilliqa-js/contract": 3.4.4 + "@zilliqa-js/core": 3.4.4 + "@zilliqa-js/crypto": 3.4.4 + "@zilliqa-js/proto": 3.4.4 + "@zilliqa-js/subscriptions": 3.4.4 + "@zilliqa-js/util": 3.4.4 buffer: 6.0.3 tslib: 2.3.1 transitivePeerDependencies: @@ -2324,16 +2571,19 @@ packages: - supports-color /abbrev@1.0.9: - resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} + resolution: + {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} dev: true /abortcontroller-polyfill@1.7.5: - resolution: {integrity: sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==} + resolution: + {integrity: sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==} dev: true /abstract-level@1.0.3: - resolution: {integrity: sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==} - engines: {node: '>=12'} + resolution: + {integrity: sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==} + engines: {node: ">=12"} dependencies: buffer: 6.0.3 catering: 2.1.1 @@ -2345,15 +2595,17 @@ packages: dev: true /accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} + resolution: + {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: ">= 0.6"} dependencies: mime-types: 2.1.35 negotiator: 0.6.3 dev: true /acorn-jsx@5.3.2(acorn@8.10.0): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + resolution: + {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: @@ -2361,36 +2613,43 @@ packages: dev: true /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} + resolution: + {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: ">=0.4.0"} dev: true /acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} - engines: {node: '>=0.4.0'} + resolution: + {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: ">=0.4.0"} hasBin: true dev: true /address@1.2.2: - resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} - engines: {node: '>= 10.0.0'} + resolution: + {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} + engines: {node: ">= 10.0.0"} dev: true /adm-zip@0.4.16: - resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} - engines: {node: '>=0.3.0'} + resolution: + {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} + engines: {node: ">=0.3.0"} dev: true /aes-js@3.0.0: - resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + resolution: + {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} dev: true /aes-js@3.1.2: - resolution: {integrity: sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==} + resolution: + {integrity: sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==} /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} + resolution: + {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: ">= 6.0.0"} dependencies: debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: @@ -2398,15 +2657,17 @@ packages: dev: true /aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: ">=8"} dependencies: clean-stack: 2.2.0 indent-string: 4.0.0 dev: true /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + resolution: + {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 @@ -2415,7 +2676,8 @@ packages: dev: true /ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + resolution: + {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 @@ -2424,192 +2686,230 @@ packages: dev: true /amdefine@1.0.1: - resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} - engines: {node: '>=0.4.2'} + resolution: + {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} + engines: {node: ">=0.4.2"} requiresBuild: true dev: true optional: true /ansi-colors@3.2.4: - resolution: {integrity: sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==} + engines: {node: ">=6"} dev: true /ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} + engines: {node: ">=6"} dev: true /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: ">=6"} dev: true /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: ">=8"} dependencies: type-fest: 0.21.3 dev: true /ansi-escapes@5.0.0: - resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} - engines: {node: '>=12'} + resolution: + {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} + engines: {node: ">=12"} dependencies: type-fest: 1.4.0 dev: true /ansi-regex@2.1.1: - resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: ">=0.10.0"} dev: true /ansi-regex@3.0.1: - resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} + engines: {node: ">=4"} dev: true /ansi-regex@4.1.1: - resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: ">=6"} /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: ">=8"} /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} + resolution: + {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: ">=12"} dev: true /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: ">=4"} dependencies: color-convert: 1.9.3 /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: ">=8"} dependencies: color-convert: 2.0.1 /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: ">=10"} dev: true /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} + resolution: + {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: ">=12"} dev: true /antlr4ts@0.5.0-alpha.4: - resolution: {integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==} + resolution: + {integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==} dev: true /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + resolution: + {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: ">= 8"} dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 dev: true /arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + resolution: + {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + resolution: + {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: sprintf-js: 1.0.3 dev: true /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + resolution: + {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true /array-back@3.1.0: - resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} + engines: {node: ">=6"} dev: true /array-back@4.0.2: - resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} + engines: {node: ">=8"} dev: true /array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + resolution: + {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} dev: true /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: ">=8"} dev: true /array-uniq@1.0.3: - resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} + engines: {node: ">=0.10.0"} dev: true /asap@2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + resolution: + {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} dev: true /asn1@0.2.6: - resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + resolution: + {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} dependencies: safer-buffer: 2.1.2 dev: true /assert-plus@1.0.0: - resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} - engines: {node: '>=0.8'} + resolution: + {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: ">=0.8"} dev: true /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + resolution: + {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} dev: true /astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: ">=8"} dev: true /async-limiter@1.0.1: - resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + resolution: + {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} dev: true /async@1.5.2: - resolution: {integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==} + resolution: + {integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==} dev: true /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + resolution: + {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: true /at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} + resolution: + {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: ">= 4.0.0"} dev: true /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} + resolution: + {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: ">= 0.4"} dev: true /aws-sign2@0.7.0: - resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + resolution: + {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} dev: true /aws4@1.12.0: - resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} + resolution: + {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} dev: true /axios@1.5.1: - resolution: {integrity: sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==} + resolution: + {integrity: sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==} dependencies: follow-redirects: 1.15.3(debug@4.3.4) form-data: 4.0.0 @@ -2619,12 +2919,13 @@ packages: dev: true /babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: ">=8"} dependencies: - '@babel/helper-plugin-utils': 7.22.5 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 + "@babel/helper-plugin-utils": 7.22.5 + "@istanbuljs/load-nyc-config": 1.1.0 + "@istanbuljs/schema": 0.1.3 istanbul-lib-instrument: 5.2.1 test-exclude: 6.0.0 transitivePeerDependencies: @@ -2632,81 +2933,95 @@ packages: dev: true /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.0): - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + resolution: + {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.0 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.0) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.0) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.0) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.0) + "@babel/core": ^7.0.0 + dependencies: + "@babel/core": 7.23.0 + "@babel/plugin-syntax-async-generators": 7.8.4(@babel/core@7.23.0) + "@babel/plugin-syntax-bigint": 7.8.3(@babel/core@7.23.0) + "@babel/plugin-syntax-class-properties": 7.12.13(@babel/core@7.23.0) + "@babel/plugin-syntax-import-meta": 7.10.4(@babel/core@7.23.0) + "@babel/plugin-syntax-json-strings": 7.8.3(@babel/core@7.23.0) + "@babel/plugin-syntax-logical-assignment-operators": 7.10.4(@babel/core@7.23.0) + "@babel/plugin-syntax-nullish-coalescing-operator": 7.8.3(@babel/core@7.23.0) + "@babel/plugin-syntax-numeric-separator": 7.10.4(@babel/core@7.23.0) + "@babel/plugin-syntax-object-rest-spread": 7.8.3(@babel/core@7.23.0) + "@babel/plugin-syntax-optional-catch-binding": 7.8.3(@babel/core@7.23.0) + "@babel/plugin-syntax-optional-chaining": 7.8.3(@babel/core@7.23.0) + "@babel/plugin-syntax-top-level-await": 7.14.5(@babel/core@7.23.0) dev: true /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + resolution: + {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true /base-x@3.0.9: - resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} + resolution: + {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} dependencies: safe-buffer: 5.2.1 /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + resolution: + {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} /bcrypt-pbkdf@1.0.2: - resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + resolution: + {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} dependencies: tweetnacl: 0.14.5 dev: true /bech32@1.1.4: - resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + resolution: + {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} dev: true /big-integer@1.6.36: - resolution: {integrity: sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==} - engines: {node: '>=0.6'} + resolution: + {integrity: sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==} + engines: {node: ">=0.6"} dev: true /big.js@6.2.1: - resolution: {integrity: sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==} + resolution: + {integrity: sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==} dev: true /bigint-crypto-utils@3.3.0: - resolution: {integrity: sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==} - engines: {node: '>=14.0.0'} + resolution: + {integrity: sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==} + engines: {node: ">=14.0.0"} dev: true /bignumber.js@7.2.1: - resolution: {integrity: sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==} + resolution: + {integrity: sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==} dev: true /bignumber.js@9.1.2: - resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} + resolution: + {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} dev: true /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: ">=8"} dev: true /bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + resolution: + {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} dependencies: file-uri-to-path: 1.0.0 /bip39@2.6.0: - resolution: {integrity: sha512-RrnQRG2EgEoqO24ea+Q/fftuPUZLmrEM3qNhhGsA3PbaXaCW791LTzPuVyx/VprXQcTbPJ3K3UeTna8ZnVl2sg==} + resolution: + {integrity: sha512-RrnQRG2EgEoqO24ea+Q/fftuPUZLmrEM3qNhhGsA3PbaXaCW791LTzPuVyx/VprXQcTbPJ3K3UeTna8ZnVl2sg==} dependencies: create-hash: 1.2.0 pbkdf2: 3.1.2 @@ -2715,32 +3030,39 @@ packages: unorm: 1.6.0 /bip66@1.1.5: - resolution: {integrity: sha512-nemMHz95EmS38a26XbbdxIYj5csHd3RMP3H5bwQknX0WYHF01qhpufP42mLOwVICuH2JmhIhXiWs89MfUGL7Xw==} + resolution: + {integrity: sha512-nemMHz95EmS38a26XbbdxIYj5csHd3RMP3H5bwQknX0WYHF01qhpufP42mLOwVICuH2JmhIhXiWs89MfUGL7Xw==} dependencies: safe-buffer: 5.2.1 /blakejs@1.2.1: - resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} + resolution: + {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} dev: true /bluebird@3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + resolution: + {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} dev: true /bn.js@4.11.6: - resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} + resolution: + {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} dev: true /bn.js@4.12.0: - resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + resolution: + {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} /bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + resolution: + {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} dev: true /body-parser@1.20.1: - resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + resolution: + {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16} dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -2759,8 +3081,9 @@ packages: dev: true /body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + resolution: + {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16} dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -2779,34 +3102,40 @@ packages: dev: true /boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + resolution: + {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} dev: true /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + resolution: + {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 dev: true /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + resolution: + {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 dev: true /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: ">=8"} dependencies: fill-range: 7.0.1 dev: true /brorand@1.1.0: - resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + resolution: + {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} /browser-level@1.0.1: - resolution: {integrity: sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==} + resolution: + {integrity: sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==} dependencies: abstract-level: 1.0.3 catering: 2.1.1 @@ -2815,11 +3144,13 @@ packages: dev: true /browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + resolution: + {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} dev: true /browserify-aes@1.2.0: - resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + resolution: + {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} dependencies: buffer-xor: 1.0.3 cipher-base: 1.0.4 @@ -2829,7 +3160,8 @@ packages: safe-buffer: 5.2.1 /browserslist@4.22.1: - resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} + resolution: + {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: @@ -2840,71 +3172,84 @@ packages: dev: true /bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + resolution: + {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} dependencies: base-x: 3.0.9 /bs58check@2.1.2: - resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} + resolution: + {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} dependencies: bs58: 4.0.1 create-hash: 1.2.0 safe-buffer: 5.2.1 /bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + resolution: + {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} dependencies: node-int64: 0.4.0 dev: true /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + resolution: + {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} /buffer-to-arraybuffer@0.0.5: - resolution: {integrity: sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==} + resolution: + {integrity: sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==} dev: true /buffer-xor@1.0.3: - resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + resolution: + {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + resolution: + {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} dependencies: base64-js: 1.5.1 ieee754: 1.2.1 dev: true /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + resolution: + {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} dependencies: base64-js: 1.5.1 ieee754: 1.2.1 /bufferutil@4.0.7: - resolution: {integrity: sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==} - engines: {node: '>=6.14.2'} + resolution: + {integrity: sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==} + engines: {node: ">=6.14.2"} requiresBuild: true dependencies: node-gyp-build: 4.6.1 /bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} + resolution: + {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: ">= 0.8"} dev: true /cacheable-lookup@5.0.4: - resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} - engines: {node: '>=10.6.0'} + resolution: + {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: ">=10.6.0"} dev: true /cacheable-lookup@6.1.0: - resolution: {integrity: sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==} - engines: {node: '>=10.6.0'} + resolution: + {integrity: sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==} + engines: {node: ">=10.6.0"} dev: true /cacheable-request@7.0.4: - resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: ">=8"} dependencies: clone-response: 1.0.3 get-stream: 5.2.0 @@ -2916,91 +3261,107 @@ packages: dev: true /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + resolution: + {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: function-bind: 1.1.1 get-intrinsic: 1.2.1 dev: true /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: ">=6"} dev: true /camel-case@3.0.0: - resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} + resolution: + {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} dependencies: no-case: 2.3.2 upper-case: 1.1.3 dev: true /camelcase@3.0.0: - resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} + engines: {node: ">=0.10.0"} dev: true /camelcase@4.1.0: - resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} + engines: {node: ">=4"} dev: true /camelcase@5.0.0: - resolution: {integrity: sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==} + engines: {node: ">=6"} /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: ">=6"} /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: ">=10"} dev: true /caniuse-lite@1.0.30001541: - resolution: {integrity: sha512-bLOsqxDgTqUBkzxbNlSBt8annkDpQB9NdzdTbO2ooJ+eC/IQcvDspDc058g84ejCelF7vHUx57KIOjEecOHXaw==} + resolution: + {integrity: sha512-bLOsqxDgTqUBkzxbNlSBt8annkDpQB9NdzdTbO2ooJ+eC/IQcvDspDc058g84ejCelF7vHUx57KIOjEecOHXaw==} dev: true /case@1.6.3: - resolution: {integrity: sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==} - engines: {node: '>= 0.8.0'} + resolution: + {integrity: sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==} + engines: {node: ">= 0.8.0"} dev: true /caseless@0.12.0: - resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + resolution: + {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} dev: true /catering@2.1.1: - resolution: {integrity: sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==} + engines: {node: ">=6"} dev: true /cbor@5.2.0: - resolution: {integrity: sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==} - engines: {node: '>=6.0.0'} + resolution: + {integrity: sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==} + engines: {node: ">=6.0.0"} dependencies: bignumber.js: 9.1.2 nofilter: 1.0.4 dev: true /cbor@8.1.0: - resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} - engines: {node: '>=12.19'} + resolution: + {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} + engines: {node: ">=12.19"} dependencies: nofilter: 3.1.0 dev: true /chai-as-promised@7.1.1(chai@4.3.10): - resolution: {integrity: sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==} + resolution: + {integrity: sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==} peerDependencies: - chai: '>= 2.1.2 < 5' + chai: ">= 2.1.2 < 5" dependencies: chai: 4.3.10 check-error: 1.0.3 dev: true /chai-bn@0.2.2(bn.js@4.12.0)(chai@4.3.10): - resolution: {integrity: sha512-MzjelH0p8vWn65QKmEq/DLBG1Hle4WeyqT79ANhXZhn/UxRWO0OogkAxi5oGGtfzwU9bZR8mvbvYdoqNVWQwFg==} + resolution: + {integrity: sha512-MzjelH0p8vWn65QKmEq/DLBG1Hle4WeyqT79ANhXZhn/UxRWO0OogkAxi5oGGtfzwU9bZR8mvbvYdoqNVWQwFg==} peerDependencies: bn.js: ^4.11.0 chai: ^4.0.0 @@ -3010,13 +3371,15 @@ packages: dev: true /chai-subset@1.6.0: - resolution: {integrity: sha512-K3d+KmqdS5XKW5DWPd5sgNffL3uxdDe+6GdnJh3AYPhwnBGRY5urfvfcbRtWIvvpz+KxkL9FeBB6MZewLUNwug==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-K3d+KmqdS5XKW5DWPd5sgNffL3uxdDe+6GdnJh3AYPhwnBGRY5urfvfcbRtWIvvpz+KxkL9FeBB6MZewLUNwug==} + engines: {node: ">=4"} dev: true /chai@4.3.10: - resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} + engines: {node: ">=4"} dependencies: assertion-error: 1.1.0 check-error: 1.0.3 @@ -3028,28 +3391,32 @@ packages: dev: true /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: ">=4"} dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: ">=10"} dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 dev: true /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + resolution: + {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} dev: true /change-case@3.0.2: - resolution: {integrity: sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==} + resolution: + {integrity: sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==} dependencies: camel-case: 3.0.0 constant-case: 2.0.0 @@ -3072,17 +3439,20 @@ packages: dev: true /charenc@0.0.2: - resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + resolution: + {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} dev: true /check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + resolution: + {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} dependencies: get-func-name: 2.0.2 dev: true /cheerio-select@2.1.0: - resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + resolution: + {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} dependencies: boolbase: 1.0.0 css-select: 5.1.0 @@ -3093,8 +3463,9 @@ packages: dev: true /cheerio@1.0.0-rc.12: - resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} - engines: {node: '>= 6'} + resolution: + {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} + engines: {node: ">= 6"} dependencies: cheerio-select: 2.1.0 dom-serializer: 2.0.0 @@ -3106,8 +3477,9 @@ packages: dev: true /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} + resolution: + {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: ">= 8.10.0"} dependencies: anymatch: 3.1.3 braces: 3.0.2 @@ -3121,25 +3493,30 @@ packages: dev: true /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + resolution: + {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} dev: true /chroma-js@2.4.2: - resolution: {integrity: sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A==} + resolution: + {integrity: sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A==} dev: false /ci-info@2.0.0: - resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + resolution: + {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} dev: true /ci-info@3.8.0: - resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + engines: {node: ">=8"} dev: true /cids@0.7.5: - resolution: {integrity: sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==} - engines: {node: '>=4.0.0', npm: '>=3.0.0'} + resolution: + {integrity: sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==} + engines: {node: ">=4.0.0", npm: ">=3.0.0"} deprecated: This module has been superseded by the multiformats module dependencies: buffer: 5.7.1 @@ -3150,22 +3527,26 @@ packages: dev: true /cipher-base@1.0.4: - resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + resolution: + {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 /cjs-module-lexer@1.2.3: - resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + resolution: + {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} dev: true /class-is@1.1.0: - resolution: {integrity: sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==} + resolution: + {integrity: sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==} dev: true /classic-level@1.3.0: - resolution: {integrity: sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==} - engines: {node: '>=12'} + resolution: + {integrity: sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==} + engines: {node: ">=12"} requiresBuild: true dependencies: abstract-level: 1.0.3 @@ -3176,13 +3557,15 @@ packages: dev: true /clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: ">=6"} dev: true /cli-color@2.0.3: - resolution: {integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==} - engines: {node: '>=0.10'} + resolution: + {integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==} + engines: {node: ">=0.10"} dependencies: d: 1.0.1 es5-ext: 0.10.62 @@ -3191,25 +3574,29 @@ packages: timers-ext: 0.1.7 /cli-cursor@2.1.0: - resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} + engines: {node: ">=4"} dependencies: restore-cursor: 2.0.0 /cli-cursor@4.0.0: - resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + resolution: + {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: restore-cursor: 4.0.0 dev: true /cli-spinners@2.9.1: - resolution: {integrity: sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==} + engines: {node: ">=6"} /cli-table3@0.5.1: - resolution: {integrity: sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==} + engines: {node: ">=6"} dependencies: object-assign: 4.1.1 string-width: 2.1.1 @@ -3218,7 +3605,8 @@ packages: dev: true /cli-truncate@3.1.0: - resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + resolution: + {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: slice-ansi: 5.0.0 @@ -3226,7 +3614,8 @@ packages: dev: true /cliui@3.2.0: - resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} + resolution: + {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} dependencies: string-width: 1.0.2 strip-ansi: 3.0.1 @@ -3234,7 +3623,8 @@ packages: dev: true /cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + resolution: + {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 @@ -3242,8 +3632,9 @@ packages: dev: true /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + resolution: + {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: ">=12"} dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 @@ -3251,69 +3642,83 @@ packages: dev: false /clone-response@1.0.3: - resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + resolution: + {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} dependencies: mimic-response: 1.0.1 dev: true /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} + resolution: + {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: ">=0.8"} /co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + resolution: + {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: ">= 1.0.0", node: ">= 0.12.0"} dev: true /code-point-at@1.1.0: - resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} + engines: {node: ">=0.10.0"} dev: true /collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + resolution: + {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} dev: true /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + resolution: + {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + resolution: + {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: ">=7.0.0"} dependencies: color-name: 1.1.4 /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + resolution: + {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + resolution: + {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + resolution: + {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} dev: true /colors@1.4.0: - resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} - engines: {node: '>=0.1.90'} + resolution: + {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} + engines: {node: ">=0.1.90"} dev: true /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} + resolution: + {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: ">= 0.8"} dependencies: delayed-stream: 1.0.0 dev: true /command-exists@1.2.9: - resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} + resolution: + {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} dev: true /command-line-args@5.2.1: - resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} - engines: {node: '>=4.0.0'} + resolution: + {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} + engines: {node: ">=4.0.0"} dependencies: array-back: 3.1.0 find-replace: 3.0.0 @@ -3322,8 +3727,9 @@ packages: dev: true /command-line-usage@6.1.3: - resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} + engines: {node: ">=8.0.0"} dependencies: array-back: 4.0.2 chalk: 2.4.2 @@ -3332,21 +3738,25 @@ packages: dev: true /commander@11.0.0: - resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} - engines: {node: '>=16'} + resolution: + {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} + engines: {node: ">=16"} dev: true /commander@3.0.2: - resolution: {integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==} + resolution: + {integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==} dev: true /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + resolution: + {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true /concat-stream@1.6.2: - resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} - engines: {'0': node >= 0.8} + resolution: + {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {"0": node >= 0.8} dependencies: buffer-from: 1.1.2 inherits: 2.0.4 @@ -3355,21 +3765,24 @@ packages: dev: true /constant-case@2.0.0: - resolution: {integrity: sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==} + resolution: + {integrity: sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==} dependencies: snake-case: 2.1.0 upper-case: 1.1.3 dev: true /content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} + resolution: + {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: ">= 0.6"} dependencies: safe-buffer: 5.2.1 dev: true /content-hash@2.5.2: - resolution: {integrity: sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==} + resolution: + {integrity: sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==} dependencies: cids: 0.7.5 multicodec: 0.5.7 @@ -3377,52 +3790,62 @@ packages: dev: true /content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} + resolution: + {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: ">= 0.6"} dev: true /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + resolution: + {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} dev: true /cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + resolution: + {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} dev: true /cookie@0.4.2: - resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} - engines: {node: '>= 0.6'} + resolution: + {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: ">= 0.6"} dev: true /cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} + resolution: + {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: ">= 0.6"} dev: true /core-util-is@1.0.2: - resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + resolution: + {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} dev: true /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + resolution: + {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: true /cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} - engines: {node: '>= 0.10'} + resolution: + {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: ">= 0.10"} dependencies: object-assign: 4.1.1 vary: 1.1.2 dev: true /crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} + resolution: + {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: ">=0.8"} hasBin: true dev: true /create-hash@1.2.0: - resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + resolution: + {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} dependencies: cipher-base: 1.0.4 inherits: 2.0.4 @@ -3431,7 +3854,8 @@ packages: sha.js: 2.4.11 /create-hmac@1.1.7: - resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + resolution: + {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} dependencies: cipher-base: 1.0.4 create-hash: 1.2.0 @@ -3441,17 +3865,20 @@ packages: sha.js: 2.4.11 /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + resolution: + {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true /cross-fetch@2.2.5: - resolution: {integrity: sha512-xqYAhQb4NhCJSRym03dwxpP1bYXpK3y7UN83Bo2WFi3x1Zmzn0SL/6xGoPr+gpt4WmNrgCCX3HPysvOwFOW36w==} + resolution: + {integrity: sha512-xqYAhQb4NhCJSRym03dwxpP1bYXpK3y7UN83Bo2WFi3x1Zmzn0SL/6xGoPr+gpt4WmNrgCCX3HPysvOwFOW36w==} dependencies: node-fetch: 2.6.1 whatwg-fetch: 2.0.4 /cross-fetch@2.2.6: - resolution: {integrity: sha512-9JZz+vXCmfKUZ68zAptS7k4Nu8e2qcibe7WVZYps7sAgk5R8GYTc+T1WR0v1rlP9HxgARmOX1UTIJZFytajpNA==} + resolution: + {integrity: sha512-9JZz+vXCmfKUZ68zAptS7k4Nu8e2qcibe7WVZYps7sAgk5R8GYTc+T1WR0v1rlP9HxgARmOX1UTIJZFytajpNA==} dependencies: node-fetch: 2.7.0 whatwg-fetch: 2.0.4 @@ -3459,7 +3886,8 @@ packages: - encoding /cross-fetch@3.1.8: - resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + resolution: + {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} dependencies: node-fetch: 2.7.0 transitivePeerDependencies: @@ -3467,7 +3895,8 @@ packages: dev: true /cross-fetch@4.0.0: - resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + resolution: + {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} dependencies: node-fetch: 2.7.0 transitivePeerDependencies: @@ -3475,8 +3904,9 @@ packages: dev: true /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + resolution: + {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: ">= 8"} dependencies: path-key: 3.1.1 shebang-command: 2.0.0 @@ -3484,11 +3914,13 @@ packages: dev: true /crypt@0.0.2: - resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + resolution: + {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} dev: true /crypto-addr-codec@0.1.8: - resolution: {integrity: sha512-GqAK90iLLgP3FvhNmHbpT3wR6dEdaM8hZyZtLX29SPardh3OA13RFLHDR6sntGCgRWOfiHqW6sIyohpNqOtV/g==} + resolution: + {integrity: sha512-GqAK90iLLgP3FvhNmHbpT3wR6dEdaM8hZyZtLX29SPardh3OA13RFLHDR6sntGCgRWOfiHqW6sIyohpNqOtV/g==} dependencies: base-x: 3.0.9 big-integer: 1.6.36 @@ -3500,7 +3932,8 @@ packages: dev: true /css-select@5.1.0: - resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + resolution: + {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} dependencies: boolbase: 1.0.0 css-what: 6.1.0 @@ -3510,41 +3943,48 @@ packages: dev: true /css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} + resolution: + {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: ">= 6"} dev: true /cwise-compiler@1.1.3: - resolution: {integrity: sha512-WXlK/m+Di8DMMcCjcWr4i+XzcQra9eCdXIJrgh4TUgh0pIS/yJduLxS9JgefsHJ/YVLdgPtXm9r62W92MvanEQ==} + resolution: + {integrity: sha512-WXlK/m+Di8DMMcCjcWr4i+XzcQra9eCdXIJrgh4TUgh0pIS/yJduLxS9JgefsHJ/YVLdgPtXm9r62W92MvanEQ==} dependencies: uniq: 1.0.1 dev: false /d@1.0.1: - resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + resolution: + {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} dependencies: es5-ext: 0.10.62 type: 1.2.0 /dashdash@1.14.1: - resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} - engines: {node: '>=0.10'} + resolution: + {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: ">=0.10"} dependencies: assert-plus: 1.0.0 dev: true /data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} + resolution: + {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: ">= 12"} /death@1.1.0: - resolution: {integrity: sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==} + resolution: + {integrity: sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==} dev: true /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + resolution: + {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: - supports-color: '*' + supports-color: "*" peerDependenciesMeta: supports-color: optional: true @@ -3552,10 +3992,11 @@ packages: ms: 2.0.0 /debug@4.3.4(supports-color@8.1.1): - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} + resolution: + {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: ">=6.0"} peerDependencies: - supports-color: '*' + supports-color: "*" peerDependenciesMeta: supports-color: optional: true @@ -3565,36 +4006,42 @@ packages: dev: true /decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: ">=0.10.0"} dev: true /decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: ">=10"} dev: true /decode-uri-component@0.2.2: - resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} - engines: {node: '>=0.10'} + resolution: + {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: ">=0.10"} dev: true /decompress-response@3.3.0: - resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} + engines: {node: ">=4"} dependencies: mimic-response: 1.0.1 dev: true /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: ">=10"} dependencies: mimic-response: 3.1.0 dev: true /dedent@1.5.1: - resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} + resolution: + {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -3603,60 +4050,71 @@ packages: dev: true /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: ">=6"} dependencies: type-detect: 4.0.8 dev: true /deep-equal-in-any-order@2.0.6: - resolution: {integrity: sha512-RfnWHQzph10YrUjvWwhd15Dne8ciSJcZ3U6OD7owPwiVwsdE5IFSoZGg8rlwJD11ES+9H5y8j3fCofviRHOqLQ==} + resolution: + {integrity: sha512-RfnWHQzph10YrUjvWwhd15Dne8ciSJcZ3U6OD7owPwiVwsdE5IFSoZGg8rlwJD11ES+9H5y8j3fCofviRHOqLQ==} dependencies: lodash.mapvalues: 4.6.0 sort-any: 2.0.0 dev: false /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} + resolution: + {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: ">=4.0.0"} dev: true /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + resolution: + {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + resolution: + {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} dependencies: clone: 1.0.4 /defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: ">=10"} dev: true /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} + resolution: + {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: ">=0.4.0"} dev: true /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} + resolution: + {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: ">= 0.8"} dev: true /destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + resolution: + {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16} dev: true /detect-indent@5.0.0: - resolution: {integrity: sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==} + engines: {node: ">=4"} dev: true /detect-port@1.5.1: - resolution: {integrity: sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==} + resolution: + {integrity: sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==} hasBin: true dependencies: address: 1.2.2 @@ -3666,42 +4124,49 @@ packages: dev: true /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + resolution: + {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} + resolution: + {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: ">=0.3.1"} dev: true /diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} + resolution: + {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} + engines: {node: ">=0.3.1"} dev: true /difflib@0.2.4: - resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} + resolution: + {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} dependencies: heap: 0.2.7 dev: true /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: ">=8"} dependencies: path-type: 4.0.0 dev: true /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + resolution: + {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: ">=6.0.0"} dependencies: esutils: 2.0.3 dev: true /dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + resolution: + {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 @@ -3709,22 +4174,26 @@ packages: dev: true /dom-walk@0.1.2: - resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} + resolution: + {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} dev: true /domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + resolution: + {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} dev: true /domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} + resolution: + {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: ">= 4"} dependencies: domelementtype: 2.3.0 dev: true /domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + resolution: + {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 @@ -3732,45 +4201,53 @@ packages: dev: true /dot-case@2.1.1: - resolution: {integrity: sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==} + resolution: + {integrity: sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==} dependencies: no-case: 2.3.2 dev: true /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} - engines: {node: '>=12'} + resolution: + {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: ">=12"} dev: false /drbg.js@1.0.1: - resolution: {integrity: sha512-F4wZ06PvqxYLFEZKkFxTDcns9oFNk34hvmJSEwdzsxVQ8YI5YaxtACgQatkYgv2VI2CFkUd2Y+xosPQnHv809g==} - engines: {node: '>=0.10'} + resolution: + {integrity: sha512-F4wZ06PvqxYLFEZKkFxTDcns9oFNk34hvmJSEwdzsxVQ8YI5YaxtACgQatkYgv2VI2CFkUd2Y+xosPQnHv809g==} + engines: {node: ">=0.10"} dependencies: browserify-aes: 1.2.0 create-hash: 1.2.0 create-hmac: 1.1.7 /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + resolution: + {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true /ecc-jsbn@0.1.2: - resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + resolution: + {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} dependencies: jsbn: 0.1.1 safer-buffer: 2.1.2 dev: true /ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + resolution: + {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: true /electron-to-chromium@1.4.537: - resolution: {integrity: sha512-W1+g9qs9hviII0HAwOdehGYkr+zt7KKdmCcJcjH0mYg6oL8+ioT3Skjmt7BLoAQqXhjf40AXd+HlR4oAWMlXjA==} + resolution: + {integrity: sha512-W1+g9qs9hviII0HAwOdehGYkr+zt7KKdmCcJcjH0mYg6oL8+ioT3Skjmt7BLoAQqXhjf40AXd+HlR4oAWMlXjA==} dev: true /elliptic@6.5.4: - resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + resolution: + {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} dependencies: bn.js: 4.12.0 brorand: 1.1.0 @@ -3781,50 +4258,59 @@ packages: minimalistic-crypto-utils: 1.0.1 /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + resolution: + {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + resolution: + {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true /encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} + resolution: + {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: ">= 0.8"} dev: true /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + resolution: + {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 dev: true /enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} + resolution: + {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: ">=8.6"} dependencies: ansi-colors: 4.1.3 strip-ansi: 6.0.1 dev: true /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} + resolution: + {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: ">=0.12"} dev: true /env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: ">=6"} dev: true /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + resolution: + {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 dev: true /es5-ext@0.10.62: - resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} - engines: {node: '>=0.10'} + resolution: + {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} + engines: {node: ">=0.10"} requiresBuild: true dependencies: es6-iterator: 2.0.3 @@ -3832,24 +4318,28 @@ packages: next-tick: 1.1.0 /es6-iterator@2.0.3: - resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + resolution: + {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} dependencies: d: 1.0.1 es5-ext: 0.10.62 es6-symbol: 3.1.3 /es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + resolution: + {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} dev: true /es6-symbol@3.1.3: - resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} + resolution: + {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} dependencies: d: 1.0.1 ext: 1.7.0 /es6-weak-map@2.0.3: - resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} + resolution: + {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} dependencies: d: 1.0.1 es5-ext: 0.10.62 @@ -3857,30 +4347,36 @@ packages: es6-symbol: 3.1.3 /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: ">=6"} /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + resolution: + {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} dev: true /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + resolution: + {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: ">=0.8.0"} /escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: ">=8"} dev: true /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: ">=10"} dev: true /escodegen@1.8.1: - resolution: {integrity: sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==} - engines: {node: '>=0.12.0'} + resolution: + {integrity: sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==} + engines: {node: ">=0.12.0"} hasBin: true dependencies: esprima: 2.7.3 @@ -3892,19 +4388,21 @@ packages: dev: true /eslint-config-prettier@8.10.0(eslint@8.50.0): - resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} + resolution: + {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} hasBin: true peerDependencies: - eslint: '>=7.0.0' + eslint: ">=7.0.0" dependencies: eslint: 8.50.0 dev: true /eslint-plugin-mocha@10.1.0(eslint@8.50.0): - resolution: {integrity: sha512-xLqqWUF17llsogVOC+8C6/jvQ+4IoOREbN7ZCHuOHuD6cT5cDD4h7f2LgsZuzMAiwswWE21tO7ExaknHVDrSkw==} - engines: {node: '>=14.0.0'} + resolution: + {integrity: sha512-xLqqWUF17llsogVOC+8C6/jvQ+4IoOREbN7ZCHuOHuD6cT5cDD4h7f2LgsZuzMAiwswWE21tO7ExaknHVDrSkw==} + engines: {node: ">=14.0.0"} peerDependencies: - eslint: '>=7.0.0' + eslint: ">=7.0.0" dependencies: eslint: 8.50.0 eslint-utils: 3.0.0(eslint@8.50.0) @@ -3912,12 +4410,13 @@ packages: dev: true /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0)(eslint@8.50.0)(prettier@2.8.8): - resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} - engines: {node: '>=12.0.0'} + resolution: + {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} + engines: {node: ">=12.0.0"} peerDependencies: - eslint: '>=7.28.0' - eslint-config-prettier: '*' - prettier: '>=2.0.0' + eslint: ">=7.28.0" + eslint-config-prettier: "*" + prettier: ">=2.0.0" peerDependenciesMeta: eslint-config-prettier: optional: true @@ -3929,7 +4428,8 @@ packages: dev: true /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + resolution: + {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: esrecurse: 4.3.0 @@ -3937,37 +4437,41 @@ packages: dev: true /eslint-utils@3.0.0(eslint@8.50.0): - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + resolution: + {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: - eslint: '>=5' + eslint: ">=5" dependencies: eslint: 8.50.0 eslint-visitor-keys: 2.1.0 dev: true /eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: ">=10"} dev: true /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + resolution: + {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true /eslint@8.50.0: - resolution: {integrity: sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==} + resolution: + {integrity: sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) - '@eslint-community/regexpp': 4.9.0 - '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.50.0 - '@humanwhocodes/config-array': 0.11.11 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 + "@eslint-community/eslint-utils": 4.4.0(eslint@8.50.0) + "@eslint-community/regexpp": 4.9.0 + "@eslint/eslintrc": 2.1.2 + "@eslint/js": 8.50.0 + "@humanwhocodes/config-array": 0.11.11 + "@humanwhocodes/module-importer": 1.0.1 + "@nodelib/fs.walk": 1.2.8 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 @@ -4003,7 +4507,8 @@ packages: dev: true /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + resolution: + {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: acorn: 8.10.0 @@ -4012,67 +4517,77 @@ packages: dev: true /esprima@2.7.3: - resolution: {integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==} + engines: {node: ">=0.10.0"} hasBin: true dev: true /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: ">=4"} hasBin: true dev: true /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} + resolution: + {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: ">=0.10"} dependencies: estraverse: 5.3.0 dev: true /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + resolution: + {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: ">=4.0"} dependencies: estraverse: 5.3.0 dev: true /estraverse@1.9.3: - resolution: {integrity: sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==} + engines: {node: ">=0.10.0"} dev: true /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} + resolution: + {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: ">=4.0"} dev: true /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: ">=0.10.0"} dev: true /etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} + resolution: + {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: ">= 0.6"} dev: true /eth-ens-namehash@2.0.8: - resolution: {integrity: sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==} + resolution: + {integrity: sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==} dependencies: idna-uts46-hx: 2.3.1 js-sha3: 0.5.7 dev: true /eth-gas-reporter@0.2.27: - resolution: {integrity: sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==} + resolution: + {integrity: sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==} peerDependencies: - '@codechecks/client': ^0.1.0 + "@codechecks/client": ^0.1.0 peerDependenciesMeta: - '@codechecks/client': + "@codechecks/client": optional: true dependencies: - '@solidity-parser/parser': 0.14.5 + "@solidity-parser/parser": 0.14.5 axios: 1.5.1 cli-table3: 0.5.1 colors: 1.4.0 @@ -4092,7 +4607,8 @@ packages: dev: true /eth-lib@0.1.29: - resolution: {integrity: sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==} + resolution: + {integrity: sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==} dependencies: bn.js: 4.12.0 elliptic: 6.5.4 @@ -4107,7 +4623,8 @@ packages: dev: true /eth-lib@0.2.8: - resolution: {integrity: sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==} + resolution: + {integrity: sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==} dependencies: bn.js: 4.12.0 elliptic: 6.5.4 @@ -4115,16 +4632,18 @@ packages: dev: true /ethereum-bloom-filters@1.0.10: - resolution: {integrity: sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==} + resolution: + {integrity: sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==} dependencies: js-sha3: 0.8.0 dev: true /ethereum-cryptography@0.1.3: - resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} + resolution: + {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} dependencies: - '@types/pbkdf2': 3.1.0 - '@types/secp256k1': 4.0.4 + "@types/pbkdf2": 3.1.0 + "@types/secp256k1": 4.0.4 blakejs: 1.2.1 browserify-aes: 1.2.0 bs58check: 2.1.2 @@ -4141,34 +4660,38 @@ packages: dev: true /ethereum-cryptography@1.2.0: - resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} + resolution: + {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} dependencies: - '@noble/hashes': 1.2.0 - '@noble/secp256k1': 1.7.1 - '@scure/bip32': 1.1.5 - '@scure/bip39': 1.1.1 + "@noble/hashes": 1.2.0 + "@noble/secp256k1": 1.7.1 + "@scure/bip32": 1.1.5 + "@scure/bip39": 1.1.1 dev: true /ethereum-cryptography@2.1.2: - resolution: {integrity: sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==} + resolution: + {integrity: sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==} dependencies: - '@noble/curves': 1.1.0 - '@noble/hashes': 1.3.1 - '@scure/bip32': 1.3.1 - '@scure/bip39': 1.2.1 + "@noble/curves": 1.1.0 + "@noble/hashes": 1.3.1 + "@scure/bip32": 1.3.1 + "@scure/bip39": 1.2.1 dev: true /ethereumjs-abi@0.6.8: - resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} + resolution: + {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} dependencies: bn.js: 4.12.0 ethereumjs-util: 6.2.1 dev: true /ethereumjs-util@6.2.1: - resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} + resolution: + {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} dependencies: - '@types/bn.js': 4.11.6 + "@types/bn.js": 4.11.6 bn.js: 4.12.0 create-hash: 1.2.0 elliptic: 6.5.4 @@ -4178,10 +4701,11 @@ packages: dev: true /ethereumjs-util@7.1.5: - resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} - engines: {node: '>=10.0.0'} + resolution: + {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} + engines: {node: ">=10.0.0"} dependencies: - '@types/bn.js': 5.1.2 + "@types/bn.js": 5.1.2 bn.js: 5.2.1 create-hash: 1.2.0 ethereum-cryptography: 0.1.3 @@ -4189,7 +4713,8 @@ packages: dev: true /ethers@4.0.49: - resolution: {integrity: sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==} + resolution: + {integrity: sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==} dependencies: aes-js: 3.0.0 bn.js: 4.12.0 @@ -4203,46 +4728,48 @@ packages: dev: true /ethers@5.7.2: - resolution: {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 + resolution: + {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 transitivePeerDependencies: - bufferutil - utf-8-validate dev: true /ethjs-abi@0.2.1: - resolution: {integrity: sha512-g2AULSDYI6nEJyJaEVEXtTimRY2aPC2fi7ddSy0W+LXvEVL8Fe1y76o43ecbgdUKwZD+xsmEgX1yJr1Ia3r1IA==} - engines: {node: '>=6.5.0', npm: '>=3'} + resolution: + {integrity: sha512-g2AULSDYI6nEJyJaEVEXtTimRY2aPC2fi7ddSy0W+LXvEVL8Fe1y76o43ecbgdUKwZD+xsmEgX1yJr1Ia3r1IA==} + engines: {node: ">=6.5.0", npm: ">=3"} dependencies: bn.js: 4.11.6 js-sha3: 0.5.5 @@ -4250,43 +4777,50 @@ packages: dev: true /ethjs-unit@0.1.6: - resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} - engines: {node: '>=6.5.0', npm: '>=3'} + resolution: + {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} + engines: {node: ">=6.5.0", npm: ">=3"} dependencies: bn.js: 4.11.6 number-to-bn: 1.7.0 dev: true /ethjs-util@0.1.6: - resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} - engines: {node: '>=6.5.0', npm: '>=3'} + resolution: + {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} + engines: {node: ">=6.5.0", npm: ">=3"} dependencies: is-hex-prefixed: 1.0.0 strip-hex-prefix: 1.0.0 dev: true /event-emitter@0.3.5: - resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + resolution: + {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} dependencies: d: 1.0.1 es5-ext: 0.10.62 /eventemitter3@4.0.4: - resolution: {integrity: sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==} + resolution: + {integrity: sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==} dev: true /eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + resolution: + {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} dev: true /evp_bytestokey@1.0.3: - resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + resolution: + {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} dependencies: md5.js: 1.3.5 safe-buffer: 5.2.1 /execa@7.2.0: - resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + resolution: + {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} dependencies: cross-spawn: 7.0.3 @@ -4301,10 +4835,11 @@ packages: dev: true /expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + resolution: + {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/expect-utils': 29.7.0 + "@jest/expect-utils": 29.7.0 jest-get-type: 29.6.3 jest-matcher-utils: 29.7.0 jest-message-util: 29.7.0 @@ -4312,8 +4847,9 @@ packages: dev: true /express@4.18.2: - resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} - engines: {node: '>= 0.10.0'} + resolution: + {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: ">= 0.10.0"} dependencies: accepts: 1.3.8 array-flatten: 1.1.1 @@ -4351,92 +4887,108 @@ packages: dev: true /ext@1.7.0: - resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + resolution: + {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} dependencies: type: 2.7.2 /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + resolution: + {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} dev: true /extsprintf@1.3.0: - resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} - engines: {'0': node >=0.6.0} + resolution: + {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {"0": node >=0.6.0} dev: true /fast-check@3.1.1: - resolution: {integrity: sha512-3vtXinVyuUKCKFKYcwXhGE6NtGWkqF8Yh3rvMZNzmwz8EPrgoc/v4pDdLHyLnCyCI5MZpZZkDEwFyXyEONOxpA==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-3vtXinVyuUKCKFKYcwXhGE6NtGWkqF8Yh3rvMZNzmwz8EPrgoc/v4pDdLHyLnCyCI5MZpZZkDEwFyXyEONOxpA==} + engines: {node: ">=8.0.0"} dependencies: pure-rand: 5.0.5 dev: true /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + resolution: + {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true /fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + resolution: + {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} dev: true /fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} + resolution: + {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: ">=8.6.0"} dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 + "@nodelib/fs.stat": 2.0.5 + "@nodelib/fs.walk": 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.5 dev: true /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + resolution: + {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: true /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + resolution: + {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + resolution: + {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: reusify: 1.0.4 dev: true /fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + resolution: + {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} dependencies: bser: 2.1.1 dev: true /fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + resolution: + {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} dependencies: node-domexception: 1.0.0 web-streams-polyfill: 3.2.1 /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + resolution: + {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.1.0 dev: true /file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + resolution: + {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: ">=8"} dependencies: to-regex-range: 5.0.1 dev: true /finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} + resolution: + {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: ">= 0.8"} dependencies: debug: 2.6.9 encodeurl: 1.0.2 @@ -4450,46 +5002,52 @@ packages: dev: true /find-replace@3.0.0: - resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} - engines: {node: '>=4.0.0'} + resolution: + {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} + engines: {node: ">=4.0.0"} dependencies: array-back: 3.1.0 dev: true /find-up@1.1.2: - resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} + engines: {node: ">=0.10.0"} dependencies: path-exists: 2.1.0 pinkie-promise: 2.0.1 dev: true /find-up@2.1.0: - resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: ">=4"} dependencies: locate-path: 2.0.0 dev: true /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: ">=8"} dependencies: locate-path: 5.0.0 path-exists: 4.0.0 dev: true /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: ">=10"} dependencies: locate-path: 6.0.0 path-exists: 4.0.0 dev: true /flat-cache@3.1.0: - resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==} - engines: {node: '>=12.0.0'} + resolution: + {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==} + engines: {node: ">=12.0.0"} dependencies: flatted: 3.2.9 keyv: 4.5.3 @@ -4497,19 +5055,22 @@ packages: dev: true /flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + resolution: + {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true dev: true /flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + resolution: + {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} dev: true /follow-redirects@1.15.3(debug@4.3.4): - resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} - engines: {node: '>=4.0'} + resolution: + {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} + engines: {node: ">=4.0"} peerDependencies: - debug: '*' + debug: "*" peerDependenciesMeta: debug: optional: true @@ -4518,22 +5079,26 @@ packages: dev: true /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + resolution: + {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.7 dev: true /forever-agent@0.6.1: - resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + resolution: + {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} dev: true /form-data-encoder@1.7.1: - resolution: {integrity: sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==} + resolution: + {integrity: sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==} dev: true /form-data@2.3.3: - resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} - engines: {node: '>= 0.12'} + resolution: + {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: ">= 0.12"} dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 @@ -4541,8 +5106,9 @@ packages: dev: true /form-data@2.5.1: - resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} - engines: {node: '>= 0.12'} + resolution: + {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} + engines: {node: ">= 0.12"} dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 @@ -4550,8 +5116,9 @@ packages: dev: true /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} + resolution: + {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: ">= 6"} dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 @@ -4559,27 +5126,32 @@ packages: dev: true /formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} + resolution: + {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: ">=12.20.0"} dependencies: fetch-blob: 3.2.0 /forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} + resolution: + {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: ">= 0.6"} dev: true /fp-ts@1.19.3: - resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} + resolution: + {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} dev: true /fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} + resolution: + {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: ">= 0.6"} dev: true /fs-extra@0.30.0: - resolution: {integrity: sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==} + resolution: + {integrity: sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==} dependencies: graceful-fs: 4.2.11 jsonfile: 2.4.0 @@ -4589,7 +5161,8 @@ packages: dev: true /fs-extra@4.0.3: - resolution: {integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==} + resolution: + {integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==} dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 @@ -4597,8 +5170,9 @@ packages: dev: true /fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} + resolution: + {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: ">=6 <7 || >=8"} dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 @@ -4606,8 +5180,9 @@ packages: dev: true /fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} + resolution: + {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: ">=6 <7 || >=8"} dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 @@ -4615,8 +5190,9 @@ packages: dev: true /fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: ">=10"} dependencies: at-least-node: 1.0.0 graceful-fs: 4.2.11 @@ -4625,21 +5201,25 @@ packages: dev: true /fs-minipass@1.2.7: - resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} + resolution: + {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} dependencies: minipass: 2.9.0 dev: true /fs-readdir-recursive@1.1.0: - resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} + resolution: + {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} dev: true /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + resolution: + {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + resolution: + {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true @@ -4647,32 +5227,39 @@ packages: optional: true /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + resolution: + {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} dev: true /functional-red-black-tree@1.0.1: - resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + resolution: + {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} dev: true /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} + resolution: + {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: ">=6.9.0"} dev: true /get-caller-file@1.0.3: - resolution: {integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==} + resolution: + {integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==} dev: true /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + resolution: + {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} /get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + resolution: + {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} dev: true /get-intrinsic@1.2.1: - resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + resolution: + {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} dependencies: function-bind: 1.1.1 has: 1.0.3 @@ -4681,35 +5268,41 @@ packages: dev: true /get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: ">=8.0.0"} dev: true /get-port@3.2.0: - resolution: {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==} + engines: {node: ">=4"} dev: true /get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: ">=8"} dependencies: pump: 3.0.0 dev: true /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: ">=10"} dev: true /getpass@0.1.7: - resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + resolution: + {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} dependencies: assert-plus: 1.0.0 dev: true /ghost-testrpc@0.0.2: - resolution: {integrity: sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==} + resolution: + {integrity: sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==} hasBin: true dependencies: chalk: 2.4.2 @@ -4717,21 +5310,24 @@ packages: dev: true /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + resolution: + {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: ">= 6"} dependencies: is-glob: 4.0.3 dev: true /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + resolution: + {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: ">=10.13.0"} dependencies: is-glob: 4.0.3 dev: true /glob@5.0.15: - resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} + resolution: + {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} dependencies: inflight: 1.0.6 inherits: 2.0.4 @@ -4741,7 +5337,8 @@ packages: dev: true /glob@7.1.7: - resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + resolution: + {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -4752,7 +5349,8 @@ packages: dev: true /glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + resolution: + {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -4763,7 +5361,8 @@ packages: dev: true /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + resolution: + {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -4774,8 +5373,9 @@ packages: dev: true /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} + resolution: + {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: ">=12"} dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -4785,15 +5385,17 @@ packages: dev: true /global-modules@2.0.0: - resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: ">=6"} dependencies: global-prefix: 3.0.0 dev: true /global-prefix@3.0.0: - resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: ">=6"} dependencies: ini: 1.3.8 kind-of: 6.0.3 @@ -4801,29 +5403,33 @@ packages: dev: true /global@4.4.0: - resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} + resolution: + {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} dependencies: min-document: 2.19.0 process: 0.11.10 dev: true /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: ">=4"} dev: true /globals@13.22.0: - resolution: {integrity: sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==} + engines: {node: ">=8"} dependencies: type-fest: 0.20.2 dev: true /globby@10.0.2: - resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} + engines: {node: ">=8"} dependencies: - '@types/glob': 7.2.0 + "@types/glob": 7.2.0 array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.1 @@ -4834,19 +5440,21 @@ packages: dev: true /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + resolution: + {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: get-intrinsic: 1.2.1 dev: true /got@11.8.6: - resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} - engines: {node: '>=10.19.0'} - dependencies: - '@sindresorhus/is': 4.6.0 - '@szmarczak/http-timer': 4.0.6 - '@types/cacheable-request': 6.0.3 - '@types/responselike': 1.0.1 + resolution: + {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: ">=10.19.0"} + dependencies: + "@sindresorhus/is": 4.6.0 + "@szmarczak/http-timer": 4.0.6 + "@types/cacheable-request": 6.0.3 + "@types/responselike": 1.0.1 cacheable-lookup: 5.0.4 cacheable-request: 7.0.4 decompress-response: 6.0.0 @@ -4857,13 +5465,14 @@ packages: dev: true /got@12.1.0: - resolution: {integrity: sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==} - engines: {node: '>=14.16'} - dependencies: - '@sindresorhus/is': 4.6.0 - '@szmarczak/http-timer': 5.0.1 - '@types/cacheable-request': 6.0.3 - '@types/responselike': 1.0.1 + resolution: + {integrity: sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==} + engines: {node: ">=14.16"} + dependencies: + "@sindresorhus/is": 4.6.0 + "@szmarczak/http-timer": 5.0.1 + "@types/cacheable-request": 6.0.3 + "@types/responselike": 1.0.1 cacheable-lookup: 6.1.0 cacheable-request: 7.0.4 decompress-response: 6.0.0 @@ -4876,16 +5485,19 @@ packages: dev: true /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + resolution: + {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} dev: true /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + resolution: + {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true /handlebars@4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} - engines: {node: '>=0.4.7'} + resolution: + {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: ">=0.4.7"} hasBin: true dependencies: minimist: 1.2.8 @@ -4897,13 +5509,15 @@ packages: dev: true /har-schema@2.0.0: - resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: ">=4"} dev: true /har-validator@5.1.5: - resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: ">=6"} deprecated: this library is no longer supported dependencies: ajv: 6.12.6 @@ -4911,7 +5525,8 @@ packages: dev: true /hardhat-gas-reporter@1.0.9(hardhat@2.17.4): - resolution: {integrity: sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==} + resolution: + {integrity: sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==} peerDependencies: hardhat: ^2.0.2 dependencies: @@ -4920,26 +5535,27 @@ packages: hardhat: 2.17.4(ts-node@10.9.1)(typescript@5.2.2) sha1: 1.1.1 transitivePeerDependencies: - - '@codechecks/client' + - "@codechecks/client" - bufferutil - debug - utf-8-validate dev: true /hardhat-scilla-plugin@3.7.0(@zilliqa-js/zilliqa@3.4.4)(hardhat@2.17.4): - resolution: {integrity: sha512-CNYkM0j9K75qJdUL/nynDF0cC3V/0gCqF6UG/x9uIyd59wo7jr+vCqj/bRARpGP8DPGp6+uRHke3q0ZLIzeSZQ==} + resolution: + {integrity: sha512-CNYkM0j9K75qJdUL/nynDF0cC3V/0gCqF6UG/x9uIyd59wo7jr+vCqj/bRARpGP8DPGp6+uRHke3q0ZLIzeSZQ==} peerDependencies: - '@zilliqa-js/zilliqa': ^3.4.3 + "@zilliqa-js/zilliqa": ^3.4.3 hardhat: ~2.16.0 dependencies: - '@ethersproject/bignumber': 5.7.0 - '@types/chai-subset': 1.3.3 - '@zilliqa-js/account': 3.4.4 - '@zilliqa-js/contract': 3.4.4 - '@zilliqa-js/core': 3.4.4 - '@zilliqa-js/crypto': 3.4.4 - '@zilliqa-js/util': 3.4.4 - '@zilliqa-js/zilliqa': 3.4.4 + "@ethersproject/bignumber": 5.7.0 + "@types/chai-subset": 1.3.3 + "@zilliqa-js/account": 3.4.4 + "@zilliqa-js/contract": 3.4.4 + "@zilliqa-js/core": 3.4.4 + "@zilliqa-js/crypto": 3.4.4 + "@zilliqa-js/util": 3.4.4 + "@zilliqa-js/zilliqa": 3.4.4 chai-subset: 1.6.0 cli-color: 2.0.3 glob: 8.1.0 @@ -4950,33 +5566,34 @@ packages: dev: true /hardhat@2.17.4(ts-node@10.9.1)(typescript@5.2.2): - resolution: {integrity: sha512-YTyHjVc9s14CY/O7Dbtzcr/92fcz6AzhrMaj6lYsZpYPIPLzOrFCZHHPxfGQB6FiE6IPNE0uJaAbr7zGF79goA==} + resolution: + {integrity: sha512-YTyHjVc9s14CY/O7Dbtzcr/92fcz6AzhrMaj6lYsZpYPIPLzOrFCZHHPxfGQB6FiE6IPNE0uJaAbr7zGF79goA==} hasBin: true peerDependencies: - ts-node: '*' - typescript: '*' + ts-node: "*" + typescript: "*" peerDependenciesMeta: ts-node: optional: true typescript: optional: true dependencies: - '@ethersproject/abi': 5.7.0 - '@metamask/eth-sig-util': 4.0.1 - '@nomicfoundation/ethereumjs-block': 5.0.2 - '@nomicfoundation/ethereumjs-blockchain': 7.0.2 - '@nomicfoundation/ethereumjs-common': 4.0.2 - '@nomicfoundation/ethereumjs-evm': 2.0.2 - '@nomicfoundation/ethereumjs-rlp': 5.0.2 - '@nomicfoundation/ethereumjs-statemanager': 2.0.2 - '@nomicfoundation/ethereumjs-trie': 6.0.2 - '@nomicfoundation/ethereumjs-tx': 5.0.2 - '@nomicfoundation/ethereumjs-util': 9.0.2 - '@nomicfoundation/ethereumjs-vm': 7.0.2 - '@nomicfoundation/solidity-analyzer': 0.1.1 - '@sentry/node': 5.30.0 - '@types/bn.js': 5.1.2 - '@types/lru-cache': 5.1.1 + "@ethersproject/abi": 5.7.0 + "@metamask/eth-sig-util": 4.0.1 + "@nomicfoundation/ethereumjs-block": 5.0.2 + "@nomicfoundation/ethereumjs-blockchain": 7.0.2 + "@nomicfoundation/ethereumjs-common": 4.0.2 + "@nomicfoundation/ethereumjs-evm": 2.0.2 + "@nomicfoundation/ethereumjs-rlp": 5.0.2 + "@nomicfoundation/ethereumjs-statemanager": 2.0.2 + "@nomicfoundation/ethereumjs-trie": 6.0.2 + "@nomicfoundation/ethereumjs-tx": 5.0.2 + "@nomicfoundation/ethereumjs-util": 9.0.2 + "@nomicfoundation/ethereumjs-vm": 7.0.2 + "@nomicfoundation/solidity-analyzer": 0.1.1 + "@sentry/node": 5.30.0 + "@types/bn.js": 5.1.2 + "@types/lru-cache": 5.1.1 adm-zip: 0.4.16 aggregate-error: 3.1.0 ansi-escapes: 4.3.2 @@ -5018,108 +5635,127 @@ packages: dev: true /has-flag@1.0.0: - resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} + engines: {node: ">=0.10.0"} dev: true /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: ">=4"} /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: ">=8"} dev: true /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} + resolution: + {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: ">= 0.4"} dev: true /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} + resolution: + {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: ">= 0.4"} dev: true /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} + resolution: + {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: ">= 0.4"} dependencies: has-symbols: 1.0.3 dev: true /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} + resolution: + {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: ">= 0.4.0"} dependencies: function-bind: 1.1.1 dev: true /hash-base@3.1.0: - resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: ">=4"} dependencies: inherits: 2.0.4 readable-stream: 3.6.2 safe-buffer: 5.2.1 /hash.js@1.1.3: - resolution: {integrity: sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==} + resolution: + {integrity: sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==} dependencies: inherits: 2.0.4 minimalistic-assert: 1.0.1 dev: true /hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + resolution: + {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} dependencies: inherits: 2.0.4 minimalistic-assert: 1.0.1 /hdkey@1.1.2: - resolution: {integrity: sha512-PTQ4VKu0oRnCrYfLp04iQZ7T2Cxz0UsEXYauk2j8eh6PJXCpbXuCFhOmtIFtbET0i3PMWmHN9J11gU8LEgUljQ==} + resolution: + {integrity: sha512-PTQ4VKu0oRnCrYfLp04iQZ7T2Cxz0UsEXYauk2j8eh6PJXCpbXuCFhOmtIFtbET0i3PMWmHN9J11gU8LEgUljQ==} dependencies: bs58check: 2.1.2 safe-buffer: 5.2.1 secp256k1: 3.8.0 /he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + resolution: + {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true dev: true /header-case@1.0.1: - resolution: {integrity: sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==} + resolution: + {integrity: sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==} dependencies: no-case: 2.3.2 upper-case: 1.1.3 dev: true /heap@0.2.7: - resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} + resolution: + {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} dev: true /highlight.js@10.7.3: - resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + resolution: + {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} dev: true /highlightjs-solidity@2.0.6: - resolution: {integrity: sha512-DySXWfQghjm2l6a/flF+cteroJqD4gI8GSdL4PtvxZSsAHie8m3yVe2JFoRg03ROKT6hp2Lc/BxXkqerNmtQYg==} + resolution: + {integrity: sha512-DySXWfQghjm2l6a/flF+cteroJqD4gI8GSdL4PtvxZSsAHie8m3yVe2JFoRg03ROKT6hp2Lc/BxXkqerNmtQYg==} dev: true /hmac-drbg@1.0.1: - resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + resolution: + {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} dependencies: hash.js: 1.1.7 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + resolution: + {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true /htmlparser2@8.0.2: - resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + resolution: + {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 @@ -5128,8 +5764,9 @@ packages: dev: true /http-basic@8.1.3: - resolution: {integrity: sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==} - engines: {node: '>=6.0.0'} + resolution: + {integrity: sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==} + engines: {node: ">=6.0.0"} dependencies: caseless: 0.12.0 concat-stream: 1.6.2 @@ -5138,12 +5775,14 @@ packages: dev: true /http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + resolution: + {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} dev: true /http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} + resolution: + {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: ">= 0.8"} dependencies: depd: 2.0.0 inherits: 2.0.4 @@ -5153,18 +5792,21 @@ packages: dev: true /http-https@1.0.0: - resolution: {integrity: sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==} + resolution: + {integrity: sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==} dev: true /http-response-object@3.0.2: - resolution: {integrity: sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==} + resolution: + {integrity: sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==} dependencies: - '@types/node': 10.17.60 + "@types/node": 10.17.60 dev: true /http-signature@1.2.0: - resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} - engines: {node: '>=0.8', npm: '>=1.3.7'} + resolution: + {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: ">=0.8", npm: ">=1.3.7"} dependencies: assert-plus: 1.0.0 jsprim: 1.4.2 @@ -5172,24 +5814,27 @@ packages: dev: true /http2-wrapper@1.0.3: - resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} - engines: {node: '>=10.19.0'} + resolution: + {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: ">=10.19.0"} dependencies: quick-lru: 5.1.1 resolve-alpn: 1.2.1 dev: true /http2-wrapper@2.2.0: - resolution: {integrity: sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==} - engines: {node: '>=10.19.0'} + resolution: + {integrity: sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==} + engines: {node: ">=10.19.0"} dependencies: quick-lru: 5.1.1 resolve-alpn: 1.2.1 dev: true /https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} + resolution: + {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: ">= 6"} dependencies: agent-base: 6.0.2 debug: 4.3.4(supports-color@8.1.1) @@ -5198,270 +5843,321 @@ packages: dev: true /human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} + resolution: + {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: ">=14.18.0"} dev: true /husky@8.0.3: - resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} - engines: {node: '>=14'} + resolution: + {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: ">=14"} hasBin: true dev: true /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: ">=0.10.0"} dependencies: safer-buffer: 2.1.2 dev: true /idna-uts46-hx@2.3.1: - resolution: {integrity: sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==} - engines: {node: '>=4.0.0'} + resolution: + {integrity: sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==} + engines: {node: ">=4.0.0"} dependencies: punycode: 2.1.0 dev: true /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + resolution: + {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} + resolution: + {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: ">= 4"} dev: true /immutable@4.3.4: - resolution: {integrity: sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==} + resolution: + {integrity: sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==} dev: true /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: ">=6"} dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 dev: true /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} + resolution: + {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: ">=0.8.19"} dev: true /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: ">=8"} dev: true /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + resolution: + {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 dev: true /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + resolution: + {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + resolution: + {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} dev: true /interpret@1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} - engines: {node: '>= 0.10'} + resolution: + {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: ">= 0.10"} dev: true /invert-kv@1.0.0: - resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} + engines: {node: ">=0.10.0"} dev: true /io-ts@1.10.4: - resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} + resolution: + {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} dependencies: fp-ts: 1.19.3 dev: true /iota-array@1.0.0: - resolution: {integrity: sha512-pZ2xT+LOHckCatGQ3DcG/a+QuEqvoxqkiL7tvE8nn3uuu+f6i1TtpB5/FtWFbxUuVr5PZCx8KskuGatbJDXOWA==} + resolution: + {integrity: sha512-pZ2xT+LOHckCatGQ3DcG/a+QuEqvoxqkiL7tvE8nn3uuu+f6i1TtpB5/FtWFbxUuVr5PZCx8KskuGatbJDXOWA==} dev: false /ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} + resolution: + {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: ">= 0.10"} dev: true /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} + resolution: + {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: ">= 0.4"} dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 dev: true /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + resolution: + {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: true /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: ">=8"} dependencies: binary-extensions: 2.2.0 dev: true /is-buffer@1.1.6: - resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + resolution: + {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} dev: false /is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: ">=4"} dev: true /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} + resolution: + {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: ">= 0.4"} dev: true /is-core-module@2.13.0: - resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + resolution: + {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} dependencies: has: 1.0.3 dev: true /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: ">=0.10.0"} dev: true /is-fullwidth-code-point@1.0.0: - resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} + engines: {node: ">=0.10.0"} dependencies: number-is-nan: 1.0.1 dev: true /is-fullwidth-code-point@2.0.0: - resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: ">=4"} dev: true /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: ">=8"} /is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} + resolution: + {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: ">=12"} dev: true /is-function@1.0.2: - resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} + resolution: + {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} dev: true /is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: ">=6"} dev: true /is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} + resolution: + {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: ">= 0.4"} dependencies: has-tostringtag: 1.0.0 dev: true /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: ">=0.10.0"} dependencies: is-extglob: 2.1.1 dev: true /is-hex-prefixed@1.0.0: - resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} - engines: {node: '>=6.5.0', npm: '>=3'} + resolution: + {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} + engines: {node: ">=6.5.0", npm: ">=3"} dev: true /is-lower-case@1.1.3: - resolution: {integrity: sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==} + resolution: + {integrity: sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==} dependencies: lower-case: 1.1.4 dev: true /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + resolution: + {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: ">=0.12.0"} dev: true /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: ">=8"} dev: true /is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: ">=8"} dev: true /is-promise@2.2.2: - resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + resolution: + {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + resolution: + {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true /is-typed-array@1.1.12: - resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} - engines: {node: '>= 0.4'} + resolution: + {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: ">= 0.4"} dependencies: which-typed-array: 1.1.11 dev: true /is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + resolution: + {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: ">=10"} dev: true /is-upper-case@1.1.2: - resolution: {integrity: sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==} + resolution: + {integrity: sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==} dependencies: upper-case: 1.1.3 dev: true /is-utf8@0.2.1: - resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + resolution: + {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} dev: true /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + resolution: + {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: true /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + resolution: + {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true /isstream@0.1.2: - resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + resolution: + {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} dev: true /istanbul-lib-coverage@3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: ">=8"} dev: true /istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: ">=8"} dependencies: - '@babel/core': 7.23.0 - '@babel/parser': 7.23.0 - '@istanbuljs/schema': 0.1.3 + "@babel/core": 7.23.0 + "@babel/parser": 7.23.0 + "@istanbuljs/schema": 0.1.3 istanbul-lib-coverage: 3.2.0 semver: 6.3.1 transitivePeerDependencies: @@ -5469,14 +6165,15 @@ packages: dev: true /jest-circus@29.7.0: - resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + resolution: + {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.8.0 + "@jest/environment": 29.7.0 + "@jest/expect": 29.7.0 + "@jest/test-result": 29.7.0 + "@jest/types": 29.6.3 + "@types/node": 20.8.0 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.1 @@ -5498,7 +6195,8 @@ packages: dev: true /jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + resolution: + {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 @@ -5508,10 +6206,11 @@ packages: dev: true /jest-each@29.7.0: - resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + resolution: + {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.6.3 + "@jest/types": 29.6.3 chalk: 4.1.2 jest-get-type: 29.6.3 jest-util: 29.7.0 @@ -5519,17 +6218,19 @@ packages: dev: true /jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + resolution: + {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true /jest-haste-map@29.7.0: - resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + resolution: + {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.6.3 - '@types/graceful-fs': 4.1.7 - '@types/node': 20.8.0 + "@jest/types": 29.6.3 + "@types/graceful-fs": 4.1.7 + "@types/node": 20.8.0 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -5543,7 +6244,8 @@ packages: dev: true /jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + resolution: + {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 @@ -5553,12 +6255,13 @@ packages: dev: true /jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + resolution: + {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.22.13 - '@jest/types': 29.6.3 - '@types/stack-utils': 2.0.1 + "@babel/code-frame": 7.22.13 + "@jest/types": 29.6.3 + "@types/stack-utils": 2.0.1 chalk: 4.1.2 graceful-fs: 4.2.11 micromatch: 4.0.5 @@ -5568,19 +6271,21 @@ packages: dev: true /jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + resolution: + {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.8.0 + "@jest/types": 29.6.3 + "@types/node": 20.8.0 jest-util: 29.7.0 dev: true /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: ">=6"} peerDependencies: - jest-resolve: '*' + jest-resolve: "*" peerDependenciesMeta: jest-resolve: optional: true @@ -5589,12 +6294,14 @@ packages: dev: true /jest-regex-util@29.6.3: - resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + resolution: + {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true /jest-resolve@29.7.0: - resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + resolution: + {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 @@ -5609,17 +6316,18 @@ packages: dev: true /jest-runtime@29.7.0: - resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + resolution: + {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/globals': 29.7.0 - '@jest/source-map': 29.6.3 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.8.0 + "@jest/environment": 29.7.0 + "@jest/fake-timers": 29.7.0 + "@jest/globals": 29.7.0 + "@jest/source-map": 29.6.3 + "@jest/test-result": 29.7.0 + "@jest/transform": 29.7.0 + "@jest/types": 29.6.3 + "@types/node": 20.8.0 chalk: 4.1.2 cjs-module-lexer: 1.2.3 collect-v8-coverage: 1.0.2 @@ -5639,17 +6347,18 @@ packages: dev: true /jest-snapshot@29.7.0: - resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + resolution: + {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.23.0 - '@babel/generator': 7.23.0 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.0) - '@babel/types': 7.23.0 - '@jest/expect-utils': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 + "@babel/core": 7.23.0 + "@babel/generator": 7.23.0 + "@babel/plugin-syntax-jsx": 7.22.5(@babel/core@7.23.0) + "@babel/plugin-syntax-typescript": 7.22.5(@babel/core@7.23.0) + "@babel/types": 7.23.0 + "@jest/expect-utils": 29.7.0 + "@jest/transform": 29.7.0 + "@jest/types": 29.6.3 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.0) chalk: 4.1.2 expect: 29.7.0 @@ -5667,11 +6376,12 @@ packages: dev: true /jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + resolution: + {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.8.0 + "@jest/types": 29.6.3 + "@types/node": 20.8.0 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -5679,10 +6389,11 @@ packages: dev: true /jest-validate@29.7.0: - resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + resolution: + {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.6.3 + "@jest/types": 29.6.3 camelcase: 6.3.0 chalk: 4.1.2 jest-get-type: 29.6.3 @@ -5691,41 +6402,49 @@ packages: dev: true /jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + resolution: + {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 20.8.0 + "@types/node": 20.8.0 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true /jpeg-js@0.4.4: - resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} + resolution: + {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} dev: false /js-sdsl@4.4.2: - resolution: {integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==} + resolution: + {integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==} dev: true /js-sha3@0.5.5: - resolution: {integrity: sha512-yLLwn44IVeunwjpDVTDZmQeVbB0h+dZpY2eO68B/Zik8hu6dH+rKeLxwua79GGIvW6xr8NBAcrtiUbYrTjEFTA==} + resolution: + {integrity: sha512-yLLwn44IVeunwjpDVTDZmQeVbB0h+dZpY2eO68B/Zik8hu6dH+rKeLxwua79GGIvW6xr8NBAcrtiUbYrTjEFTA==} dev: true /js-sha3@0.5.7: - resolution: {integrity: sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==} + resolution: + {integrity: sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==} dev: true /js-sha3@0.8.0: - resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + resolution: + {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} dev: true /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + resolution: + {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: true /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + resolution: + {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true dependencies: argparse: 1.0.10 @@ -5733,66 +6452,79 @@ packages: dev: true /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + resolution: + {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true dependencies: argparse: 2.0.1 dev: true /jsbn@0.1.1: - resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + resolution: + {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} dev: true /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: ">=4"} hasBin: true dev: true /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + resolution: + {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} dev: true /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + resolution: + {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + resolution: + {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} dev: true /json-schema@0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + resolution: + {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} dev: true /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + resolution: + {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true /json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + resolution: + {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} dev: true /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: ">=6"} hasBin: true dev: true /jsonfile@2.4.0: - resolution: {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==} + resolution: + {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==} optionalDependencies: graceful-fs: 4.2.11 dev: true /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + resolution: + {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} optionalDependencies: graceful-fs: 4.2.11 dev: true /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + resolution: + {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: universalify: 2.0.0 optionalDependencies: @@ -5800,12 +6532,14 @@ packages: dev: true /jsonschema@1.4.1: - resolution: {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==} + resolution: + {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==} dev: true /jsprim@1.4.2: - resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} - engines: {node: '>=0.6.0'} + resolution: + {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: ">=0.6.0"} dependencies: assert-plus: 1.0.0 extsprintf: 1.3.0 @@ -5814,8 +6548,9 @@ packages: dev: true /keccak@3.0.4: - resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} - engines: {node: '>=10.0.0'} + resolution: + {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} + engines: {node: ">=10.0.0"} requiresBuild: true dependencies: node-addon-api: 2.0.2 @@ -5824,83 +6559,96 @@ packages: dev: true /keyv@4.5.3: - resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} + resolution: + {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} dependencies: json-buffer: 3.0.1 dev: true /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: ">=0.10.0"} dev: true /klaw@1.3.1: - resolution: {integrity: sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==} + resolution: + {integrity: sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==} optionalDependencies: graceful-fs: 4.2.11 dev: true /lazyness@1.2.0: - resolution: {integrity: sha512-KenL6EFbwxBwRxG93t0gcUyi0Nw0Ub31FJKN1laA4UscdkL1K1AxUd0gYZdcLU3v+x+wcFi4uQKS5hL+fk500g==} - engines: {node: '>=6.0.0'} + resolution: + {integrity: sha512-KenL6EFbwxBwRxG93t0gcUyi0Nw0Ub31FJKN1laA4UscdkL1K1AxUd0gYZdcLU3v+x+wcFi4uQKS5hL+fk500g==} + engines: {node: ">=6.0.0"} dev: false /lcid@1.0.0: - resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} + engines: {node: ">=0.10.0"} dependencies: invert-kv: 1.0.0 dev: true /level-supports@4.0.1: - resolution: {integrity: sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==} - engines: {node: '>=12'} + resolution: + {integrity: sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==} + engines: {node: ">=12"} dev: true /level-transcoder@1.0.1: - resolution: {integrity: sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==} - engines: {node: '>=12'} + resolution: + {integrity: sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==} + engines: {node: ">=12"} dependencies: buffer: 6.0.3 module-error: 1.0.2 dev: true /level@8.0.0: - resolution: {integrity: sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==} - engines: {node: '>=12'} + resolution: + {integrity: sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==} + engines: {node: ">=12"} dependencies: browser-level: 1.0.1 classic-level: 1.3.0 dev: true /leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: ">=6"} dev: true /levn@0.3.0: - resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} - engines: {node: '>= 0.8.0'} + resolution: + {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: ">= 0.8.0"} dependencies: prelude-ls: 1.1.2 type-check: 0.3.2 dev: true /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + resolution: + {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: ">= 0.8.0"} dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 dev: true /lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: ">=10"} dev: true /lint-staged@13.3.0: - resolution: {integrity: sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==} + resolution: + {integrity: sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==} engines: {node: ^16.14.0 || >=18.0.0} hasBin: true dependencies: @@ -5920,10 +6668,11 @@ packages: dev: true /listr2@6.6.1: - resolution: {integrity: sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==} - engines: {node: '>=16.0.0'} + resolution: + {integrity: sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==} + engines: {node: ">=16.0.0"} peerDependencies: - enquirer: '>= 2.3.0 < 3' + enquirer: ">= 2.3.0 < 3" peerDependenciesMeta: enquirer: optional: true @@ -5937,8 +6686,9 @@ packages: dev: true /load-json-file@1.1.0: - resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} + engines: {node: ">=0.10.0"} dependencies: graceful-fs: 4.2.11 parse-json: 2.2.0 @@ -5948,70 +6698,83 @@ packages: dev: true /locate-path@2.0.0: - resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: ">=4"} dependencies: p-locate: 2.0.0 path-exists: 3.0.0 dev: true /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: ">=8"} dependencies: p-locate: 4.1.0 dev: true /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: ">=10"} dependencies: p-locate: 5.0.0 dev: true /lodash.assign@4.2.0: - resolution: {integrity: sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==} + resolution: + {integrity: sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==} dev: true /lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + resolution: + {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} dev: true /lodash.flatten@4.4.0: - resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} + resolution: + {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} dev: true /lodash.mapvalues@4.6.0: - resolution: {integrity: sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==} + resolution: + {integrity: sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==} dev: false /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + resolution: + {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true /lodash.truncate@4.4.2: - resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + resolution: + {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} dev: true /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + resolution: + {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} /log-symbols@2.2.0: - resolution: {integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==} + engines: {node: ">=4"} dependencies: chalk: 2.4.2 /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: ">=10"} dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 dev: true /log-update@5.0.1: - resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} + resolution: + {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: ansi-escapes: 5.0.0 @@ -6022,89 +6785,106 @@ packages: dev: true /long@4.0.0: - resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + resolution: + {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} /loupe@2.3.6: - resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + resolution: + {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} dependencies: get-func-name: 2.0.2 dev: true /lower-case-first@1.0.2: - resolution: {integrity: sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==} + resolution: + {integrity: sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==} dependencies: lower-case: 1.1.4 dev: true /lower-case@1.1.4: - resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} + resolution: + {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} dev: true /lowercase-keys@2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: ">=8"} dev: true /lowercase-keys@3.0.0: - resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + resolution: + {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + resolution: + {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: yallist: 3.1.1 dev: true /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: ">=10"} dependencies: yallist: 4.0.0 dev: true /lru-queue@0.1.0: - resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} + resolution: + {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} dependencies: es5-ext: 0.10.62 /lru_map@0.3.3: - resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} + resolution: + {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} dev: true /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + resolution: + {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true /makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + resolution: + {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} dependencies: tmpl: 1.0.5 dev: true /markdown-table@1.1.3: - resolution: {integrity: sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==} + resolution: + {integrity: sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==} dev: true /mcl-wasm@0.7.9: - resolution: {integrity: sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==} - engines: {node: '>=8.9.0'} + resolution: + {integrity: sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==} + engines: {node: ">=8.9.0"} dev: true /md5.js@1.3.5: - resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + resolution: + {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} dependencies: hash-base: 3.1.0 inherits: 2.0.4 safe-buffer: 5.2.1 /media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} + resolution: + {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: ">= 0.6"} dev: true /memoizee@0.4.15: - resolution: {integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==} + resolution: + {integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==} dependencies: d: 1.0.1 es5-ext: 0.10.62 @@ -6116,8 +6896,9 @@ packages: timers-ext: 0.1.7 /memory-level@1.0.0: - resolution: {integrity: sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==} - engines: {node: '>=12'} + resolution: + {integrity: sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==} + engines: {node: ">=12"} dependencies: abstract-level: 1.0.3 functional-red-black-tree: 1.0.1 @@ -6125,170 +6906,201 @@ packages: dev: true /memorystream@0.3.1: - resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} - engines: {node: '>= 0.10.0'} + resolution: + {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: ">= 0.10.0"} dev: true /merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + resolution: + {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} dev: true /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + resolution: + {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + resolution: + {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: ">= 8"} dev: true /methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} + resolution: + {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: ">= 0.6"} dev: true /micro-ftch@0.3.1: - resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + resolution: + {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} dev: true /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + resolution: + {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: ">=8.6"} dependencies: braces: 3.0.2 picomatch: 2.3.1 dev: true /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + resolution: + {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: ">= 0.6"} dev: true /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + resolution: + {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: ">= 0.6"} dependencies: mime-db: 1.52.0 dev: true /mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: ">=4"} hasBin: true dev: true /mimic-fn@1.2.0: - resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} + engines: {node: ">=4"} /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: ">=6"} dev: true /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} + resolution: + {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: ">=12"} dev: true /mimic-response@1.0.1: - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: ">=4"} dev: true /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: ">=10"} dev: true /min-document@2.19.0: - resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} + resolution: + {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} dependencies: dom-walk: 0.1.2 dev: true /minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + resolution: + {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} /minimalistic-crypto-utils@1.0.1: - resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + resolution: + {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + resolution: + {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 dev: true /minimatch@5.0.1: - resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} + engines: {node: ">=10"} dependencies: brace-expansion: 2.0.1 dev: true /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: ">=10"} dependencies: brace-expansion: 2.0.1 dev: true /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + resolution: + {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true /minipass@2.9.0: - resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} + resolution: + {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} dependencies: safe-buffer: 5.2.1 yallist: 3.1.1 dev: true /minizlib@1.3.3: - resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} + resolution: + {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} dependencies: minipass: 2.9.0 dev: true /mitt@1.2.0: - resolution: {integrity: sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==} + resolution: + {integrity: sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==} /mkdirp-promise@5.0.1: - resolution: {integrity: sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==} + engines: {node: ">=4"} deprecated: This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that. dependencies: mkdirp: 3.0.1 dev: true /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + resolution: + {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true dependencies: minimist: 1.2.8 dev: true /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: ">=10"} hasBin: true dev: true /mkdirp@3.0.1: - resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: ">=10"} hasBin: true dev: true /mnemonist@0.38.5: - resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} + resolution: + {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} dependencies: obliterator: 2.0.4 dev: true /mocha@10.2.0: - resolution: {integrity: sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==} - engines: {node: '>= 14.0.0'} + resolution: + {integrity: sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==} + engines: {node: ">= 14.0.0"} hasBin: true dependencies: ansi-colors: 4.1.1 @@ -6315,27 +7127,33 @@ packages: dev: true /mock-fs@4.14.0: - resolution: {integrity: sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==} + resolution: + {integrity: sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==} dev: true /module-error@1.0.2: - resolution: {integrity: sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==} + engines: {node: ">=10"} dev: true /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + resolution: + {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + resolution: + {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + resolution: + {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: true /multibase@0.6.1: - resolution: {integrity: sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==} + resolution: + {integrity: sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==} deprecated: This module has been superseded by the multiformats module dependencies: base-x: 3.0.9 @@ -6343,7 +7161,8 @@ packages: dev: true /multibase@0.7.0: - resolution: {integrity: sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==} + resolution: + {integrity: sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==} deprecated: This module has been superseded by the multiformats module dependencies: base-x: 3.0.9 @@ -6351,14 +7170,16 @@ packages: dev: true /multicodec@0.5.7: - resolution: {integrity: sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==} + resolution: + {integrity: sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==} deprecated: This module has been superseded by the multiformats module dependencies: varint: 5.0.2 dev: true /multicodec@1.0.4: - resolution: {integrity: sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==} + resolution: + {integrity: sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==} deprecated: This module has been superseded by the multiformats module dependencies: buffer: 5.7.1 @@ -6366,7 +7187,8 @@ packages: dev: true /multihashes@0.4.21: - resolution: {integrity: sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==} + resolution: + {integrity: sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==} dependencies: buffer: 5.7.1 multibase: 0.7.0 @@ -6374,92 +7196,111 @@ packages: dev: true /nan@2.18.0: - resolution: {integrity: sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==} + resolution: + {integrity: sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==} /nano-base32@1.0.1: - resolution: {integrity: sha512-sxEtoTqAPdjWVGv71Q17koMFGsOMSiHsIFEvzOM7cNp8BXB4AnEwmDabm5dorusJf/v1z7QxaZYxUorU9RKaAw==} + resolution: + {integrity: sha512-sxEtoTqAPdjWVGv71Q17koMFGsOMSiHsIFEvzOM7cNp8BXB4AnEwmDabm5dorusJf/v1z7QxaZYxUorU9RKaAw==} dev: true /nano-json-stream-parser@0.1.2: - resolution: {integrity: sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==} + resolution: + {integrity: sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==} dev: true /nanoid@3.3.3: - resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==} + resolution: + {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true dev: true /napi-macros@2.2.2: - resolution: {integrity: sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==} + resolution: + {integrity: sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==} dev: true /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + resolution: + {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true /ndarray-pack@1.2.1: - resolution: {integrity: sha512-51cECUJMT0rUZNQa09EoKsnFeDL4x2dHRT0VR5U2H5ZgEcm95ZDWcMA5JShroXjHOejmAD/fg8+H+OvUnVXz2g==} + resolution: + {integrity: sha512-51cECUJMT0rUZNQa09EoKsnFeDL4x2dHRT0VR5U2H5ZgEcm95ZDWcMA5JShroXjHOejmAD/fg8+H+OvUnVXz2g==} dependencies: cwise-compiler: 1.1.3 ndarray: 1.0.19 dev: false /ndarray@1.0.19: - resolution: {integrity: sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ==} + resolution: + {integrity: sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ==} dependencies: iota-array: 1.0.0 is-buffer: 1.1.6 dev: false /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} + resolution: + {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: ">= 0.6"} dev: true /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + resolution: + {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: true /next-tick@1.1.0: - resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + resolution: + {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} /nextgen-events@1.5.3: - resolution: {integrity: sha512-P6qw6kenNXP+J9XlKJNi/MNHUQ+Lx5K8FEcSfX7/w8KJdZan5+BB5MKzuNgL2RTjHG1Svg8SehfseVEp8zAqwA==} - engines: {node: '>=6.0.0'} + resolution: + {integrity: sha512-P6qw6kenNXP+J9XlKJNi/MNHUQ+Lx5K8FEcSfX7/w8KJdZan5+BB5MKzuNgL2RTjHG1Svg8SehfseVEp8zAqwA==} + engines: {node: ">=6.0.0"} dev: false /no-case@2.3.2: - resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} + resolution: + {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} dependencies: lower-case: 1.1.4 dev: true /node-addon-api@2.0.2: - resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + resolution: + {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} dev: true /node-bitmap@0.0.1: - resolution: {integrity: sha512-Jx5lPaaLdIaOsj2mVLWMWulXF6GQVdyLvNSxmiYCvZ8Ma2hfKX0POoR2kgKOqz+oFsRreq0yYZjQ2wjE9VNzCA==} - engines: {node: '>=v0.6.5'} + resolution: + {integrity: sha512-Jx5lPaaLdIaOsj2mVLWMWulXF6GQVdyLvNSxmiYCvZ8Ma2hfKX0POoR2kgKOqz+oFsRreq0yYZjQ2wjE9VNzCA==} + engines: {node: ">=v0.6.5"} dev: false /node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} + resolution: + {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: ">=10.5.0"} /node-emoji@1.11.0: - resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + resolution: + {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} dependencies: lodash: 4.17.21 dev: true /node-fetch@2.6.1: - resolution: {integrity: sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==} + resolution: + {integrity: sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==} engines: {node: 4.x || >=6.0.0} /node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + resolution: + {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} peerDependencies: encoding: ^0.1.0 @@ -6470,7 +7311,8 @@ packages: whatwg-url: 5.0.0 /node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + resolution: + {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: data-uri-to-buffer: 4.0.1 @@ -6478,36 +7320,43 @@ packages: formdata-polyfill: 4.0.10 /node-gyp-build@4.6.1: - resolution: {integrity: sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==} + resolution: + {integrity: sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==} hasBin: true /node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + resolution: + {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} dev: true /node-releases@2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + resolution: + {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} dev: true /nofilter@1.0.4: - resolution: {integrity: sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==} + engines: {node: ">=8"} dev: true /nofilter@3.1.0: - resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} - engines: {node: '>=12.19'} + resolution: + {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} + engines: {node: ">=12.19"} dev: true /nopt@3.0.6: - resolution: {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} + resolution: + {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} hasBin: true dependencies: abbrev: 1.0.9 dev: true /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + resolution: + {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 resolve: 1.22.6 @@ -6516,104 +7365,122 @@ packages: dev: true /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: ">=0.10.0"} dev: true /normalize-url@6.1.0: - resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: ">=10"} dev: true /npm-run-path@5.1.0: - resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + resolution: + {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: path-key: 4.0.0 dev: true /nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + resolution: + {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} dependencies: boolbase: 1.0.0 dev: true /number-is-nan@1.0.1: - resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: ">=0.10.0"} dev: true /number-to-bn@1.7.0: - resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} - engines: {node: '>=6.5.0', npm: '>=3'} + resolution: + {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} + engines: {node: ">=6.5.0", npm: ">=3"} dependencies: bn.js: 4.11.6 strip-hex-prefix: 1.0.0 dev: true /oauth-sign@0.9.0: - resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + resolution: + {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} dev: true /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: ">=0.10.0"} dev: true /object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + resolution: + {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} dev: true /obliterator@2.0.4: - resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + resolution: + {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} dev: true /oboe@2.1.5: - resolution: {integrity: sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==} + resolution: + {integrity: sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==} dependencies: http-https: 1.0.0 dev: true /omggif@1.0.10: - resolution: {integrity: sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==} + resolution: + {integrity: sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==} dev: false /on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + resolution: + {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: ">= 0.8"} dependencies: ee-first: 1.1.1 dev: true /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + resolution: + {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 dev: true /onetime@2.0.1: - resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==} + engines: {node: ">=4"} dependencies: mimic-fn: 1.2.0 /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: ">=6"} dependencies: mimic-fn: 2.1.0 dev: true /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + resolution: + {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: ">=12"} dependencies: mimic-fn: 4.0.0 dev: true /optionator@0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} - engines: {node: '>= 0.8.0'} + resolution: + {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: ">= 0.8.0"} dependencies: deep-is: 0.1.4 fast-levenshtein: 2.0.6 @@ -6624,10 +7491,11 @@ packages: dev: true /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} + resolution: + {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: ">= 0.8.0"} dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 + "@aashutoshrathi/word-wrap": 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 @@ -6636,8 +7504,9 @@ packages: dev: true /ora@3.4.0: - resolution: {integrity: sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==} + engines: {node: ">=6"} dependencies: chalk: 2.4.2 cli-cursor: 2.1.0 @@ -6647,192 +7516,225 @@ packages: wcwidth: 1.0.1 /ordinal@1.0.3: - resolution: {integrity: sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==} + resolution: + {integrity: sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==} dev: true /os-locale@1.4.0: - resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==} + engines: {node: ">=0.10.0"} dependencies: lcid: 1.0.0 dev: true /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: ">=0.10.0"} dev: true /p-cancelable@2.1.1: - resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: ">=8"} dev: true /p-cancelable@3.0.0: - resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} - engines: {node: '>=12.20'} + resolution: + {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: ">=12.20"} dev: true /p-limit@1.3.0: - resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: ">=4"} dependencies: p-try: 1.0.0 dev: true /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: ">=6"} dependencies: p-try: 2.2.0 dev: true /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: ">=10"} dependencies: yocto-queue: 0.1.0 dev: true /p-locate@2.0.0: - resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: ">=4"} dependencies: p-limit: 1.3.0 dev: true /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: ">=8"} dependencies: p-limit: 2.3.0 dev: true /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: ">=10"} dependencies: p-limit: 3.1.0 dev: true /p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: ">=10"} dependencies: aggregate-error: 3.1.0 dev: true /p-try@1.0.0: - resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: ">=4"} dev: true /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: ">=6"} dev: true /param-case@2.1.1: - resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} + resolution: + {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} dependencies: no-case: 2.3.2 dev: true /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: ">=6"} dependencies: callsites: 3.1.0 dev: true /parse-cache-control@1.0.1: - resolution: {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==} + resolution: + {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==} dev: true /parse-headers@2.0.5: - resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==} + resolution: + {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==} dev: true /parse-json@2.2.0: - resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} + engines: {node: ">=0.10.0"} dependencies: error-ex: 1.3.2 dev: true /parse5-htmlparser2-tree-adapter@7.0.0: - resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + resolution: + {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} dependencies: domhandler: 5.0.3 parse5: 7.1.2 dev: true /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + resolution: + {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} dependencies: entities: 4.5.0 dev: true /parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} + resolution: + {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: ">= 0.8"} dev: true /pascal-case@2.0.1: - resolution: {integrity: sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==} + resolution: + {integrity: sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==} dependencies: camel-case: 3.0.0 upper-case-first: 1.1.2 dev: true /path-case@2.1.1: - resolution: {integrity: sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==} + resolution: + {integrity: sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==} dependencies: no-case: 2.3.2 dev: true /path-exists@2.1.0: - resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} + engines: {node: ">=0.10.0"} dependencies: pinkie-promise: 2.0.1 dev: true /path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: ">=4"} dev: true /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: ">=8"} dev: true /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: ">=0.10.0"} dev: true /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: ">=8"} dev: true /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} + resolution: + {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: ">=12"} dev: true /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + resolution: + {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true /path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + resolution: + {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} dev: true /path-type@1.1.0: - resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} + engines: {node: ">=0.10.0"} dependencies: graceful-fs: 4.2.11 pify: 2.3.0 @@ -6840,17 +7742,20 @@ packages: dev: true /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: ">=8"} dev: true /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + resolution: + {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} dev: true /pbkdf2@3.1.2: - resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} - engines: {node: '>=0.12'} + resolution: + {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + engines: {node: ">=0.12"} dependencies: create-hash: 1.2.0 create-hmac: 1.1.7 @@ -6859,185 +7764,216 @@ packages: sha.js: 2.4.11 /performance-now@2.1.0: - resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + resolution: + {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} dev: true /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + resolution: + {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + resolution: + {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: ">=8.6"} dev: true /pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} - engines: {node: '>=0.10'} + resolution: + {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: ">=0.10"} hasBin: true dev: true /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: ">=0.10.0"} dev: true /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: ">=6"} dev: true /pinkie-promise@2.0.1: - resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: ">=0.10.0"} dependencies: pinkie: 2.0.4 dev: true /pinkie@2.0.4: - resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: ">=0.10.0"} dev: true /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} + resolution: + {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: ">= 6"} dev: true /pngjs@6.0.0: - resolution: {integrity: sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==} - engines: {node: '>=12.13.0'} + resolution: + {integrity: sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==} + engines: {node: ">=12.13.0"} dev: false /prelude-ls@1.1.2: - resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} - engines: {node: '>= 0.8.0'} + resolution: + {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: ">= 0.8.0"} dev: true /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} + resolution: + {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: ">= 0.8.0"} dev: true /prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} + resolution: + {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: ">=6.0.0"} dependencies: fast-diff: 1.3.0 dev: true /prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} + resolution: + {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: ">=10.13.0"} hasBin: true dev: true /pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + resolution: + {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/schemas': 29.6.3 + "@jest/schemas": 29.6.3 ansi-styles: 5.2.0 react-is: 18.2.0 dev: true /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + resolution: + {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: true /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} + resolution: + {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: ">= 0.6.0"} dev: true /promise@8.3.0: - resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} + resolution: + {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} dependencies: asap: 2.0.6 dev: true /protobufjs@6.11.4: - resolution: {integrity: sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==} + resolution: + {integrity: sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==} hasBin: true requiresBuild: true 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.2 - '@types/node': 20.8.0 + "@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.2 + "@types/node": 20.8.0 long: 4.0.0 /proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} + resolution: + {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: ">= 0.10"} dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 dev: true /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + resolution: + {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} dev: true /psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + resolution: + {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} dev: true /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + resolution: + {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} dependencies: end-of-stream: 1.4.4 once: 1.4.0 dev: true /punycode@2.1.0: - resolution: {integrity: sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==} + engines: {node: ">=6"} dev: true /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: ">=6"} dev: true /pure-rand@5.0.5: - resolution: {integrity: sha512-BwQpbqxSCBJVpamI6ydzcKqyFmnd5msMWUGvzXLm1aXvusbbgkbOto/EUPM00hjveJEaJtdbhUjKSzWRhQVkaw==} + resolution: + {integrity: sha512-BwQpbqxSCBJVpamI6ydzcKqyFmnd5msMWUGvzXLm1aXvusbbgkbOto/EUPM00hjveJEaJtdbhUjKSzWRhQVkaw==} dev: true /pure-rand@6.0.4: - resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} + resolution: + {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} dev: true /qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} + resolution: + {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: ">=0.6"} dependencies: side-channel: 1.0.4 dev: true /qs@6.11.2: - resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} - engines: {node: '>=0.6'} + resolution: + {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: ">=0.6"} dependencies: side-channel: 1.0.4 dev: true /qs@6.5.3: - resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} - engines: {node: '>=0.6'} + resolution: + {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: ">=0.6"} dev: true /query-string@5.1.1: - resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==} + engines: {node: ">=0.10.0"} dependencies: decode-uri-component: 0.2.2 object-assign: 4.1.1 @@ -7045,31 +7981,37 @@ packages: dev: true /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + resolution: + {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true /quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: ">=10"} dev: true /rambda@7.5.0: - resolution: {integrity: sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==} + resolution: + {integrity: sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==} dev: true /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + resolution: + {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: safe-buffer: 5.2.1 /range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} + resolution: + {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: ">= 0.6"} dev: true /raw-body@2.5.1: - resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} - engines: {node: '>= 0.8'} + resolution: + {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: ">= 0.8"} dependencies: bytes: 3.1.2 http-errors: 2.0.0 @@ -7078,8 +8020,9 @@ packages: dev: true /raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} + resolution: + {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: ">= 0.8"} dependencies: bytes: 3.1.2 http-errors: 2.0.0 @@ -7088,20 +8031,23 @@ packages: dev: true /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + resolution: + {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} dev: true /read-pkg-up@1.0.1: - resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} + engines: {node: ">=0.10.0"} dependencies: find-up: 1.1.2 read-pkg: 1.1.0 dev: true /read-pkg@1.1.0: - resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} + engines: {node: ">=0.10.0"} dependencies: load-json-file: 1.1.0 normalize-package-data: 2.5.0 @@ -7109,7 +8055,8 @@ packages: dev: true /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + resolution: + {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -7121,60 +8068,69 @@ packages: dev: true /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + resolution: + {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: ">= 6"} dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + resolution: + {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: ">=8.10.0"} dependencies: picomatch: 2.3.1 dev: true /rechoir@0.6.2: - resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} - engines: {node: '>= 0.10'} + resolution: + {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: ">= 0.10"} dependencies: resolve: 1.22.6 dev: true /recursive-readdir@2.2.3: - resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} - engines: {node: '>=6.0.0'} + resolution: + {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} + engines: {node: ">=6.0.0"} dependencies: minimatch: 3.1.2 dev: true /reduce-flatten@2.0.0: - resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} + engines: {node: ">=6"} dev: true /regenerator-runtime@0.14.0: - resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + resolution: + {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} dev: true /req-cwd@2.0.0: - resolution: {integrity: sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==} + engines: {node: ">=4"} dependencies: req-from: 2.0.0 dev: true /req-from@2.0.0: - resolution: {integrity: sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==} + engines: {node: ">=4"} dependencies: resolve-from: 3.0.0 dev: true /request@2.88.2: - resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} - engines: {node: '>= 6'} + resolution: + {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: ">= 6"} deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 dependencies: aws-sign2: 0.7.0 @@ -7200,59 +8156,71 @@ packages: dev: true /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: ">=0.10.0"} /require-from-string@1.2.1: - resolution: {integrity: sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==} + engines: {node: ">=0.10.0"} dev: true /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: ">=0.10.0"} dev: true /require-main-filename@1.0.1: - resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==} + resolution: + {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==} dev: true /resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + resolution: + {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} dev: true /resolve-from@3.0.0: - resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} + engines: {node: ">=4"} dev: true /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: ">=4"} dev: true /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: ">=8"} dev: true /resolve.exports@2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: ">=10"} dev: true /resolve@1.1.7: - resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} + resolution: + {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} dev: true /resolve@1.17.0: - resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} + resolution: + {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} dependencies: path-parse: 1.0.7 dev: true /resolve@1.22.6: - resolution: {integrity: sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==} + resolution: + {integrity: sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==} hasBin: true dependencies: is-core-module: 2.13.0 @@ -7261,20 +8229,23 @@ packages: dev: true /responselike@2.0.1: - resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + resolution: + {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} dependencies: lowercase-keys: 2.0.0 dev: true /restore-cursor@2.0.0: - resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} + engines: {node: ">=4"} dependencies: onetime: 2.0.1 signal-exit: 3.0.7 /restore-cursor@4.0.0: - resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + resolution: + {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: onetime: 5.1.2 @@ -7282,79 +8253,94 @@ packages: dev: true /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + resolution: + {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: ">=1.0.0", node: ">=0.10.0"} dev: true /rfdc@1.3.0: - resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} + resolution: + {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} dev: true /rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + resolution: + {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} hasBin: true dependencies: glob: 7.2.0 dev: true /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + resolution: + {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true dependencies: glob: 7.2.3 dev: true /ripemd160-min@0.0.6: - resolution: {integrity: sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A==} + engines: {node: ">=8"} dev: true /ripemd160@2.0.2: - resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + resolution: + {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} dependencies: hash-base: 3.1.0 inherits: 2.0.4 /rlp@2.2.7: - resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} + resolution: + {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} hasBin: true dependencies: bn.js: 5.2.1 dev: true /run-parallel-limit@1.1.0: - resolution: {integrity: sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==} + resolution: + {integrity: sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==} dependencies: queue-microtask: 1.2.3 dev: true /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + resolution: + {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 dev: true /rustbn.js@0.2.0: - resolution: {integrity: sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==} + resolution: + {integrity: sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==} dev: true /s-expression@3.1.1: - resolution: {integrity: sha512-VMsW7sIvixXfIDmDll7XCePMYYY52UlUtA7OlFQUovqj3XtQ2UkZkjjAvnSFW8o+SbswzUEeCBMmpAx9LS3qrg==} + resolution: + {integrity: sha512-VMsW7sIvixXfIDmDll7XCePMYYY52UlUtA7OlFQUovqj3XtQ2UkZkjjAvnSFW8o+SbswzUEeCBMmpAx9LS3qrg==} dev: true /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + resolution: + {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} dev: true /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + resolution: + {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + resolution: + {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: true /sc-istanbul@0.4.6: - resolution: {integrity: sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==} + resolution: + {integrity: sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==} hasBin: true dependencies: abbrev: 1.0.9 @@ -7374,18 +8360,22 @@ packages: dev: true /scrypt-js@2.0.4: - resolution: {integrity: sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==} + resolution: + {integrity: sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==} dev: true /scrypt-js@3.0.1: - resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + resolution: + {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} /scryptsy@2.1.0: - resolution: {integrity: sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==} + resolution: + {integrity: sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==} /secp256k1@3.8.0: - resolution: {integrity: sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw==} - engines: {node: '>=4.0.0'} + resolution: + {integrity: sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw==} + engines: {node: ">=4.0.0"} requiresBuild: true dependencies: bindings: 1.5.0 @@ -7398,8 +8388,9 @@ packages: safe-buffer: 5.2.1 /secp256k1@4.0.3: - resolution: {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==} - engines: {node: '>=10.0.0'} + resolution: + {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==} + engines: {node: ">=10.0.0"} requiresBuild: true dependencies: elliptic: 6.5.4 @@ -7408,26 +8399,30 @@ packages: dev: true /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + resolution: + {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true dev: true /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + resolution: + {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true dev: true /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: ">=10"} hasBin: true dependencies: lru-cache: 6.0.0 dev: true /send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} + resolution: + {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: ">= 0.8.0"} dependencies: debug: 2.6.9 depd: 2.0.0 @@ -7447,21 +8442,24 @@ packages: dev: true /sentence-case@2.1.1: - resolution: {integrity: sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==} + resolution: + {integrity: sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==} dependencies: no-case: 2.3.2 upper-case-first: 1.1.2 dev: true /serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + resolution: + {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} dependencies: randombytes: 2.1.0 dev: true /serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} + resolution: + {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: ">= 0.8.0"} dependencies: encodeurl: 1.0.2 escape-html: 1.0.3 @@ -7472,8 +8470,9 @@ packages: dev: true /servify@0.1.12: - resolution: {integrity: sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==} + engines: {node: ">=6"} dependencies: body-parser: 1.20.2 cors: 2.8.5 @@ -7485,62 +8484,73 @@ packages: dev: true /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + resolution: + {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true /setimmediate@1.0.4: - resolution: {integrity: sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==} + resolution: + {integrity: sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==} dev: true /setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + resolution: + {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} /setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + resolution: + {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} dev: true /seventh@0.8.3: - resolution: {integrity: sha512-iMKkXvJdFwp7Rq/mfoi9ExRER0tJ5wjM/lh/9s4zESYoujrgh1ouRwhCWDfZryerhq1U+nXrhDeT4DhbunF0CA==} - engines: {node: '>=16.13.0'} + resolution: + {integrity: sha512-iMKkXvJdFwp7Rq/mfoi9ExRER0tJ5wjM/lh/9s4zESYoujrgh1ouRwhCWDfZryerhq1U+nXrhDeT4DhbunF0CA==} + engines: {node: ">=16.13.0"} dependencies: setimmediate: 1.0.5 dev: false /sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + resolution: + {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} hasBin: true dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 /sha1@1.1.1: - resolution: {integrity: sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==} + resolution: + {integrity: sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==} dependencies: charenc: 0.0.2 crypt: 0.0.2 dev: true /sha3@2.1.4: - resolution: {integrity: sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==} + resolution: + {integrity: sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==} dependencies: buffer: 6.0.3 dev: true /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: ">=8"} dependencies: shebang-regex: 3.0.0 dev: true /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: ">=8"} dev: true /shelljs@0.8.5: - resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: ">=4"} hasBin: true dependencies: glob: 7.2.3 @@ -7549,7 +8559,8 @@ packages: dev: true /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + resolution: + {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 @@ -7557,14 +8568,17 @@ packages: dev: true /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + resolution: + {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} /simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + resolution: + {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} dev: true /simple-get@2.8.2: - resolution: {integrity: sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==} + resolution: + {integrity: sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==} dependencies: decompress-response: 3.3.0 once: 1.4.0 @@ -7572,13 +8586,15 @@ packages: dev: true /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: ">=8"} dev: true /slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: ">=10"} dependencies: ansi-styles: 4.3.0 astral-regex: 2.0.0 @@ -7586,33 +8602,38 @@ packages: dev: true /slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} + resolution: + {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: ">=12"} dependencies: ansi-styles: 6.2.1 is-fullwidth-code-point: 4.0.0 dev: true /snake-case@2.1.0: - resolution: {integrity: sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==} + resolution: + {integrity: sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==} dependencies: no-case: 2.3.2 dev: true /sodium-native@3.3.0: - resolution: {integrity: sha512-rg6lCDM/qa3p07YGqaVD+ciAbUqm6SoO4xmlcfkbU5r1zIGrguXztLiEtaLYTV5U6k8KSIUFmnU3yQUSKmf6DA==} + resolution: + {integrity: sha512-rg6lCDM/qa3p07YGqaVD+ciAbUqm6SoO4xmlcfkbU5r1zIGrguXztLiEtaLYTV5U6k8KSIUFmnU3yQUSKmf6DA==} requiresBuild: true dependencies: node-gyp-build: 4.6.1 /sodium-randbytes@0.14.0: - resolution: {integrity: sha512-X5HXTHiorRs8Jte7+SEwxnX0ZPmDdU3TxYIIOoTklEgdiFELtQ1CwwyBBePPZlN0T+XDNBlNaikPRarfT0cK/A==} + resolution: + {integrity: sha512-X5HXTHiorRs8Jte7+SEwxnX0ZPmDdU3TxYIIOoTklEgdiFELtQ1CwwyBBePPZlN0T+XDNBlNaikPRarfT0cK/A==} dependencies: - '@types/sodium-native': 2.3.5 + "@types/sodium-native": 2.3.5 sodium-native: 3.3.0 /solc@0.4.26: - resolution: {integrity: sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==} + resolution: + {integrity: sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==} hasBin: true dependencies: fs-extra: 0.30.0 @@ -7623,8 +8644,9 @@ packages: dev: true /solc@0.7.3(debug@4.3.4): - resolution: {integrity: sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==} + engines: {node: ">=8.0.0"} hasBin: true dependencies: command-exists: 1.2.9 @@ -7641,13 +8663,14 @@ packages: dev: true /solidity-coverage@0.8.5(hardhat@2.17.4): - resolution: {integrity: sha512-6C6N6OV2O8FQA0FWA95FdzVH+L16HU94iFgg5wAFZ29UpLFkgNI/DRR2HotG1bC0F4gAc/OMs2BJI44Q/DYlKQ==} + resolution: + {integrity: sha512-6C6N6OV2O8FQA0FWA95FdzVH+L16HU94iFgg5wAFZ29UpLFkgNI/DRR2HotG1bC0F4gAc/OMs2BJI44Q/DYlKQ==} hasBin: true peerDependencies: hardhat: ^2.11.0 dependencies: - '@ethersproject/abi': 5.7.0 - '@solidity-parser/parser': 0.16.1 + "@ethersproject/abi": 5.7.0 + "@solidity-parser/parser": 0.16.1 chalk: 2.4.2 death: 1.1.0 detect-port: 1.5.1 @@ -7672,21 +8695,24 @@ packages: dev: true /sort-any@2.0.0: - resolution: {integrity: sha512-T9JoiDewQEmWcnmPn/s9h/PH9t3d/LSWi0RgVmXSuDYeZXTZOZ1/wrK2PHaptuR1VXe3clLLt0pD6sgVOwjNEA==} + resolution: + {integrity: sha512-T9JoiDewQEmWcnmPn/s9h/PH9t3d/LSWi0RgVmXSuDYeZXTZOZ1/wrK2PHaptuR1VXe3clLLt0pD6sgVOwjNEA==} dependencies: lodash: 4.17.21 dev: false /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + resolution: + {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 dev: true /source-map@0.2.0: - resolution: {integrity: sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==} - engines: {node: '>=0.8.0'} + resolution: + {integrity: sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==} + engines: {node: ">=0.8.0"} requiresBuild: true dependencies: amdefine: 1.0.1 @@ -7694,39 +8720,46 @@ packages: optional: true /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: ">=0.10.0"} dev: true /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + resolution: + {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.15 dev: true /spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + resolution: + {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} dev: true /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + resolution: + {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.3.0 spdx-license-ids: 3.0.15 dev: true /spdx-license-ids@3.0.15: - resolution: {integrity: sha512-lpT8hSQp9jAKp9mhtBU4Xjon8LPGBvLIuBiSVhMEtmLecTh2mO0tlqrAMp47tBXzMr13NJMQ2lf7RpQGLJ3HsQ==} + resolution: + {integrity: sha512-lpT8hSQp9jAKp9mhtBU4Xjon8LPGBvLIuBiSVhMEtmLecTh2mO0tlqrAMp47tBXzMr13NJMQ2lf7RpQGLJ3HsQ==} dev: true /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + resolution: + {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: true /sshpk@1.17.0: - resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==} + engines: {node: ">=0.10.0"} hasBin: true dependencies: asn1: 0.2.6 @@ -7741,46 +8774,54 @@ packages: dev: true /stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: ">=10"} dependencies: escape-string-regexp: 2.0.0 dev: true /stacktrace-parser@0.1.10: - resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} + engines: {node: ">=6"} dependencies: type-fest: 0.7.1 dev: true /statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} + resolution: + {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: ">= 0.8"} dev: true /strict-uri-encode@1.1.0: - resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} + engines: {node: ">=0.10.0"} dev: true /string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} + resolution: + {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: ">=0.6.19"} dev: true /string-format@2.0.0: - resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} + resolution: + {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} dev: true /string-kit@0.17.10: - resolution: {integrity: sha512-n3/2BeEJrlzztoxeBTt9DVh0dfHordBuZoFsSJs59tk1JoPVvtvNsvAgqu0Nlpj5Y/qoQbnT8jCnfuoHcsfGnw==} - engines: {node: '>=14.15.0'} + resolution: + {integrity: sha512-n3/2BeEJrlzztoxeBTt9DVh0dfHordBuZoFsSJs59tk1JoPVvtvNsvAgqu0Nlpj5Y/qoQbnT8jCnfuoHcsfGnw==} + engines: {node: ">=14.15.0"} dev: false /string-width@1.0.2: - resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} + engines: {node: ">=0.10.0"} dependencies: code-point-at: 1.1.0 is-fullwidth-code-point: 1.0.0 @@ -7788,24 +8829,27 @@ packages: dev: true /string-width@2.1.1: - resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} + engines: {node: ">=4"} dependencies: is-fullwidth-code-point: 2.0.0 strip-ansi: 4.0.0 dev: true /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: ">=8"} dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + resolution: + {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: ">=12"} dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 @@ -7813,124 +8857,144 @@ packages: dev: true /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + resolution: + {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: safe-buffer: 5.1.2 dev: true /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + resolution: + {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 /strip-ansi@3.0.1: - resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: ">=0.10.0"} dependencies: ansi-regex: 2.1.1 dev: true /strip-ansi@4.0.0: - resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} + engines: {node: ">=4"} dependencies: ansi-regex: 3.0.1 dev: true /strip-ansi@5.2.0: - resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: ">=6"} dependencies: ansi-regex: 4.1.1 /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: ">=8"} dependencies: ansi-regex: 5.0.1 /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + resolution: + {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: ">=12"} dependencies: ansi-regex: 6.0.1 dev: true /strip-bom@2.0.0: - resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} + engines: {node: ">=0.10.0"} dependencies: is-utf8: 0.2.1 dev: true /strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: ">=8"} dev: true /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} + resolution: + {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: ">=12"} dev: true /strip-hex-prefix@1.0.0: - resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} - engines: {node: '>=6.5.0', npm: '>=3'} + resolution: + {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} + engines: {node: ">=6.5.0", npm: ">=3"} dependencies: is-hex-prefixed: 1.0.0 dev: true /strip-indent@2.0.0: - resolution: {integrity: sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==} + engines: {node: ">=4"} dev: true /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: ">=8"} dev: true /supports-color@3.2.3: - resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} - engines: {node: '>=0.8.0'} + resolution: + {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} + engines: {node: ">=0.8.0"} dependencies: has-flag: 1.0.0 dev: true /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: ">=4"} dependencies: has-flag: 3.0.0 /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: ">=8"} dependencies: has-flag: 4.0.0 dev: true /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: ">=10"} dependencies: has-flag: 4.0.0 dev: true /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + resolution: + {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: ">= 0.4"} dev: true /swap-case@1.1.2: - resolution: {integrity: sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==} + resolution: + {integrity: sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==} dependencies: lower-case: 1.1.4 upper-case: 1.1.3 dev: true /swarm-js@0.1.42: - resolution: {integrity: sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==} + resolution: + {integrity: sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==} dependencies: bluebird: 3.7.2 buffer: 5.7.1 @@ -7950,8 +9014,9 @@ packages: dev: true /sync-request@6.1.0: - resolution: {integrity: sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==} + engines: {node: ">=8.0.0"} dependencies: http-response-object: 3.0.2 sync-rpc: 1.3.6 @@ -7959,14 +9024,16 @@ packages: dev: true /sync-rpc@1.3.6: - resolution: {integrity: sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==} + resolution: + {integrity: sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==} dependencies: get-port: 3.2.0 dev: true /table-layout@1.0.2: - resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} + engines: {node: ">=8.0.0"} dependencies: array-back: 4.0.2 deep-extend: 0.6.0 @@ -7975,8 +9042,9 @@ packages: dev: true /table@6.8.1: - resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} - engines: {node: '>=10.0.0'} + resolution: + {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} + engines: {node: ">=10.0.0"} dependencies: ajv: 8.12.0 lodash.truncate: 4.4.2 @@ -7986,8 +9054,9 @@ packages: dev: true /tar@4.4.19: - resolution: {integrity: sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==} - engines: {node: '>=4.5'} + resolution: + {integrity: sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==} + engines: {node: ">=4.5"} dependencies: chownr: 1.1.4 fs-minipass: 1.2.7 @@ -7999,10 +9068,11 @@ packages: dev: true /terminal-kit@3.0.0: - resolution: {integrity: sha512-GSJGYF0+hoFylKJXmq0ntE42b4S7zUkxFpf7FqHGwKFPCNeGkuv3jV0tmGquZkmfh5mYb/B2xoPJiP40mJsQrg==} - engines: {node: '>=16.13.0'} + resolution: + {integrity: sha512-GSJGYF0+hoFylKJXmq0ntE42b4S7zUkxFpf7FqHGwKFPCNeGkuv3jV0tmGquZkmfh5mYb/B2xoPJiP40mJsQrg==} + engines: {node: ">=16.13.0"} dependencies: - '@cronvel/get-pixels': 3.4.1 + "@cronvel/get-pixels": 3.4.1 chroma-js: 2.4.2 lazyness: 1.2.0 ndarray: 1.0.19 @@ -8013,31 +9083,35 @@ packages: dev: false /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: ">=8"} dependencies: - '@istanbuljs/schema': 0.1.3 + "@istanbuljs/schema": 0.1.3 glob: 7.2.3 minimatch: 3.1.2 dev: true /testrpc@0.0.1: - resolution: {integrity: sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==} + resolution: + {integrity: sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==} deprecated: testrpc has been renamed to ganache-cli, please use this package from now on. dev: true /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + resolution: + {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true /then-request@6.0.2: - resolution: {integrity: sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==} - engines: {node: '>=6.0.0'} - dependencies: - '@types/concat-stream': 1.6.1 - '@types/form-data': 0.0.33 - '@types/node': 8.10.66 - '@types/qs': 6.9.8 + resolution: + {integrity: sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==} + engines: {node: ">=6.0.0"} + dependencies: + "@types/concat-stream": 1.6.1 + "@types/form-data": 0.0.33 + "@types/node": 8.10.66 + "@types/qs": 6.9.8 caseless: 0.12.0 concat-stream: 1.6.2 form-data: 2.5.1 @@ -8048,68 +9122,80 @@ packages: dev: true /timed-out@4.0.1: - resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} + engines: {node: ">=0.10.0"} dev: true /timers-ext@0.1.7: - resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} + resolution: + {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} dependencies: es5-ext: 0.10.62 next-tick: 1.1.0 /title-case@2.1.1: - resolution: {integrity: sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==} + resolution: + {integrity: sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==} dependencies: no-case: 2.3.2 upper-case: 1.1.3 dev: true /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + resolution: + {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: ">=0.6.0"} dependencies: os-tmpdir: 1.0.2 dev: true /tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + resolution: + {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} dev: true /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: ">=4"} dev: true /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + resolution: + {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: ">=8.0"} dependencies: is-number: 7.0.0 dev: true /toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} + resolution: + {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: ">=0.6"} dev: true /tough-cookie@2.5.0: - resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} - engines: {node: '>=0.8'} + resolution: + {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: ">=0.8"} dependencies: psl: 1.9.0 punycode: 2.3.0 dev: true /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + resolution: + {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} /tree-kit@0.7.5: - resolution: {integrity: sha512-CmyY7d0OYE5W6UCmvij+SaocG7z+q4roF+Oj7BtU8B+KlpdiRZRMUwNyqfmWYcpYgsOcY1/dfIx/VsLmbAOLGg==} + resolution: + {integrity: sha512-CmyY7d0OYE5W6UCmvij+SaocG7z+q4roF+Oj7BtU8B+KlpdiRZRMUwNyqfmWYcpYgsOcY1/dfIx/VsLmbAOLGg==} dev: false /ts-command-line-args@2.5.1: - resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} + resolution: + {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} hasBin: true dependencies: chalk: 4.1.2 @@ -8119,33 +9205,35 @@ packages: dev: true /ts-essentials@7.0.3(typescript@5.2.2): - resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} + resolution: + {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} peerDependencies: - typescript: '>=3.7.0' + typescript: ">=3.7.0" dependencies: typescript: 5.2.2 dev: true /ts-node@10.9.1(@types/node@20.8.0)(typescript@5.2.2): - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + resolution: + {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" peerDependenciesMeta: - '@swc/core': + "@swc/core": optional: true - '@swc/wasm': + "@swc/wasm": optional: true dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 20.8.0 + "@cspotcode/source-map-support": 0.8.1 + "@tsconfig/node10": 1.0.9 + "@tsconfig/node12": 1.0.11 + "@tsconfig/node14": 1.0.3 + "@tsconfig/node16": 1.0.4 + "@types/node": 20.8.0 acorn: 8.10.0 acorn-walk: 8.2.0 arg: 4.1.3 @@ -8158,94 +9246,112 @@ packages: dev: true /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + resolution: + {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true /tslib@2.3.1: - resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} + resolution: + {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} /tsort@0.0.1: - resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} + resolution: + {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} dev: true /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + resolution: + {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} dependencies: safe-buffer: 5.2.1 dev: true /tweetnacl-util@0.15.1: - resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} + resolution: + {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} dev: true /tweetnacl@0.14.5: - resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + resolution: + {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} dev: true /tweetnacl@1.0.3: - resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + resolution: + {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} dev: true /type-check@0.3.2: - resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} - engines: {node: '>= 0.8.0'} + resolution: + {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: ">= 0.8.0"} dependencies: prelude-ls: 1.1.2 dev: true /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + resolution: + {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: ">= 0.8.0"} dependencies: prelude-ls: 1.2.1 dev: true /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} + resolution: + {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: ">=4"} dev: true /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: ">=10"} dev: true /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: ">=10"} dev: true /type-fest@0.7.1: - resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: ">=8"} dev: true /type-fest@1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: ">=10"} dev: true /type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} + resolution: + {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: ">= 0.6"} dependencies: media-typer: 0.3.0 mime-types: 2.1.35 dev: true /type@1.2.0: - resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + resolution: + {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} /type@2.7.2: - resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + resolution: + {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} /typechain@8.3.1(typescript@5.2.2): - resolution: {integrity: sha512-fA7clol2IP/56yq6vkMTR+4URF1nGjV82Wx6Rf09EsqD4tkzMAvEaqYxVFCavJm/1xaRga/oD55K+4FtuXwQOQ==} + resolution: + {integrity: sha512-fA7clol2IP/56yq6vkMTR+4URF1nGjV82Wx6Rf09EsqD4tkzMAvEaqYxVFCavJm/1xaRga/oD55K+4FtuXwQOQ==} hasBin: true peerDependencies: - typescript: '>=4.3.0' + typescript: ">=4.3.0" dependencies: - '@types/prettier': 2.7.3 + "@types/prettier": 2.7.3 debug: 4.3.4(supports-color@8.1.1) fs-extra: 7.0.1 glob: 7.1.7 @@ -8261,77 +9367,91 @@ packages: dev: true /typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + resolution: + {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} dependencies: is-typedarray: 1.0.0 /typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + resolution: + {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} dev: true /typescript@5.2.2: - resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} - engines: {node: '>=14.17'} + resolution: + {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: ">=14.17"} hasBin: true dev: true /typical@4.0.0: - resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} + engines: {node: ">=8"} dev: true /typical@5.2.0: - resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} - engines: {node: '>=8'} + resolution: + {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} + engines: {node: ">=8"} dev: true /uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} - engines: {node: '>=0.8.0'} + resolution: + {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: ">=0.8.0"} hasBin: true requiresBuild: true dev: true optional: true /ultron@1.1.1: - resolution: {integrity: sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==} + resolution: + {integrity: sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==} dev: true /undici@5.25.3: - resolution: {integrity: sha512-7lmhlz3K1+IKB6IUjkdzV2l0jKY8/0KguEMdEpzzXCug5pEGIp3DxUg0DEN65DrVoxHiRKpPORC/qzX+UglSkQ==} - engines: {node: '>=14.0'} + resolution: + {integrity: sha512-7lmhlz3K1+IKB6IUjkdzV2l0jKY8/0KguEMdEpzzXCug5pEGIp3DxUg0DEN65DrVoxHiRKpPORC/qzX+UglSkQ==} + engines: {node: ">=14.0"} dependencies: - '@fastify/busboy': 2.0.0 + "@fastify/busboy": 2.0.0 dev: true /uniq@1.0.1: - resolution: {integrity: sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==} + resolution: + {integrity: sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==} dev: false /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} + resolution: + {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: ">= 4.0.0"} dev: true /universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} - engines: {node: '>= 10.0.0'} + resolution: + {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: ">= 10.0.0"} dev: true /unorm@1.6.0: - resolution: {integrity: sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==} - engines: {node: '>= 0.4.0'} + resolution: + {integrity: sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==} + engines: {node: ">= 0.4.0"} /unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} + resolution: + {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: ">= 0.8"} dev: true /update-browserslist-db@1.0.13(browserslist@4.22.1): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + resolution: + {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true peerDependencies: - browserslist: '>= 4.21.0' + browserslist: ">= 4.21.0" dependencies: browserslist: 4.22.1 escalade: 3.1.1 @@ -8339,41 +9459,49 @@ packages: dev: true /upper-case-first@1.1.2: - resolution: {integrity: sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==} + resolution: + {integrity: sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==} dependencies: upper-case: 1.1.3 dev: true /upper-case@1.1.3: - resolution: {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==} + resolution: + {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==} dev: true /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + resolution: + {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.0 dev: true /url-set-query@1.0.0: - resolution: {integrity: sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==} + resolution: + {integrity: sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==} dev: true /utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} + resolution: + {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: ">=6.14.2"} requiresBuild: true dependencies: node-gyp-build: 4.6.1 /utf8@3.0.0: - resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} + resolution: + {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} dev: true /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + resolution: + {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} /util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + resolution: + {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} dependencies: inherits: 2.0.4 is-arguments: 1.1.1 @@ -8383,61 +9511,73 @@ packages: dev: true /utility-types@2.1.0: - resolution: {integrity: sha512-/nP2gqavggo6l38rtQI/CdeV+2fmBGXVvHgj9kV2MAnms3TIi77Mz9BtapPFI0+GZQCqqom0vACQ+VlTTaCovw==} - engines: {node: '>= 4'} + resolution: + {integrity: sha512-/nP2gqavggo6l38rtQI/CdeV+2fmBGXVvHgj9kV2MAnms3TIi77Mz9BtapPFI0+GZQCqqom0vACQ+VlTTaCovw==} + engines: {node: ">= 4"} /utility-types@3.10.0: - resolution: {integrity: sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==} - engines: {node: '>= 4'} + resolution: + {integrity: sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==} + engines: {node: ">= 4"} /utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} + resolution: + {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: ">= 0.4.0"} dev: true /uuid@2.0.1: - resolution: {integrity: sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==} + resolution: + {integrity: sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==} deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. dev: true /uuid@3.4.0: - resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + resolution: + {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. hasBin: true dev: true /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + resolution: + {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true /uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + resolution: + {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true dev: true /v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + resolution: + {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + resolution: + {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 dev: true /varint@5.0.2: - resolution: {integrity: sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==} + resolution: + {integrity: sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==} dev: true /vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} + resolution: + {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: ">= 0.8"} dev: true /verror@1.10.0: - resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} - engines: {'0': node >=0.6.0} + resolution: + {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {"0": node >=0.6.0} dependencies: assert-plus: 1.0.0 core-util-is: 1.0.2 @@ -8445,26 +9585,30 @@ packages: dev: true /walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + resolution: + {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: makeerror: 1.0.12 dev: true /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + resolution: + {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} dependencies: defaults: 1.0.4 /web-streams-polyfill@3.2.1: - resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} - engines: {node: '>= 8'} + resolution: + {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} + engines: {node: ">= 8"} /web3-bzz@1.10.0: - resolution: {integrity: sha512-o9IR59io3pDUsXTsps5pO5hW1D5zBmg46iNc2t4j2DkaYHNdDLwk2IP9ukoM2wg47QILfPEJYzhTfkS/CcX0KA==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-o9IR59io3pDUsXTsps5pO5hW1D5zBmg46iNc2t4j2DkaYHNdDLwk2IP9ukoM2wg47QILfPEJYzhTfkS/CcX0KA==} + engines: {node: ">=8.0.0"} requiresBuild: true dependencies: - '@types/node': 12.20.55 + "@types/node": 12.20.55 got: 12.1.0 swarm-js: 0.1.42 transitivePeerDependencies: @@ -8474,11 +9618,12 @@ packages: dev: true /web3-bzz@1.10.2: - resolution: {integrity: sha512-vLOfDCj6198Qc7esDrCKeFA/M3ZLbowsaHQ0hIL4NmIHoq7lU8aSRTa5AI+JBh8cKN1gVryJsuW2ZCc5bM4I4Q==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-vLOfDCj6198Qc7esDrCKeFA/M3ZLbowsaHQ0hIL4NmIHoq7lU8aSRTa5AI+JBh8cKN1gVryJsuW2ZCc5bM4I4Q==} + engines: {node: ">=8.0.0"} requiresBuild: true dependencies: - '@types/node': 12.20.55 + "@types/node": 12.20.55 got: 12.1.0 swarm-js: 0.1.42 transitivePeerDependencies: @@ -8488,26 +9633,29 @@ packages: dev: true /web3-core-helpers@1.10.0: - resolution: {integrity: sha512-pIxAzFDS5vnbXvfvLSpaA1tfRykAe9adw43YCKsEYQwH0gCLL0kMLkaCX3q+Q8EVmAh+e1jWL/nl9U0de1+++g==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-pIxAzFDS5vnbXvfvLSpaA1tfRykAe9adw43YCKsEYQwH0gCLL0kMLkaCX3q+Q8EVmAh+e1jWL/nl9U0de1+++g==} + engines: {node: ">=8.0.0"} dependencies: web3-eth-iban: 1.10.0 web3-utils: 1.10.0 dev: true /web3-core-helpers@1.10.2: - resolution: {integrity: sha512-1JfaNtox6/ZYJHNoI+QVc2ObgwEPeGF+YdxHZQ7aF5605BmlwM1Bk3A8xv6mg64jIRvEq1xX6k9oG6x7p1WgXQ==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-1JfaNtox6/ZYJHNoI+QVc2ObgwEPeGF+YdxHZQ7aF5605BmlwM1Bk3A8xv6mg64jIRvEq1xX6k9oG6x7p1WgXQ==} + engines: {node: ">=8.0.0"} dependencies: web3-eth-iban: 1.10.2 web3-utils: 1.10.2 dev: true /web3-core-method@1.10.0: - resolution: {integrity: sha512-4R700jTLAMKDMhQ+nsVfIXvH6IGJlJzGisIfMKWAIswH31h5AZz7uDUW2YctI+HrYd+5uOAlS4OJeeT9bIpvkA==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-4R700jTLAMKDMhQ+nsVfIXvH6IGJlJzGisIfMKWAIswH31h5AZz7uDUW2YctI+HrYd+5uOAlS4OJeeT9bIpvkA==} + engines: {node: ">=8.0.0"} dependencies: - '@ethersproject/transactions': 5.7.0 + "@ethersproject/transactions": 5.7.0 web3-core-helpers: 1.10.0 web3-core-promievent: 1.10.0 web3-core-subscriptions: 1.10.0 @@ -8515,10 +9663,11 @@ packages: dev: true /web3-core-method@1.10.2: - resolution: {integrity: sha512-gG6ES+LOuo01MJHML4gnEt702M8lcPGMYZoX8UjZzmEebGrPYOY9XccpCrsFgCeKgQzM12SVnlwwpMod1+lcLg==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-gG6ES+LOuo01MJHML4gnEt702M8lcPGMYZoX8UjZzmEebGrPYOY9XccpCrsFgCeKgQzM12SVnlwwpMod1+lcLg==} + engines: {node: ">=8.0.0"} dependencies: - '@ethersproject/transactions': 5.7.0 + "@ethersproject/transactions": 5.7.0 web3-core-helpers: 1.10.2 web3-core-promievent: 1.10.2 web3-core-subscriptions: 1.10.2 @@ -8526,22 +9675,25 @@ packages: dev: true /web3-core-promievent@1.10.0: - resolution: {integrity: sha512-68N7k5LWL5R38xRaKFrTFT2pm2jBNFaM4GioS00YjAKXRQ3KjmhijOMG3TICz6Aa5+6GDWYelDNx21YAeZ4YTg==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-68N7k5LWL5R38xRaKFrTFT2pm2jBNFaM4GioS00YjAKXRQ3KjmhijOMG3TICz6Aa5+6GDWYelDNx21YAeZ4YTg==} + engines: {node: ">=8.0.0"} dependencies: eventemitter3: 4.0.4 dev: true /web3-core-promievent@1.10.2: - resolution: {integrity: sha512-Qkkb1dCDOU8dZeORkcwJBQRAX+mdsjx8LqFBB+P4W9QgwMqyJ6LXda+y1XgyeEVeKEmY1RCeTq9Y94q1v62Sfw==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-Qkkb1dCDOU8dZeORkcwJBQRAX+mdsjx8LqFBB+P4W9QgwMqyJ6LXda+y1XgyeEVeKEmY1RCeTq9Y94q1v62Sfw==} + engines: {node: ">=8.0.0"} dependencies: eventemitter3: 4.0.4 dev: true /web3-core-requestmanager@1.10.0: - resolution: {integrity: sha512-3z/JKE++Os62APml4dvBM+GAuId4h3L9ckUrj7ebEtS2AR0ixyQPbrBodgL91Sv7j7cQ3Y+hllaluqjguxvSaQ==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-3z/JKE++Os62APml4dvBM+GAuId4h3L9ckUrj7ebEtS2AR0ixyQPbrBodgL91Sv7j7cQ3Y+hllaluqjguxvSaQ==} + engines: {node: ">=8.0.0"} dependencies: util: 0.12.5 web3-core-helpers: 1.10.0 @@ -8554,8 +9706,9 @@ packages: dev: true /web3-core-requestmanager@1.10.2: - resolution: {integrity: sha512-nlLeNJUu6fR+ZbJr2k9Du/nN3VWwB4AJPY4r6nxUODAmykgJq57T21cLP/BEk6mbiFQYGE9TrrPhh4qWxQEtAw==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-nlLeNJUu6fR+ZbJr2k9Du/nN3VWwB4AJPY4r6nxUODAmykgJq57T21cLP/BEk6mbiFQYGE9TrrPhh4qWxQEtAw==} + engines: {node: ">=8.0.0"} dependencies: util: 0.12.5 web3-core-helpers: 1.10.2 @@ -8568,27 +9721,30 @@ packages: dev: true /web3-core-subscriptions@1.10.0: - resolution: {integrity: sha512-HGm1PbDqsxejI075gxBc5OSkwymilRWZufIy9zEpnWKNmfbuv5FfHgW1/chtJP6aP3Uq2vHkvTDl3smQBb8l+g==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-HGm1PbDqsxejI075gxBc5OSkwymilRWZufIy9zEpnWKNmfbuv5FfHgW1/chtJP6aP3Uq2vHkvTDl3smQBb8l+g==} + engines: {node: ">=8.0.0"} dependencies: eventemitter3: 4.0.4 web3-core-helpers: 1.10.0 dev: true /web3-core-subscriptions@1.10.2: - resolution: {integrity: sha512-MiWcKjz4tco793EPPPLc/YOJmYUV3zAfxeQH/UVTfBejMfnNvmfwKa2SBKfPIvKQHz/xI5bV2TF15uvJEucU7w==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-MiWcKjz4tco793EPPPLc/YOJmYUV3zAfxeQH/UVTfBejMfnNvmfwKa2SBKfPIvKQHz/xI5bV2TF15uvJEucU7w==} + engines: {node: ">=8.0.0"} dependencies: eventemitter3: 4.0.4 web3-core-helpers: 1.10.2 dev: true /web3-core@1.10.0: - resolution: {integrity: sha512-fWySwqy2hn3TL89w5TM8wXF1Z2Q6frQTKHWmP0ppRQorEK8NcHJRfeMiv/mQlSKoTS1F6n/nv2uyZsixFycjYQ==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-fWySwqy2hn3TL89w5TM8wXF1Z2Q6frQTKHWmP0ppRQorEK8NcHJRfeMiv/mQlSKoTS1F6n/nv2uyZsixFycjYQ==} + engines: {node: ">=8.0.0"} dependencies: - '@types/bn.js': 5.1.2 - '@types/node': 12.20.55 + "@types/bn.js": 5.1.2 + "@types/node": 12.20.55 bignumber.js: 9.1.2 web3-core-helpers: 1.10.0 web3-core-method: 1.10.0 @@ -8600,11 +9756,12 @@ packages: dev: true /web3-core@1.10.2: - resolution: {integrity: sha512-qTn2UmtE8tvwMRsC5pXVdHxrQ4uZ6jiLgF5DRUVtdi7dPUmX18Dp9uxKfIfhGcA011EAn8P6+X7r3pvi2YRxBw==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-qTn2UmtE8tvwMRsC5pXVdHxrQ4uZ6jiLgF5DRUVtdi7dPUmX18Dp9uxKfIfhGcA011EAn8P6+X7r3pvi2YRxBw==} + engines: {node: ">=8.0.0"} dependencies: - '@types/bn.js': 5.1.2 - '@types/node': 12.20.55 + "@types/bn.js": 5.1.2 + "@types/node": 12.20.55 bignumber.js: 9.1.2 web3-core-helpers: 1.10.2 web3-core-method: 1.10.2 @@ -8616,27 +9773,30 @@ packages: dev: true /web3-eth-abi@1.10.0: - resolution: {integrity: sha512-cwS+qRBWpJ43aI9L3JS88QYPfFcSJJ3XapxOQ4j40v6mk7ATpA8CVK1vGTzpihNlOfMVRBkR95oAj7oL6aiDOg==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-cwS+qRBWpJ43aI9L3JS88QYPfFcSJJ3XapxOQ4j40v6mk7ATpA8CVK1vGTzpihNlOfMVRBkR95oAj7oL6aiDOg==} + engines: {node: ">=8.0.0"} dependencies: - '@ethersproject/abi': 5.7.0 + "@ethersproject/abi": 5.7.0 web3-utils: 1.10.0 dev: true /web3-eth-abi@1.10.2: - resolution: {integrity: sha512-pY4fQUio7W7ZRSLf+vsYkaxJqaT/jHcALZjIxy+uBQaYAJ3t6zpQqMZkJB3Dw7HUODRJ1yI0NPEFGTnkYf/17A==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-pY4fQUio7W7ZRSLf+vsYkaxJqaT/jHcALZjIxy+uBQaYAJ3t6zpQqMZkJB3Dw7HUODRJ1yI0NPEFGTnkYf/17A==} + engines: {node: ">=8.0.0"} dependencies: - '@ethersproject/abi': 5.7.0 + "@ethersproject/abi": 5.7.0 web3-utils: 1.10.2 dev: true /web3-eth-accounts@1.10.0: - resolution: {integrity: sha512-wiq39Uc3mOI8rw24wE2n15hboLE0E9BsQLdlmsL4Zua9diDS6B5abXG0XhFcoNsXIGMWXVZz4TOq3u4EdpXF/Q==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-wiq39Uc3mOI8rw24wE2n15hboLE0E9BsQLdlmsL4Zua9diDS6B5abXG0XhFcoNsXIGMWXVZz4TOq3u4EdpXF/Q==} + engines: {node: ">=8.0.0"} dependencies: - '@ethereumjs/common': 2.5.0 - '@ethereumjs/tx': 3.3.2 + "@ethereumjs/common": 2.5.0 + "@ethereumjs/tx": 3.3.2 eth-lib: 0.2.8 ethereumjs-util: 7.1.5 scrypt-js: 3.0.1 @@ -8651,12 +9811,13 @@ packages: dev: true /web3-eth-accounts@1.10.2: - resolution: {integrity: sha512-6/HhCBYAXN/f553/SyxS9gY62NbLgpD1zJpENcvRTDpJN3Znvli1cmpl5Q3ZIUJkvHnG//48EWfWh0cbb3fbKQ==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-6/HhCBYAXN/f553/SyxS9gY62NbLgpD1zJpENcvRTDpJN3Znvli1cmpl5Q3ZIUJkvHnG//48EWfWh0cbb3fbKQ==} + engines: {node: ">=8.0.0"} dependencies: - '@ethereumjs/common': 2.5.0 - '@ethereumjs/tx': 3.3.2 - '@ethereumjs/util': 8.1.0 + "@ethereumjs/common": 2.5.0 + "@ethereumjs/tx": 3.3.2 + "@ethereumjs/util": 8.1.0 eth-lib: 0.2.8 scrypt-js: 3.0.1 uuid: 9.0.1 @@ -8670,10 +9831,11 @@ packages: dev: true /web3-eth-contract@1.10.0: - resolution: {integrity: sha512-MIC5FOzP/+2evDksQQ/dpcXhSqa/2hFNytdl/x61IeWxhh6vlFeSjq0YVTAyIzdjwnL7nEmZpjfI6y6/Ufhy7w==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-MIC5FOzP/+2evDksQQ/dpcXhSqa/2hFNytdl/x61IeWxhh6vlFeSjq0YVTAyIzdjwnL7nEmZpjfI6y6/Ufhy7w==} + engines: {node: ">=8.0.0"} dependencies: - '@types/bn.js': 5.1.2 + "@types/bn.js": 5.1.2 web3-core: 1.10.0 web3-core-helpers: 1.10.0 web3-core-method: 1.10.0 @@ -8687,10 +9849,11 @@ packages: dev: true /web3-eth-contract@1.10.2: - resolution: {integrity: sha512-CZLKPQRmupP/+OZ5A/CBwWWkBiz5B/foOpARz0upMh1yjb0dEud4YzRW2gJaeNu0eGxDLsWVaXhUimJVGYprQw==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-CZLKPQRmupP/+OZ5A/CBwWWkBiz5B/foOpARz0upMh1yjb0dEud4YzRW2gJaeNu0eGxDLsWVaXhUimJVGYprQw==} + engines: {node: ">=8.0.0"} dependencies: - '@types/bn.js': 5.1.2 + "@types/bn.js": 5.1.2 web3-core: 1.10.2 web3-core-helpers: 1.10.2 web3-core-method: 1.10.2 @@ -8704,8 +9867,9 @@ packages: dev: true /web3-eth-ens@1.10.0: - resolution: {integrity: sha512-3hpGgzX3qjgxNAmqdrC2YUQMTfnZbs4GeLEmy8aCWziVwogbuqQZ+Gzdfrym45eOZodk+lmXyLuAdqkNlvkc1g==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-3hpGgzX3qjgxNAmqdrC2YUQMTfnZbs4GeLEmy8aCWziVwogbuqQZ+Gzdfrym45eOZodk+lmXyLuAdqkNlvkc1g==} + engines: {node: ">=8.0.0"} dependencies: content-hash: 2.5.2 eth-ens-namehash: 2.0.8 @@ -8721,8 +9885,9 @@ packages: dev: true /web3-eth-ens@1.10.2: - resolution: {integrity: sha512-kTQ42UdNHy4BQJHgWe97bHNMkc3zCMBKKY7t636XOMxdI/lkRdIjdE5nQzt97VjQvSVasgIWYKRAtd8aRaiZiQ==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-kTQ42UdNHy4BQJHgWe97bHNMkc3zCMBKKY7t636XOMxdI/lkRdIjdE5nQzt97VjQvSVasgIWYKRAtd8aRaiZiQ==} + engines: {node: ">=8.0.0"} dependencies: content-hash: 2.5.2 eth-ens-namehash: 2.0.8 @@ -8738,26 +9903,29 @@ packages: dev: true /web3-eth-iban@1.10.0: - resolution: {integrity: sha512-0l+SP3IGhInw7Q20LY3IVafYEuufo4Dn75jAHT7c2aDJsIolvf2Lc6ugHkBajlwUneGfbRQs/ccYPQ9JeMUbrg==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-0l+SP3IGhInw7Q20LY3IVafYEuufo4Dn75jAHT7c2aDJsIolvf2Lc6ugHkBajlwUneGfbRQs/ccYPQ9JeMUbrg==} + engines: {node: ">=8.0.0"} dependencies: bn.js: 5.2.1 web3-utils: 1.10.0 dev: true /web3-eth-iban@1.10.2: - resolution: {integrity: sha512-y8+Ii2XXdyHQMFNL2NWpBnXe+TVJ4ryvPlzNhObRRnIo4O4nLIXS010olLDMayozDzoUlmzCmBZJYc9Eev1g7A==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-y8+Ii2XXdyHQMFNL2NWpBnXe+TVJ4ryvPlzNhObRRnIo4O4nLIXS010olLDMayozDzoUlmzCmBZJYc9Eev1g7A==} + engines: {node: ">=8.0.0"} dependencies: bn.js: 5.2.1 web3-utils: 1.10.2 dev: true /web3-eth-personal@1.10.0: - resolution: {integrity: sha512-anseKn98w/d703eWq52uNuZi7GhQeVjTC5/svrBWEKob0WZ5kPdo+EZoFN0sp5a5ubbrk/E0xSl1/M5yORMtpg==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-anseKn98w/d703eWq52uNuZi7GhQeVjTC5/svrBWEKob0WZ5kPdo+EZoFN0sp5a5ubbrk/E0xSl1/M5yORMtpg==} + engines: {node: ">=8.0.0"} dependencies: - '@types/node': 12.20.55 + "@types/node": 12.20.55 web3-core: 1.10.0 web3-core-helpers: 1.10.0 web3-core-method: 1.10.0 @@ -8769,10 +9937,11 @@ packages: dev: true /web3-eth-personal@1.10.2: - resolution: {integrity: sha512-+vEbJsPUJc5J683y0c2aN645vXC+gPVlFVCQu4IjPvXzJrAtUfz26+IZ6AUOth4fDJPT0f1uSLS5W2yrUdw9BQ==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-+vEbJsPUJc5J683y0c2aN645vXC+gPVlFVCQu4IjPvXzJrAtUfz26+IZ6AUOth4fDJPT0f1uSLS5W2yrUdw9BQ==} + engines: {node: ">=8.0.0"} dependencies: - '@types/node': 12.20.55 + "@types/node": 12.20.55 web3-core: 1.10.2 web3-core-helpers: 1.10.2 web3-core-method: 1.10.2 @@ -8784,8 +9953,9 @@ packages: dev: true /web3-eth@1.10.0: - resolution: {integrity: sha512-Z5vT6slNMLPKuwRyKGbqeGYC87OAy8bOblaqRTgg94CXcn/mmqU7iPIlG4506YdcdK3x6cfEDG7B6w+jRxypKA==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-Z5vT6slNMLPKuwRyKGbqeGYC87OAy8bOblaqRTgg94CXcn/mmqU7iPIlG4506YdcdK3x6cfEDG7B6w+jRxypKA==} + engines: {node: ">=8.0.0"} dependencies: web3-core: 1.10.0 web3-core-helpers: 1.10.0 @@ -8805,8 +9975,9 @@ packages: dev: true /web3-eth@1.10.2: - resolution: {integrity: sha512-s38rhrntyhGShmXC4R/aQtfkpcmev9c7iZwgb9CDIBFo7K8nrEJvqIOyajeZTxnDIiGzTJmrHxiKSadii5qTRg==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-s38rhrntyhGShmXC4R/aQtfkpcmev9c7iZwgb9CDIBFo7K8nrEJvqIOyajeZTxnDIiGzTJmrHxiKSadii5qTRg==} + engines: {node: ">=8.0.0"} dependencies: web3-core: 1.10.2 web3-core-helpers: 1.10.2 @@ -8826,8 +9997,9 @@ packages: dev: true /web3-net@1.10.0: - resolution: {integrity: sha512-NLH/N3IshYWASpxk4/18Ge6n60GEvWBVeM8inx2dmZJVmRI6SJIlUxbL8jySgiTn3MMZlhbdvrGo8fpUW7a1GA==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-NLH/N3IshYWASpxk4/18Ge6n60GEvWBVeM8inx2dmZJVmRI6SJIlUxbL8jySgiTn3MMZlhbdvrGo8fpUW7a1GA==} + engines: {node: ">=8.0.0"} dependencies: web3-core: 1.10.0 web3-core-method: 1.10.0 @@ -8838,8 +10010,9 @@ packages: dev: true /web3-net@1.10.2: - resolution: {integrity: sha512-w9i1t2z7dItagfskhaCKwpp6W3ylUR88gs68u820y5f8yfK5EbPmHc6c2lD8X9ZrTnmDoeOpIRCN/RFPtZCp+g==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-w9i1t2z7dItagfskhaCKwpp6W3ylUR88gs68u820y5f8yfK5EbPmHc6c2lD8X9ZrTnmDoeOpIRCN/RFPtZCp+g==} + engines: {node: ">=8.0.0"} dependencies: web3-core: 1.10.2 web3-core-method: 1.10.2 @@ -8850,8 +10023,9 @@ packages: dev: true /web3-providers-http@1.10.0: - resolution: {integrity: sha512-eNr965YB8a9mLiNrkjAWNAPXgmQWfpBfkkn7tpEFlghfww0u3I0tktMZiaToJVcL2+Xq+81cxbkpeWJ5XQDwOA==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-eNr965YB8a9mLiNrkjAWNAPXgmQWfpBfkkn7tpEFlghfww0u3I0tktMZiaToJVcL2+Xq+81cxbkpeWJ5XQDwOA==} + engines: {node: ">=8.0.0"} dependencies: abortcontroller-polyfill: 1.7.5 cross-fetch: 3.1.8 @@ -8862,8 +10036,9 @@ packages: dev: true /web3-providers-http@1.10.2: - resolution: {integrity: sha512-G8abKtpkyKGpRVKvfjIF3I4O/epHP7mxXWN8mNMQLkQj1cjMFiZBZ13f+qI77lNJN7QOf6+LtNdKrhsTGU72TA==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-G8abKtpkyKGpRVKvfjIF3I4O/epHP7mxXWN8mNMQLkQj1cjMFiZBZ13f+qI77lNJN7QOf6+LtNdKrhsTGU72TA==} + engines: {node: ">=8.0.0"} dependencies: abortcontroller-polyfill: 1.7.5 cross-fetch: 4.0.0 @@ -8874,24 +10049,27 @@ packages: dev: true /web3-providers-ipc@1.10.0: - resolution: {integrity: sha512-OfXG1aWN8L1OUqppshzq8YISkWrYHaATW9H8eh0p89TlWMc1KZOL9vttBuaBEi96D/n0eYDn2trzt22bqHWfXA==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-OfXG1aWN8L1OUqppshzq8YISkWrYHaATW9H8eh0p89TlWMc1KZOL9vttBuaBEi96D/n0eYDn2trzt22bqHWfXA==} + engines: {node: ">=8.0.0"} dependencies: oboe: 2.1.5 web3-core-helpers: 1.10.0 dev: true /web3-providers-ipc@1.10.2: - resolution: {integrity: sha512-lWbn6c+SgvhLymU8u4Ea/WOVC0Gqs7OJUvauejWz+iLycxeF0xFNyXnHVAi42ZJDPVI3vnfZotafoxcNNL7Sug==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-lWbn6c+SgvhLymU8u4Ea/WOVC0Gqs7OJUvauejWz+iLycxeF0xFNyXnHVAi42ZJDPVI3vnfZotafoxcNNL7Sug==} + engines: {node: ">=8.0.0"} dependencies: oboe: 2.1.5 web3-core-helpers: 1.10.2 dev: true /web3-providers-ws@1.10.0: - resolution: {integrity: sha512-sK0fNcglW36yD5xjnjtSGBnEtf59cbw4vZzJ+CmOWIKGIR96mP5l684g0WD0Eo+f4NQc2anWWXG74lRc9OVMCQ==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-sK0fNcglW36yD5xjnjtSGBnEtf59cbw4vZzJ+CmOWIKGIR96mP5l684g0WD0Eo+f4NQc2anWWXG74lRc9OVMCQ==} + engines: {node: ">=8.0.0"} dependencies: eventemitter3: 4.0.4 web3-core-helpers: 1.10.0 @@ -8901,8 +10079,9 @@ packages: dev: true /web3-providers-ws@1.10.2: - resolution: {integrity: sha512-3nYSiP6grI5GvpkSoehctSywfCTodU21VY8bUtXyFHK/IVfDooNtMpd5lVIMvXVAlaxwwrCfjebokaJtKH2Iag==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-3nYSiP6grI5GvpkSoehctSywfCTodU21VY8bUtXyFHK/IVfDooNtMpd5lVIMvXVAlaxwwrCfjebokaJtKH2Iag==} + engines: {node: ">=8.0.0"} dependencies: eventemitter3: 4.0.4 web3-core-helpers: 1.10.2 @@ -8912,8 +10091,9 @@ packages: dev: true /web3-shh@1.10.0: - resolution: {integrity: sha512-uNUUuNsO2AjX41GJARV9zJibs11eq6HtOe6Wr0FtRUcj8SN6nHeYIzwstAvJ4fXA53gRqFMTxdntHEt9aXVjpg==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-uNUUuNsO2AjX41GJARV9zJibs11eq6HtOe6Wr0FtRUcj8SN6nHeYIzwstAvJ4fXA53gRqFMTxdntHEt9aXVjpg==} + engines: {node: ">=8.0.0"} requiresBuild: true dependencies: web3-core: 1.10.0 @@ -8926,8 +10106,9 @@ packages: dev: true /web3-shh@1.10.2: - resolution: {integrity: sha512-UP0Kc3pHv9uULFu0+LOVfPwKBSJ6B+sJ5KflF7NyBk6TvNRxlpF3hUhuaVDCjjB/dDUR6T0EQeg25FA2uzJbag==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-UP0Kc3pHv9uULFu0+LOVfPwKBSJ6B+sJ5KflF7NyBk6TvNRxlpF3hUhuaVDCjjB/dDUR6T0EQeg25FA2uzJbag==} + engines: {node: ">=8.0.0"} requiresBuild: true dependencies: web3-core: 1.10.2 @@ -8940,8 +10121,9 @@ packages: dev: true /web3-utils@1.10.0: - resolution: {integrity: sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==} + engines: {node: ">=8.0.0"} dependencies: bn.js: 5.2.1 ethereum-bloom-filters: 1.0.10 @@ -8953,10 +10135,11 @@ packages: dev: true /web3-utils@1.10.2: - resolution: {integrity: sha512-TdApdzdse5YR+5GCX/b/vQnhhbj1KSAtfrDtRW7YS0kcWp1gkJsN62gw6GzCaNTeXookB7UrLtmDUuMv65qgow==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-TdApdzdse5YR+5GCX/b/vQnhhbj1KSAtfrDtRW7YS0kcWp1gkJsN62gw6GzCaNTeXookB7UrLtmDUuMv65qgow==} + engines: {node: ">=8.0.0"} dependencies: - '@ethereumjs/util': 8.1.0 + "@ethereumjs/util": 8.1.0 bn.js: 5.2.1 ethereum-bloom-filters: 1.0.10 ethereum-cryptography: 2.1.2 @@ -8967,8 +10150,9 @@ packages: dev: true /web3@1.10.0: - resolution: {integrity: sha512-YfKY9wSkGcM8seO+daR89oVTcbu18NsVfvOngzqMYGUU0pPSQmE57qQDvQzUeoIOHAnXEBNzrhjQJmm8ER0rng==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-YfKY9wSkGcM8seO+daR89oVTcbu18NsVfvOngzqMYGUU0pPSQmE57qQDvQzUeoIOHAnXEBNzrhjQJmm8ER0rng==} + engines: {node: ">=8.0.0"} requiresBuild: true dependencies: web3-bzz: 1.10.0 @@ -8986,8 +10170,9 @@ packages: dev: true /web3@1.10.2: - resolution: {integrity: sha512-DAtZ3a3ruPziE80uZ3Ob0YDZxt6Vk2un/F5BcBrxO70owJ9Z1Y2+loZmbh1MoAmoLGjA/SUSHeUtid3fYmBaog==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-DAtZ3a3ruPziE80uZ3Ob0YDZxt6Vk2un/F5BcBrxO70owJ9Z1Y2+loZmbh1MoAmoLGjA/SUSHeUtid3fYmBaog==} + engines: {node: ">=8.0.0"} requiresBuild: true dependencies: web3-bzz: 1.10.2 @@ -9005,11 +10190,13 @@ packages: dev: true /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + resolution: + {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} /websocket@1.0.34: - resolution: {integrity: sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==} - engines: {node: '>=4.0.0'} + resolution: + {integrity: sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==} + engines: {node: ">=4.0.0"} dependencies: bufferutil: 4.0.7 debug: 2.6.9 @@ -9021,21 +10208,25 @@ packages: - supports-color /whatwg-fetch@2.0.4: - resolution: {integrity: sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==} + resolution: + {integrity: sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==} /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + resolution: + {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 /which-module@1.0.0: - resolution: {integrity: sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==} + resolution: + {integrity: sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==} dev: true /which-typed-array@1.1.11: - resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} - engines: {node: '>= 0.4'} + resolution: + {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} + engines: {node: ">= 0.4"} dependencies: available-typed-arrays: 1.0.5 call-bind: 1.0.2 @@ -9045,66 +10236,76 @@ packages: dev: true /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + resolution: + {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true dependencies: isexe: 2.0.0 dev: true /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} + resolution: + {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: ">= 8"} hasBin: true dependencies: isexe: 2.0.0 dev: true /window-size@0.2.0: - resolution: {integrity: sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==} - engines: {node: '>= 0.10.0'} + resolution: + {integrity: sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==} + engines: {node: ">= 0.10.0"} hasBin: true dev: true /word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: ">=0.10.0"} dev: true /wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + resolution: + {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} dev: true /wordwrapjs@4.0.1: - resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} - engines: {node: '>=8.0.0'} + resolution: + {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} + engines: {node: ">=8.0.0"} dependencies: reduce-flatten: 2.0.0 typical: 5.2.0 dev: true /workerpool@6.2.1: - resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} + resolution: + {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} dev: true /wrap-ansi@2.1.0: - resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} - engines: {node: '>=0.10.0'} + resolution: + {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} + engines: {node: ">=0.10.0"} dependencies: string-width: 1.0.2 strip-ansi: 3.0.1 dev: true /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: ">=10"} dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + resolution: + {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: ">=12"} dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 @@ -9112,11 +10313,13 @@ packages: dev: true /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + resolution: + {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true /write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + resolution: + {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: imurmurhash: 0.1.4 @@ -9124,7 +10327,8 @@ packages: dev: true /ws@3.3.3: - resolution: {integrity: sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==} + resolution: + {integrity: sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==} peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ^5.0.2 @@ -9140,8 +10344,9 @@ packages: dev: true /ws@7.4.6: - resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} - engines: {node: '>=8.3.0'} + resolution: + {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} + engines: {node: ">=8.3.0"} peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ^5.0.2 @@ -9153,8 +10358,9 @@ packages: dev: true /ws@7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} - engines: {node: '>=8.3.0'} + resolution: + {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: ">=8.3.0"} peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ^5.0.2 @@ -9166,13 +10372,15 @@ packages: dev: true /xhr-request-promise@0.1.3: - resolution: {integrity: sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==} + resolution: + {integrity: sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==} dependencies: xhr-request: 1.1.0 dev: true /xhr-request@1.1.0: - resolution: {integrity: sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==} + resolution: + {integrity: sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==} dependencies: buffer-to-arraybuffer: 0.0.5 object-assign: 4.1.1 @@ -9184,7 +10392,8 @@ packages: dev: true /xhr@2.6.0: - resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==} + resolution: + {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==} dependencies: global: 4.4.0 is-function: 1.0.2 @@ -9193,60 +10402,72 @@ packages: dev: true /xmlhttprequest@1.8.0: - resolution: {integrity: sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==} - engines: {node: '>=0.4.0'} + resolution: + {integrity: sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==} + engines: {node: ">=0.4.0"} dev: true /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} + resolution: + {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: ">=0.4"} dev: true /y18n@3.2.2: - resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} + resolution: + {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} dev: true /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: ">=10"} /yaeti@0.0.6: - resolution: {integrity: sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==} - engines: {node: '>=0.10.32'} + resolution: + {integrity: sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==} + engines: {node: ">=0.10.32"} /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + resolution: + {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + resolution: + {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true /yaml@2.3.1: - resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} - engines: {node: '>= 14'} + resolution: + {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} + engines: {node: ">= 14"} dev: true /yargs-parser@2.4.1: - resolution: {integrity: sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==} + resolution: + {integrity: sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==} dependencies: camelcase: 3.0.0 lodash.assign: 4.2.0 dev: true /yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} + engines: {node: ">=10"} dev: true /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + resolution: + {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: ">=12"} dev: false /yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: ">=10"} dependencies: camelcase: 6.3.0 decamelize: 4.0.0 @@ -9255,8 +10476,9 @@ packages: dev: true /yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: ">=10"} dependencies: cliui: 7.0.4 escalade: 3.1.1 @@ -9268,8 +10490,9 @@ packages: dev: true /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + resolution: + {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: ">=12"} dependencies: cliui: 8.0.1 escalade: 3.1.1 @@ -9281,7 +10504,8 @@ packages: dev: false /yargs@4.8.1: - resolution: {integrity: sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==} + resolution: + {integrity: sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==} dependencies: cliui: 3.2.0 decamelize: 1.2.0 @@ -9300,11 +10524,13 @@ packages: dev: true /yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} + resolution: + {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: ">=6"} dev: true /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + resolution: + {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: ">=10"} dev: true diff --git a/tests/EvmAcceptanceTests/scripts/FundAccountsAsync.ts b/tests/EvmAcceptanceTests/scripts/FundAccountsAsync.ts index 41d605bf0d..0fdc28c4d6 100644 --- a/tests/EvmAcceptanceTests/scripts/FundAccountsAsync.ts +++ b/tests/EvmAcceptanceTests/scripts/FundAccountsAsync.ts @@ -1,5 +1,5 @@ import {getAddressFromPrivateKey} from "@zilliqa-js/crypto"; -import {BN, Zilliqa, bytes, toChecksumAddress} from "@zilliqa-js/zilliqa"; +import {BN, Transaction, Zilliqa, bytes, toChecksumAddress} from "@zilliqa-js/zilliqa"; import clc from "cli-color"; import {ethers} from "ethers"; import Long from "long"; @@ -41,7 +41,7 @@ async function main() { zilliqa.wallet.addByPrivateKey(privateKey); const private_keys: string[] = hre.network["config"]["accounts"] as string[]; - let txs = []; + let txs: [address: string, tx: Transaction][] = []; let current_nonce = nonce + 1; console.log(`Issuing ${private_keys.length} transactions ... `); for (const element of private_keys) { @@ -60,21 +60,21 @@ async function main() { false ) ); - txs.push(tx); + txs.push([ethAddrConverted, tx]); current_nonce += 1; console.log(`${JSON.stringify(tx)}`); } - for (const tx of txs) { + for (const [address, tx] of txs) { if (tx.id) { const confirmedTxn = await tx.confirm(tx.id); const receipt = confirmedTxn.getReceipt(); if (receipt && receipt.success) { - console.log(`${tx.toAddr}` + clc.bold.green(" funded.")); + console.log(`${address}` + clc.bold.green(" funded.")); continue; } } - console.log(clc.red(`Failed to fund ${tx.toAddr}.`)); + console.log(clc.red(`Failed to fund ${address}.`)); } } diff --git a/tests/EvmAcceptanceTests/tasks/RefundSigners.ts b/tests/EvmAcceptanceTests/tasks/RefundSigners.ts index c3a39a5d2b..05abd077ca 100644 --- a/tests/EvmAcceptanceTests/tasks/RefundSigners.ts +++ b/tests/EvmAcceptanceTests/tasks/RefundSigners.ts @@ -3,50 +3,80 @@ import {task} from "hardhat/config"; import {HardhatRuntimeEnvironment} from "hardhat/types"; import clc from "cli-color"; import ora from "ora"; -import {getAddressFromPrivateKey} from "@zilliqa-js/zilliqa"; -import {loadFromSignersFile, loadSignersFromConfig} from "../helpers/SignersHelper"; +import {BN, getAddressFromPrivateKey} from "@zilliqa-js/zilliqa"; +import { + Account, + AccountType, + getEthAddress, + getEthSignersBalances, + getZilSignersBalances, + loadFromSignersFile, + loadSignersFromConfig +} from "../helpers/SignersHelper"; task("refund-signers", "A task to refund signers") .addParam("from", "Sender's private key") + .addParam( + "fromAddressType", + "It can be either `eth` or `zil`. If eth is selected, Eth address of private key will be used. Otherwise, the zil address will be used." + ) .addParam("amount", "Balance of each newly generated signers") .setAction(async (taskArgs, hre) => { - const {from, amount} = taskArgs; + const {from, fromAddressType, amount} = taskArgs; const spinner = ora(); - const accounts = [...loadFromSignersFile(hre.network.name), ...loadSignersFromConfig(hre)] - if (accounts.length === 0) { - console.log(clc.yellowBright(`No signers found in .signers/${hre.network.name}`)); + + spinner.start(`Refunding signers for ${hre.network.name} network...`); + + if (fromAddressType === "eth" || fromAddressType === "zil") { + await refundAccounts( + hre, + {private_key: from, type: fromAddressType as AccountType}, + hre.ethers.utils.parseEther(amount) + ); + } else { + displayError(`--from-address-type should be either eth or zil. ${fromAddressType} is not supported`); + spinner.fail(); return; } - spinner.start(`Refunding ${accounts.length} accounts for ${hre.network.name} network...`); - await refundAccounts(hre, from, hre.ethers.utils.parseEther(amount), accounts); - spinner.succeed(); }); -const refundAccounts = async ( - hre: HardhatRuntimeEnvironment, - privateKey: string, - amount: BigNumber, - accounts: string[] -) => { - const wallet = new ethers.Wallet(privateKey, hre.ethers.provider); +const refundAccounts = async (hre: HardhatRuntimeEnvironment, sourceAccount: Account, amount: BigNumber) => { + const wallet = new ethers.Wallet(sourceAccount.private_key, hre.ethers.provider); + + const ethBalances = await getEthSignersBalances(hre); + const zilBalances = await getZilSignersBalances(hre); const addresses = [ - ...accounts.map((private_key) => new ethers.Wallet(private_key).address.toLocaleLowerCase()), - ...accounts.map((private_key) => getAddressFromPrivateKey(private_key).toLocaleLowerCase()) + ...ethBalances.filter(([address, balance]) => balance.lt(amount)).map(([address, _]) => address), + ...zilBalances.filter(([address, balance]) => balance.lt(new BN(amount.toString()))).map(([address, _]) => address) ]; const totalValue = amount.mul(addresses.length); + + if (sourceAccount.type === AccountType.ZilBased) { + await hre.run("transfer", { + from: sourceAccount.private_key, + to: getEthAddress(sourceAccount.private_key), + amount: ethers.utils.formatEther(amount.add(totalValue)), // Add +amount for the source account itself + fromAddressType: "zil" + }); + } + if ((await wallet.getBalance()).lt(totalValue)) { throw new Error("Sender doesn't have enough fund in its eth address."); } - let contract = await hre.deployContractWithSigner("BatchTransferCtor", wallet, addresses, amount, { value: totalValue }); await contract.deployed(); }; + +// TODO: DRY +const displayError = (error: string) => { + console.log(clc.red.bold("Error: "), error); +}; diff --git a/tests/EvmAcceptanceTests/tasks/SetRewards.ts b/tests/EvmAcceptanceTests/tasks/SetRewards.ts index e9e390e59b..2d24d2245a 100644 --- a/tests/EvmAcceptanceTests/tasks/SetRewards.ts +++ b/tests/EvmAcceptanceTests/tasks/SetRewards.ts @@ -4,8 +4,8 @@ import {BN, Zilliqa, bytes, toChecksumAddress} from "@zilliqa-js/zilliqa"; import {Account} from "@zilliqa-js/account"; import clc from "cli-color"; import Long from "long"; -import { HardhatRuntimeEnvironment } from "hardhat/types"; -const {task} = require("hardhat/config"); +import {HardhatRuntimeEnvironment} from "hardhat/types"; +import { task } from "hardhat/config"; const MSG_VERSION = 1; // current msgVersion //const VERSION = bytes.pack(hre.getZilliqaChainId(), msgVersion); @@ -16,9 +16,9 @@ const WELL_KNOWN_CONTRACT_ADDRESS = "0xb73DA094d60aa93AC4fA8Ae41Df5d8c13925b0BD" // the constants.xml file, and thus the nonce and identity of the deployer have to be known statically. interface ContractContext { contract: ScillaContract; - deployerAddress: String; + deployerAddress: string; zilliqa: Zilliqa; - version: String; + version: string; hre: HardhatRuntimeEnvironment; deployerAccount: Account; } @@ -42,7 +42,11 @@ async function ensureContractDeployment(hre: HardhatRuntimeEnvironment): Promise if (!contractBalanceResult.error) { console.log(clc.green("Contract already deployed. Yay!")); const contract = await hre.interactWithScillaContract(WELL_KNOWN_CONTRACT_ADDRESS); - return {contract, deployerAddress, zilliqa, version, hre, deployerAccount}; + if (contract == undefined) { + throw Error(clc.bold.red(`Failed to get the contract at ${WELL_KNOWN_CONTRACT_ADDRESS}`)); + } + + return {contract, deployerAddress, zilliqa, version: version.toString(), hre, deployerAccount}; } console.log(`Contract not present; deploying .. `); @@ -110,10 +114,10 @@ async function ensureContractDeployment(hre: HardhatRuntimeEnvironment): Promise let contract = await hre.deployScillaContract("RewardsParams", deployerAddress); console.log(`Result ${JSON.stringify(contract)}`); console.log(`Contract deployed at ${contract.address}`); - return {contract, deployerAddress, zilliqa, version, hre, deployerAccount}; + return {contract, deployerAddress, zilliqa, version: version.toString(), hre, deployerAccount}; } -async function checkContractDeployment() { +async function checkContractDeployment(zilliqa: Zilliqa) { const contractBalance = await zilliqa.blockchain.getBalance(WELL_KNOWN_CONTRACT_ADDRESS); console.log(`Bal ${JSON.stringify(contractBalance)}`); if (contractBalance.error !== undefined) { diff --git a/tests/EvmAcceptanceTests/tasks/Setup.ts b/tests/EvmAcceptanceTests/tasks/Setup.ts index 2e6e8954c8..9e370c95fb 100644 --- a/tests/EvmAcceptanceTests/tasks/Setup.ts +++ b/tests/EvmAcceptanceTests/tasks/Setup.ts @@ -1,152 +1,114 @@ import clc from "cli-color"; import {task} from "hardhat/config"; -import {terminal} from "terminal-kit"; -import {getEthAddress, getEthBalance, getZilBalance} from "../helpers/SignersHelper"; +import {AccountType, getEthSignersBalances, getZilSignersBalances} from "../helpers/SignersHelper"; import {BN} from "@zilliqa-js/zilliqa"; - -enum AddressType { - EvmBased, - ZilBased -} - -enum CreationStrategy{ - CreateNewSigners = 0, // Replace previous one - AppendToPreviousSigners = 1, - RefundPreviousSigners = 2 +import select, {Separator} from "@inquirer/select"; +import {HardhatRuntimeEnvironment} from "hardhat/types"; +import {ethers} from "ethers"; +import {askAmount, askForAccount, askForAccountType, askForAddress} from "../helpers/UiHelper"; + +enum WhatDoYouWantToDo { + RunTestsSequentially, + RunTestsInParallel, + RefundCurrentSigners, } -const displayTitle = (title: string) => { - terminal.white.bold(`${title} ${clc.blackBright("(Press ESC to exit)")}\n`); -}; - -const askAddressType = async (): Promise => { - console.clear(); - var items = [ - "An account(private key) with some ethers in its ethereum based address", - "An account(private key) with some zils in its zilliqa based address" - ]; - - displayTitle("What do you have?"); - let out = await terminal.singleColumnMenu(items, {cancelable: true}).promise; - return out.canceled ? undefined : out.selectedIndex; -}; - -const askWhatYouWantToDo = async (): Promise => { - console.clear(); - var items = ["Create a set of signers (Replaces the previous ones)", - "Append a set of new signers to the previous ones", - "Refund existing signers"]; - - displayTitle("What do you want to do?"); - let out = await terminal.singleColumnMenu(items, {cancelable: true}).promise; +task("setup", "A task to setup test suite").setAction(async (taskArgs, hre) => { + const task: WhatDoYouWantToDo = await askWhatDoYouWantToDo(); - return out.canceled ? undefined : out.selectedIndex as CreationStrategy; -}; + switch (task) { + case WhatDoYouWantToDo.RefundCurrentSigners: + await refundCurrentSigners(hre); + break; -const askPrivateKey = async (): Promise => { - console.clear(); - displayTitle("Please enter your private key: "); - let out = terminal.inputField({cancelable: true}); - const address = await out.promise; + case WhatDoYouWantToDo.RunTestsInParallel: + await prepareToRunTestsInParallel(hre); + break; - return address; -}; + case WhatDoYouWantToDo.RunTestsSequentially: + await prepareToRunTestsSequentially(hre); + break; -const askSignersCount = async (): Promise => { - console.clear(); - displayTitle("Please enter number signers to create: "); - let out = terminal.inputField({cancelable: true, default: "30"}); - const count = await out.promise; - if (count === undefined) { - return undefined; + default: + console.log(clc.yellow("Selected option is not valid!")); + break; } +}); - return Number(count); +const askWhatDoYouWantToDo = async (): Promise => { + return await select({ + message: "What do you want to do?", + choices: [ + { + name: "Run tests sequentially", + value: WhatDoYouWantToDo.RunTestsSequentially + }, + { + name: "Run tests in parallel", + value: WhatDoYouWantToDo.RunTestsInParallel + }, + new Separator(), + { + name: "Refund current signers", + value: WhatDoYouWantToDo.RefundCurrentSigners + }, + ] + }); }; -const askBalance = async (): Promise => { - console.clear(); - displayTitle("Please enter amount of balance for each signer in Ether: "); - let out = terminal.inputField({cancelable: true, default: "1000"}); - const balance = await out.promise; - if (balance === undefined) { - return undefined; - } - - return Number(balance); +const refundCurrentSigners = async (hre: HardhatRuntimeEnvironment) => { + let amount = await askAmount(); + let account = await askForAccount(); + await hre.run("refund-signers", { + from: account.private_key, + fromAddressType: account.type as string, + amount: amount.toString() + }); }; -task("setup", "A task to setup test suite").setAction(async (taskArgs, hre) => { - const strategy = await askWhatYouWantToDo(); +async function prepareToRunTestsInParallel(hre: HardhatRuntimeEnvironment) { + const NEEDED_SIGNERS = 30; + const NEEDED_BALANCE = 1000; - if (strategy === undefined) { - return; - } - - const address_type = await askAddressType(); - if (address_type === undefined) { - return; - } + await prepareToRunTests(hre, NEEDED_SIGNERS, NEEDED_BALANCE); + console.log(clc.greenBright("\nYou're good to go!")); + console.log(clc.yellowBright.bold("\nrun: npx hardhat test --parallel")); +} - const private_key = await askPrivateKey(); +async function prepareToRunTestsSequentially(hre: HardhatRuntimeEnvironment) { + const NEEDED_SIGNERS = 4; + const NEEDED_BALANCE = 1000; - if (private_key === undefined) { - return; - } + await prepareToRunTests(hre, NEEDED_SIGNERS, NEEDED_BALANCE); + console.log(clc.greenBright("\nYou're good to go.")); + console.log(clc.yellowBright.bold("\nrun: npx hardhat test")); +} - let signersCount = 0; - if (strategy !== CreationStrategy.RefundPreviousSigners) { - const count = await askSignersCount(); - - if (count === undefined) { - return; - } +async function prepareToRunTests(hre: HardhatRuntimeEnvironment, needed_signers: number, needed_balance: number) { + const ethBalances = await getEthSignersBalances(hre); + const zilBalances = await getZilSignersBalances(hre); + const signersAreEnough = ethBalances.length >= needed_signers; + const ethSignersHaveEnoughFund = ethBalances.every(([_, balance]) => balance.gt(needed_balance)); + const zilSignersHaveEnoughFund = zilBalances.every(([_, balance]) => balance.gt(new BN(needed_balance))); - signersCount = count; + if (signersAreEnough && ethSignersHaveEnoughFund && zilSignersHaveEnoughFund) { + return; } - const eachSignerBalance = await askBalance(); + const sourceAccount = await askForAccount(); - if (eachSignerBalance === undefined) { - return; - } + await hre.run("refund-signers", { + from: sourceAccount.private_key, + fromAddressType: sourceAccount.type as string, + amount: needed_balance.toString() + }); - let neededBalance = 0; - if (address_type == AddressType.EvmBased) { - // *2 because we both fund zil/eth address. - neededBalance = eachSignerBalance * 2 * signersCount; - const [address, balance] = await getEthBalance(hre, private_key); - if (balance.isZero()) { - console.log( - clc.red(`Provided private key with address ${address} does not enough funds. Needed ${neededBalance} ZIL.`) - ); - return; - } - } else if (address_type == AddressType.ZilBased) { - // *2 because we both fund zil/eth address. +1 to fund the private key eth-address as well. - neededBalance = eachSignerBalance * 2 * (signersCount + 1); - - const [address, balance] = await getZilBalance(hre, private_key); - if (balance.lt(new BN(neededBalance))) { - console.log( - clc.red(`Provided private key with address ${address} does not enough funds. Needed ${neededBalance} ZIL.`) - ); - return; - } - - // First fund the eth address of the private key - await hre.run("transfer", { - from: private_key, - to: getEthAddress(private_key), - amount: neededBalance.toString(), - fromAddressType: "zil" + if (signersAreEnough == false) { + await hre.run("init-signers", { + from: sourceAccount.private_key, + count: (needed_signers - ethBalances.length).toString(), + balance: needed_balance.toString(), + append: false }); } - - if (strategy === CreationStrategy.RefundPreviousSigners) { - await hre.run("refund-signers", {from: private_key, amount: eachSignerBalance.toString()}); - } else { - const append = strategy === CreationStrategy.AppendToPreviousSigners; - await hre.run("init-signers", {from: private_key, count: "30", balance: eachSignerBalance.toString(), append}); - } -}); +} \ No newline at end of file diff --git a/tests/EvmAcceptanceTests/tasks/Ui.ts b/tests/EvmAcceptanceTests/tasks/Ui.ts new file mode 100644 index 0000000000..2ac02961dd --- /dev/null +++ b/tests/EvmAcceptanceTests/tasks/Ui.ts @@ -0,0 +1,81 @@ +import clc from "cli-color"; +import {task} from "hardhat/config"; +import {Account, AccountType, getEthSignersBalances, getZilSignersBalances} from "../helpers/SignersHelper"; +import select, {Separator} from "@inquirer/select"; +import {HardhatRuntimeEnvironment} from "hardhat/types"; +import {ethers} from "ethers"; +import {askAmount, askForAccount, askForAddress} from "../helpers/UiHelper"; + +enum WhatDoYouWantToDo { + TransferFund, + PrintBalances +} + +task("ui", "A task to setup test suite").setAction(async (taskArgs, hre) => { + const task: WhatDoYouWantToDo = await askWhatDoYouWantToDo(); + + switch (task) { + case WhatDoYouWantToDo.TransferFund: + await transferFund(hre); + break; + + case WhatDoYouWantToDo.PrintBalances: + await printBalances(hre); + break; + + default: + console.log(clc.yellow("Selected option is not valid!")); + break; + } +}); + +const askWhatDoYouWantToDo = async (): Promise => { + return await select({ + message: "What do you want to do?", + choices: [ + { + name: "Transfer fund", + value: WhatDoYouWantToDo.TransferFund + }, + { + name: "Print signers balances", + value: WhatDoYouWantToDo.PrintBalances + } + ] + }); +}; + +const askForAccountType = async (message?: string, ethMessage?: string, zilMessage?: string): Promise => { + return await select({ + message: message || "What type of funded source account do you have?", + choices: [ + { + name: ethMessage || "An eth-based account", + value: AccountType.EthBased + }, + { + name: zilMessage || "A zil-based account", + value: AccountType.ZilBased + } + ] + }); +}; + +async function transferFund(hre: HardhatRuntimeEnvironment) { + const from = await askForAccount(); + const to = await askForAddress(); + const amount = await askAmount("How much to transfer? "); + + await hre.run("transfer", { + from: from.private_key, + to: to, + amount: ethers.utils.formatEther(amount), + fromAddressType: from.type as string + }); +} + +async function printBalances(hre: HardhatRuntimeEnvironment) { + const accountType = await askForAccountType("Eth balances or Zil balances?", "ETH", "ZIL"); + + await hre.run("balances", {zil: accountType === AccountType.ZilBased, eth: accountType === AccountType.EthBased}); +} diff --git a/tests/Zilliqa/test_zilliqa_local.py b/tests/Zilliqa/test_zilliqa_local.py index 64fd92a9ac..77e7f5d17e 100755 --- a/tests/Zilliqa/test_zilliqa_local.py +++ b/tests/Zilliqa/test_zilliqa_local.py @@ -30,7 +30,6 @@ STATUS_SERVER_LISTEN_PORT = 4301 LOCAL_RUN_FOLDER = './local_run/' REJOIN_DS_GUARD_RUN_FOLDER = './dsguard_rejoin_local_run/' -SCILLA_SOCKET_NAME = "/tmp/scilla-ipc-socket" def print_usage(): @@ -290,15 +289,13 @@ def run_start(numdsnodes): shutil.copyfile('ds_whitelist.xml', LOCAL_RUN_FOLDER + testfolders_list[x] + '/ds_whitelist.xml') shutil.copyfile('shard_whitelist.xml', LOCAL_RUN_FOLDER + testfolders_list[x] + '/shard_whitelist.xml') shutil.copyfile(fp, LOCAL_RUN_FOLDER + testfolders_list[x] + '/constants.xml') - ipc_path = LOCAL_RUN_FOLDER + testfolders_list[x] + "/scilla" + ".sock" - scilla_server_path = LOCAL_RUN_FOLDER + testfolders_list[x] + "/scilla-server" + ".sock" + ipc_path = "/tmp/zilliqa" + str(NODE_LISTEN_PORT + x) + ".sock" status_server_port = str(STATUS_SERVER_LISTEN_PORT + x) '''patch_lookup_pubkey(LOCAL_RUN_FOLDER + testfolders_list[x] + '/dsnodes.xml', keypairs)''' '''patch_seed_pubkey(LOCAL_RUN_FOLDER + testfolders_list[x] + '/dsnodes.xml', keypairs)''' - patch_param_in_xml(LOCAL_RUN_FOLDER + testfolders_list[x] + '/constants.xml', ipc_path, scilla_server_path, - status_server_port) + patch_param_in_xml(LOCAL_RUN_FOLDER + testfolders_list[x] + '/constants.xml', ipc_path, status_server_port) shutil.copyfile('dsnodes.xml', LOCAL_RUN_FOLDER + testfolders_list[x] + '/dsnodes.xml') @@ -317,17 +314,14 @@ def run_start(numdsnodes): -def patch_param_in_xml(filepath, ipc_path, scilla_server_path, status_server_port): +def patch_param_in_xml(filepath, ipc_path, status_server_port): root = ET.parse(filepath).getroot() td = root.find('jsonrpc') ''' TODO will need extending for other params''' - if td: - print("Setting SCILLA_IPC_SOCKET_PATH to " + ipc_path + " and STATUS_RPC_PORT to " + status_server_port ) - td.find('SCILLA_IPC_SOCKET_PATH').text = ipc_path - td.find('SCILLA_SERVER_SOCKET_PATH').text = scilla_server_path - td.find('STATUS_RPC_PORT').text = status_server_port + td.find('SCILLA_IPC_SOCKET_PATH').text = ipc_path + td.find('STATUS_RPC_PORT').text = status_server_port tree = ET.ElementTree(root) tree.write(filepath) diff --git a/tests/Zilliqa/test_zilliqa_lookup.py b/tests/Zilliqa/test_zilliqa_lookup.py index a695cf70db..ed1d7d404a 100755 --- a/tests/Zilliqa/test_zilliqa_lookup.py +++ b/tests/Zilliqa/test_zilliqa_lookup.py @@ -25,7 +25,6 @@ NODE_LISTEN_PORT = 23456 LOCAL_RUN_FOLDER = './lookup_local_run/' LOCAL_FOLDER = "./" -STATUS_SERVER_LISTEN_PORT = 5555 GENTXN_WORKING_DIR = os.path.join(LOCAL_RUN_FOLDER, 'gentxn') @@ -92,6 +91,8 @@ def run_setup(numnodes, printnodes): testfolders_list = get_immediate_subdirectories(LOCAL_RUN_FOLDER) count = len(testfolders_list) + + if printnodes: for x in range(0, count): print('[Node ' + str(x + 1).ljust(3) + '] [Port ' + str(NODE_LISTEN_PORT + x) + '] ' + LOCAL_RUN_FOLDER + @@ -117,20 +118,12 @@ def run_setup(numnodes, printnodes): keys_file.write(keypairs[x] + '\n') keys_file.close() - -def patch_constants_xml(filepath, ipc_path, scilla_server_path, status_server_port): +def patch_constants_xml(filepath, read_txn=False): root = ET.parse(filepath).getroot() general = root.find('general') general.find('LOOKUP_NODE_MODE').text = 'true' - td = root.find('jsonrpc') - if td: - print("Setting SCILLA_IPC_SOCKET_PATH to " + ipc_path + " and STATUS_RPC_PORT to " + status_server_port) - td.find('SCILLA_IPC_SOCKET_PATH').text = ipc_path - td.find('SCILLA_SERVER_SOCKET_PATH').text = scilla_server_path - td.find('STATUS_RPC_PORT').text = status_server_port - tree = ET.ElementTree(root) tree.write(filepath) @@ -187,7 +180,6 @@ def patch_seed_pubkey(filepath, keypairs): tree = ET.ElementTree(root) tree.write(filepath) - def run_start(): testfolders_list = get_immediate_subdirectories(LOCAL_RUN_FOLDER) count = len(testfolders_list) @@ -197,10 +189,11 @@ def run_start(): print("DEV_TREE_ROOT is not set") return + fp = LOCAL_FOLDER + "constants.xml" if not os.path.exists(fp): - print(fp + " not found") + print( fp +" not found") return # Load the keypairs @@ -209,10 +202,6 @@ def run_start(): keypairs = f.readlines() keypairs = [x.strip() for x in keypairs] - ipc_path = "ipc.socket" - scilla_server_path = "scilla-server.socket" - status_server_port = str(STATUS_SERVER_LISTEN_PORT) - for x in range(0, count): shutil.copyfile('config_normal.xml', LOCAL_RUN_FOLDER + testfolders_list[x] + '/config.xml') shutil.copyfile(fp, LOCAL_RUN_FOLDER + testfolders_list[x] + '/constants.xml') @@ -222,18 +211,12 @@ def run_start(): # one with the jsonrpc server running will do the transaction dispatching and coincidentally there # will be only one as there is an unknown issue that multiple lookup nodes are having port collision # on 4201 and eventually only one will get the port and others won't be able to start jsonrpc server - ipc_path = LOCAL_RUN_FOLDER + testfolders_list[x] + "/scilla" + ".sock" - scilla_server_path = LOCAL_RUN_FOLDER + testfolders_list[x] + "/scilla-server" + ".sock" - status_server_port = str(STATUS_SERVER_LISTEN_PORT + x) - - patch_constants_xml(LOCAL_RUN_FOLDER + testfolders_list[x] + '/constants.xml', ipc_path, scilla_server_path, - status_server_port) + patch_constants_xml(LOCAL_RUN_FOLDER + testfolders_list[x] + '/constants.xml', True) # Launch node zilliqa process for x in range(0, count): keypair = keypairs[x].split(" ") - start_str = ' --privk ' + keypair[1] + ' --pubk ' + keypair[0] + ' --address ' + '127.0.0.1' + ' --port ' + str( - NODE_LISTEN_PORT + x) + ' --identity ' + 'lookup-' + str(x) + start_str = ' --privk ' + keypair[1] + ' --pubk ' + keypair[0] + ' --address ' + '127.0.0.1' + ' --port ' + str(NODE_LISTEN_PORT + x) + ' --identity ' + 'lookup-' + str(x) print(start_str) os.system('cd ' + LOCAL_RUN_FOLDER + testfolders_list[x] + '; echo \"' + keypair[0] + ' ' + keypair[ 1] + '\" > mykey.txt' + '; ulimit -n 65535; ulimit -Sc unlimited; ulimit -Hc unlimited; $(pwd)/lzilliqa ' + From 075b2f4b5b3f10fafbc92eee1deb4c8c11f0a25c Mon Sep 17 00:00:00 2001 From: bzawisto Date: Mon, 6 Nov 2023 12:15:01 +0100 Subject: [PATCH 25/61] Adding more helpful logs --- src/libLookup/Lookup.cpp | 34 ++++++++++++++++++++++++++-------- src/libNode/Node.cpp | 10 ++++++++-- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/src/libLookup/Lookup.cpp b/src/libLookup/Lookup.cpp index b540b70aa9..24095a254e 100644 --- a/src/libLookup/Lookup.cpp +++ b/src/libLookup/Lookup.cpp @@ -26,8 +26,10 @@ #include #include +#include #include #include +#include #include "Lookup.h" #include "common/Messages.h" @@ -5290,6 +5292,13 @@ bool Lookup::ClearTxnMemPool() { return true; } lock_guard g(m_txnMemPoolMutex); + const auto content = boost::algorithm::join( + m_txnMemPool | boost::adaptors::transformed([](const Transaction& txn) { + return txn.GetTranID().hex(); + }), + ", "); + LOG_GENERAL(INFO, "Clearing m_txnMemPool, current content: " << content); + m_txnMemPool.clear(); return true; @@ -5499,6 +5508,18 @@ bool Lookup::ProcessForwardTxn(const zbytes& message, unsigned int offset, "Lookup::ProcessForwardTxn not expected to be called from " "non-lookup node"); } + std::vector transactions; + if (!Messenger::GetForwardTxnBlockFromSeed(message, offset, transactions)) { + LOG_GENERAL(WARNING, + "Unable to deserialize message from by Lookup from Seed"); + return false; + } + + const auto content = boost::algorithm::join( + transactions | boost::adaptors::transformed([](const Transaction& txn) { + return txn.GetTranID().hex(); + }), + ", "); if (m_mediator.m_disableTxns) { LOG_GENERAL(INFO, "Txns disabled - dropping txn packet"); @@ -5510,17 +5531,14 @@ bool Lookup::ProcessForwardTxn(const zbytes& message, unsigned int offset, // private seed nodes if (ARCHIVAL_LOOKUP && LOOKUP_NODE_MODE) { // I'm seed/external-seed - forward message to next layer of 'lookups' + LOG_GENERAL(INFO, "Sending from seed to next layer transactions batch: " + << content); SendMessageToRandomSeedNode(message); } else { // I'm a lookup (non-seed & non-external) - forward messages to ds shard - std::vector transactions; - if (!Messenger::GetForwardTxnBlockFromSeed(message, offset, transactions)) { - LOG_GENERAL(WARNING, - "Unable to deserialize message from by Lookup from Seed"); - return false; - } - std::this_thread::sleep_for( - chrono::milliseconds(TX_DISTRIBUTE_TIME_IN_MS)); + std::this_thread::sleep_for(chrono::milliseconds(TX_DISTRIBUTE_TIME_IN_MS)); + LOG_GENERAL(INFO, "Sending from lookup to ds-members transactions batch: " + << content); SenderTxnBatchThread(std::move(transactions)); } diff --git a/src/libNode/Node.cpp b/src/libNode/Node.cpp index 5c15a43666..9ac9b3e1e4 100644 --- a/src/libNode/Node.cpp +++ b/src/libNode/Node.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include "Node.h" #include "common/Constants.h" @@ -1698,8 +1699,13 @@ bool Node::ProcessTxnPacketFromLookup( return false; } - LOG_GENERAL(INFO, "Received txns: " << transactions.size() << ", from " - << from << ", my shardId is: " + const auto content = boost::algorithm::join( + transactions | boost::adaptors::transformed([](const Transaction &txn) { + return txn.GetTranID().hex(); + }), + ", "); + LOG_GENERAL(INFO, "Received txns: " << content << ", from " << from + << ", my shardId is: " << m_mediator.m_node->m_myshardId); { From 2c5b92d536b50448ef9e75c07724a81b6c6f5fda Mon Sep 17 00:00:00 2001 From: bzawisto Date: Tue, 7 Nov 2023 11:17:34 +0100 Subject: [PATCH 26/61] Accept new connection regardless of current error --- src/libLookup/Lookup.cpp | 11 ++++--- src/libNode/Node.cpp | 6 ++-- src/libServer/APIServerImpl.cpp | 36 ++++++++++++---------- src/libServer/DedicatedWebsocketServer.cpp | 15 ++++----- 4 files changed, 36 insertions(+), 32 deletions(-) diff --git a/src/libLookup/Lookup.cpp b/src/libLookup/Lookup.cpp index 24095a254e..213074fecc 100644 --- a/src/libLookup/Lookup.cpp +++ b/src/libLookup/Lookup.cpp @@ -5297,7 +5297,8 @@ bool Lookup::ClearTxnMemPool() { return txn.GetTranID().hex(); }), ", "); - LOG_GENERAL(INFO, "Clearing m_txnMemPool, current content: " << content); + LOG_GENERAL(INFO, + "Clearing m_txnMemPool, current content: [" << content << "]"); m_txnMemPool.clear(); @@ -5531,14 +5532,14 @@ bool Lookup::ProcessForwardTxn(const zbytes& message, unsigned int offset, // private seed nodes if (ARCHIVAL_LOOKUP && LOOKUP_NODE_MODE) { // I'm seed/external-seed - forward message to next layer of 'lookups' - LOG_GENERAL(INFO, "Sending from seed to next layer transactions batch: " - << content); + LOG_GENERAL(INFO, "Sending from seed to next layer transactions batch: [" + << content << "]"); SendMessageToRandomSeedNode(message); } else { // I'm a lookup (non-seed & non-external) - forward messages to ds shard std::this_thread::sleep_for(chrono::milliseconds(TX_DISTRIBUTE_TIME_IN_MS)); - LOG_GENERAL(INFO, "Sending from lookup to ds-members transactions batch: " - << content); + LOG_GENERAL(INFO, "Sending from lookup to ds-members transactions batch: [" + << content << "]"); SenderTxnBatchThread(std::move(transactions)); } diff --git a/src/libNode/Node.cpp b/src/libNode/Node.cpp index 9ac9b3e1e4..309742760e 100644 --- a/src/libNode/Node.cpp +++ b/src/libNode/Node.cpp @@ -1704,9 +1704,9 @@ bool Node::ProcessTxnPacketFromLookup( return txn.GetTranID().hex(); }), ", "); - LOG_GENERAL(INFO, "Received txns: " << content << ", from " << from - << ", my shardId is: " - << m_mediator.m_node->m_myshardId); + LOG_GENERAL(INFO, "Received txns: [" << content << "], from " << from + << ", my shardId is: " + << m_mediator.m_node->m_myshardId); { // The check here is in case the lookup send the packet diff --git a/src/libServer/APIServerImpl.cpp b/src/libServer/APIServerImpl.cpp index 95817d5b63..cc6eaea2d2 100644 --- a/src/libServer/APIServerImpl.cpp +++ b/src/libServer/APIServerImpl.cpp @@ -350,10 +350,11 @@ bool APIServerImpl::DoListen() { beast::error_code ec; -#define CHECK_EC() \ - if (ec) { \ - LOG_GENERAL(FATAL, "Cannot start API server: " << ec.message() << " port " << m_options.port); \ - return false; \ +#define CHECK_EC() \ + if (ec) { \ + LOG_GENERAL(FATAL, "Cannot start API server: " << ec.message() << " port " \ + << m_options.port); \ + return false; \ } m_acceptor->open(endpoint.protocol(), ec); @@ -460,26 +461,27 @@ void APIServerImpl::AcceptNext() { } void APIServerImpl::OnAccept(beast::error_code ec, tcp::socket socket) { - if (ec || !m_active || !m_started || !socket.is_open()) { + if (!m_active || !m_started) { // stopped, ignore return; } - socket.set_option(asio::socket_base::keep_alive(true), ec); + if (!ec && socket.is_open()) { + socket.set_option(asio::socket_base::keep_alive(true), ec); - auto ep = socket.remote_endpoint(ec); - auto from = ep.address().to_string() + ":" + std::to_string(ep.port()); + auto ep = socket.remote_endpoint(ec); + auto from = ep.address().to_string() + ":" + std::to_string(ep.port()); - ++m_counter; - auto conn = std::make_shared(weak_from_this(), m_counter, from, - std::move(socket), - m_options.inputBodyLimitBytes); - conn->StartReading(); - m_connections[m_counter] = std::move(conn); - - LOG_GENERAL(DEBUG, "Connection #" << m_counter << " from " << from - << ", total=" << m_connections.size()); + ++m_counter; + auto conn = std::make_shared(weak_from_this(), m_counter, from, + std::move(socket), + m_options.inputBodyLimitBytes); + conn->StartReading(); + m_connections[m_counter] = std::move(conn); + LOG_GENERAL(DEBUG, "Connection #" << m_counter << " from " << from + << ", total=" << m_connections.size()); + } AcceptNext(); } diff --git a/src/libServer/DedicatedWebsocketServer.cpp b/src/libServer/DedicatedWebsocketServer.cpp index 87ff1390bf..2daebc4011 100644 --- a/src/libServer/DedicatedWebsocketServer.cpp +++ b/src/libServer/DedicatedWebsocketServer.cpp @@ -264,20 +264,21 @@ void DedicatedWSImpl::AcceptNext() { } void DedicatedWSImpl::OnAccept(beast::error_code ec, tcp::socket socket) { - if (ec || !m_started || !socket.is_open()) { + if (!m_started) { // stopped, ignore return; } - socket.set_option(asio::socket_base::keep_alive(true), ec); - - assert(m_websocket); + if (!ec && socket.is_open()) { + socket.set_option(asio::socket_base::keep_alive(true), ec); - auto ep = socket.remote_endpoint(ec); - auto from = ep.address().to_string() + ":" + std::to_string(ep.port()); + assert(m_websocket); - m_websocket->NewConnection(std::move(from), std::move(socket)); + auto ep = socket.remote_endpoint(ec); + auto from = ep.address().to_string() + ":" + std::to_string(ep.port()); + m_websocket->NewConnection(std::move(from), std::move(socket)); + } AcceptNext(); } From c12b1f71509b5f5b784207dc174265731364e149 Mon Sep 17 00:00:00 2001 From: bzawisto Date: Tue, 7 Nov 2023 11:25:20 +0100 Subject: [PATCH 27/61] Missing file: --- src/libNetwork/P2PServer.cpp | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/libNetwork/P2PServer.cpp b/src/libNetwork/P2PServer.cpp index e9173e038e..fcf620e754 100644 --- a/src/libNetwork/P2PServer.cpp +++ b/src/libNetwork/P2PServer.cpp @@ -109,8 +109,15 @@ class P2PServerImpl : public P2PServer, void AcceptNextConnection() { m_acceptor.async_accept( [wptr = weak_from_this()](const ErrorCode& ec, TcpSocket sock) { - if (!wptr.expired() && ec != OPERATION_ABORTED) { - wptr.lock()->OnAccept(ec, std::move(sock)); + if (!wptr.expired()) { + if (!ec) { + wptr.lock()->OnAccept(ec, std::move(sock)); + } + wptr.lock()->AcceptNextConnection(); + } else { + LOG_GENERAL(WARNING, + "Parent doesn't exist anymore, this may happen only " + "during shutdown phase of Zilliqa"); } }); } @@ -150,8 +157,6 @@ class P2PServerImpl : public P2PServer, m_connections[m_counter] = std::move(conn); // TODO Metric - - AcceptNextConnection(); } else { LOG_GENERAL(FATAL, "Error in accept : " << ec.message()); } @@ -323,17 +328,18 @@ void P2PServerConnection::Close() { void P2PServerConnection::CloseSocket() { ErrorCode ec; - // both close and shutdown should be none blocking calls certainly on current linux - // shutdown marks the socket as blocked for both read and write - // shutdown tells the OS to begin the graceful closedown of the TCP connection. - // close() is a blocking call that waits for the OS to complete the closedown. - // close also frees the OS resources from the program so should be called even if - // an error condition is encountered + // both close and shutdown should be none blocking calls certainly on current + // linux shutdown marks the socket as blocked for both read and write shutdown + // tells the OS to begin the graceful closedown of the TCP connection. close() + // is a blocking call that waits for the OS to complete the closedown. close + // also frees the OS resources from the program so should be called even if an + // error condition is encountered m_socket.shutdown(boost::asio::socket_base::shutdown_both, ec); if (ec) { m_socket.close(ec); if (ec) { - LOG_GENERAL(INFO, "Informational, not an issue - Error closing socket: " << ec.message()); + LOG_GENERAL(INFO, "Informational, not an issue - Error closing socket: " + << ec.message()); } return; } @@ -354,12 +360,14 @@ void P2PServerConnection::CloseSocket() { boost::container::small_vector buf; buf.resize(unread); m_socket.read_some(boost::asio::mutable_buffer(buf.data(), unread), ec); - LOG_GENERAL(INFO, "Draining remaining IO before close" << m_remotePeer.GetPrintableIPAddress()); + LOG_GENERAL(INFO, "Draining remaining IO before close" + << m_remotePeer.GetPrintableIPAddress()); } while (!ec && (unread = m_socket.available(ec)) > 0); } m_socket.close(ec); if (ec) { - LOG_GENERAL(INFO, "Informational, not an issue - Error closing socket: " << ec.message()); + LOG_GENERAL(INFO, "Informational, not an issue - Error closing socket: " + << ec.message()); } } From e39d345262710145f71131544b2376fe3b3bf523 Mon Sep 17 00:00:00 2001 From: bzawisto Date: Tue, 7 Nov 2023 12:05:07 +0100 Subject: [PATCH 28/61] Add more logging --- src/libNetwork/P2PServer.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/libNetwork/P2PServer.cpp b/src/libNetwork/P2PServer.cpp index fcf620e754..1897a49d10 100644 --- a/src/libNetwork/P2PServer.cpp +++ b/src/libNetwork/P2PServer.cpp @@ -110,10 +110,14 @@ class P2PServerImpl : public P2PServer, m_acceptor.async_accept( [wptr = weak_from_this()](const ErrorCode& ec, TcpSocket sock) { if (!wptr.expired()) { + auto parent = wptr.lock(); if (!ec) { - wptr.lock()->OnAccept(ec, std::move(sock)); + parent->OnAccept(ec, std::move(sock)); + } else { + LOG_GENERAL(WARNING, "Got an error from Accept in P2P Server: " + << ec.message()); } - wptr.lock()->AcceptNextConnection(); + parent->AcceptNextConnection(); } else { LOG_GENERAL(WARNING, "Parent doesn't exist anymore, this may happen only " @@ -145,6 +149,7 @@ class P2PServerImpl : public P2PServer, auto maybe_peer = ExtractRemotePeer(socket); if (!maybe_peer) { + LOG_GENERAL(WARNING, "Couldn't get the IP address from remove socket!"); return; } From 3a562edfe4d74e489db513641f1682fee77c4fcf Mon Sep 17 00:00:00 2001 From: bzawisto Date: Tue, 7 Nov 2023 16:21:57 +0100 Subject: [PATCH 29/61] Add heartbeat timer for p2p connections --- src/libNetwork/P2P.cpp | 33 ++++++++++------ src/libNetwork/P2PServer.cpp | 74 ++++++++++++++++++++++++++++++++---- src/libNetwork/SendJobs.cpp | 16 ++++---- 3 files changed, 97 insertions(+), 26 deletions(-) diff --git a/src/libNetwork/P2P.cpp b/src/libNetwork/P2P.cpp index 36fef017cf..03d2b41815 100644 --- a/src/libNetwork/P2P.cpp +++ b/src/libNetwork/P2P.cpp @@ -260,7 +260,9 @@ void P2P::SendBroadcastMessage(const std::deque& peers, /// Special case for cmd line utilities only - blocking void P2P::SendMessageNoQueue(const Peer& peer, const zbytes& message, unsigned char startByteType) { - if (Blacklist::GetInstance().Exist({peer.m_ipAddress,peer.GetListenPortHost(),peer.GetNodeIndentifier()})) { + if (Blacklist::GetInstance().Exist({peer.m_ipAddress, + peer.GetListenPortHost(), + peer.GetNodeIndentifier()})) { LOG_GENERAL(INFO, "The node " << peer << " is in black list, block all message to it."); @@ -365,7 +367,9 @@ bool P2P::DispatchMessage(const Peer& from, ReadMessageResult& result) { LOG_GENERAL(WARNING, "Hash missing or empty broadcast message (messageLength = " << result.message.size() << ")"); - Blacklist::GetInstance().Add({from.GetIpAddress(),from.GetListenPortHost(),from.GetNodeIndentifier()}); + Blacklist::GetInstance().Add({from.GetIpAddress(), + from.GetListenPortHost(), + from.GetNodeIndentifier()}); return false; } @@ -385,8 +389,10 @@ bool P2P::DispatchMessage(const Peer& from, ReadMessageResult& result) { << result.message.size() << "] is unexpectedly large [ >" << MAX_GOSSIP_MSG_SIZE_IN_BYTES << " ]. Will be strictly blacklisting the sender"); - Blacklist::GetInstance().Add({from.GetIpAddress(),from.GetListenPortHost(),from.GetNodeIndentifier()}); // so we don't spend cost sending any data to this - // sender as well. + Blacklist::GetInstance().Add( + {from.GetIpAddress(), from.GetListenPortHost(), + from.GetNodeIndentifier()}); // so we don't spend cost sending any + // data to this sender as well. return false; } if (result.message.size() < @@ -396,7 +402,9 @@ bool P2P::DispatchMessage(const Peer& from, ReadMessageResult& result) { "Gossip Msg Type and/or Gossip Round and/or SNDR LISTNR is missing " "(messageLength = " << result.message.size() << ")"); - Blacklist::GetInstance().Add({from.GetIpAddress(),from.GetListenPortHost(),from.GetNodeIndentifier()}); + Blacklist::GetInstance().Add({from.GetIpAddress(), + from.GetListenPortHost(), + from.GetNodeIndentifier()}); return false; } @@ -404,7 +412,8 @@ bool P2P::DispatchMessage(const Peer& from, ReadMessageResult& result) { } else { // Unexpected start byte. Drop this message LOG_GENERAL(WARNING, "Incorrect start byte " << result.startByte); - Blacklist::GetInstance().Add({from.GetIpAddress(),from.GetListenPortHost(),from.GetNodeIndentifier()}); + Blacklist::GetInstance().Add({from.GetIpAddress(), from.GetListenPortHost(), + from.GetNodeIndentifier()}); return false; } @@ -430,7 +439,9 @@ void P2P::ProcessBroadCastMsg(zbytes& message, zbytes& hash, const Peer& from, } else { LOG_GENERAL(WARNING, "Incorrect message hash. Blacklisting peer " << from.GetPrintableIPAddress()); - Blacklist::GetInstance().Add({from.GetIpAddress(),from.GetListenPortHost(),from.GetNodeIndentifier()}); + Blacklist::GetInstance().Add({from.GetIpAddress(), + from.GetListenPortHost(), + from.GetNodeIndentifier()}); return; } } @@ -509,9 +520,7 @@ void P2P::ProcessGossipMsg(zbytes& message, const Peer& from, } } -P2P::P2P() - : m_rumorManager(std::make_shared()), - m_broadcastCleanupThread([this] { BroadcastCleanupJob(); }) {} +P2P::P2P() : m_rumorManager(std::make_shared()) {} P2P::~P2P() { { @@ -519,7 +528,9 @@ P2P::~P2P() { m_stopped = true; } m_condition.notify_all(); - m_broadcastCleanupThread.join(); + if (m_broadcastCleanupThread.joinable()) { + m_broadcastCleanupThread.join(); + } } } // namespace zil::p2p diff --git a/src/libNetwork/P2PServer.cpp b/src/libNetwork/P2PServer.cpp index 1897a49d10..7eb330f6b4 100644 --- a/src/libNetwork/P2PServer.cpp +++ b/src/libNetwork/P2PServer.cpp @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -31,6 +32,7 @@ namespace zil::p2p { using AsioContext = boost::asio::io_context; +using DeadlineTimer = boost::asio::deadline_timer; using TcpSocket = boost::asio::ip::tcp::socket; using TcpAcceptor = boost::asio::ip::tcp::acceptor; using TcpEndpoint = boost::asio::ip::tcp::endpoint; @@ -38,6 +40,12 @@ using ErrorCode = boost::system::error_code; const ErrorCode OPERATION_ABORTED = boost::asio::error::operation_aborted; const ErrorCode END_OF_FILE = boost::asio::error::eof; +// How long it has to elapse from last successful read to mark connection as +// stale +constexpr auto INACTIVITY_TIME_TO_CLOSE = std::chrono::seconds(180); +// How often we should check if the connection is still 'alive' +constexpr auto HEARTBEAT_CHECK = std::chrono::seconds(60); + class P2PServerImpl; class P2PServerConnection @@ -47,7 +55,7 @@ class P2PServerConnection Peer&& remote_peer, TcpSocket socket, size_t max_message_size); - void ReadNextMessage(); + void StartReading(); void Close(); @@ -56,6 +64,12 @@ class P2PServerConnection void OnBodyRead(const ErrorCode& ec); + void ReadNextMessage(); + + void SetupHeartBeat(); + + void OnHeartBeat(const ErrorCode& ec); + void CloseSocket(); void OnConnectionClosed(); @@ -64,6 +78,9 @@ class P2PServerConnection uint64_t m_id; Peer m_remotePeer; TcpSocket m_socket; + DeadlineTimer m_timer; + std::chrono::steady_clock::time_point m_last_time_packet_received; + bool m_is_marked_as_closed; size_t m_maxMessageSize; zbytes m_readBuffer; }; @@ -107,6 +124,8 @@ class P2PServerImpl : public P2PServer, } void AcceptNextConnection() { + LOG_GENERAL(INFO, + "Scheduling acceptor to asynchronously accept new connection"); m_acceptor.async_accept( [wptr = weak_from_this()](const ErrorCode& ec, TcpSocket sock) { if (!wptr.expired()) { @@ -152,13 +171,14 @@ class P2PServerImpl : public P2PServer, LOG_GENERAL(WARNING, "Couldn't get the IP address from remove socket!"); return; } - + LOG_GENERAL(INFO, "Accepted new connection from: " + << maybe_peer.value().GetPrintableIPAddress()); auto conn = std::make_shared( weak_from_this(), ++m_counter, std::move(maybe_peer.value()), /*m_asio,*/ std::move(socket), m_maxMessageSize); - conn->ReadNextMessage(); + conn->StartReading(); m_connections[m_counter] = std::move(conn); // TODO Metric @@ -202,6 +222,7 @@ std::shared_ptr P2PServer::CreateAndStart(AsioContext& asio, // this call is needed to be decoupled from ctor, because in the ctor // it's impossible to get weak_from_this(), such a subtliety + LOG_GENERAL(INFO, "Starting...."); server->AcceptNextConnection(); return server; @@ -221,8 +242,16 @@ P2PServerConnection::P2PServerConnection(std::weak_ptr owner, m_id(this_id), m_remotePeer(std::move(remote_peer)), m_socket(std::move(socket)), + m_timer(m_socket.get_executor()), + m_last_time_packet_received(std::chrono::steady_clock::now()), + m_is_marked_as_closed(false), m_maxMessageSize(max_message_size) {} +void P2PServerConnection::StartReading() { + SetupHeartBeat(); + ReadNextMessage(); +} + void P2PServerConnection::ReadNextMessage() { static constexpr size_t RESERVE_SIZE = 1024; static constexpr size_t THRESHOLD_SIZE = 1024 * 100; @@ -260,7 +289,7 @@ void P2PServerConnection::OnHeaderRead(const ErrorCode& ec) { } assert(m_readBuffer.size() == HDR_LEN); - + m_last_time_packet_received = std::chrono::steady_clock::now(); auto remainingLength = ReadU32BE(m_readBuffer.data() + 4); if (remainingLength > m_maxMessageSize) { LOG_GENERAL(WARNING, "[blacklist] Encountered data of size: " @@ -301,6 +330,7 @@ void P2PServerConnection::OnBodyRead(const ErrorCode& ec) { OnConnectionClosed(); return; } + m_last_time_packet_received = std::chrono::steady_clock::now(); ReadMessageResult result; auto state = TryReadMessage(m_readBuffer.data(), m_readBuffer.size(), result); @@ -315,7 +345,6 @@ void P2PServerConnection::OnBodyRead(const ErrorCode& ec) { OnConnectionClosed(); return; } - auto owner = m_owner.lock(); if (!owner || !owner->OnMessage(m_id, m_remotePeer, result)) { CloseSocket(); @@ -326,13 +355,43 @@ void P2PServerConnection::OnBodyRead(const ErrorCode& ec) { ReadNextMessage(); } +void P2PServerConnection::SetupHeartBeat() { + ErrorCode ec; + m_timer.cancel(ec); + m_timer.expires_from_now(boost::posix_time::seconds(HEARTBEAT_CHECK.count())); + m_timer.async_wait(std::bind(&P2PServerConnection::OnHeartBeat, + shared_from_this(), std::placeholders::_1)); +} + +void P2PServerConnection::OnHeartBeat(const zil::p2p::ErrorCode& ec) { + if (m_is_marked_as_closed) { + return; + } + + if (!ec && !m_is_marked_as_closed) { + // Timer still can expire without error code despite being explicitly + // cancelled therefore check activity on the socket + if (std::chrono::steady_clock::now() < + m_last_time_packet_received + INACTIVITY_TIME_TO_CLOSE) { + SetupHeartBeat(); + return; + } + LOG_GENERAL(WARNING, "Due to inactivity on socket with peer: " + << m_remotePeer.GetPrintableIPAddress() + << " connection is closed"); + Close(); + } +} + void P2PServerConnection::Close() { + m_is_marked_as_closed = true; m_owner.reset(); CloseSocket(); } void P2PServerConnection::CloseSocket() { ErrorCode ec; + m_timer.cancel(ec); // both close and shutdown should be none blocking calls certainly on current // linux shutdown marks the socket as blocked for both read and write shutdown // tells the OS to begin the graceful closedown of the TCP connection. close() @@ -362,8 +421,9 @@ void P2PServerConnection::CloseSocket() { // before calling close() on a socket. if (unread > 0) { do { - boost::container::small_vector buf; - buf.resize(unread); + constexpr size_t BUFF_SIZE = 4096; + boost::container::small_vector buf; + buf.resize(std::min(unread, BUFF_SIZE)); m_socket.read_some(boost::asio::mutable_buffer(buf.data(), unread), ec); LOG_GENERAL(INFO, "Draining remaining IO before close" << m_remotePeer.GetPrintableIPAddress()); diff --git a/src/libNetwork/SendJobs.cpp b/src/libNetwork/SendJobs.cpp index b55bfd21f8..abaa8f7dfa 100644 --- a/src/libNetwork/SendJobs.cpp +++ b/src/libNetwork/SendJobs.cpp @@ -237,15 +237,15 @@ void CloseGracefully(Socket&& socket) { return; } if (unread > 0) { - boost::container::small_vector buf; - buf.resize(unread); - socket.read_some(boost::asio::mutable_buffer(buf.data(), unread), ec); - } - if (!ec) { - std::make_shared(std::move(socket))->Close(); - } else { - socket.close(ec); + do { + constexpr size_t BUFF_SIZE = 4096; + boost::container::small_vector buf; + buf.resize(std::min(BUFF_SIZE, unread)); + socket.read_some(boost::asio::mutable_buffer(buf.data(), unread), ec); + LOG_GENERAL(INFO, "Draining remaining IO before close"); + } while (!ec && (unread = socket.available(ec)) > 0); } + socket.close(ec); } constinit std::chrono::milliseconds IDLE_TIMEOUT(120000); From 5973b5ebfd553c8f4678efc1256880136d2aa422 Mon Sep 17 00:00:00 2001 From: bzawisto Date: Tue, 7 Nov 2023 16:24:24 +0100 Subject: [PATCH 30/61] Fix --- src/libNetwork/P2P.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/libNetwork/P2P.cpp b/src/libNetwork/P2P.cpp index 03d2b41815..013d491083 100644 --- a/src/libNetwork/P2P.cpp +++ b/src/libNetwork/P2P.cpp @@ -520,7 +520,9 @@ void P2P::ProcessGossipMsg(zbytes& message, const Peer& from, } } -P2P::P2P() : m_rumorManager(std::make_shared()) {} +P2P::P2P() + : m_rumorManager(std::make_shared()), + m_broadcastCleanupThread([this] { BroadcastCleanupJob(); }) {} P2P::~P2P() { { From 051847ec3c5666429b1ac99e20294a9bac09a1a7 Mon Sep 17 00:00:00 2001 From: stephen white Date: Tue, 7 Nov 2023 15:39:32 +0000 Subject: [PATCH 31/61] Made my changes to config descrete and inside localdev under the desk parameter --- docker/Dockerfile | 30 ++++++++++++---------- scripts/localdev.py | 6 ++--- tests/EvmAcceptanceTests/hardhat.config.ts | 3 +-- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index fd1faa5c05..e69b95014c 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -18,7 +18,7 @@ ARG SCILLA_VERSION=v0.13.4 ARG SCILLA_IMAGE=zilliqa/scilla:${SCILLA_VERSION} # Common dependencies of the builder and runner stages. -FROM ubuntu:22.04 AS base +FROM arm64v8/ubuntu:22.04 AS base # Format guideline: one package per line and keep them alphabetically sorted RUN apt-get update \ && apt-get install -y software-properties-common \ @@ -78,12 +78,11 @@ ENV SCCACHE_DIR="/sccache" ENV RUSTC_WRAPPER="/root/.cargo/bin/sccache" ARG CMAKE_VERSION=3.25.1 -RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-Linux-x86_64.sh \ - && echo "6598da34f0e3a0f763809e25cfdd646aa1d5e4d133c4277821e63ae5cfe09457 cmake-${CMAKE_VERSION}-Linux-x86_64.sh" | sha256sum -c \ +RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-Linux-aarch64.sh \ && mkdir -p "${HOME}"/.local \ - && bash ./cmake-${CMAKE_VERSION}-Linux-x86_64.sh --skip-license --prefix="${HOME}"/.local/ \ + && bash ./cmake-${CMAKE_VERSION}-Linux-aarch64.sh --skip-license --prefix="${HOME}"/.local/ \ && "${HOME}"/.local/bin/cmake --version \ - && rm cmake-${CMAKE_VERSION}-Linux-x86_64.sh + && rm cmake-${CMAKE_VERSION}-Linux-aarch64.sh ENV PATH="/root/.local/bin:${PATH}" # Setup ccache @@ -98,6 +97,7 @@ ARG VCPKG_ROOT=/vcpkg RUN ccache -p && ccache -z +ENV VCPKG_FORCE_SYSTEM_BINARIES=1 # If COMMIT_OR_TAG is a branch name or a tag, clone a shallow copy which is # faster; if this fails, just clone the full repo and checkout the commit. RUN git clone https://github.com/microsoft/vcpkg ${VCPKG_ROOT} \ @@ -116,9 +116,11 @@ RUN apt update -y \ && curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - \ && apt update -y && apt install -y google-cloud-cli -ENV VCPKG_BINARY_SOURCES="default,readwrite;x-gcs,gs://vcpkg/ubuntu/22.04/x64-linux-dynamic/${VCPKG_COMMIT_OR_TAG}/,read" +ENV VCPKG_BINARY_SOURCES="default,readwrite;x-gcs,gs://vcpkg/ubuntu/22.04/arm64-linux-dynamic/${VCPKG_COMMIT_OR_TAG}/,readwrite" -RUN --mount=type=cache,target=/root/.cache/vcpkg/ ${VCPKG_ROOT}/vcpkg install --triplet=x64-linux-dynamic +RUN --mount=type=cache,target=/root/.cache/vcpkg/ \ + echo "set(VCPKG_TARGET_ARCHITECTURE arm64)\nset(VCPKG_CRT_LINKAGE dynamic)\nset(VCPKG_LIBRARY_LINKAGE dynamic)\nset(VCPKG_CMAKE_SYSTEM_NAME Linux)\nset(VCPKG_FIXUP_ELF_RPATH ON)" >> ${VCPKG_ROOT}/triplets/community/arm64-linux-dynamic.cmake \ + && ${VCPKG_ROOT}/vcpkg install --triplet=arm64-linux-dynamic ENV INSTALL_DIR=/usr/local ENV CCACHE_DIR="/ccache" @@ -128,13 +130,13 @@ WORKDIR /zilliqa COPY src/libPersistence/*.proto src/libPersistence/ COPY src/libUtils/*.proto src/libUtils/ COPY evm-ds/ evm-ds -RUN --mount=type=cache,target=/sccache/ cd evm-ds && PATH=/zilliqa/build/vcpkg_installed/x64-linux-dynamic/tools/protobuf:$PATH cargo build --release --package evm-ds && sccache --show-stats +RUN --mount=type=cache,target=/sccache/ cd evm-ds && PATH=/zilliqa/build/vcpkg_installed/arm64-linux-dynamic/tools/protobuf:$PATH cargo build --release --package evm-ds && sccache --show-stats RUN ls -l /zilliqa/evm-ds/target -RUN cp /zilliqa/build/vcpkg_installed/x64-linux-dynamic/lib/libffi.so /usr/local/lib \ - && cp /zilliqa/build/vcpkg_installed/x64-linux-dynamic/lib/libssl.so* /usr/local/lib \ - && cp /zilliqa/build/vcpkg_installed/x64-linux-dynamic/lib/libcrypto.so* /usr/local/lib +RUN cp /zilliqa/build/vcpkg_installed/arm64-linux-dynamic/lib/libffi.so /usr/local/lib \ + && cp /zilliqa/build/vcpkg_installed/arm64-linux-dynamic/lib/libssl.so* /usr/local/lib \ + && cp /zilliqa/build/vcpkg_installed/arm64-linux-dynamic/lib/libcrypto.so* /usr/local/lib RUN apt-get install -y patchelf @@ -191,8 +193,8 @@ RUN mkdir -p /scilla/0/bin2/ && cp -L /scilla/0/bin/* /scilla/0/bin2/ && strip / FROM builder AS test_runner RUN mkdir -p \ - /scilla/0/bin /scilla/0/src/stdlib /scilla/0/vcpkg_installed/x64-linux-dynamic \ - && ln -s /usr/local/lib /scilla/0/vcpkg_installed/x64-linux-dynamic + /scilla/0/bin /scilla/0/src/stdlib /scilla/0/vcpkg_installed/arm64-linux-dynamic \ + && ln -s /usr/local/lib /scilla/0/vcpkg_installed/arm64-linux-dynamic # pour in scilla binaries COPY --from=scilla /scilla/0/bin2 /scilla/0/bin # pour in scilla tests @@ -224,7 +226,7 @@ COPY --from=builder /usr/local/lib/*.so* /usr/local/lib/ COPY --from=builder /zilliqa/evm-ds/target/release/evm-ds /usr/local/bin/ COPY --from=builder /zilliqa/evm-ds/log4rs.yml /usr/local/etc/ -ADD https://github.com/krallin/tini/releases/latest/download/tini /tini +ADD https://github.com/krallin/tini/releases/latest/download/tini-arm64 /tini # The above COPY doesn't preserve symlinks which causes gcc/g++/cc/c++ # to hang as stand-alone binaries on Ubuntu 22.04. diff --git a/scripts/localdev.py b/scripts/localdev.py index ddb4990c23..36b6b75751 100755 --- a/scripts/localdev.py +++ b/scripts/localdev.py @@ -763,9 +763,9 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se cmd = ["./bootstrap.py", testnet_name, "--clusters", "minikube", "--constants-from-file", os.path.join(ZILLIQA_DIR, "constants.xml"), "--image", zilliqa_image, - "-n", "15", - "-s", "15", - "-d", "15", + "-n", "40", + "-s", "40", + "-d", "40", "-l", "1", "--guard", "11/0", "--gentxn", "false", diff --git a/tests/EvmAcceptanceTests/hardhat.config.ts b/tests/EvmAcceptanceTests/hardhat.config.ts index b86d4e0fb9..94302deb58 100644 --- a/tests/EvmAcceptanceTests/hardhat.config.ts +++ b/tests/EvmAcceptanceTests/hardhat.config.ts @@ -176,7 +176,6 @@ import "./tasks/Transfer"; import "./tasks/InitSigners"; import "./tasks/RefundSigners"; import "./tasks/SetRewards"; -import "./tasks/Ui"; import {initZilliqa} from "hardhat-scilla-plugin"; -export default config; +export default config; \ No newline at end of file From e6868786d97478e3f6814acc4d0d94b8dd21c878 Mon Sep 17 00:00:00 2001 From: bzawisto Date: Tue, 7 Nov 2023 20:06:29 +0100 Subject: [PATCH 32/61] Minor fix --- src/libNetwork/P2PServer.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/libNetwork/P2PServer.cpp b/src/libNetwork/P2PServer.cpp index 7eb330f6b4..9ec222f44c 100644 --- a/src/libNetwork/P2PServer.cpp +++ b/src/libNetwork/P2PServer.cpp @@ -157,7 +157,7 @@ class P2PServerImpl : public P2PServer, void OnConnectionClosed(uint64_t id) { m_connections.erase(id); // TODO metric about m_connections.size() - LOG_GENERAL(DEBUG, "Total incoming connections: " << m_connections.size()); + LOG_GENERAL(INFO, "Total incoming connections: " << m_connections.size()); } private: @@ -181,6 +181,7 @@ class P2PServerImpl : public P2PServer, conn->StartReading(); m_connections[m_counter] = std::move(conn); + LOG_GENERAL(INFO, "Total incoming connections: " << m_connections.size()); // TODO Metric } else { LOG_GENERAL(FATAL, "Error in accept : " << ec.message()); @@ -379,7 +380,8 @@ void P2PServerConnection::OnHeartBeat(const zil::p2p::ErrorCode& ec) { LOG_GENERAL(WARNING, "Due to inactivity on socket with peer: " << m_remotePeer.GetPrintableIPAddress() << " connection is closed"); - Close(); + CloseSocket(); + OnConnectionClosed(); } } @@ -390,6 +392,7 @@ void P2PServerConnection::Close() { } void P2PServerConnection::CloseSocket() { + m_is_marked_as_closed = true; ErrorCode ec; m_timer.cancel(ec); // both close and shutdown should be none blocking calls certainly on current @@ -398,8 +401,10 @@ void P2PServerConnection::CloseSocket() { // is a blocking call that waits for the OS to complete the closedown. close // also frees the OS resources from the program so should be called even if an // error condition is encountered + LOG_GENERAL(INFO, "Attempting to do a shudtown on a socket"); m_socket.shutdown(boost::asio::socket_base::shutdown_both, ec); if (ec) { + LOG_GENERAL(INFO, "Shutdown completed with an error: " << ec.message()); m_socket.close(ec); if (ec) { LOG_GENERAL(INFO, "Informational, not an issue - Error closing socket: " @@ -408,6 +413,8 @@ void P2PServerConnection::CloseSocket() { return; } size_t unread = m_socket.available(ec); + LOG_GENERAL(INFO, "Number of unread bytes available on socket: " + << unread << ", ec: " << ec.message()); if (ec) { m_socket.close(ec); return; @@ -434,6 +441,8 @@ void P2PServerConnection::CloseSocket() { LOG_GENERAL(INFO, "Informational, not an issue - Error closing socket: " << ec.message()); } + LOG_GENERAL(INFO, "Connection completely closed with peer: " + << m_remotePeer.GetPrintableIPAddress()); } void P2PServerConnection::OnConnectionClosed() { From 14ad622c2a9e82b76d942356d96aed602922eb36 Mon Sep 17 00:00:00 2001 From: bzawisto Date: Wed, 8 Nov 2023 08:54:15 +0100 Subject: [PATCH 33/61] Some fixes --- src/libDirectoryService/DSComposition.cpp | 6 +++--- src/libUtils/IPConverter.cpp | 13 ++++++++++--- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/libDirectoryService/DSComposition.cpp b/src/libDirectoryService/DSComposition.cpp index 288ad36276..032621add4 100644 --- a/src/libDirectoryService/DSComposition.cpp +++ b/src/libDirectoryService/DSComposition.cpp @@ -122,13 +122,13 @@ void UpdateDSCommitteeCompositionCore(const PubKey& selfKeyPub, minerInfo.m_dsNodesEjected.clear(); } - LOG_GENERAL(INFO, "Current dsComm size is: " - << dsComm.size() << ", expected size: " << COMM_SIZE); + LOG_GENERAL(DEBUG, "Current dsComm size is: " + << dsComm.size() << ", expected size: " << COMM_SIZE); // Remove that many members so that new dsComm.size() == COMM_SIZE const auto toRemoveCount = dsComm.size() > COMM_SIZE ? dsComm.size() - COMM_SIZE : 0; - LOG_GENERAL(INFO, + LOG_GENERAL(DEBUG, "Since new dsComm might not equal expected COMM_SIZE, number of " "nodes to be trimmed is: " << toRemoveCount); diff --git a/src/libUtils/IPConverter.cpp b/src/libUtils/IPConverter.cpp index 41e3b76236..d944a73a02 100644 --- a/src/libUtils/IPConverter.cpp +++ b/src/libUtils/IPConverter.cpp @@ -16,6 +16,7 @@ */ #include "IPConverter.h" +#include "libUtils/Logger.h" #include "libUtils/SWInfo.h" #include @@ -121,6 +122,7 @@ bool ToNumericalIPFromStr(const std::string& ipStr, uint128_t& ipInt) { bool ResolveDNS(const std::string& url, const uint32_t& port, uint128_t& ipInt) { + const auto start = std::chrono::steady_clock::now(); try { boost::asio::io_service my_io_service; boost::asio::ip::tcp::resolver resolver(my_io_service); @@ -130,9 +132,14 @@ bool ResolveDNS(const std::string& url, const uint32_t& port, boost::asio::ip::tcp::resolver::iterator end; // End marker. while (iter != end) { boost::asio::ip::tcp::endpoint endpoint = *iter++; - if (endpoint.address().is_v4()) { - return ToNumericalIPFromStr(endpoint.address().to_string(), ipInt); - } + const auto end_time = std::chrono::steady_clock::now(); + LOG_GENERAL(WARNING, + "Milliseconds it took to resolve dns name: " + << (std::chrono::duration_cast( + end_time - start)) + .count() + << " for name: " << url); + return ToNumericalIPFromStr(endpoint.address().to_string(), ipInt); } } catch (std::exception& e) { return false; From f0a2d523c8f0abd336943981c254e4c9dee54e20 Mon Sep 17 00:00:00 2001 From: bzawisto Date: Wed, 8 Nov 2023 12:47:33 +0100 Subject: [PATCH 34/61] Use async dns lookups if needed --- src/libLookup/Lookup.cpp | 54 +++++++++++++++------------------- src/libNetwork/DataSender.cpp | 18 ++---------- src/libNetwork/Peer.cpp | 8 +++-- src/libNetwork/Peer.h | 4 +-- src/libNetwork/SendJobs.cpp | 55 +++++++++++++++++++++++++++++++++-- 5 files changed, 88 insertions(+), 51 deletions(-) diff --git a/src/libLookup/Lookup.cpp b/src/libLookup/Lookup.cpp index 213074fecc..964a4c9366 100644 --- a/src/libLookup/Lookup.cpp +++ b/src/libLookup/Lookup.cpp @@ -652,11 +652,10 @@ void Lookup::SendMessageToLookupNodes(const zbytes& message) const { { lock_guard lock(m_mutexLookupNodes); for (const auto& node : m_lookupNodes) { - auto resolved_ip = TryGettingResolvedIP(node.second); - Blacklist::GetInstance().Whitelist( - {resolved_ip, node.second.GetListenPortHost(), ""}); - Peer tmp(resolved_ip, node.second.GetListenPortHost()); + {node.second.GetIpAddress(), node.second.GetListenPortHost(), ""}); + Peer tmp(node.second.GetIpAddress(), node.second.GetListenPortHost(), + node.second.GetHostname()); LOG_GENERAL(INFO, "Sending to lookup " << tmp); allLookupNodes.emplace_back(tmp); @@ -679,13 +678,11 @@ void Lookup::SendMessageToLookupNodesSerial(const zbytes& message) const { }) != m_multipliers.end()) { continue; } - - auto resolved_ip = TryGettingResolvedIP(node.second); - Blacklist::GetInstance().Whitelist( - {resolved_ip, node.second.GetListenPortHost(), ""}); + {node.second.GetIpAddress(), node.second.GetListenPortHost(), ""}); - Peer tmp(resolved_ip, node.second.GetListenPortHost()); + Peer tmp(node.second.GetIpAddress(), node.second.GetListenPortHost(), + node.second.GetHostname()); LOG_GENERAL(INFO, "Sending to lookup " << tmp); allLookupNodes.emplace_back(tmp); @@ -721,11 +718,11 @@ void Lookup::SendMessageToRandomLookupNode(const zbytes& message) const { } int index = RandomGenerator::GetRandomInt(tmp.size()); - auto resolved_ip = TryGettingResolvedIP(tmp[index].second); - + const auto& peer = tmp[index].second; Blacklist::GetInstance().Whitelist( - {resolved_ip, tmp[index].second.GetListenPortHost(), ""}); - Peer tmpPeer(resolved_ip, tmp[index].second.GetListenPortHost()); + {peer.GetIpAddress(), peer.GetListenPortHost(), ""}); + Peer tmpPeer(peer.GetIpAddress(), peer.GetListenPortHost(), + peer.GetHostname()); LOG_GENERAL(INFO, "Sending to Random lookup: " << tmpPeer); zil::p2p::GetInstance().SendMessage(tmpPeer, message); } @@ -736,11 +733,10 @@ void Lookup::SendMessageToSeedNodes(const zbytes& message) const { lock_guard g(m_mutexSeedNodes); for (const auto& node : m_seedNodes) { - auto resolved_ip = TryGettingResolvedIP(node.second); - Blacklist::GetInstance().Whitelist( - {resolved_ip, node.second.GetListenPortHost(), ""}); - Peer tmpPeer(resolved_ip, node.second.GetListenPortHost()); + {node.second.GetIpAddress(), node.second.GetListenPortHost(), ""}); + Peer tmpPeer(node.second.GetIpAddress(), node.second.GetListenPortHost(), + node.second.GetHostname()); LOG_EPOCH(INFO, m_mediator.m_currentEpochNum, "Sending msg to seed node " << tmpPeer); seedNodePeer.emplace_back(tmpPeer); @@ -1256,12 +1252,12 @@ void Lookup::SendMessageToRandomL2lDataProvider(const zbytes& message) const { } int index = RandomGenerator::GetRandomInt(m_l2lDataProviders.size()); - auto resolved_ip = TryGettingResolvedIP(m_l2lDataProviders[index].second); + const auto& peer = m_l2lDataProviders[index].second; Blacklist::GetInstance().Whitelist( - {resolved_ip, m_l2lDataProviders[index].second.GetListenPortHost(), ""}); - Peer tmpPeer(resolved_ip, - m_l2lDataProviders[index].second.GetListenPortHost()); + {peer.GetIpAddress(), peer.GetListenPortHost(), ""}); + Peer tmpPeer(peer.GetIpAddress(), peer.GetListenPortHost(), + peer.GetHostname()); LOG_GENERAL(INFO, "Sending message to l2l: " << tmpPeer); unsigned char startByte = zil::p2p::START_BYTE_NORMAL; // TODO Disabled in updated protocol @@ -1281,14 +1277,14 @@ void Lookup::SendMessageToRandomSeedNode(const zbytes& message) const { } for (const auto& node : m_seedNodes) { - auto seedNodeIpToSend = TryGettingResolvedIP(node.second); - if (!Blacklist::GetInstance().Exist({seedNodeIpToSend, + if (!Blacklist::GetInstance().Exist({node.second.GetIpAddress(), node.second.GetListenPortHost(), node.second.GetNodeIndentifier()}) && - (m_mediator.m_selfPeer.GetIpAddress() != seedNodeIpToSend)) { - notBlackListedSeedNodes.push_back( - Peer(seedNodeIpToSend, node.second.GetListenPortHost(), - node.second.GetNodeIndentifier())); + (m_mediator.m_selfPeer.GetIpAddress() != + node.second.GetIpAddress())) { + notBlackListedSeedNodes.push_back(Peer(node.second.GetIpAddress(), + node.second.GetListenPortHost(), + node.second.GetHostname())); } } } @@ -5235,9 +5231,7 @@ void Lookup::RemoveSeedNodesFromBlackList() { lock_guard lock(m_mutexSeedNodes); for (auto& node : m_seedNodes) { - auto seedNodeIp = TryGettingResolvedIP(node.second); - - Blacklist::GetInstance().Remove({seedNodeIp, + Blacklist::GetInstance().Remove({node.second.GetIpAddress(), node.second.GetListenPortHost(), node.second.GetNodeIndentifier()}); } diff --git a/src/libNetwork/DataSender.cpp b/src/libNetwork/DataSender.cpp index eb95c33c3e..bc59024a28 100644 --- a/src/libNetwork/DataSender.cpp +++ b/src/libNetwork/DataSender.cpp @@ -38,24 +38,12 @@ void SendDataToLookupNodesDefault(const VectorOfNode& lookups, vector allLookupNodes; for (auto& node : lookups) { - string url = node.second.GetHostname(); - auto resolved_ip = node.second.GetIpAddress(); // existing one - if (!url.empty()) { - uint128_t tmpIp; - if (IPConverter::ResolveDNS(url, node.second.GetListenPortHost(), - tmpIp)) { - resolved_ip = tmpIp; // resolved one - } else { - LOG_GENERAL(WARNING, "Unable to resolve DNS for " << url); - } - } - Blacklist::GetInstance().Whitelist( - {resolved_ip, node.second.GetListenPortHost(), + {node.second.GetIpAddress(), node.second.GetListenPortHost(), node.second.GetNodeIndentifier()}); // exclude this lookup ip from // blacklisting - Peer tmp(resolved_ip, node.second.GetListenPortHost(), - node.second.GetNodeIndentifier()); + Peer tmp(node.second.GetIpAddress(), node.second.GetListenPortHost(), + node.second.GetHostname()); LOG_GENERAL(INFO, "Sending to lookup " << tmp); allLookupNodes.emplace_back(tmp); diff --git a/src/libNetwork/Peer.cpp b/src/libNetwork/Peer.cpp index 01d7ed3c32..3cef47f1a8 100644 --- a/src/libNetwork/Peer.cpp +++ b/src/libNetwork/Peer.cpp @@ -26,8 +26,12 @@ using namespace boost::multiprecision; Peer::Peer() : m_ipAddress(0), m_listenPortHost(0) {} -Peer::Peer(const uint128_t& ip_address, uint32_t listen_port_host, const std::string& nodeIndentifier) - : m_ipAddress(ip_address), m_listenPortHost(listen_port_host), m_nodeIndentifier(nodeIndentifier) {} +Peer::Peer(const uint128_t& ip_address, uint32_t listen_port_host, + const std::string& hostname, const std::string& identifier) + : m_ipAddress(ip_address), + m_listenPortHost(listen_port_host), + m_hostname(hostname), + m_nodeIndentifier(identifier) {} Peer::Peer(const zbytes& src, unsigned int offset) : m_ipAddress(0), m_listenPortHost(0) { diff --git a/src/libNetwork/Peer.h b/src/libNetwork/Peer.h index 4a71f7102f..f2e0766a6e 100644 --- a/src/libNetwork/Peer.h +++ b/src/libNetwork/Peer.h @@ -40,7 +40,8 @@ struct Peer : public Serializable { Peer(); /// Constructor with specified IP info. - Peer(const uint128_t& ip_address, uint32_t listen_port_host, const std::string& nodeIndentifier=""); + Peer(const uint128_t& ip_address, uint32_t listen_port_host, + const std::string& hostname = "", const std::string& identifier = ""); /// Constructor for loading peer information from a byte stream. Peer(const zbytes& src, unsigned int offset); @@ -80,7 +81,6 @@ struct Peer : public Serializable { const uint32_t& GetListenPortHost() const; const std::string GetHostname() const; const std::string GetNodeIndentifier() const; - }; namespace IPCHECK { static inline bool IsPortValid(const uint32_t listenPort) { diff --git a/src/libNetwork/SendJobs.cpp b/src/libNetwork/SendJobs.cpp index abaa8f7dfa..23cf85f3cf 100644 --- a/src/libNetwork/SendJobs.cpp +++ b/src/libNetwork/SendJobs.cpp @@ -104,6 +104,7 @@ static SendJobsVariables variables{}; namespace zil::p2p { using AsioContext = boost::asio::io_context; +using Tcp = boost::asio::ip::tcp; using Socket = boost::asio::ip::tcp::socket; using Endpoint = boost::asio::ip::tcp::endpoint; using SteadyTimer = boost::asio::steady_timer; @@ -268,6 +269,7 @@ class PeerSendQueue : public std::enable_shared_from_this { m_doneCallback(done_cb), m_peer(std::move(peer)), m_socket(m_asioContext), + m_resolver(m_asioContext), m_timer(m_asioContext), m_messageExpireTime(std::max(15000u, TX_DISTRIBUTE_TIME_IN_MS * 5 / 6)), m_isMultiplier(is_multiplier), @@ -283,7 +285,7 @@ class PeerSendQueue : public std::enable_shared_from_this { item.expires_at = Clock() + m_messageExpireTime; if (m_queue.size() == 1) { if (!m_connected) { - Connect(); + Resolve(); } else { SendMessage(); } @@ -299,6 +301,52 @@ class PeerSendQueue : public std::enable_shared_from_this { } private: + void Resolve() { + if (!std::empty(m_peer.GetHostname())) { + m_resolver.async_resolve( + m_peer.GetHostname(), "", + [self = shared_from_this()]( + const ErrorCode& ec, + const Tcp::resolver::results_type& endpoints) { + if (!ec) { + self->OnResolved(endpoints); + } else { + LOG_GENERAL(WARNING, "Unable to resolve dns name: " + << self->m_peer.GetHostname()); + self->Done(); + } + }); + + } else { + Connect(); + } + } + + void OnResolved(const Tcp::resolver::results_type& endpoints) { + ErrorCode ignored; + m_timer.cancel(ignored); + + WaitTimer(m_timer, Milliseconds{CONNECTION_TIMEOUT_IN_MS}, [this]() { + m_socket.cancel(); + OnConnected(TIMED_OUT); + }); + + boost::asio::async_connect( + m_socket, endpoints, + [self = shared_from_this()](const ErrorCode& ec, + const Endpoint& endpoint) { + if (ec != OPERATION_ABORTED) { + self->m_endpoint = endpoint; + LOG_GENERAL(DEBUG, "Connection to " << self->m_endpoint << ": " + << ec.message() << " (" << ec + << ')'); + + self->m_timer.cancel(); + self->OnConnected(ec); + } + }); + } + void Connect() { ErrorCode ec; @@ -437,7 +485,7 @@ class PeerSendQueue : public std::enable_shared_from_this { LOG_GENERAL(INFO, "Peer " << m_peer << " reconnects"); CloseGracefully(std::move(m_socket)); m_socket = Socket(m_asioContext); - Connect(); + Resolve(); } void Done() { @@ -463,6 +511,9 @@ class PeerSendQueue : public std::enable_shared_from_this { // tcp socket Socket m_socket; + // Resolved for asynchronous dns lookups + Tcp::resolver m_resolver; + // Timer is used SteadyTimer m_timer; From 625d02be749354fb8bcadc9dfe8a24d43c124de9 Mon Sep 17 00:00:00 2001 From: bzawisto Date: Wed, 8 Nov 2023 15:35:11 +0100 Subject: [PATCH 35/61] Better logging --- src/libNetwork/SendJobs.cpp | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/libNetwork/SendJobs.cpp b/src/libNetwork/SendJobs.cpp index 23cf85f3cf..bec770f761 100644 --- a/src/libNetwork/SendJobs.cpp +++ b/src/libNetwork/SendJobs.cpp @@ -337,9 +337,9 @@ class PeerSendQueue : public std::enable_shared_from_this { const Endpoint& endpoint) { if (ec != OPERATION_ABORTED) { self->m_endpoint = endpoint; - LOG_GENERAL(DEBUG, "Connection to " << self->m_endpoint << ": " - << ec.message() << " (" << ec - << ')'); + LOG_GENERAL(DEBUG, "Connection (via async resolve) to " + << self->m_endpoint << ": " << ec.message() + << " (" << ec << ')'); self->m_timer.cancel(); self->OnConnected(ec); @@ -370,15 +370,16 @@ class PeerSendQueue : public std::enable_shared_from_this { OnConnected(TIMED_OUT); }); - m_socket.async_connect(m_endpoint, [self = shared_from_this()]( - const ErrorCode& ec) { - LOG_GENERAL(DEBUG, "Connection to " << self->m_endpoint << ": " - << ec.message() << " (" << ec << ')'); - if (ec != OPERATION_ABORTED) { - self->m_timer.cancel(); - self->OnConnected(ec); - } - }); + m_socket.async_connect( + m_endpoint, [self = shared_from_this()](const ErrorCode& ec) { + LOG_GENERAL(DEBUG, "Connection (via direct ip) to " + << self->m_endpoint << ": " << ec.message() + << " (" << ec << ')'); + if (ec != OPERATION_ABORTED) { + self->m_timer.cancel(); + self->OnConnected(ec); + } + }); } void OnConnected(const ErrorCode& ec) { @@ -621,6 +622,9 @@ class SendJobsImpl : public SendJobs, } // explicit Close() because shared_ptr may be reused in async operation + LOG_GENERAL( + INFO, "Nothing else to be sent to peer, so closing socket with remote: " + << peer.GetPrintableIPAddress()); it->second->Close(); m_activePeers.erase(it); } From ae0b14b316a3d28c361f7b2f82da9a8540aa7e5f Mon Sep 17 00:00:00 2001 From: Chetan Phirke Date: Tue, 17 Oct 2023 15:08:43 +0800 Subject: [PATCH 36/61] fix merge problem --- src/libConsensus/ConsensusBackup.cpp | 3 + src/libConsensus/ConsensusLeader.cpp | 80 +++++++++++++------ src/libConsensus/ConsensusLeader.h | 2 +- .../DSBlockPreProcessing.cpp | 2 +- .../FinalBlockPreProcessing.cpp | 2 +- .../ViewChangePreProcessing.cpp | 2 +- src/libNetwork/SendJobs.cpp | 3 +- 7 files changed, 63 insertions(+), 31 deletions(-) diff --git a/src/libConsensus/ConsensusBackup.cpp b/src/libConsensus/ConsensusBackup.cpp index e1e3035401..7f3daad9fa 100644 --- a/src/libConsensus/ConsensusBackup.cpp +++ b/src/libConsensus/ConsensusBackup.cpp @@ -348,6 +348,9 @@ bool ConsensusBackup::ProcessMessageChallengeCore( // Unicast to the leader // ===================== LOG_GENERAL(WARNING, "Uni-casting response to leader (message challenge)"); + LOG_GENERAL(INFO, "Sending response to = " + << GetCommitteeMember(m_leaderID).second); + zil::p2p::GetInstance().SendMessage(GetCommitteeMember(m_leaderID).second, response); diff --git a/src/libConsensus/ConsensusLeader.cpp b/src/libConsensus/ConsensusLeader.cpp index e534077de7..ec70421109 100644 --- a/src/libConsensus/ConsensusLeader.cpp +++ b/src/libConsensus/ConsensusLeader.cpp @@ -325,6 +325,10 @@ bool ConsensusLeader::StartConsensusSubsets() { std::mt19937 randomEngine(randomDevice()); shuffle(peerInfo.begin(), peerInfo.end(), randomEngine); + for (const auto& peer : peerInfo) { + LOG_GENERAL(INFO, "Sending challenge to = " << peer); + } + zil::p2p::GetInstance().SendMessage(peerInfo, challenge, zil::p2p::START_BYTE_NORMAL, true, true); @@ -693,6 +697,7 @@ bool ConsensusLeader::ProcessMessageResponseCore( } bool guardInOtherSubsets = false; + LOG_GENERAL(INFO, "Response sender1 = "<= 0; subsetID--) { // Check subset state @@ -861,6 +866,7 @@ bool ConsensusLeader::ProcessMessageResponseCore( "= " << m_numForConsensus << " Actual = " << m_commitCounter); m_state = ERROR; + Audit(false); zil::local::variables.SetConsensusState(int(m_state)); zil::local::variables.AddConsensusError(1); } else { @@ -1162,6 +1168,7 @@ bool ConsensusLeader::ProcessMessage(const zbytes& message, unsigned int offset, result = ProcessMessageCommitFailure(message, offset + 1, from); break; case ConsensusMessageType::RESPONSE: + LOG_GENERAL(INFO, "Response sender = "< g(m_mutex); - for (unsigned int subsetID = 0; subsetID < m_consensusSubsets.size(); - subsetID++) { - ConsensusSubset& subset = m_consensusSubsets.at(subsetID); + LOG_GENERAL(INFO, "Leader State = " << GetStateString(m_state.load())); - LogResponsesStats(subsetID); + auto responseAudit = [this]() -> void { + for (auto subsetID = 0u; subsetID < m_consensusSubsets.size(); subsetID++) { + ConsensusSubset& subset = m_consensusSubsets.at(subsetID); - if ((subset.state == CHALLENGE_DONE) || - (subset.state == FINALCHALLENGE_DONE)) { - if (subset.commitMap.size() != m_committee.size()) { - LOG_GENERAL(WARNING, "Wrong commit map size"); - continue; - } - if (subset.commitMap.size() != subset.responseMap.size()) { - LOG_GENERAL(WARNING, "Wrong response map size"); - continue; - } + LogResponsesStats(subsetID); - LOG_GENERAL(INFO, "[Subset " << subsetID << "] State = " - << GetStateString(subset.state)); - LOG_GENERAL(INFO, "Missing responses:"); + if (subset.state == ConsensusCommon::State::CHALLENGE_DONE || + subset.state == ConsensusCommon::State::FINALCHALLENGE_DONE) { + if (subset.commitMap.size() != m_committee.size()) { + LOG_GENERAL(WARNING, "Wrong commit map size"); + LOG_GENERAL(WARNING, "Commit map size: " << subset.commitMap.size()); + LOG_GENERAL(WARNING, "Committee size: " << m_committee.size()); + continue; + } + if (subset.commitMap.size() != subset.responseMap.size()) { + LOG_GENERAL(WARNING, "Wrong response map size"); + LOG_GENERAL(WARNING, + "Commit map size: " << subset.commitMap.size()); + LOG_GENERAL(WARNING, + "Response map size: " << subset.responseMap.size()); + continue; + } + + LOG_GENERAL(INFO, "[Subset " << subsetID << "] State = " + << GetStateString(subset.state)); + LOG_GENERAL(INFO, "Missing responses:"); - for (unsigned int peerIndex = 0; peerIndex < m_committee.size(); - peerIndex++) { - if (subset.commitMap.at(peerIndex) && - !subset.responseMap.at(peerIndex)) { - LOG_GENERAL(INFO, "[" << PAD(peerIndex, 3, ' ') << "] " - << m_committee.at(peerIndex).second); + for (auto peerIndex = 0u; peerIndex < m_committee.size(); peerIndex++) { + if (subset.commitMap.at(peerIndex) && + !subset.responseMap.at(peerIndex)) { + LOG_GENERAL(INFO, "[" << PAD(peerIndex, 3, ' ') << "] " + << m_committee.at(peerIndex).second); + } } } } + }; + + auto commitAudit = [this]() -> void { + LOG_GENERAL(INFO, "Missing commits:"); + for (auto peerIndex = 0u; peerIndex < m_commitMap.size(); ++peerIndex) { + if (!m_commitMap.at(peerIndex)) { + LOG_GENERAL(INFO, "Missing [" << PAD(peerIndex, 3, ' ') << "] " + << m_committee.at(peerIndex).second); + } + } + }; + + if (checkForResponses) { + responseAudit(); + } else { + commitAudit(); } } - #define MAKE_LITERAL_PAIR(s) \ { s, #s } diff --git a/src/libConsensus/ConsensusLeader.h b/src/libConsensus/ConsensusLeader.h index a4e9de5739..943a71a736 100644 --- a/src/libConsensus/ConsensusLeader.h +++ b/src/libConsensus/ConsensusLeader.h @@ -160,7 +160,7 @@ class ConsensusLeader : public ConsensusCommon { unsigned int GetNumForConsensusFailure() { return m_numForConsensusFailure; } /// Function to check for missing responses - void Audit(); + void Audit(bool checkForResponses); /// Function to log the responses stats void LogResponsesStats(unsigned int subsetID); diff --git a/src/libDirectoryService/DSBlockPreProcessing.cpp b/src/libDirectoryService/DSBlockPreProcessing.cpp index 58d1fcf9cd..c9d0ebe48d 100644 --- a/src/libDirectoryService/DSBlockPreProcessing.cpp +++ b/src/libDirectoryService/DSBlockPreProcessing.cpp @@ -1507,7 +1507,7 @@ void DirectoryService::RunConsensusOnDSBlock() { ConsensusLeader* cl = dynamic_cast(m_consensusObject.get()); if (cl != nullptr) { - cl->Audit(); + cl->Audit(true); } } diff --git a/src/libDirectoryService/FinalBlockPreProcessing.cpp b/src/libDirectoryService/FinalBlockPreProcessing.cpp index 8c8b31c1ed..bf799e7102 100644 --- a/src/libDirectoryService/FinalBlockPreProcessing.cpp +++ b/src/libDirectoryService/FinalBlockPreProcessing.cpp @@ -1400,7 +1400,7 @@ void DirectoryService::RunConsensusOnFinalBlock() { ConsensusLeader* cl = dynamic_cast(m_consensusObject.get()); if (cl != nullptr) { - cl->Audit(); + cl->Audit(true); } } diff --git a/src/libDirectoryService/ViewChangePreProcessing.cpp b/src/libDirectoryService/ViewChangePreProcessing.cpp index cc099d727e..ba3e0cb409 100644 --- a/src/libDirectoryService/ViewChangePreProcessing.cpp +++ b/src/libDirectoryService/ViewChangePreProcessing.cpp @@ -374,7 +374,7 @@ void DirectoryService::ScheduleViewChangeTimeout() { ConsensusLeader* cl = dynamic_cast(m_consensusObject.get()); if (cl != nullptr) { - cl->Audit(); + cl->Audit(true); } } diff --git a/src/libNetwork/SendJobs.cpp b/src/libNetwork/SendJobs.cpp index bec770f761..109b087f4f 100644 --- a/src/libNetwork/SendJobs.cpp +++ b/src/libNetwork/SendJobs.cpp @@ -560,8 +560,7 @@ class SendJobsImpl : public SendJobs, return; } - LOG_GENERAL(DEBUG, "Enqueueing message, size=" << message.size - << " peer = " << peer); + LOG_GENERAL(DEBUG, "Enqueueing message, size=" << message.size <<" peer = "<< peer); // this fn enqueues the lambda to be executed on WorkerThread with // sequential guarantees for messages from every calling thread From 4df95b6b5df14363904d87453b2fe8a5997c5266 Mon Sep 17 00:00:00 2001 From: Chetan Phirke Date: Wed, 8 Nov 2023 21:26:11 +0530 Subject: [PATCH 37/61] log both commit and response audit --- src/libConsensus/ConsensusLeader.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/libConsensus/ConsensusLeader.cpp b/src/libConsensus/ConsensusLeader.cpp index ec70421109..7d7aa14b8e 100644 --- a/src/libConsensus/ConsensusLeader.cpp +++ b/src/libConsensus/ConsensusLeader.cpp @@ -1239,12 +1239,8 @@ void ConsensusLeader::Audit(bool checkForResponses) { } } }; - - if (checkForResponses) { - responseAudit(); - } else { - commitAudit(); - } + commitAudit(); + responseAudit(); } #define MAKE_LITERAL_PAIR(s) \ { s, #s } From 99a19926698557c63927208a07d49bb7981ae3e6 Mon Sep 17 00:00:00 2001 From: stephen Date: Wed, 8 Nov 2023 16:48:20 +0000 Subject: [PATCH 38/61] overwrote with mac version - oops --- docker/Dockerfile | 30 ++++++++++++++---------------- scripts/localdev.py | 43 ++++++++++++++++++++----------------------- 2 files changed, 34 insertions(+), 39 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index e69b95014c..fd1faa5c05 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -18,7 +18,7 @@ ARG SCILLA_VERSION=v0.13.4 ARG SCILLA_IMAGE=zilliqa/scilla:${SCILLA_VERSION} # Common dependencies of the builder and runner stages. -FROM arm64v8/ubuntu:22.04 AS base +FROM ubuntu:22.04 AS base # Format guideline: one package per line and keep them alphabetically sorted RUN apt-get update \ && apt-get install -y software-properties-common \ @@ -78,11 +78,12 @@ ENV SCCACHE_DIR="/sccache" ENV RUSTC_WRAPPER="/root/.cargo/bin/sccache" ARG CMAKE_VERSION=3.25.1 -RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-Linux-aarch64.sh \ +RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-Linux-x86_64.sh \ + && echo "6598da34f0e3a0f763809e25cfdd646aa1d5e4d133c4277821e63ae5cfe09457 cmake-${CMAKE_VERSION}-Linux-x86_64.sh" | sha256sum -c \ && mkdir -p "${HOME}"/.local \ - && bash ./cmake-${CMAKE_VERSION}-Linux-aarch64.sh --skip-license --prefix="${HOME}"/.local/ \ + && bash ./cmake-${CMAKE_VERSION}-Linux-x86_64.sh --skip-license --prefix="${HOME}"/.local/ \ && "${HOME}"/.local/bin/cmake --version \ - && rm cmake-${CMAKE_VERSION}-Linux-aarch64.sh + && rm cmake-${CMAKE_VERSION}-Linux-x86_64.sh ENV PATH="/root/.local/bin:${PATH}" # Setup ccache @@ -97,7 +98,6 @@ ARG VCPKG_ROOT=/vcpkg RUN ccache -p && ccache -z -ENV VCPKG_FORCE_SYSTEM_BINARIES=1 # If COMMIT_OR_TAG is a branch name or a tag, clone a shallow copy which is # faster; if this fails, just clone the full repo and checkout the commit. RUN git clone https://github.com/microsoft/vcpkg ${VCPKG_ROOT} \ @@ -116,11 +116,9 @@ RUN apt update -y \ && curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - \ && apt update -y && apt install -y google-cloud-cli -ENV VCPKG_BINARY_SOURCES="default,readwrite;x-gcs,gs://vcpkg/ubuntu/22.04/arm64-linux-dynamic/${VCPKG_COMMIT_OR_TAG}/,readwrite" +ENV VCPKG_BINARY_SOURCES="default,readwrite;x-gcs,gs://vcpkg/ubuntu/22.04/x64-linux-dynamic/${VCPKG_COMMIT_OR_TAG}/,read" -RUN --mount=type=cache,target=/root/.cache/vcpkg/ \ - echo "set(VCPKG_TARGET_ARCHITECTURE arm64)\nset(VCPKG_CRT_LINKAGE dynamic)\nset(VCPKG_LIBRARY_LINKAGE dynamic)\nset(VCPKG_CMAKE_SYSTEM_NAME Linux)\nset(VCPKG_FIXUP_ELF_RPATH ON)" >> ${VCPKG_ROOT}/triplets/community/arm64-linux-dynamic.cmake \ - && ${VCPKG_ROOT}/vcpkg install --triplet=arm64-linux-dynamic +RUN --mount=type=cache,target=/root/.cache/vcpkg/ ${VCPKG_ROOT}/vcpkg install --triplet=x64-linux-dynamic ENV INSTALL_DIR=/usr/local ENV CCACHE_DIR="/ccache" @@ -130,13 +128,13 @@ WORKDIR /zilliqa COPY src/libPersistence/*.proto src/libPersistence/ COPY src/libUtils/*.proto src/libUtils/ COPY evm-ds/ evm-ds -RUN --mount=type=cache,target=/sccache/ cd evm-ds && PATH=/zilliqa/build/vcpkg_installed/arm64-linux-dynamic/tools/protobuf:$PATH cargo build --release --package evm-ds && sccache --show-stats +RUN --mount=type=cache,target=/sccache/ cd evm-ds && PATH=/zilliqa/build/vcpkg_installed/x64-linux-dynamic/tools/protobuf:$PATH cargo build --release --package evm-ds && sccache --show-stats RUN ls -l /zilliqa/evm-ds/target -RUN cp /zilliqa/build/vcpkg_installed/arm64-linux-dynamic/lib/libffi.so /usr/local/lib \ - && cp /zilliqa/build/vcpkg_installed/arm64-linux-dynamic/lib/libssl.so* /usr/local/lib \ - && cp /zilliqa/build/vcpkg_installed/arm64-linux-dynamic/lib/libcrypto.so* /usr/local/lib +RUN cp /zilliqa/build/vcpkg_installed/x64-linux-dynamic/lib/libffi.so /usr/local/lib \ + && cp /zilliqa/build/vcpkg_installed/x64-linux-dynamic/lib/libssl.so* /usr/local/lib \ + && cp /zilliqa/build/vcpkg_installed/x64-linux-dynamic/lib/libcrypto.so* /usr/local/lib RUN apt-get install -y patchelf @@ -193,8 +191,8 @@ RUN mkdir -p /scilla/0/bin2/ && cp -L /scilla/0/bin/* /scilla/0/bin2/ && strip / FROM builder AS test_runner RUN mkdir -p \ - /scilla/0/bin /scilla/0/src/stdlib /scilla/0/vcpkg_installed/arm64-linux-dynamic \ - && ln -s /usr/local/lib /scilla/0/vcpkg_installed/arm64-linux-dynamic + /scilla/0/bin /scilla/0/src/stdlib /scilla/0/vcpkg_installed/x64-linux-dynamic \ + && ln -s /usr/local/lib /scilla/0/vcpkg_installed/x64-linux-dynamic # pour in scilla binaries COPY --from=scilla /scilla/0/bin2 /scilla/0/bin # pour in scilla tests @@ -226,7 +224,7 @@ COPY --from=builder /usr/local/lib/*.so* /usr/local/lib/ COPY --from=builder /zilliqa/evm-ds/target/release/evm-ds /usr/local/bin/ COPY --from=builder /zilliqa/evm-ds/log4rs.yml /usr/local/etc/ -ADD https://github.com/krallin/tini/releases/latest/download/tini-arm64 /tini +ADD https://github.com/krallin/tini/releases/latest/download/tini /tini # The above COPY doesn't preserve symlinks which causes gcc/g++/cc/c++ # to hang as stand-alone binaries on Ubuntu 22.04. diff --git a/scripts/localdev.py b/scripts/localdev.py index 59951b63e1..51d32e926a 100755 --- a/scripts/localdev.py +++ b/scripts/localdev.py @@ -427,12 +427,12 @@ def prometheus_up(config, testnet_name, count = 8): ips.append(pod_ip) - if len(ips) != count: + if len(ips) < count: # If for some reason you see the following line repeating indefinitely when # bringing up a devnet, it's most likely because the count is incorrect either # due to a change in write_testnet_configuration or in the testnet repo (perhaps # someone added/removed pods?). - print(f"Waiting for all pods to be assigned an IP...") + print(f"Waiting for {count} pods to be assigned an IP... got {len(ips)}") time.sleep(2) else: break @@ -749,10 +749,11 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se cmd = ["./bootstrap.py", testnet_name, "--clusters", "minikube", "--constants-from-file", os.path.join(ZILLIQA_DIR, "constants.xml"), "--image", zilliqa_image, - "-n", "6", - "-d", "5", + "-n", "7", + "-s", "7", + "-d", "7", "-l", "1", - "--guard", "4/0", + "--guard", "5/0", "--gentxn", "false", "--multiplier-fanout", "1", "--host-network", "false", @@ -790,30 +791,25 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se constants_xml_target_path = os.path.join(TESTNET_DIR, f"{testnet_name}/configmap/constants.xml") config_file = xml.dom.minidom.parse(constants_xml_target_path) + if desk: print("Explicitly disabling all telemetry for desktop testing mode") xml_replace_element(config_file, config_file.documentElement, "DEBUG_LEVEL", "3") - xml_replace_element(config_file, config_file.documentElement, "BROADCAST_GOSSIP_MODE", "false") + xml_replace_element(config_file, config_file.documentElement, "BROADCAST_GOSSIP_MODE", "true") xml_replace_element(config_file, config_file.documentElement, "SEND_RESPONSE_FOR_LAZY_PUSH", "false") xml_replace_element(config_file, config_file.documentElement, "MAX_NEIGHBORS_PER_ROUND", "5") xml_replace_element(config_file, config_file.documentElement, "NUM_GOSSIP_RECEIVERS", "5") - xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_HOSTNAME", "") - xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PORT", "0") - xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PROVIDER", "NONE") - xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_MASK", "NONE") - xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_HOSTNAME", "") - xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_PORT", "") - xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_PROVIDER", "NONE") - xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_MASK", "NONE") - else: - xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_HOSTNAME", "0.0.0.0") - xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PORT", "0") - xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PROVIDER", "NONE") - xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_MASK", "NONE") - xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_HOSTNAME", "tempo.default.svc.cluster.local") - xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_PORT", "4317") - xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_PROVIDER", "OTLPGRPC") - xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_MASK", "ALL") + + + xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_HOSTNAME", "0.0.0.0") + xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PORT", "8090") + xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PROVIDER", "PROMETHEUS") + xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_MASK", "ALL") + xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_HOSTNAME", "tempo.default.svc.cluster.local") + xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_PORT", "4317") + + xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_PROVIDER", "NONE") + xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_MASK", "NONE") if chain_id is not None: xml_replace_element(config_file, config_file.documentElement, "CHAIN_ID", chain_id) output_config = config_file.toprettyxml(newl='') @@ -913,6 +909,7 @@ def build_native_to_workspace(config): pass build_env = os.environ.copy() build_env['SCILLA_REPO_ROOT'] = SCILLA_DIR + build_env['EXTRA_BUILD_PARAMS'] = "tests debug" # Let's start off by building Scilla, in case it breaks. run_or_die(config, ["make"], in_dir = SCILLA_DIR, env = build_env) run_or_die(config, ["./build.sh"], in_dir = ZILLIQA_DIR) From 8ab37f2b745447b39fd5698a755d83f8b164f438 Mon Sep 17 00:00:00 2001 From: stephen Date: Wed, 8 Nov 2023 17:16:19 +0000 Subject: [PATCH 39/61] overwrote with mac version - oops --- scripts/localdev.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/localdev.py b/scripts/localdev.py index 51d32e926a..49d1ddd988 100755 --- a/scripts/localdev.py +++ b/scripts/localdev.py @@ -795,12 +795,12 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se if desk: print("Explicitly disabling all telemetry for desktop testing mode") xml_replace_element(config_file, config_file.documentElement, "DEBUG_LEVEL", "3") - xml_replace_element(config_file, config_file.documentElement, "BROADCAST_GOSSIP_MODE", "true") xml_replace_element(config_file, config_file.documentElement, "SEND_RESPONSE_FOR_LAZY_PUSH", "false") xml_replace_element(config_file, config_file.documentElement, "MAX_NEIGHBORS_PER_ROUND", "5") xml_replace_element(config_file, config_file.documentElement, "NUM_GOSSIP_RECEIVERS", "5") + xml_replace_element(config_file, config_file.documentElement, "NUM_FINAL_BLOCK_PER_POW", "250") - + xml_replace_element(config_file, config_file.documentElement, "BROADCAST_GOSSIP_MODE", "true") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_HOSTNAME", "0.0.0.0") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PORT", "8090") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PROVIDER", "PROMETHEUS") From 48cabb982254dea4aa9a4c4db6383a8ce771ae10 Mon Sep 17 00:00:00 2001 From: stephen Date: Wed, 8 Nov 2023 17:34:49 +0000 Subject: [PATCH 40/61] overwrote with mac version - oops --- scripts/localdev.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/scripts/localdev.py b/scripts/localdev.py index 49d1ddd988..0c41b0fe2c 100755 --- a/scripts/localdev.py +++ b/scripts/localdev.py @@ -795,12 +795,9 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se if desk: print("Explicitly disabling all telemetry for desktop testing mode") xml_replace_element(config_file, config_file.documentElement, "DEBUG_LEVEL", "3") - xml_replace_element(config_file, config_file.documentElement, "SEND_RESPONSE_FOR_LAZY_PUSH", "false") - xml_replace_element(config_file, config_file.documentElement, "MAX_NEIGHBORS_PER_ROUND", "5") - xml_replace_element(config_file, config_file.documentElement, "NUM_GOSSIP_RECEIVERS", "5") - xml_replace_element(config_file, config_file.documentElement, "NUM_FINAL_BLOCK_PER_POW", "250") + xml_replace_element(config_file, config_file.documentElement, "BROADCAST_GOSSIP_MODE", "true") + - xml_replace_element(config_file, config_file.documentElement, "BROADCAST_GOSSIP_MODE", "true") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_HOSTNAME", "0.0.0.0") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PORT", "8090") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PROVIDER", "PROMETHEUS") From ca181ea6174045c688b1d3b286e6fb64df002c26 Mon Sep 17 00:00:00 2001 From: stephen Date: Wed, 8 Nov 2023 17:45:58 +0000 Subject: [PATCH 41/61] overwrote with mac version - oops --- scripts/localdev.py | 2 +- src/libNetwork/Guard.cpp | 10 ---------- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/scripts/localdev.py b/scripts/localdev.py index 0c41b0fe2c..400a1e8af6 100755 --- a/scripts/localdev.py +++ b/scripts/localdev.py @@ -906,7 +906,7 @@ def build_native_to_workspace(config): pass build_env = os.environ.copy() build_env['SCILLA_REPO_ROOT'] = SCILLA_DIR - build_env['EXTRA_BUILD_PARAMS'] = "tests debug" + '''build_env['EXTRA_BUILD_PARAMS'] = "tests debug"''' # Let's start off by building Scilla, in case it breaks. run_or_die(config, ["make"], in_dir = SCILLA_DIR, env = build_env) run_or_die(config, ["./build.sh"], in_dir = ZILLIQA_DIR) diff --git a/src/libNetwork/Guard.cpp b/src/libNetwork/Guard.cpp index 2997dc26b6..540f4f6b25 100644 --- a/src/libNetwork/Guard.cpp +++ b/src/libNetwork/Guard.cpp @@ -248,16 +248,6 @@ void Guard::AddDSGuardToBlacklistExcludeList(const DequeOfNode& dsComm) { void Guard::ValidateRunTimeEnvironment() { LOG_MARKER(); - unsigned int nodeReplacementLimit = static_cast( - COMM_SIZE - ceil(COMM_SIZE * TOLERANCE_FRACTION)); - - if (NUM_DS_ELECTION > nodeReplacementLimit) { - LOG_GENERAL(FATAL, - "Check constants configuration. nodeReplacementLimit must be " - "bigger than NUM_DS_ELECTION. Refer to design documentation. " - "nodeReplacementLimit: " - << nodeReplacementLimit); - } } void Guard::Init() { From 3f8f70105ed3ad25c03a690850f0171aa2d61993 Mon Sep 17 00:00:00 2001 From: stephen Date: Wed, 8 Nov 2023 18:16:04 +0000 Subject: [PATCH 42/61] overwrote with mac version - oops --- scripts/localdev.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/localdev.py b/scripts/localdev.py index 400a1e8af6..aa571c6390 100755 --- a/scripts/localdev.py +++ b/scripts/localdev.py @@ -796,7 +796,7 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se print("Explicitly disabling all telemetry for desktop testing mode") xml_replace_element(config_file, config_file.documentElement, "DEBUG_LEVEL", "3") xml_replace_element(config_file, config_file.documentElement, "BROADCAST_GOSSIP_MODE", "true") - + xml_replace_element(config_file, config_file.documentElement, "NUM_FINAL_BLOCK_PER_POW", "250") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_HOSTNAME", "0.0.0.0") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PORT", "8090") From 98d911f95d58bc536ffc5da7dd4e9d19700a77b0 Mon Sep 17 00:00:00 2001 From: stephen Date: Thu, 9 Nov 2023 02:20:55 +0000 Subject: [PATCH 43/61] overwrote with mac version - oops --- constants.xml | 2 +- scripts/localdev.py | 9 ++++----- tests/EvmAcceptanceTests/hardhat.config.ts | 1 - 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/constants.xml b/constants.xml index 9eae455481..9e027d7d72 100644 --- a/constants.xml +++ b/constants.xml @@ -57,7 +57,7 @@ 0.667 - 10 + 40 10 20 2 diff --git a/scripts/localdev.py b/scripts/localdev.py index aa571c6390..cb2fed40f8 100755 --- a/scripts/localdev.py +++ b/scripts/localdev.py @@ -770,9 +770,9 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se "-s", "15", "-d", "15", "-l", "1", - "--guard", "11/0", + "--guard", "7/0", "--gentxn", "false", - "--multiplier-fanout", "1,1", + "--multiplier-fanout", "1", "--host-network", "false", "--https", "localdomain", "--seed-multiplier", "true", @@ -794,17 +794,16 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se if desk: print("Explicitly disabling all telemetry for desktop testing mode") - xml_replace_element(config_file, config_file.documentElement, "DEBUG_LEVEL", "3") - xml_replace_element(config_file, config_file.documentElement, "BROADCAST_GOSSIP_MODE", "true") xml_replace_element(config_file, config_file.documentElement, "NUM_FINAL_BLOCK_PER_POW", "250") + xml_replace_element(config_file, config_file.documentElement, "DEBUG_LEVEL", "3") + xml_replace_element(config_file, config_file.documentElement, "BROADCAST_GOSSIP_MODE", "true") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_HOSTNAME", "0.0.0.0") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PORT", "8090") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PROVIDER", "PROMETHEUS") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_MASK", "ALL") xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_HOSTNAME", "tempo.default.svc.cluster.local") xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_PORT", "4317") - xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_PROVIDER", "NONE") xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_MASK", "NONE") if chain_id is not None: diff --git a/tests/EvmAcceptanceTests/hardhat.config.ts b/tests/EvmAcceptanceTests/hardhat.config.ts index b86d4e0fb9..6e3ddfff7a 100644 --- a/tests/EvmAcceptanceTests/hardhat.config.ts +++ b/tests/EvmAcceptanceTests/hardhat.config.ts @@ -74,7 +74,6 @@ const config: HardhatUserConfig = { "589417286a3213dceb37f8f89bd164c3505a4cec9200c61f7c6db13a30a71b45", "e7f59a4beb997a02a13e0d5e025b39a6f0adc64d37bb1e6a849a4863b4680411", "410b0e0a86625a10c554f8248a77c7198917bd9135c15bb28922684826bb9f14", - ...loadFromSignersFile("localdev2") ], chainId: 0x8001, web3ClientVersion: "Zilliqa/v8.2", From 64fb5b1b2400da7f34804f61e02da55bc53f3223 Mon Sep 17 00:00:00 2001 From: bzawisto Date: Thu, 9 Nov 2023 09:49:09 +0100 Subject: [PATCH 44/61] Some additional fixes --- src/libConsensus/ConsensusLeader.cpp | 9 +++++--- src/libConsensus/ConsensusLeader.h | 2 +- src/libDirectoryService/DirectoryService.cpp | 4 ++-- src/libDirectoryService/DirectoryService.h | 10 ++++---- .../FinalBlockPostProcessing.cpp | 7 ++++++ .../FinalBlockPreProcessing.cpp | 22 ++++++++++++------ .../ViewChangePreProcessing.cpp | 2 +- src/libNetwork/SendJobs.cpp | 23 +++++++++++++++---- src/libNode/Node.cpp | 3 ++- 9 files changed, 56 insertions(+), 26 deletions(-) diff --git a/src/libConsensus/ConsensusLeader.cpp b/src/libConsensus/ConsensusLeader.cpp index e534077de7..fb824894b8 100644 --- a/src/libConsensus/ConsensusLeader.cpp +++ b/src/libConsensus/ConsensusLeader.cpp @@ -1062,7 +1062,7 @@ ConsensusLeader::~ConsensusLeader() {} bool ConsensusLeader::StartConsensus( const AnnouncementGeneratorFunc& announcementGeneratorFunc, const AnnouncementGeneratorFunc& newAnnouncementGeneratorFunc, - bool useGossipProto) { + bool useGossipProto, bool afterRecovery) { LOG_MARKER(); // Initial checks @@ -1112,11 +1112,14 @@ bool ConsensusLeader::StartConsensus( if (m_numOfSubsets > 1) { // Start timer for accepting commits // ================================= - auto func = [this]() -> void { + auto func = [this, afterRecovery]() -> void { std::unique_lock cv_lk(m_mutexAnnounceSubsetConsensus); m_sufficientCommitsReceived = false; + const auto commitWindowSeconds = afterRecovery + ? (COMMIT_WINDOW_IN_SECONDS * 2) + : COMMIT_WINDOW_IN_SECONDS; if (cv_scheduleSubsetConsensus.wait_for( - cv_lk, std::chrono::seconds(COMMIT_WINDOW_IN_SECONDS), + cv_lk, std::chrono::seconds(commitWindowSeconds), [&] { return m_sufficientCommitsReceived; })) { LOG_GENERAL(INFO, "Sufficient commits within window"); } else { diff --git a/src/libConsensus/ConsensusLeader.h b/src/libConsensus/ConsensusLeader.h index a4e9de5739..fced605803 100644 --- a/src/libConsensus/ConsensusLeader.h +++ b/src/libConsensus/ConsensusLeader.h @@ -151,7 +151,7 @@ class ConsensusLeader : public ConsensusCommon { bool StartConsensus( const AnnouncementGeneratorFunc& announcementGeneratorFunc, const AnnouncementGeneratorFunc& newAnnouncementGeneratorFunc = nullptr, - bool useGossipProto = false); + bool useGossipProto = false, bool afterRecovery = false); /// Function to process any consensus message received. bool ProcessMessage(const zbytes& message, unsigned int offset, diff --git a/src/libDirectoryService/DirectoryService.cpp b/src/libDirectoryService/DirectoryService.cpp index ef47ddd674..f972eccdc7 100644 --- a/src/libDirectoryService/DirectoryService.cpp +++ b/src/libDirectoryService/DirectoryService.cpp @@ -1078,7 +1078,7 @@ bool DirectoryService::ProcessCosigsRewardsFromSeed( if (!m_mediator.m_lookup->VerifySenderNode( m_mediator.m_lookup->GetSeedNodes(), lookupPubKey)) { - LOG_EPOCH(WARNING, m_mediator.m_currentEpochNum, + LOG_EPOCH(DEBUG, m_mediator.m_currentEpochNum, "The message sender pubkey: " << lookupPubKey << " is not in my lookup node list."); return false; @@ -1123,7 +1123,7 @@ bool DirectoryService::ProcessGetDSLeaderTxnPool( if (!m_mediator.m_lookup->VerifySenderNode( m_mediator.m_lookup->GetLookupNodes(), lookupPubKey)) { - LOG_EPOCH(WARNING, m_mediator.m_currentEpochNum, + LOG_EPOCH(DEBUG, m_mediator.m_currentEpochNum, "The message sender pubkey: " << lookupPubKey << " is not in my lookup node list."); return false; diff --git a/src/libDirectoryService/DirectoryService.h b/src/libDirectoryService/DirectoryService.h index 64aef3f9af..0179e19642 100644 --- a/src/libDirectoryService/DirectoryService.h +++ b/src/libDirectoryService/DirectoryService.h @@ -90,8 +90,8 @@ struct DSGuardUpdateStruct { namespace CoinbaseReward { const int FINALBLOCK_REWARD = -1; -// LOOKUP_REWARD is in fact used to reward stakers - the funds are drained from the -// lookup accounts by the staking scripts and then fed back to the SSNs. +// LOOKUP_REWARD is in fact used to reward stakers - the funds are drained from +// the lookup accounts by the staking scripts and then fed back to the SSNs. const int LOOKUP_REWARD = -2; } // namespace CoinbaseReward @@ -100,8 +100,6 @@ using VectorOfPoWSoln = std::vector, PubKey>>; using MapOfPubKeyPoW = std::map; - - struct RewardInformation { uint128_t base_reward; uint128_t base_each_reward; @@ -599,7 +597,7 @@ class DirectoryService : public Executable { /// network bool FinishRejoinAsDS(bool fetchShardingStruct = false); - void RunConsensusOnFinalBlock(); + void RunConsensusOnFinalBlock(bool afterRecover = false); // Coinbase bool SaveCoinbase(const std::vector& b1, const std::vector& b2, @@ -703,7 +701,7 @@ class DirectoryService : public Executable { std::array GetDSPoWSoln(const PubKey& Pubk); uint32_t GetNumberOfDSPoWSolns(); void ClearVCBlockVector(); - bool RunConsensusOnFinalBlockWhenDSPrimary(); + bool RunConsensusOnFinalBlockWhenDSPrimary(bool afterRecovery); bool CheckIfDSNode(const PubKey& submitterPubKey); bool RemoveDSMicroBlock(); diff --git a/src/libDirectoryService/FinalBlockPostProcessing.cpp b/src/libDirectoryService/FinalBlockPostProcessing.cpp index 8a1f4115a9..4b8bcef730 100644 --- a/src/libDirectoryService/FinalBlockPostProcessing.cpp +++ b/src/libDirectoryService/FinalBlockPostProcessing.cpp @@ -390,6 +390,13 @@ bool DirectoryService::ProcessFinalBlockConsensus( zbytes reserialized_message; PubKey senderPubKey; + if (!m_consensusObject) { + LOG_GENERAL(WARNING, + "Consensus object has not been created yet! Please check " + "consensus timings!"); + return false; + } + if (!m_consensusObject->PreProcessMessage( message, offset, consensus_id, senderPubKey, reserialized_message)) { LOG_EPOCH(WARNING, m_mediator.m_currentEpochNum, diff --git a/src/libDirectoryService/FinalBlockPreProcessing.cpp b/src/libDirectoryService/FinalBlockPreProcessing.cpp index 8c8b31c1ed..b9b80ce22d 100644 --- a/src/libDirectoryService/FinalBlockPreProcessing.cpp +++ b/src/libDirectoryService/FinalBlockPreProcessing.cpp @@ -221,7 +221,8 @@ bool DirectoryService::WaitUntilCompleteFinalBlockIsReady() { return true; } -bool DirectoryService::RunConsensusOnFinalBlockWhenDSPrimary() { +bool DirectoryService::RunConsensusOnFinalBlockWhenDSPrimary( + bool afterRecovery) { LOG_MARKER(); if (LOOKUP_NODE_MODE) { @@ -354,7 +355,8 @@ bool DirectoryService::RunConsensusOnFinalBlockWhenDSPrimary() { SetState(FINALBLOCK_CONSENSUS); cl->StartConsensus(preprepFBAnnouncementGeneratorFunc, - newFBAnnouncementReadinessFunc, BROADCAST_GOSSIP_MODE); + newFBAnnouncementReadinessFunc, BROADCAST_GOSSIP_MODE, + afterRecovery); if (m_mediator.ToProcessTransaction()) { m_mediator.m_node->ProcessTransactionWhenShardLeader(m_microBlockGasLimit); @@ -1311,7 +1313,7 @@ void DirectoryService::CalculateCurrentDSMBGasLimit() { } } -void DirectoryService::RunConsensusOnFinalBlock() { +void DirectoryService::RunConsensusOnFinalBlock(bool afterRecover) { LOG_MARKER(); if (LOOKUP_NODE_MODE) { @@ -1362,8 +1364,11 @@ void DirectoryService::RunConsensusOnFinalBlock() { // function, but rather wait for view change. bool ConsensusObjCreation = true; if (m_mode == PRIMARY_DS) { - this_thread::sleep_for(chrono::milliseconds(DS_ANNOUNCEMENT_DELAY_IN_MS)); - ConsensusObjCreation = RunConsensusOnFinalBlockWhenDSPrimary(); + const auto announceDealy = afterRecover ? DS_ANNOUNCEMENT_DELAY_IN_MS * 3 + : DS_ANNOUNCEMENT_DELAY_IN_MS; + this_thread::sleep_for(chrono::milliseconds(announceDealy)); + ConsensusObjCreation = + RunConsensusOnFinalBlockWhenDSPrimary(afterRecover); if (!ConsensusObjCreation) { LOG_GENERAL(WARNING, "Consensus failed at " @@ -1385,13 +1390,16 @@ void DirectoryService::RunConsensusOnFinalBlock() { } } - auto func1 = [this]() -> void { + auto func1 = [this, afterRecover]() -> void { // View change will wait for timeout. If conditional variable is notified // before timeout, the thread will return without triggering view change. std::unique_lock cv_lk(m_MutexCVViewChangeFinalBlock); + + const auto viewchangeTime = + afterRecover ? (VIEWCHANGE_TIME * 2) : VIEWCHANGE_TIME; // TODO: cv fix if (cv_viewChangeFinalBlock.wait_for( - cv_lk, std::chrono::seconds(VIEWCHANGE_TIME)) == + cv_lk, std::chrono::seconds(viewchangeTime)) == std::cv_status::timeout) { LOG_EPOCH(INFO, m_mediator.m_currentEpochNum, "Initiated final block view change"); diff --git a/src/libDirectoryService/ViewChangePreProcessing.cpp b/src/libDirectoryService/ViewChangePreProcessing.cpp index cc099d727e..3279e54df7 100644 --- a/src/libDirectoryService/ViewChangePreProcessing.cpp +++ b/src/libDirectoryService/ViewChangePreProcessing.cpp @@ -781,7 +781,7 @@ bool DirectoryService::ProcessVCPushLatestDSTxBlock( if (!m_mediator.m_lookup->VerifySenderNode( m_mediator.m_lookup->GetSeedNodes(), lookupPubKey)) { - LOG_EPOCH(WARNING, m_mediator.m_currentEpochNum, + LOG_EPOCH(DEBUG, m_mediator.m_currentEpochNum, "The message sender pubkey: " << lookupPubKey << " is not in my lookup node list."); return false; diff --git a/src/libNetwork/SendJobs.cpp b/src/libNetwork/SendJobs.cpp index bec770f761..79dc2ae32f 100644 --- a/src/libNetwork/SendJobs.cpp +++ b/src/libNetwork/SendJobs.cpp @@ -250,6 +250,7 @@ void CloseGracefully(Socket&& socket) { } constinit std::chrono::milliseconds IDLE_TIMEOUT(120000); +constinit std::chrono::milliseconds SLOW_SEND_TO_REPORT(5000); } // namespace @@ -399,8 +400,10 @@ class PeerSendQueue : public std::enable_shared_from_this { auto clock = Clock(); while (!m_queue.empty()) { if (m_queue.front().expires_at < clock) { + LOG_GENERAL(INFO, "Dropping P2P message as expired, peer=" + << m_peer << ", elapsed [ms]: " + << (clock - m_queue.front().expires_at).count()); m_queue.pop_front(); - LOG_GENERAL(INFO, "Dropping P2P message as expired, peer=" << m_peer); // TODO metric about message drops } else { return true; @@ -432,11 +435,21 @@ class PeerSendQueue : public std::enable_shared_from_this { boost::asio::async_write( m_socket, boost::asio::const_buffer(msg.data.get(), msg.size), - [self = shared_from_this()](const ErrorCode& ec, size_t) { - if (ec) { - // LOG_GENERAL(WARNING, "Got error code: " << ec.message()); - } + [self = shared_from_this(), + start_time = std::chrono::steady_clock::now()](const ErrorCode& ec, + size_t) { if (ec != OPERATION_ABORTED) { + const auto now = std::chrono::steady_clock::now(); + + if (now - start_time > SLOW_SEND_TO_REPORT) { + LOG_GENERAL( + WARNING, + "Slow send, it took: " + << std::chrono::duration_cast( + now - start_time) + .count() + << "[ms] to deliver msg"); + } self->OnWritten(ec); } }); diff --git a/src/libNode/Node.cpp b/src/libNode/Node.cpp index 309742760e..4a2c53ed66 100644 --- a/src/libNode/Node.cpp +++ b/src/libNode/Node.cpp @@ -1364,7 +1364,8 @@ void Node::WakeupAtTxEpoch() { m_mediator.m_ds->SetState( DirectoryService::DirState::FINALBLOCK_CONSENSUS_PREP); auto func = [this]() mutable -> void { - m_mediator.m_ds->RunConsensusOnFinalBlock(); + constexpr auto AFTER_RECOVERY = true; + m_mediator.m_ds->RunConsensusOnFinalBlock(AFTER_RECOVERY); }; DetachedFunction(1, func); return; From c20e7df5e72745ef9fb313034ba8e7386328fbb9 Mon Sep 17 00:00:00 2001 From: bzawisto Date: Thu, 9 Nov 2023 09:52:09 +0100 Subject: [PATCH 45/61] Make one log infoed --- src/libNetwork/SendJobs.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/libNetwork/SendJobs.cpp b/src/libNetwork/SendJobs.cpp index f6d2039043..55ea1a8375 100644 --- a/src/libNetwork/SendJobs.cpp +++ b/src/libNetwork/SendJobs.cpp @@ -338,9 +338,9 @@ class PeerSendQueue : public std::enable_shared_from_this { const Endpoint& endpoint) { if (ec != OPERATION_ABORTED) { self->m_endpoint = endpoint; - LOG_GENERAL(DEBUG, "Connection (via async resolve) to " - << self->m_endpoint << ": " << ec.message() - << " (" << ec << ')'); + LOG_GENERAL(INFO, "Connection (via async resolve) to " + << self->m_endpoint << ": " << ec.message() + << " (" << ec << ')'); self->m_timer.cancel(); self->OnConnected(ec); @@ -573,7 +573,8 @@ class SendJobsImpl : public SendJobs, return; } - LOG_GENERAL(DEBUG, "Enqueueing message, size=" << message.size <<" peer = "<< peer); + LOG_GENERAL(DEBUG, "Enqueueing message, size=" << message.size + << " peer = " << peer); // this fn enqueues the lambda to be executed on WorkerThread with // sequential guarantees for messages from every calling thread From 4344dff41f962c802b558e02c0196819773eef5e Mon Sep 17 00:00:00 2001 From: bzawisto Date: Thu, 9 Nov 2023 11:29:54 +0100 Subject: [PATCH 46/61] More logs --- src/libNetwork/DataSender.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/libNetwork/DataSender.cpp b/src/libNetwork/DataSender.cpp index bc59024a28..d4bdc81fec 100644 --- a/src/libNetwork/DataSender.cpp +++ b/src/libNetwork/DataSender.cpp @@ -211,6 +211,7 @@ bool DataSender::SendDataToOthers( } if (inB2) { + LOG_GENERAL(INFO, "I'm in B2 set, so I'll try to send data to others"); zbytes message; if (!(composeMessageForSenderFunc && composeMessageForSenderFunc(message))) { @@ -236,6 +237,12 @@ bool DataSender::SendDataToOthers( if (sendDataToLookupFunc) { sendDataToLookupFunc(lookups, message); } + } else { + LOG_GENERAL(WARNING, + "I'm not going to send data to others because: IndexB2 is: " + << indexB2 + << ", nodeLookupLo is : " << nodeToSendToLookUpLo + << ", nodeLookupHi is: " << nodeToSendToLookUpHi); } if (!shards.empty()) { @@ -258,7 +265,15 @@ bool DataSender::SendDataToOthers( forceMulticast); } } + } else { + LOG_GENERAL(WARNING, "Shards size is: " << shards.size() + << ", so no data was sent there"); } + } else { + LOG_GENERAL(WARNING, "I'm NOT in B2 set! " + << "B2 size " << blockwcosigSender.GetB2().size() + << " and committee size " + << sendercommittee.size()); } return true; From 8e2fe843ad98b2f605e3fb3be45310a4037f17eb Mon Sep 17 00:00:00 2001 From: bzawisto Date: Thu, 9 Nov 2023 12:14:36 +0100 Subject: [PATCH 47/61] Leader always sends block --- src/libNetwork/DataSender.cpp | 66 +++++------------------------------ 1 file changed, 8 insertions(+), 58 deletions(-) diff --git a/src/libNetwork/DataSender.cpp b/src/libNetwork/DataSender.cpp index d4bdc81fec..e042637ef9 100644 --- a/src/libNetwork/DataSender.cpp +++ b/src/libNetwork/DataSender.cpp @@ -199,19 +199,19 @@ bool DataSender::SendDataToOthers( tmpCommittee.push_back(sendercommittee.at(i)); } } - - bool inB2 = false; + // Always use leader for sending data to lookups uint16_t indexB2 = 0; for (const auto& entry : tmpCommittee) { if (entry.second == Peer()) { - inB2 = true; break; } indexB2++; } - if (inB2) { - LOG_GENERAL(INFO, "I'm in B2 set, so I'll try to send data to others"); + if (indexB2 == 0 && !std::empty(tmpCommittee)) { + LOG_GENERAL( + INFO, + "I'm a leader who signed this block, I'll send it to all lookups"); zbytes message; if (!(composeMessageForSenderFunc && composeMessageForSenderFunc(message))) { @@ -220,60 +220,10 @@ bool DataSender::SendDataToOthers( "composeMessageForSenderFunc undefined or cannot compose message"); return false; } - - uint16_t randomDigits = - DataConversion::charArrTo16Bits(hashForRandom.asBytes()); - bool committeeTooSmall = tmpCommittee.size() <= TX_SHARING_CLUSTER_SIZE; - uint16_t nodeToSendToLookUpLo = - committeeTooSmall - ? 0 - : (randomDigits % (tmpCommittee.size() - TX_SHARING_CLUSTER_SIZE)); - uint16_t nodeToSendToLookUpHi = - committeeTooSmall ? tmpCommittee.size() - : nodeToSendToLookUpLo + TX_SHARING_CLUSTER_SIZE; - - if (indexB2 >= nodeToSendToLookUpLo && indexB2 < nodeToSendToLookUpHi) { - LOG_GENERAL(INFO, "I will send data to the lookups"); - if (sendDataToLookupFunc) { - sendDataToLookupFunc(lookups, message); - } - } else { - LOG_GENERAL(WARNING, - "I'm not going to send data to others because: IndexB2 is: " - << indexB2 - << ", nodeLookupLo is : " << nodeToSendToLookUpLo - << ", nodeLookupHi is: " << nodeToSendToLookUpHi); - } - - if (!shards.empty()) { - unsigned int my_cluster_num = UINT_MAX; - unsigned int my_shards_lo = 0; - unsigned int my_shards_hi = 0; - - DetermineShardToSendDataTo(my_cluster_num, my_shards_lo, my_shards_hi, - shards, tmpCommittee, indexB2); - - if ((my_cluster_num + 1) <= shards.size()) { - LOG_GENERAL(INFO, "I will send data to the shards"); - if (sendDataToShardFunc) { - sendDataToShardFunc(message, shards, my_shards_lo, my_shards_hi); - } else { - std::deque sharded_receivers; - DetermineNodesToSendDataTo(shards, consensusMyId, forceMulticast, - sharded_receivers); - SendDataToShardNodesDefault(message, sharded_receivers, - forceMulticast); - } - } - } else { - LOG_GENERAL(WARNING, "Shards size is: " << shards.size() - << ", so no data was sent there"); + LOG_GENERAL(INFO, "I will send data to the lookups"); + if (sendDataToLookupFunc) { + sendDataToLookupFunc(lookups, message); } - } else { - LOG_GENERAL(WARNING, "I'm NOT in B2 set! " - << "B2 size " << blockwcosigSender.GetB2().size() - << " and committee size " - << sendercommittee.size()); } return true; From 9349a84f6e9fd9a85872bbf45db9dd28e30a81ce Mon Sep 17 00:00:00 2001 From: bzawisto Date: Thu, 9 Nov 2023 13:59:52 +0100 Subject: [PATCH 48/61] Don't expire messages for dns-like nodes too early --- src/libNetwork/SendJobs.cpp | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/libNetwork/SendJobs.cpp b/src/libNetwork/SendJobs.cpp index 55ea1a8375..508b4086f8 100644 --- a/src/libNetwork/SendJobs.cpp +++ b/src/libNetwork/SendJobs.cpp @@ -249,7 +249,10 @@ void CloseGracefully(Socket&& socket) { socket.close(ec); } -constinit std::chrono::milliseconds IDLE_TIMEOUT(120000); +constinit std::chrono::seconds IDLE_TIMEOUT_IP_ONLY(120); +// We don't want to resolve dns name very often, give more idle time for this +// type of connections +constinit std::chrono::seconds IDLE_TIMEOUT_DNS(3600); constinit std::chrono::milliseconds SLOW_SEND_TO_REPORT(5000); } // namespace @@ -303,13 +306,15 @@ class PeerSendQueue : public std::enable_shared_from_this { private: void Resolve() { - if (!std::empty(m_peer.GetHostname())) { + if (!std::empty(m_peer.GetHostname()) && !m_is_resolving) { + m_is_resolving = true; m_resolver.async_resolve( m_peer.GetHostname(), "", [self = shared_from_this()]( const ErrorCode& ec, const Tcp::resolver::results_type& endpoints) { if (!ec) { + LOG_GENERAL(INFO, "Successfully resolved dns name: " << self->m_peer.GetHostname()); self->OnResolved(endpoints); } else { LOG_GENERAL(WARNING, "Unable to resolve dns name: " @@ -389,6 +394,7 @@ class PeerSendQueue : public std::enable_shared_from_this { } if (!ec) { m_connected = true; + m_is_resolving = false; SendMessage(); } else { m_connected = false; @@ -398,7 +404,8 @@ class PeerSendQueue : public std::enable_shared_from_this { bool FindNotExpiredMessage() { auto clock = Clock(); - while (!m_queue.empty()) { + // Messages sent to entities having dns name don't expire + while (!m_queue.empty() && std::empty(m_peer.GetHostname())) { if (m_queue.front().expires_at < clock) { LOG_GENERAL(INFO, "Dropping P2P message as expired, peer=" << m_peer << ", elapsed [ms]: " @@ -422,7 +429,10 @@ class PeerSendQueue : public std::enable_shared_from_this { if (!FindNotExpiredMessage()) { if (m_connected && !m_noWait && !m_isMultiplier) { m_inIdleTimeout = true; - WaitTimer(m_timer, IDLE_TIMEOUT, [this]() { OnIdleTimer(); }); + const auto delay = std::empty(m_peer.GetHostname()) + ? IDLE_TIMEOUT_IP_ONLY + : IDLE_TIMEOUT_DNS; + WaitTimer(m_timer, delay, [this]() { OnIdleTimer(); }); } else { Done(); } @@ -544,6 +554,9 @@ class PeerSendQueue : public std::enable_shared_from_this { // it's hard to determine is an asio socket really connected, so explicit var bool m_connected = false; + // Checks wheter dns resolve call is taking place + bool m_is_resolving = false; + bool m_inIdleTimeout = false; bool m_noWait = false; From abc1d8fc4116ccb7d21009448ea5a373e9550a17 Mon Sep 17 00:00:00 2001 From: bzawisto Date: Thu, 9 Nov 2023 14:31:28 +0100 Subject: [PATCH 49/61] More logs --- src/libNetwork/SendJobs.cpp | 40 +++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/src/libNetwork/SendJobs.cpp b/src/libNetwork/SendJobs.cpp index 508b4086f8..e00167252c 100644 --- a/src/libNetwork/SendJobs.cpp +++ b/src/libNetwork/SendJobs.cpp @@ -314,7 +314,8 @@ class PeerSendQueue : public std::enable_shared_from_this { const ErrorCode& ec, const Tcp::resolver::results_type& endpoints) { if (!ec) { - LOG_GENERAL(INFO, "Successfully resolved dns name: " << self->m_peer.GetHostname()); + LOG_GENERAL(INFO, "Successfully resolved dns name: " + << self->m_peer.GetHostname()); self->OnResolved(endpoints); } else { LOG_GENERAL(WARNING, "Unable to resolve dns name: " @@ -332,15 +333,29 @@ class PeerSendQueue : public std::enable_shared_from_this { ErrorCode ignored; m_timer.cancel(ignored); - WaitTimer(m_timer, Milliseconds{CONNECTION_TIMEOUT_IN_MS}, [this]() { - m_socket.cancel(); - OnConnected(TIMED_OUT); - }); - + WaitTimer(m_timer, Milliseconds{CONNECTION_TIMEOUT_IN_MS}, + [self = shared_from_this()]() { + LOG_GENERAL(WARNING, + "Unable to connect within " + << CONNECTION_TIMEOUT_IN_MS + << ", canceling any operation on the socket " + "with remote dns/ip: " + << self->m_peer.GetHostname() << "/" + << self->m_peer.GetPrintableIPAddress()); + self->m_socket.cancel(); + self->OnConnected(TIMED_OUT); + }); + + LOG_GENERAL(INFO, + "I'll try to connect to remote IP since the dns name was " + "successfully resolved, peer: " + << m_peer.GetHostname()); boost::asio::async_connect( m_socket, endpoints, [self = shared_from_this()](const ErrorCode& ec, const Endpoint& endpoint) { + LOG_GENERAL(INFO, + "Async connect handler called with ec: " << ec.message()); if (ec != OPERATION_ABORTED) { self->m_endpoint = endpoint; LOG_GENERAL(INFO, "Connection (via async resolve) to " @@ -371,10 +386,15 @@ class PeerSendQueue : public std::enable_shared_from_this { m_timer.cancel(ec); - WaitTimer(m_timer, Milliseconds{CONNECTION_TIMEOUT_IN_MS}, [this]() { - m_socket.cancel(); - OnConnected(TIMED_OUT); - }); + WaitTimer(m_timer, Milliseconds{CONNECTION_TIMEOUT_IN_MS}, + [self = shared_from_this()]() { + LOG_GENERAL(WARNING, + "Unable to connect within " + << CONNECTION_TIMEOUT_IN_MS + << ", canceling any operation on the socket"); + self->m_socket.cancel(); + self->OnConnected(TIMED_OUT); + }); m_socket.async_connect( m_endpoint, [self = shared_from_this()](const ErrorCode& ec) { From 90917f51643ea8172c28b82e5b58a9f68bf75704 Mon Sep 17 00:00:00 2001 From: bzawisto Date: Thu, 9 Nov 2023 14:49:01 +0100 Subject: [PATCH 50/61] Missing port --- src/libNetwork/SendJobs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libNetwork/SendJobs.cpp b/src/libNetwork/SendJobs.cpp index e00167252c..43eb0015f3 100644 --- a/src/libNetwork/SendJobs.cpp +++ b/src/libNetwork/SendJobs.cpp @@ -309,7 +309,7 @@ class PeerSendQueue : public std::enable_shared_from_this { if (!std::empty(m_peer.GetHostname()) && !m_is_resolving) { m_is_resolving = true; m_resolver.async_resolve( - m_peer.GetHostname(), "", + m_peer.GetHostname(), std::to_string(m_peer.GetListenPortHost()), [self = shared_from_this()]( const ErrorCode& ec, const Tcp::resolver::results_type& endpoints) { From 664a8351d3c342e85e2e8e9df94db205527df3fd Mon Sep 17 00:00:00 2001 From: bzawisto Date: Thu, 9 Nov 2023 15:14:48 +0100 Subject: [PATCH 51/61] Fix --- src/libNetwork/SendJobs.cpp | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/libNetwork/SendJobs.cpp b/src/libNetwork/SendJobs.cpp index 43eb0015f3..e2ff4d1fb8 100644 --- a/src/libNetwork/SendJobs.cpp +++ b/src/libNetwork/SendJobs.cpp @@ -360,7 +360,8 @@ class PeerSendQueue : public std::enable_shared_from_this { self->m_endpoint = endpoint; LOG_GENERAL(INFO, "Connection (via async resolve) to " << self->m_endpoint << ": " << ec.message() - << " (" << ec << ')'); + << " (" << ec << ')' + << ", queue size: " << self->m_queue.size()); self->m_timer.cancel(); self->OnConnected(ec); @@ -410,13 +411,19 @@ class PeerSendQueue : public std::enable_shared_from_this { void OnConnected(const ErrorCode& ec) { if (m_closed) { + LOG_GENERAL(INFO, + "It looks the OnConnected was called when socket was already " + "closed, returning"); return; } if (!ec) { + LOG_GENERAL(INFO, "There's no error, so sending the message from queue"); m_connected = true; m_is_resolving = false; SendMessage(); } else { + LOG_GENERAL(INFO, "There was an error: " << ec.message() + << ", so I'll try to reconnect"); m_connected = false; ScheduleReconnectOrGiveUp(); } @@ -424,9 +431,10 @@ class PeerSendQueue : public std::enable_shared_from_this { bool FindNotExpiredMessage() { auto clock = Clock(); - // Messages sent to entities having dns name don't expire - while (!m_queue.empty() && std::empty(m_peer.GetHostname())) { - if (m_queue.front().expires_at < clock) { + while (!m_queue.empty()) { + // Messages sent to entities having dns name don't expire + if (std::empty(m_peer.GetHostname()) && + m_queue.front().expires_at < clock) { LOG_GENERAL(INFO, "Dropping P2P message as expired, peer=" << m_peer << ", elapsed [ms]: " << (clock - m_queue.front().expires_at).count()); @@ -452,10 +460,15 @@ class PeerSendQueue : public std::enable_shared_from_this { const auto delay = std::empty(m_peer.GetHostname()) ? IDLE_TIMEOUT_IP_ONLY : IDLE_TIMEOUT_DNS; + LOG_GENERAL(INFO, "I'll schedule WaitTimer"); WaitTimer(m_timer, delay, [this]() { OnIdleTimer(); }); } else { + LOG_GENERAL(INFO, + "I'll call Done() now since some conditions are not met"); Done(); } + LOG_GENERAL(INFO, + "Apparently some conditions are not met so I'll just return"); return; } From 68135eb19f47e49126c6671819231765f87a2c60 Mon Sep 17 00:00:00 2001 From: bzawisto Date: Thu, 9 Nov 2023 15:27:06 +0100 Subject: [PATCH 52/61] Don't log --- src/libNetwork/SendJobs.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/libNetwork/SendJobs.cpp b/src/libNetwork/SendJobs.cpp index e2ff4d1fb8..1c4fa428ba 100644 --- a/src/libNetwork/SendJobs.cpp +++ b/src/libNetwork/SendJobs.cpp @@ -460,15 +460,10 @@ class PeerSendQueue : public std::enable_shared_from_this { const auto delay = std::empty(m_peer.GetHostname()) ? IDLE_TIMEOUT_IP_ONLY : IDLE_TIMEOUT_DNS; - LOG_GENERAL(INFO, "I'll schedule WaitTimer"); WaitTimer(m_timer, delay, [this]() { OnIdleTimer(); }); } else { - LOG_GENERAL(INFO, - "I'll call Done() now since some conditions are not met"); Done(); } - LOG_GENERAL(INFO, - "Apparently some conditions are not met so I'll just return"); return; } From cac0e9c41ad1c9e23fd5ebe4c785b3180510b312 Mon Sep 17 00:00:00 2001 From: stephen Date: Fri, 10 Nov 2023 09:59:48 +0000 Subject: [PATCH 53/61] Add the increase to DS_ANNOUNCEMENT_DELAY_IN_MS --- scripts/localdev.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/localdev.py b/scripts/localdev.py index cb2fed40f8..d7fa93fd8a 100755 --- a/scripts/localdev.py +++ b/scripts/localdev.py @@ -806,6 +806,8 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_PORT", "4317") xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_PROVIDER", "NONE") xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_MASK", "NONE") + xml_replace_element_if_exists(config_file, config_file.documentElement, "DS_ANNOUNCEMENT_DELAY_IN_MS", "5") + if chain_id is not None: xml_replace_element(config_file, config_file.documentElement, "CHAIN_ID", chain_id) output_config = config_file.toprettyxml(newl='') From 64c6b9f434373c14de3a0cefb608c63a2f989121 Mon Sep 17 00:00:00 2001 From: stephen Date: Fri, 10 Nov 2023 10:51:21 +0000 Subject: [PATCH 54/61] Add the increase to DS_ANNOUNCEMENT_DELAY_IN_MS --- scripts/localdev.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/scripts/localdev.py b/scripts/localdev.py index b397e1ce8e..68240b65c4 100755 --- a/scripts/localdev.py +++ b/scripts/localdev.py @@ -796,8 +796,11 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_MASK", "ALL") xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_HOSTNAME", "tempo.default.svc.cluster.local") xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_PORT", "4317") - xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_PROVIDER", "OTLPGRPC") - xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_MASK", "ALL") + xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_PROVIDER", "NONE") + xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_MASK", "NONE") + xml_replace_element_if_exists(config_file, config_file.documentElement, "DS_ANNOUNCEMENT_DELAY_IN_MS", "5") + xml_replace_element_if_exists(config_file, config_file.documentElement, "NUM_DS_ELECTION", "2") + if chain_id is not None: xml_replace_element(config_file, config_file.documentElement, "CHAIN_ID", chain_id) output_config = config_file.toprettyxml(newl='') From 273d49fddf75579aab8b9f7c08c145025808fd73 Mon Sep 17 00:00:00 2001 From: stephen Date: Mon, 13 Nov 2023 09:35:04 +0000 Subject: [PATCH 55/61] Add the increase to DS_ANNOUNCEMENT_DELAY_IN_MS --- build.sh | 1 + daemon/CMakeLists.txt | 3 +- src/libDirectoryService/CMakeLists.txt | 3 +- src/libNetwork/P2PServer.cpp | 133 ++++++++-- tests/Network/CMakeLists.txt | 5 + tests/Network/Test_Rumours.cpp | 341 +++++++++++++++++++++++++ 6 files changed, 463 insertions(+), 23 deletions(-) create mode 100644 tests/Network/Test_Rumours.cpp diff --git a/build.sh b/build.sh index 55623a9d3b..819c7020ae 100755 --- a/build.sh +++ b/build.sh @@ -176,6 +176,7 @@ echo "Install directory: ${install_dir}" echo building using $jobs jobs +jobs=6 cmake -H. -B"${build_dir}" ${CMAKE_EXTRA_OPTIONS} -DCMAKE_BUILD_TYPE=${build_type} -DCMAKE_INSTALL_PREFIX="${install_dir}" -DCMAKE_TOOLCHAIN_FILE="${VCPKG_ROOT}"/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=${VCPKG_TRIPLET} cmake --build "${build_dir}" --config ${build_type} -j $jobs diff --git a/daemon/CMakeLists.txt b/daemon/CMakeLists.txt index 53bfeeb849..dbaacad613 100644 --- a/daemon/CMakeLists.txt +++ b/daemon/CMakeLists.txt @@ -1,4 +1,5 @@ -add_executable(zilliqad ZilliqaDaemon.cpp ZilliqaUpdater.cpp) +add_executable(zilliqad ZilliqaDaemon.cpp ZilliqaUpdater.cpp + ../tests/Network/Test_Rumours.cpp) target_include_directories(zilliqad PRIVATE ${CMAKE_SOURCE_DIR}/src) target_link_libraries (zilliqad diff --git a/src/libDirectoryService/CMakeLists.txt b/src/libDirectoryService/CMakeLists.txt index c998e0318a..abd3a26411 100644 --- a/src/libDirectoryService/CMakeLists.txt +++ b/src/libDirectoryService/CMakeLists.txt @@ -1,3 +1,4 @@ -add_library (DirectoryService DSBlockPostProcessing.cpp DSBlockPreProcessing.cpp DSComposition.cpp DirectoryService.cpp FinalBlockPostProcessing.cpp FinalBlockPreProcessing.cpp MicroBlockProcessing.cpp PoWProcessing.cpp ViewChangePreProcessing.cpp ViewChangePostProcessing.cpp Coinbase.cpp GasPricer.cpp) +add_library (DirectoryService DSBlockPostProcessing.cpp DSBlockPreProcessing.cpp DSComposition.cpp DirectoryService.cpp FinalBlockPostProcessing.cpp FinalBlockPreProcessing.cpp MicroBlockProcessing.cpp PoWProcessing.cpp ViewChangePreProcessing.cpp ViewChangePostProcessing.cpp Coinbase.cpp GasPricer.cpp + ) target_include_directories (DirectoryService PUBLIC ${PROJECT_SOURCE_DIR}/src) target_link_libraries (DirectoryService PUBLIC AccountStore AccountData Consensus MiningData Mediator Node Persistence) diff --git a/src/libNetwork/P2PServer.cpp b/src/libNetwork/P2PServer.cpp index 9ec222f44c..610bb3c0d4 100644 --- a/src/libNetwork/P2PServer.cpp +++ b/src/libNetwork/P2PServer.cpp @@ -19,16 +19,99 @@ #include #include +#include #include #include #include #include #include - +#include "libMetrics/Api.h" #include "Blacklist.h" #include "libUtils/Logger.h" +namespace zil { +namespace local { + +class P2PServerVariables { + int connects = 0; + int closes = 0; + int active = 0; + int reads = 0; + int writes = 0; + int errors = 0; + int timeouts = 0; + public: + std::unique_ptr temp; + + void AddConnects(int count) { + Init(); + connects += count; + } + + void AddClose(int count) { + Init(); + closes += count; + } + + void AddActive(int count) { + Init(); + active += count; + } + + void SubActive(int count) { + Init(); + active -= count; + } + + void AddReads(int amount) { + Init(); + reads += amount; + } + + void AddWrites(int count) { + Init(); + writes += count; + } + + void AddErrors(int count) { + Init(); + writes += count; + } + + void AddTimeouts(int count) { + Init(); + timeouts += count; + } + + + void Init() { + if (!temp) { + temp = std::make_unique(Z_FL::BLOCKS, "p2pServer.gauge", + "p2pServer metrics", "calls", true); + + temp->SetCallback([this](auto&& result) { + result.Set(connects, + {{"counter", "Connects"}}); + result.Set(closes, + {{"counter", "Closes"}}); + result.Set(active, + {{"counter", "Active"}}); + result.Set(reads, {{"counter", "Reads"}}); + result.Set(writes, + {{"counter", "Writes"}}); + result.Set(errors, + {{"counter", "Errors"}}); + result.Set(timeouts, + {{"counter", "Timeouts"}}); + }); + } + } +}; +static thread_local P2PServerVariables obs_variables{}; +} // namespace local +} // namespace zil + namespace zil::p2p { using AsioContext = boost::asio::io_context; @@ -101,6 +184,7 @@ std::optional ExtractRemotePeer(const TcpSocket& socket) { } else { LOG_GENERAL(WARNING, "Cannot extract address from endpoint: " << ec.message()); + zil::local::obs_variables.AddErrors(1); } return result; } @@ -135,12 +219,14 @@ class P2PServerImpl : public P2PServer, } else { LOG_GENERAL(WARNING, "Got an error from Accept in P2P Server: " << ec.message()); + zil::local::obs_variables.AddErrors(1); } parent->AcceptNextConnection(); } else { LOG_GENERAL(WARNING, "Parent doesn't exist anymore, this may happen only " "during shutdown phase of Zilliqa"); + zil::local::obs_variables.AddErrors(1); } }); } @@ -156,7 +242,8 @@ class P2PServerImpl : public P2PServer, void OnConnectionClosed(uint64_t id) { m_connections.erase(id); - // TODO metric about m_connections.size() + zil::local::obs_variables.AddClose(1); + zil::local::obs_variables.SubActive(1); LOG_GENERAL(INFO, "Total incoming connections: " << m_connections.size()); } @@ -169,6 +256,7 @@ class P2PServerImpl : public P2PServer, auto maybe_peer = ExtractRemotePeer(socket); if (!maybe_peer) { LOG_GENERAL(WARNING, "Couldn't get the IP address from remove socket!"); + zil::local::obs_variables.AddErrors(1); return; } LOG_GENERAL(INFO, "Accepted new connection from: " @@ -181,10 +269,12 @@ class P2PServerImpl : public P2PServer, conn->StartReading(); m_connections[m_counter] = std::move(conn); + zil::local::obs_variables.AddActive(1); LOG_GENERAL(INFO, "Total incoming connections: " << m_connections.size()); - // TODO Metric + zil::local::obs_variables.AddConnects(1); } else { LOG_GENERAL(FATAL, "Error in accept : " << ec.message()); + zil::local::obs_variables.AddErrors(1); } } @@ -194,9 +284,6 @@ class P2PServerImpl : public P2PServer, uint64_t m_counter = 0; std::unordered_map> m_connections; - - // TODO decide if this is needed. It seems that no - // std::map m_peerConnectionCount; }; std::shared_ptr P2PServer::CreateAndStart(AsioContext& asio, @@ -204,6 +291,7 @@ std::shared_ptr P2PServer::CreateAndStart(AsioContext& asio, size_t max_message_size, Callback callback) { if (port == 0 || max_message_size == 0 || !callback) { + zil::local::obs_variables.AddErrors(1); throw std::runtime_error("P2PServer::CreateAndStart : invalid args"); } @@ -225,13 +313,13 @@ std::shared_ptr P2PServer::CreateAndStart(AsioContext& asio, // it's impossible to get weak_from_this(), such a subtliety LOG_GENERAL(INFO, "Starting...."); server->AcceptNextConnection(); - return server; } catch (const boost::system::system_error& e) { error_msg = e.what(); } + zil::local::obs_variables.AddErrors(1); throw std::runtime_error(error_msg); } @@ -269,11 +357,9 @@ void P2PServerConnection::ReadNextMessage() { m_socket, boost::asio::buffer(m_readBuffer), [self = shared_from_this()](const ErrorCode& ec, size_t n) { if (!ec) { + // TODO - non stop software should not stop !! assert(n == HDR_LEN); } - if (ec) { - // LOG_GENERAL(WARNING, "Got error code: " << ec.message()); - } if (ec != OPERATION_ABORTED) { self->OnHeaderRead(ec); } @@ -282,8 +368,9 @@ void P2PServerConnection::ReadNextMessage() { void P2PServerConnection::OnHeaderRead(const ErrorCode& ec) { if (ec) { - LOG_GENERAL(INFO, - "Peer " << m_remotePeer << " read error: " << ec.message()); + if (ec != END_OF_FILE) { + LOG_GENERAL(INFO, "Peer " << m_remotePeer << " read error: " << ec.message()); + } CloseSocket(); OnConnectionClosed(); return; @@ -313,11 +400,9 @@ void P2PServerConnection::OnHeaderRead(const ErrorCode& ec) { boost::asio::buffer(m_readBuffer.data() + HDR_LEN, remainingLength), [self = shared_from_this()](const ErrorCode& ec, size_t n) { if (!ec) { + // TODO - non stop software should not stop !! assert(n == self->m_readBuffer.size() - HDR_LEN); } - if (ec) { - // LOG_GENERAL(WARNING, "Got error code: " << ec.message()); - } if (ec != OPERATION_ABORTED) { self->OnBodyRead(ec); } @@ -326,7 +411,10 @@ void P2PServerConnection::OnHeaderRead(const ErrorCode& ec) { void P2PServerConnection::OnBodyRead(const ErrorCode& ec) { if (ec) { - LOG_GENERAL(INFO, "Read error: " << ec.message()); + if (ec != END_OF_FILE){ + LOG_GENERAL(INFO, "Read error: " << ec.message()); + zil::local::obs_variables.AddErrors(1); + } CloseSocket(); OnConnectionClosed(); return; @@ -341,18 +429,19 @@ void P2PServerConnection::OnBodyRead(const ErrorCode& ec) { Blacklist::GetInstance().Add({m_remotePeer.GetIpAddress(), m_remotePeer.GetListenPortHost(), m_remotePeer.GetNodeIndentifier()}); - + zil::local::obs_variables.AddErrors(1); CloseSocket(); OnConnectionClosed(); return; } auto owner = m_owner.lock(); if (!owner || !owner->OnMessage(m_id, m_remotePeer, result)) { + zil::local::obs_variables.AddErrors(1); CloseSocket(); OnConnectionClosed(); return; } - + zil::local::obs_variables.AddReads(1); ReadNextMessage(); } @@ -380,6 +469,7 @@ void P2PServerConnection::OnHeartBeat(const zil::p2p::ErrorCode& ec) { LOG_GENERAL(WARNING, "Due to inactivity on socket with peer: " << m_remotePeer.GetPrintableIPAddress() << " connection is closed"); + zil::local::obs_variables.AddTimeouts(1); CloseSocket(); OnConnectionClosed(); } @@ -406,10 +496,9 @@ void P2PServerConnection::CloseSocket() { if (ec) { LOG_GENERAL(INFO, "Shutdown completed with an error: " << ec.message()); m_socket.close(ec); - if (ec) { - LOG_GENERAL(INFO, "Informational, not an issue - Error closing socket: " + zil::local::obs_variables.AddErrors(1); + LOG_GENERAL(INFO, "Informational, not an issue - Error closing socket: " << ec.message()); - } return; } size_t unread = m_socket.available(ec); @@ -417,6 +506,7 @@ void P2PServerConnection::CloseSocket() { << unread << ", ec: " << ec.message()); if (ec) { m_socket.close(ec); + zil::local::obs_variables.AddErrors(1); return; } // On Linux, the close() function for sockets does not necessarily wait @@ -440,6 +530,7 @@ void P2PServerConnection::CloseSocket() { if (ec) { LOG_GENERAL(INFO, "Informational, not an issue - Error closing socket: " << ec.message()); + zil::local::obs_variables.AddErrors(1); } LOG_GENERAL(INFO, "Connection completely closed with peer: " << m_remotePeer.GetPrintableIPAddress()); diff --git a/tests/Network/CMakeLists.txt b/tests/Network/CMakeLists.txt index e4e392d004..7331a2dfd7 100644 --- a/tests/Network/CMakeLists.txt +++ b/tests/Network/CMakeLists.txt @@ -35,3 +35,8 @@ add_executable (Test_Peer Test_Peer.cpp) target_include_directories (Test_Peer PUBLIC ${CMAKE_SOURCE_DIR}/src) target_link_libraries (Test_Peer PUBLIC Network) add_test(NAME Test_Peer COMMAND Test_Peer) + +add_executable (Test_Rumours Test_Rumours.cpp) +target_include_directories (Test_Rumours PUBLIC ${CMAKE_SOURCE_DIR}/src) +target_link_libraries (Test_Rumours PUBLIC Network Utils Boost::unit_test_framework) +add_test(NAME Test_Rumours COMMAND Test_Rumours) diff --git a/tests/Network/Test_Rumours.cpp b/tests/Network/Test_Rumours.cpp new file mode 100644 index 0000000000..b7dcead317 --- /dev/null +++ b/tests/Network/Test_Rumours.cpp @@ -0,0 +1,341 @@ +/* +* Copyright (C) 2023 Zilliqa + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include +#include +#include "libMetrics/Tracing.h" +#include "libNetwork/P2P.h" +#include "libUtils/DetachedFunction.h" +/* +using namespace std; +chrono::high_resolution_clock::time_point startTime; + +void process_message(std::shared_ptr message) { + LOG_MARKER(); + + if (message->msg.size() < 10) { + LOG_GENERAL(INFO, "Received message '" + << (char*)&message->msg.at(0) << "' at port " + << message->from.m_listenPortHost << " from address " + << message->from.m_ipAddress); + } else { + chrono::duration time_span = + chrono::high_resolution_clock::now() - startTime; + LOG_GENERAL(INFO, "Received " << message->msg.size() / (1024 * 1024) + << " MB message in " << time_span.count() + << " ms"); + LOG_GENERAL(INFO, "Benchmark: " << (1000 * message->msg.size()) / + (time_span.count() * 1024 * 1024) + << " MBps"); + } +} + +static bool comparePairSecond( + const std::pair>& a, + const std::pair>& b) { + return a.second < b.second; +} + +void TestRemoveBroadcast() { + LOG_MARKER(); + + static const unsigned int BROADCAST_INTERVAL = 5; + static const unsigned int BROADCAST_EXPIRY = 10; + static const unsigned int hashNum = 100000; + static set broadcastHashes; + static mutex broadcastHashesMutex; + static deque>> + broadcastToRemoved; + static mutex broadcastToRemovedMutex; + static const chrono::time_point initTime = + chrono::system_clock::now(); + + LOG_GENERAL(INFO, "Start TestRemoveBroadcast, BROADCAST_INTERVAL = " + << BROADCAST_INTERVAL + << ", BROADCAST_EXPIRY = " << BROADCAST_EXPIRY + << ", hashNum = " << hashNum << "."); + + // Filled in broadcastHashes (hashNum) + auto FillHash = []() mutable -> void { + LOG_GENERAL(INFO, "Start to fill broadcastHashes..."); + + for (unsigned int i = 0; i < hashNum; ++i) { + lock_guard g(broadcastHashesMutex); + string hash = to_string(i); + broadcastHashes.emplace(hash.begin(), hash.end()); + } + + LOG_GENERAL(INFO, "Finished fill " << broadcastHashes.size() + << " broadcastHashes."); + }; + + DetachedFunction(1, FillHash); + this_thread::sleep_for(chrono::seconds(1)); + + // Filled in broadcastToRemoved (hashNum / 2) + auto FillRemove = []() mutable -> void { + LOG_GENERAL(INFO, "Start to fill broadcastToRemoved..."); + chrono::time_point currentTime = initTime; + for (unsigned int i = 0; i < hashNum; i += 2) { + lock_guard g(broadcastToRemovedMutex); + string hash = to_string(i); + zbytes hashS(hash.begin(), hash.end()); + + if (i > 0 && 0 == (i % 100)) { + currentTime += chrono::seconds(1); + } + + broadcastToRemoved.emplace_back(hashS, currentTime); + } + + LOG_GENERAL(INFO, "Finished fill " << broadcastToRemoved.size() + << " broadcastToRemoved."); + }; + + DetachedFunction(1, FillRemove); + this_thread::sleep_for(chrono::seconds(1)); + + auto RemoveChecking = []() mutable -> void { + LOG_GENERAL(INFO, "Start to remove hash, 100 seconds checking..."); + + queue answer; + answer.push(100000); + unsigned int cur = 99950; + + for (unsigned int i = 0; i < 19; ++i) { + answer.push(cur); + cur -= 250; + } + + zbytes emptyHash; + chrono::time_point currentTime = initTime; + + while (true) { + this_thread::sleep_for(chrono::seconds(BROADCAST_INTERVAL)); + currentTime += chrono::seconds(BROADCAST_INTERVAL); + lock(broadcastToRemovedMutex, broadcastHashesMutex); + lock_guard g(broadcastToRemovedMutex, adopt_lock); + lock_guard g2(broadcastHashesMutex, adopt_lock); + + if (broadcastToRemoved.empty() || + broadcastToRemoved.front().second > + currentTime - chrono::seconds(BROADCAST_EXPIRY)) { + LOG_GENERAL(INFO, "After " << chrono::duration_cast( + currentTime - initTime) + .count() + << " seconds, broadcastHashes size remained " + << broadcastHashes.size()); + + LOG_GENERAL(INFO, + "Checking " << ((answer.front() == broadcastHashes.size()) + ? "PASS!" + : "FAILED!")); + answer.pop(); + continue; + } + + auto up = upper_bound( + broadcastToRemoved.begin(), broadcastToRemoved.end(), + make_pair(emptyHash, currentTime - chrono::seconds(BROADCAST_EXPIRY)), + comparePairSecond); + + for (auto it = broadcastToRemoved.begin(); it != up; ++it) { + broadcastHashes.erase(it->first); + } + + broadcastToRemoved.erase(broadcastToRemoved.begin(), up); + + LOG_GENERAL(INFO, "After " << chrono::duration_cast( + currentTime - initTime) + .count() + << " seconds, broadcastHashes size reduce to " + << broadcastHashes.size()); + + LOG_GENERAL(INFO, + "Checking " << ((answer.front() == broadcastHashes.size()) + ? "PASS!" + : "FAILED!")); + + answer.pop(); + } + }; + + DetachedFunction(1, RemoveChecking); + this_thread::sleep_for(chrono::seconds(100)); +} + +int TestSerialize() { + using namespace zil::trace; + + auto nospan = Tracing::CreateSpan(FilterClass::QUEUE, "ooo"); + assert(nospan.GetIds().empty()); + assert(!Tracing::HasActiveSpan()); + assert(!Tracing::GetActiveSpanIds().has_value()); + assert(!Tracing::GetActiveSpanStringIds().has_value()); + + std::ignore = Tracing::Initialize("bobobo", "ALL"); + + auto span = Tracing::CreateSpan(FilterClass::QUEUE, "ooo"); + std::string trace_info = span.GetIds(); + assert(!trace_info.empty()); + + assert(Tracing::HasActiveSpan()); + assert(Tracing::GetActiveSpanIds().has_value()); + + auto string_ids_opt = Tracing::GetActiveSpanStringIds(); + assert(string_ids_opt.has_value()); + + LOG_GENERAL(INFO, "Expected trace info: " + << trace_info << ", trace_id: " << string_ids_opt->first + << ", span_id: " << string_ids_opt->second); + + int num_errors = 0; + + auto Test = [&num_errors, &trace_info](const zbytes& msg, const zbytes& hash, + bool with_traces) { + bool ok = false; + do { + auto start_byte = hash.empty() ? zil::p2p::START_BYTE_NORMAL + : zil::p2p::START_BYTE_BROADCAST; + + auto raw = zil::p2p::CreateMessage(msg, hash, start_byte, with_traces); + if (!raw.data) { + break; + } + + zil::p2p::ReadMessageResult result; + auto state = zil::p2p::TryReadMessage((const uint8_t*)raw.data.get(), + raw.size, result); + if (state != zil::p2p::ReadState::SUCCESS) { + break; + } + + ok = (result.startByte == start_byte) && (result.message == msg) && + (result.hash == hash); + if (ok && with_traces) { + ok = (result.traceInfo == trace_info); + auto span = zil::trace::Tracing::CreateChildSpanOfRemoteTrace( + zil::trace::FilterClass::QUEUE, "child", trace_info); + } + } while (false); + LOG_GENERAL(DEBUG, "size=" << msg.size() << " hash=" << !hash.empty() + << " trace=" << with_traces << " :" + << (ok ? "OK" : "FAILED")); + if (!ok) { + ++num_errors; + } + }; + + zbytes short_msg(33, 'x'); + zbytes long_msg(1024 * 1024, 'x'); + zbytes hash(32, 1); + zbytes no_hash; + + Test(short_msg, no_hash, false); + Test(short_msg, hash, false); + Test(short_msg, no_hash, true); + Test(short_msg, hash, true); + Test(long_msg, no_hash, false); + Test(long_msg, hash, false); + Test(long_msg, no_hash, true); + Test(long_msg, hash, true); + + if (num_errors > 0) { + LOG_GENERAL(WARNING, + __FUNCTION__ << " failed with " << num_errors << " errors"); + } + + return num_errors; +} + +int main(int argc, const char* argv[]) { + INIT_STDOUT_LOGGER(); + + int ret = TestSerialize(); + if (argc > 1 && std::string("--short") == argv[1]) { + return ret; + } + + auto func = []() mutable -> void { + boost::asio::io_context ctx(1); + boost::asio::signal_set sig(ctx, SIGINT, SIGTERM); + sig.async_wait([&](const boost::system::error_code&, int) { ctx.stop(); }); + + auto dispatcher = [](std::shared_ptr message) { + process_message(std::move(message)); + }; + + zil::p2p::GetInstance().StartServer(ctx, 33133, 0, + std::move(dispatcher)); + + ctx.run(); + }; + + DetachedFunction(1, func); + + this_thread::sleep_for(chrono::seconds(1)); // short delay to prepare socket + + struct in_addr ip_addr {}; + inet_pton(AF_INET, "127.0.0.1", &ip_addr); + Peer peer = {ip_addr.s_addr, 33133}; + zbytes message1 = {'H', 'e', 'l', 'l', 'o', '\0'}; // Send Hello once + + zil::p2p::GetInstance().SendMessage(peer, message1, + zil::p2p::START_BYTE_NORMAL, false); + + vector peers = {peer, peer, peer}; + zbytes message2 = {'W', 'o', 'r', 'l', 'd', '\0'}; // Send World 3x + + zil::p2p::GetInstance().SendMessage(peers, message2, + zil::p2p::START_BYTE_NORMAL, false); + + zbytes longMsg(1024 * 1024 * 1024, 'z'); + longMsg.emplace_back('\0'); + + startTime = chrono::high_resolution_clock::now(); + zil::p2p::GetInstance().SendMessage(peer, longMsg, + zil::p2p::START_BYTE_NORMAL, false); + + if (argc > 1 && std::string("--long") == argv[1]) { + TestRemoveBroadcast(); + } + + return ret; +} + +/* +#include +#include + +int +main(int argc,char **argv) { + VectorOfNode peers; + std::vector pubKeys; + + std::shared_ptr m_rumorManager; + + GetEntireNetworkPeerInfo(peers, pubKeys); + + + zil::p2p::GetInstance().InitializeRumorManager(peers, pubKeys); + + return 0; +} +*/ \ No newline at end of file From f58b43b117e70908d3a467f46cd13f3171eeef1b Mon Sep 17 00:00:00 2001 From: stephen Date: Mon, 13 Nov 2023 14:07:37 +0000 Subject: [PATCH 56/61] Patchup again after changes to main --- scripts/localdev.py | 26 ++++++++++++++++++++------ tests/Network/CMakeLists.txt | 8 ++++---- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/scripts/localdev.py b/scripts/localdev.py index 68240b65c4..2bee7d48fe 100755 --- a/scripts/localdev.py +++ b/scripts/localdev.py @@ -749,10 +749,11 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se cmd = ["./bootstrap.py", testnet_name, "--clusters", "minikube", "--constants-from-file", os.path.join(ZILLIQA_DIR, "constants.xml"), "--image", zilliqa_image, - "-n", "6", - "-d", "5", - "-l", "1", - "--guard", "4/0", + "-n", "7", + "-d", "7", + "-s", "7", + "-l", "7", + "--guard", "5/0", "--gentxn", "false", "--multiplier-fanout", "1", "--host-network", "false", @@ -769,9 +770,9 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se "-s", "15", "-d", "15", "-l", "1", - "--guard", "11/0", + "--guard", "7/0", "--gentxn", "false", - "--multiplier-fanout", "1,1", + "--multiplier-fanout", "1", "--host-network", "false", "--https", "localdomain", "--seed-multiplier", "true", @@ -790,6 +791,9 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se constants_xml_target_path = os.path.join(TESTNET_DIR, f"{testnet_name}/configmap/constants.xml") config_file = xml.dom.minidom.parse(constants_xml_target_path) + + xml_replace_element(config_file, config_file.documentElement, "DEBUG_LEVEL", "3") + xml_replace_element(config_file, config_file.documentElement, "BROADCAST_GOSSIP_MODE", "true") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_HOSTNAME", "0.0.0.0") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PORT", "8090") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PROVIDER", "PROMETHEUS") @@ -800,6 +804,16 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_MASK", "NONE") xml_replace_element_if_exists(config_file, config_file.documentElement, "DS_ANNOUNCEMENT_DELAY_IN_MS", "5") xml_replace_element_if_exists(config_file, config_file.documentElement, "NUM_DS_ELECTION", "2") + xml_replace_element(config_file, config_file.documentElement, "NUM_FINAL_BLOCK_PER_POW", "250") + ''' + xml_replace_element(config_file, config_file.documentElement, "GOSSIP_CUSTOM_ROUNDS_SETTINGS", "false") + xml_replace_element(config_file, config_file.documentElement, "SIGN_VERIFY_EMPTY_MSGTYP", "false") + xml_replace_element(config_file, config_file.documentElement, "SIGN_VERIFY_NONEMPTY_MSGTYP", "false") + xml_replace_element(config_file, config_file.documentElement, "MAX_NEIGHBORS_PER_ROUND", "3") + xml_replace_element(config_file, config_file.documentElement, "NUM_GOSSIP_RECEIVERS", "3") + xml_replace_element(config_file, config_file.documentElement, "ROUND_TIME_IN_MS", "1000") + ''' + if chain_id is not None: xml_replace_element(config_file, config_file.documentElement, "CHAIN_ID", chain_id) diff --git a/tests/Network/CMakeLists.txt b/tests/Network/CMakeLists.txt index 7331a2dfd7..ecf2ea9118 100644 --- a/tests/Network/CMakeLists.txt +++ b/tests/Network/CMakeLists.txt @@ -36,7 +36,7 @@ target_include_directories (Test_Peer PUBLIC ${CMAKE_SOURCE_DIR}/src) target_link_libraries (Test_Peer PUBLIC Network) add_test(NAME Test_Peer COMMAND Test_Peer) -add_executable (Test_Rumours Test_Rumours.cpp) -target_include_directories (Test_Rumours PUBLIC ${CMAKE_SOURCE_DIR}/src) -target_link_libraries (Test_Rumours PUBLIC Network Utils Boost::unit_test_framework) -add_test(NAME Test_Rumours COMMAND Test_Rumours) +#add_executable (Test_Rumours Test_Rumours.cpp) +#target_include_directories (Test_Rumours PUBLIC ${CMAKE_SOURCE_DIR}/src) +#target_link_libraries (Test_Rumours PUBLIC Network Utils Boost::unit_test_framework) +#add_test(NAME Test_Rumours COMMAND Test_Rumours) From 28c30d119d57cbf6196b0f096a712d566d2c77a0 Mon Sep 17 00:00:00 2001 From: stephen Date: Mon, 13 Nov 2023 14:21:48 +0000 Subject: [PATCH 57/61] Patchup again after changes to main --- scripts/localdev.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/localdev.py b/scripts/localdev.py index 2bee7d48fe..bccc6a8092 100755 --- a/scripts/localdev.py +++ b/scripts/localdev.py @@ -752,7 +752,7 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se "-n", "7", "-d", "7", "-s", "7", - "-l", "7", + "-l", "1", "--guard", "5/0", "--gentxn", "false", "--multiplier-fanout", "1", From 53154a98be6da4def69d6755484d0d45d92fa6c0 Mon Sep 17 00:00:00 2001 From: stephen Date: Mon, 13 Nov 2023 19:27:30 +0000 Subject: [PATCH 58/61] Patchup again after changes to main --- constants.xml | 76 ++++++++++++++++------------- scripts/localdev.py | 4 +- src/libNetwork/P2PServer.cpp | 26 +++++----- src/libNetwork/SendJobs.cpp | 27 +++++----- src/libUtils/Logger.h | 1 + tests/Node/test_node_simple.sh | 4 +- tests/Zilliqa/test_zilliqa_local.py | 43 ++++++++++++---- 7 files changed, 103 insertions(+), 78 deletions(-) diff --git a/constants.xml b/constants.xml index 9e027d7d72..9625593746 100644 --- a/constants.xml +++ b/constants.xml @@ -2,10 +2,10 @@ - 4 + 3 false false - 25 + 50 1 3 @@ -19,7 +19,7 @@ 0 15 15360 - true + false 1 @@ -57,19 +57,20 @@ 0.667 - 40 + 50 10 20 2 1 - 80 - 1000 + 69 + 50 + 9422 true 10 - 10 - 3 + 11 + 4 5 5 10 @@ -83,36 +84,37 @@ 2000 10 - 2000 + 7000 3000 - 500 - 180 - 2 - 500 + 5000 + 3000 + 96 + 45 + 90 60 - 150 + 90 5 - 6000 7000 55 - 5 + 6000 + 10 3 - 5 5 + 5 10 - 3 3 + 3 12 - 10 1 + 10 21000 - 500000 - 400000 + 200000 + 150000 50 10 - 50 + 1 80 10 70 @@ -126,8 +128,8 @@ 127.0.0.1 - false - false + true + true true 2 @@ -135,7 +137,7 @@ 6 10 - 10 + 5 1000 0 18 @@ -205,6 +207,10 @@ true true + + 1 + 5 + @@ -223,22 +229,22 @@ 60 - 600 + 300 3 600 200 - 3 - 128 + 1 + 420 1 - 128 - 5000000 + 420 + 10000000 0 - 10000000 + 120000000 5 100 20 5 - 5 + 15 true @@ -305,7 +311,7 @@ input_blockchain.json input_message.json output.json - input + input.scilla .scilla .scillib scilla_libs @@ -335,7 +341,7 @@ 12600000000000000000000 20 40 - 76800 + 51200 20 100 300 @@ -428,7 +434,7 @@ 10 15 10 - 600 + 360 diff --git a/scripts/localdev.py b/scripts/localdev.py index bccc6a8092..6547f0ec3f 100755 --- a/scripts/localdev.py +++ b/scripts/localdev.py @@ -796,8 +796,8 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se xml_replace_element(config_file, config_file.documentElement, "BROADCAST_GOSSIP_MODE", "true") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_HOSTNAME", "0.0.0.0") xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PORT", "8090") - xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PROVIDER", "PROMETHEUS") - xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_MASK", "ALL") + xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_PROVIDER", "NONE") + xml_replace_element(config_file, config_file.documentElement, "METRIC_ZILLIQA_MASK", "NONE") xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_HOSTNAME", "tempo.default.svc.cluster.local") xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_PORT", "4317") xml_replace_element_if_exists(config_file, config_file.documentElement, "TRACE_ZILLIQA_PROVIDER", "NONE") diff --git a/src/libNetwork/P2PServer.cpp b/src/libNetwork/P2PServer.cpp index 610bb3c0d4..9cf57b99f5 100644 --- a/src/libNetwork/P2PServer.cpp +++ b/src/libNetwork/P2PServer.cpp @@ -208,7 +208,7 @@ class P2PServerImpl : public P2PServer, } void AcceptNextConnection() { - LOG_GENERAL(INFO, + LOG_GENERAL(DEBUG, "Scheduling acceptor to asynchronously accept new connection"); m_acceptor.async_accept( [wptr = weak_from_this()](const ErrorCode& ec, TcpSocket sock) { @@ -244,7 +244,7 @@ class P2PServerImpl : public P2PServer, m_connections.erase(id); zil::local::obs_variables.AddClose(1); zil::local::obs_variables.SubActive(1); - LOG_GENERAL(INFO, "Total incoming connections: " << m_connections.size()); + LOG_GENERAL(DEBUG, "Total incoming connections: " << m_connections.size()); } private: @@ -259,7 +259,7 @@ class P2PServerImpl : public P2PServer, zil::local::obs_variables.AddErrors(1); return; } - LOG_GENERAL(INFO, "Accepted new connection from: " + LOG_GENERAL(DEBUG, "Accepted new connection from: " << maybe_peer.value().GetPrintableIPAddress()); auto conn = std::make_shared( weak_from_this(), ++m_counter, @@ -270,10 +270,10 @@ class P2PServerImpl : public P2PServer, m_connections[m_counter] = std::move(conn); zil::local::obs_variables.AddActive(1); - LOG_GENERAL(INFO, "Total incoming connections: " << m_connections.size()); + LOG_GENERAL(DEBUG, "Total incoming connections: " << m_connections.size()); zil::local::obs_variables.AddConnects(1); } else { - LOG_GENERAL(FATAL, "Error in accept : " << ec.message()); + LOG_GENERAL(DEBUG, "Error in accept : " << ec.message()); zil::local::obs_variables.AddErrors(1); } } @@ -369,7 +369,7 @@ void P2PServerConnection::ReadNextMessage() { void P2PServerConnection::OnHeaderRead(const ErrorCode& ec) { if (ec) { if (ec != END_OF_FILE) { - LOG_GENERAL(INFO, "Peer " << m_remotePeer << " read error: " << ec.message()); + LOG_GENERAL(DEBUG, "Peer " << m_remotePeer << " read error: " << ec.message()); } CloseSocket(); OnConnectionClosed(); @@ -412,7 +412,7 @@ void P2PServerConnection::OnHeaderRead(const ErrorCode& ec) { void P2PServerConnection::OnBodyRead(const ErrorCode& ec) { if (ec) { if (ec != END_OF_FILE){ - LOG_GENERAL(INFO, "Read error: " << ec.message()); + LOG_GENERAL(DEBUG, "Read error: " << ec.message()); zil::local::obs_variables.AddErrors(1); } CloseSocket(); @@ -491,18 +491,18 @@ void P2PServerConnection::CloseSocket() { // is a blocking call that waits for the OS to complete the closedown. close // also frees the OS resources from the program so should be called even if an // error condition is encountered - LOG_GENERAL(INFO, "Attempting to do a shudtown on a socket"); + LOG_GENERAL(DEBUG, "Attempting to do a shutdown on a socket"); m_socket.shutdown(boost::asio::socket_base::shutdown_both, ec); if (ec) { LOG_GENERAL(INFO, "Shutdown completed with an error: " << ec.message()); m_socket.close(ec); zil::local::obs_variables.AddErrors(1); - LOG_GENERAL(INFO, "Informational, not an issue - Error closing socket: " + LOG_GENERAL(DEBUG, "Informational, not an issue - Error closing socket: " << ec.message()); return; } size_t unread = m_socket.available(ec); - LOG_GENERAL(INFO, "Number of unread bytes available on socket: " + LOG_GENERAL(DEBUG, "Number of unread bytes available on socket: " << unread << ", ec: " << ec.message()); if (ec) { m_socket.close(ec); @@ -522,17 +522,17 @@ void P2PServerConnection::CloseSocket() { boost::container::small_vector buf; buf.resize(std::min(unread, BUFF_SIZE)); m_socket.read_some(boost::asio::mutable_buffer(buf.data(), unread), ec); - LOG_GENERAL(INFO, "Draining remaining IO before close" + LOG_GENERAL(DEBUG, "Draining remaining IO before close" << m_remotePeer.GetPrintableIPAddress()); } while (!ec && (unread = m_socket.available(ec)) > 0); } m_socket.close(ec); if (ec) { - LOG_GENERAL(INFO, "Informational, not an issue - Error closing socket: " + LOG_GENERAL(DEBUG, "Informational, not an issue - Error closing socket: " << ec.message()); zil::local::obs_variables.AddErrors(1); } - LOG_GENERAL(INFO, "Connection completely closed with peer: " + LOG_GENERAL(DEBUG, "Connection completely closed with peer: " << m_remotePeer.GetPrintableIPAddress()); } diff --git a/src/libNetwork/SendJobs.cpp b/src/libNetwork/SendJobs.cpp index 1c4fa428ba..85dca8710e 100644 --- a/src/libNetwork/SendJobs.cpp +++ b/src/libNetwork/SendJobs.cpp @@ -178,7 +178,7 @@ std::set ExtractMultipliers() { } auto inserted = peers.emplace(uint128_t(ip_addr.s_addr), port); if (inserted.second) { - LOG_GENERAL(INFO, "Found multiplier at " << *inserted.first); + LOG_GENERAL(DEBUG, "Found multiplier at " << *inserted.first); } } } @@ -243,7 +243,7 @@ void CloseGracefully(Socket&& socket) { boost::container::small_vector buf; buf.resize(std::min(BUFF_SIZE, unread)); socket.read_some(boost::asio::mutable_buffer(buf.data(), unread), ec); - LOG_GENERAL(INFO, "Draining remaining IO before close"); + LOG_GENERAL(DEBUG, "Draining remaining IO before close"); } while (!ec && (unread = socket.available(ec)) > 0); } socket.close(ec); @@ -314,7 +314,7 @@ class PeerSendQueue : public std::enable_shared_from_this { const ErrorCode& ec, const Tcp::resolver::results_type& endpoints) { if (!ec) { - LOG_GENERAL(INFO, "Successfully resolved dns name: " + LOG_GENERAL(DEBUG, "Successfully resolved dns name: " << self->m_peer.GetHostname()); self->OnResolved(endpoints); } else { @@ -346,7 +346,7 @@ class PeerSendQueue : public std::enable_shared_from_this { self->OnConnected(TIMED_OUT); }); - LOG_GENERAL(INFO, + LOG_GENERAL(DEBUG, "I'll try to connect to remote IP since the dns name was " "successfully resolved, peer: " << m_peer.GetHostname()); @@ -354,11 +354,11 @@ class PeerSendQueue : public std::enable_shared_from_this { m_socket, endpoints, [self = shared_from_this()](const ErrorCode& ec, const Endpoint& endpoint) { - LOG_GENERAL(INFO, + LOG_GENERAL(DEBUG, "Async connect handler called with ec: " << ec.message()); if (ec != OPERATION_ABORTED) { self->m_endpoint = endpoint; - LOG_GENERAL(INFO, "Connection (via async resolve) to " + LOG_GENERAL(DEBUG, "Connection (via async resolve) to " << self->m_endpoint << ": " << ec.message() << " (" << ec << ')' << ", queue size: " << self->m_queue.size()); @@ -376,7 +376,7 @@ class PeerSendQueue : public std::enable_shared_from_this { auto address = boost::asio::ip::make_address(m_peer.GetPrintableIPAddress(), ec); if (ec) { - LOG_GENERAL(INFO, "Cannot create endpoint for address " + LOG_GENERAL(WARNING, "Cannot create endpoint for address " << m_peer.GetPrintableIPAddress() << ":" << m_peer.GetListenPortHost()); Done(); @@ -417,7 +417,6 @@ class PeerSendQueue : public std::enable_shared_from_this { return; } if (!ec) { - LOG_GENERAL(INFO, "There's no error, so sending the message from queue"); m_connected = true; m_is_resolving = false; SendMessage(); @@ -494,11 +493,7 @@ class PeerSendQueue : public std::enable_shared_from_this { } void OnWritten(const ErrorCode& ec) { - if (!ec && !m_closed) { - // LOG_GENERAL(INFO, "Successfully sent message to: " - // << m_peer.GetPrintableIPAddress() - // << " with size: " << m_queue.front().msg.size); - } + if (m_closed) { return; } @@ -534,7 +529,7 @@ class PeerSendQueue : public std::enable_shared_from_this { } void Reconnect() { - LOG_GENERAL(INFO, "Peer " << m_peer << " reconnects"); + LOG_GENERAL(DEBUG, "Peer " << m_peer << " reconnects"); CloseGracefully(std::move(m_socket)); m_socket = Socket(m_asioContext); Resolve(); @@ -609,7 +604,7 @@ class SendJobsImpl : public SendJobs, bool allow_relaxed_blacklist) override { zil::local::variables.AddSendMessageToPeerCount(1); if (peer.m_listenPortHost == 0) { - LOG_GENERAL(WARNING, "Ignoring message to peer " << peer); + LOG_GENERAL(INFO, "Ignoring message to peer " << peer); zil::local::variables.AddSendMessageToPeerFailed(1); return; } @@ -677,7 +672,7 @@ class SendJobsImpl : public SendJobs, // explicit Close() because shared_ptr may be reused in async operation LOG_GENERAL( - INFO, "Nothing else to be sent to peer, so closing socket with remote: " + DEBUG, "Nothing else to be sent to peer, so closing socket with remote: " << peer.GetPrintableIPAddress()); it->second->Close(); m_activePeers.erase(it); diff --git a/src/libUtils/Logger.h b/src/libUtils/Logger.h index 44fb48778a..4ded5fb2a2 100644 --- a/src/libUtils/Logger.h +++ b/src/libUtils/Logger.h @@ -161,6 +161,7 @@ std::shared_ptr CreateTracingExtraData(); #define LOG_GENERAL(level, msg) \ { TRACED_FILTERED_LOG(level, &Logger::IsGeneralSink) << ' ' << msg; } +#define NOMARK #if !defined(NOMARK) #define LOG_MARKER() \ Logger::ScopeMarker marker{__FILE__, __LINE__, __FUNCTION__}; diff --git a/tests/Node/test_node_simple.sh b/tests/Node/test_node_simple.sh index 6c8da5db52..0f2df70865 100755 --- a/tests/Node/test_node_simple.sh +++ b/tests/Node/test_node_simple.sh @@ -23,7 +23,7 @@ ulimit -s unlimited; python tests/zilliqa/test_zilliqa_local.py start 5 -sleep 40 +sleep 8 echo "starting..." #set primary @@ -31,7 +31,7 @@ for ds in {1..5} do python tests/Zilliqa/test_zilliqa_local.py sendcmd $ds 01000000000000000000000000000100007F00001389 done -sleep 10 +sleep 6 # PoW submission should be multicasted to all DS committee members for node in {6..10} diff --git a/tests/Zilliqa/test_zilliqa_local.py b/tests/Zilliqa/test_zilliqa_local.py index 77e7f5d17e..375e515500 100755 --- a/tests/Zilliqa/test_zilliqa_local.py +++ b/tests/Zilliqa/test_zilliqa_local.py @@ -24,6 +24,7 @@ from subprocess import Popen, PIPE import xml.etree.cElementTree as ET +import xml.dom.minidom NODE_LISTEN_PORT = 5001 NODE_LOOKUP_PORT = 23456 @@ -311,20 +312,42 @@ def run_start(numdsnodes): keypair[1] + ' --pubk ' + keypair[0] + ' --address ' + '127.0.0.1' + ' --port ' + str( NODE_LISTEN_PORT + x) + ' --identity normal-' + str(x) + ' > ./error_log_zilliqa 2>&1 &') - - +class GiveUp(Exception): + pass + +def xml_get_element(doc, parent, name): + elems = parent.getElementsByTagName(name) + if elems is None or len(elems) < 1: + raise GiveUp(f"XML: Cannot find element {name} in {parent}") + elif len(elems) > 1: + raise GiveUp(f"XML: More than one child named {name} in {parent}") + return elems[0] +def xml_replace_element(doc, parent, name, new_value): + elem = xml_get_element(doc, parent, name) + # Remove all the nodes + while elem.firstChild is not None: + elem.removeChild(elem.firstChild) + elem.appendChild(doc.createTextNode(new_value)) def patch_param_in_xml(filepath, ipc_path, status_server_port): - root = ET.parse(filepath).getroot() - - td = root.find('jsonrpc') - ''' TODO will need extending for other params''' - td.find('SCILLA_IPC_SOCKET_PATH').text = ipc_path - td.find('STATUS_RPC_PORT').text = status_server_port + config_file = xml.dom.minidom.parse("constants.xml") + + xml_replace_element(config_file, config_file.documentElement, "LOOKUP_NODE_MODE", "true") + xml_replace_element(config_file, config_file.documentElement, "DEBUG_LEVEL", "3") + xml_replace_element(config_file, config_file.documentElement, "ENABLE_SC", "false") + xml_replace_element(config_file, config_file.documentElement, "ENABLE_SCILLA_MULTI_VERSION", "false") + xml_replace_element(config_file, config_file.documentElement, "SCILLA_ROOT", "scilla") + xml_replace_element(config_file, config_file.documentElement, "SCILLA_LIB", "stdlib") + xml_replace_element(config_file, config_file.documentElement, "SCILLA_LIB", "stdlib") + xml_replace_element(config_file, config_file.documentElement, "SCILLA_IPC_SOCKET_PATH", ipc_path) + xml_replace_element(config_file, config_file.documentElement, "STATUS_RPC_PORT", status_server_port) + xml_replace_element(config_file, config_file.documentElement, "ENABLE_SCILLA_MULTI_VERSION", "false") + xml_replace_element(config_file, config_file.documentElement, "ENABLE_EVM", "true") + xml_replace_element(config_file, config_file.documentElement, "EVM_SERVER_BINARY", "evm-ds/evm-ds") + xml_replace_element(config_file, config_file.documentElement, "EVM_LOG_CONFIG", "evm-ds/log4rs-local.yml") + xml_replace_element(config_file, config_file.documentElement, "EVM_SERVER_SOCKET_PATH", "/tmp/evm-server.sock") - tree = ET.ElementTree(root) - tree.write(filepath) def patch_lookup_pubkey(filepath, keypairs): From 15a04f37afe051b201cfa6904163dd0e5f7ad6a7 Mon Sep 17 00:00:00 2001 From: stephen Date: Mon, 13 Nov 2023 22:31:00 +0000 Subject: [PATCH 59/61] Patchup again after changes to main --- scripts/localdev.py | 11 ++++++----- src/libNetwork/RumorManager.cpp | 18 +++++++++--------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/scripts/localdev.py b/scripts/localdev.py index 6547f0ec3f..c6cf58c113 100755 --- a/scripts/localdev.py +++ b/scripts/localdev.py @@ -766,11 +766,11 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se cmd = ["./bootstrap.py", testnet_name, "--clusters", "minikube", "--constants-from-file", os.path.join(ZILLIQA_DIR, "constants.xml"), "--image", zilliqa_image, - "-n", "15", - "-s", "15", - "-d", "15", + "-n", "30", + "-s", "30", + "-d", "30", "-l", "1", - "--guard", "7/0", + "--guard", "17/0", "--gentxn", "false", "--multiplier-fanout", "1", "--host-network", "false", @@ -811,8 +811,9 @@ def write_testnet_configuration(config, zilliqa_image, testnet_name, isolated_se xml_replace_element(config_file, config_file.documentElement, "SIGN_VERIFY_NONEMPTY_MSGTYP", "false") xml_replace_element(config_file, config_file.documentElement, "MAX_NEIGHBORS_PER_ROUND", "3") xml_replace_element(config_file, config_file.documentElement, "NUM_GOSSIP_RECEIVERS", "3") - xml_replace_element(config_file, config_file.documentElement, "ROUND_TIME_IN_MS", "1000") ''' + xml_replace_element(config_file, config_file.documentElement, "ROUND_TIME_IN_MS", "1000") + if chain_id is not None: diff --git a/src/libNetwork/RumorManager.cpp b/src/libNetwork/RumorManager.cpp index 81582727f6..f90117a28e 100644 --- a/src/libNetwork/RumorManager.cpp +++ b/src/libNetwork/RumorManager.cpp @@ -180,7 +180,7 @@ void RumorManager::StartRounds() { if (m_condStopRound.wait_for(guard, std::chrono::milliseconds(ROUND_TIME_IN_MS), [&] { return !m_continueRound; })) { - LOG_GENERAL(INFO, "Stopping round now.."); + LOG_GENERAL(DEBUG, "Stopping round now.."); return; } } @@ -271,7 +271,7 @@ void RumorManager::UpdatePeerInfo(const Peer& newPeerInfo, if (it2 != m_peerIdPeerBimap.right.end()) { m_peerIdPeerBimap.right.modify_key(it2, boost::bimaps::_key = newPeerInfo); - LOG_GENERAL(INFO, "Updated peer info successfully!"); + LOG_GENERAL(DEBUG, "Updated peer info successfully!"); return; } @@ -429,9 +429,9 @@ void RumorManager::SendRumorToForeignPeers( LOG_PAYLOAD(INFO, "Forwarding new gossip to foreign peers. My IP = " << m_selfPeer, message, Logger::MAX_BYTES_TO_DISPLAY); - LOG_GENERAL(INFO, "Foreign Peers: "); + LOG_GENERAL(DEBUG, "Foreign Peers: "); for (auto& i : toForeignPeers) { - LOG_GENERAL(INFO, i); + LOG_GENERAL(DEBUG, i); } RawBytes cmd = GenerateGossipForwardMessage(message); @@ -445,9 +445,9 @@ void RumorManager::SendRumorToForeignPeers(const VectorOfPeer& toForeignPeers, LOG_PAYLOAD(INFO, "Forwarding new gossip to foreign peers. My IP = " << m_selfPeer, message, Logger::MAX_BYTES_TO_DISPLAY); - LOG_GENERAL(INFO, "Foreign Peers: "); + LOG_GENERAL(DEBUG, "Foreign Peers: "); for (auto& i : toForeignPeers) { - LOG_GENERAL(INFO, i); + LOG_GENERAL(DEBUG, i); } RawBytes cmd = GenerateGossipForwardMessage(message); @@ -763,7 +763,7 @@ void RumorManager::SendMessage(const Peer& toPeer, if (!DataConversion::Uint8VecToHexStr(it1->second, gossipHashStr)) { return; } - LOG_GENERAL(INFO, "Sending [" << gossipHashStr.substr(0, 6) << "] to " + LOG_GENERAL(DEBUG, "Sending [" << gossipHashStr.substr(0, 6) << "] to " << toPeer); } else { // Nothing to send. @@ -830,7 +830,7 @@ void RumorManager::PrintStatistics() { if (!DataConversion::Uint8VecToHexStr(this_msg_hash, gossipHashStr)) { continue; } - LOG_GENERAL(INFO, "[ RumorId: " << rumorId << ", Hash: " + LOG_GENERAL(DEBUG, "[ RumorId: " << rumorId << ", Hash: " << gossipHashStr.substr(0, 6) << " ], " << state); } @@ -860,6 +860,6 @@ void RumorManager::CleanUp() { } } if (count != 0) { - LOG_GENERAL(INFO, "Cleaned " << count << " messages"); + LOG_GENERAL(DEBUG, "Cleaned " << count << " messages"); } } From 2786f777cb6f835141bc34bcc14a28232fee20d9 Mon Sep 17 00:00:00 2001 From: stephen Date: Tue, 14 Nov 2023 12:35:28 +0000 Subject: [PATCH 60/61] Adjusted the constants.xml to match mainnet --- constants.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/constants.xml b/constants.xml index 9625593746..d38e5bf6a4 100644 --- a/constants.xml +++ b/constants.xml @@ -140,7 +140,7 @@ 5 1000 0 - 18 + 300 true true From 2cb0651d34aa6f336d41d1d8ddec30b49be78eef Mon Sep 17 00:00:00 2001 From: stephen white Date: Thu, 16 Nov 2023 08:38:50 +0000 Subject: [PATCH 61/61] Made my changes to config descrete and inside localdev under the desk parameter --- scripts/config-man.py | 81 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100755 scripts/config-man.py diff --git a/scripts/config-man.py b/scripts/config-man.py new file mode 100755 index 0000000000..8eaefe8a08 --- /dev/null +++ b/scripts/config-man.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python +# Copyright (C) 2019 Zilliqa +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import click +from xml.etree import ElementTree as et + +class XMLCombiner(object): + def __init__(self, filenames, new_file): + assert len(filenames) > 0, 'No filenames!' + # save all the roots, in order, to be processed later + self.roots = [et.parse(f).getroot() for f in filenames] + self.output = new_file + + def combine(self): + for r in self.roots[1:]: + # combine each element with the first one, and update that + self.combine_element(self.roots[0], r) + # return the string representation + tree = et.ElementTree(self.roots[0]) + tree.write(self.output, encoding="utf-8", xml_declaration=True) + return True + + def combine_element(self, one, other): + + mapping = {el.tag: el for el in one} + for el in other: + if len(el) == 0: + # Not nested + try: + # Update the text + mapping[el.tag].text = el.text + except KeyError: + # An element with this name is not in the mapping + mapping[el.tag] = el + # Add it + one.append(el) + else: + try: + # Recursively process the element, and update it in the same way + self.combine_element(mapping[el.tag], el) + except KeyError: + # Not in the mapping + mapping[el.tag] = el + # Just add it + one.append(el) + + +@click.command("merge-xml") +@click.option('--baseline', default='constants.xml', prompt='The baseline file', + help='The name of the master file probably constants.xml') +@click.option('--update', default='update.xml', prompt='The file with the updates', + help='The name of the update file probably just the difference from the baseline file') +@click.option('--output', default='constants_new.xml', prompt='The combined file', + help='The name of the output file probably constants_new.xml') +@click.pass_context + +def setup(ctx, baseline, update, output): + + source_xml_file = 'constants_v9.3.0rt1_latest.xml' + target_xml_file = 'test.xml' + new_file = 'constants_new.xml' + + if XMLCombiner((baseline, update), output).combine() : + print('success') + else: + print('failed') + +